[Gnucash-changes] r13090 - gnucash/trunk/src/engine/test - Add some test-cases for gnc_numerics using the reciprocal denominator.

Chris Shoemaker chris at cvs.gnucash.org
Sat Feb 4 00:37:50 EST 2006


Author: chris
Date: 2006-02-04 00:37:50 -0500 (Sat, 04 Feb 2006)
New Revision: 13090
Trac: http://svn.gnucash.org/trac/changeset/13090

Modified:
   gnucash/trunk/src/engine/test/test-numeric.c
Log:
   Add some test-cases for gnc_numerics using the reciprocal denominator.
   Even though we don't explicitly ask for this representation, certain
   calculations (e.g. those involving GNC_HOW_DENOM_SIGFIGS in the loan    
   druid and soon in budgets) will return numbers using this representation.

   Unfortunately, these numbers aren't handled correctly by most of the
   gnc_numeric functions, like the ones for comparison, equality testing,
   arithmetic and conversion.


Modified: gnucash/trunk/src/engine/test/test-numeric.c
===================================================================
--- gnucash/trunk/src/engine/test/test-numeric.c	2006-02-03 21:29:06 UTC (rev 13089)
+++ gnucash/trunk/src/engine/test/test-numeric.c	2006-02-04 05:37:50 UTC (rev 13090)
@@ -541,33 +541,52 @@
   gint64 v;
   gnc_numeric c, d;
   gnc_numeric amt_a, amt_tot, frac, val_tot, val_a;
+  gnc_numeric a, b;
 
-  gnc_numeric a = gnc_numeric_create(2, 6);
-  gnc_numeric b = gnc_numeric_create(1, 4);
+  a = gnc_numeric_create(-100, 100);
+  b = gnc_numeric_create(1, 1);
+  check_binary_op (gnc_numeric_create(-100, 100), 
+                   gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
+                   a, b, "expected %s got %s = %s / %s div exact");
 
+  a = gnc_numeric_create(-100, 100);
+  b = gnc_numeric_create(-1, 1);
+  check_binary_op (gnc_numeric_create(100, 100), 
+                   gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
+                   a, b, "expected %s got %s = %s / %s div exact");
+
+  a = gnc_numeric_create(-100, 100);
+  b = gnc_numeric_create(-1, 1);
+  check_binary_op (gnc_numeric_create(100, 100), 
+                   gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
+                   a, b, "expected %s got %s = %s * %s mult exact");
+
+  a = gnc_numeric_create(2, 6);
+  b = gnc_numeric_create(1, 4);
+
   check_binary_op (gnc_numeric_create(2,24), 
                    gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
-						 a, b, "expected %s got %s = %s * %s for mult exact");
+                   a, b, "expected %s got %s = %s * %s for mult exact");
 
   check_binary_op (gnc_numeric_create(1,12), 
                    gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE),
-						 a, b, "expected %s got %s = %s * %s for mult reduce");
+                   a, b, "expected %s got %s = %s * %s for mult reduce");
 
   check_binary_op (gnc_numeric_create(8,100), 
                    gnc_numeric_mul(a, b, 100, GNC_HOW_RND_ROUND),
-						 a, b, "expected %s got %s = %s * %s for mult 100th's");
+                   a, b, "expected %s got %s = %s * %s for mult 100th's");
 
   check_binary_op (gnc_numeric_create(8,6), 
                    gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
-						 a, b, "expected %s got %s = %s / %s for div exact");
+                   a, b, "expected %s got %s = %s / %s for div exact");
 
   check_binary_op (gnc_numeric_create(4,3), 
                    gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE),
-						 a, b, "expected %s got %s = %s / %s for div reduce");
+                   a, b, "expected %s got %s = %s / %s for div reduce");
 
   check_binary_op (gnc_numeric_create(133,100), 
                    gnc_numeric_div(a, b, 100, GNC_HOW_RND_ROUND),
-						 a, b, "expected %s got %s = %s * %s for div 100th's");
+                   a, b, "expected %s got %s = %s * %s for div 100th's");
 
 #if CHECK_ERRORS_TOO
   gnc_numeric c;
@@ -743,6 +762,81 @@
 	                 "expected %s got %s = %s / %s for mult sigfigs");
 
 }
+
+static void
+check_reciprocal(void)
+{
+    gnc_numeric a, b, ans, val;
+    double flo;
+
+    val = gnc_numeric_create(-60,20);
+    check_unary_op (gnc_numeric_eq, gnc_numeric_create (-3, -1),
+                    gnc_numeric_convert(val, GNC_DENOM_RECIPROCAL(1), 
+                                        GNC_HOW_RND_NEVER),
+                    val, "expected %s = %s = (%s as RECIP(1))");
+
+    a = gnc_numeric_create(200, 100);
+    b = gnc_numeric_create(300, 100);
+
+    /* 2 + 3 = 5 */
+    ans = gnc_numeric_add(a, b, GNC_DENOM_RECIPROCAL(1), GNC_HOW_RND_NEVER);
+    check_binary_op (gnc_numeric_create(5, -1),
+                     ans, a, b, "expected %s got %s = %s + %s for recirocal");
+                   
+    /* 2 + 3 = 5 */
+    a = gnc_numeric_create(2, -1);
+    b = gnc_numeric_create(300, 100);
+    ans = gnc_numeric_add(a, b, GNC_DENOM_RECIPROCAL(1), GNC_HOW_RND_NEVER);
+    check_binary_op (gnc_numeric_create(5, -1),
+                     ans, a, b, "expected %s got %s = %s + %s for recirocal");
+
+    /* check gnc_numeric_to_double */
+    flo = gnc_numeric_to_double(gnc_numeric_create(5, -1));
+    do_test ((5.0 == flo), "reciprocal conversion");
+
+    /* check gnc_numeric_compare */
+    a = gnc_numeric_create(2, 1);
+    b = gnc_numeric_create(2, -1);
+    do_test((0 == gnc_numeric_compare(a, b)), " 2 == 2 ");
+    a = gnc_numeric_create(2, 1);
+    b = gnc_numeric_create(3, -1);
+    do_test((-1 == gnc_numeric_compare(a, b)), " 2 < 3 ");
+    a = gnc_numeric_create(-2, 1);
+    b = gnc_numeric_create(2, -1);
+    do_test((-1 == gnc_numeric_compare(a, b)), " -2 < 2 ");
+    a = gnc_numeric_create(2, -1);
+    b = gnc_numeric_create(3, -1);
+    do_test((-1 == gnc_numeric_compare(a, b)), " 2 < 3 ");
+
+    /* check for equality */
+    a = gnc_numeric_create(2, 1);
+    b = gnc_numeric_create(2, -1);
+    do_test(gnc_numeric_equal(a, b), " 2 == 2 ");
+
+    /* check gnc_numeric_mul */
+    a = gnc_numeric_create(2, 1);
+    b = gnc_numeric_create(3, -1);
+    ans = gnc_numeric_mul(a, b, GNC_DENOM_RECIPROCAL(1), GNC_HOW_RND_NEVER);
+    check_binary_op (gnc_numeric_create(6, -1),
+                     ans, a, b, "expected %s got %s = %s * %s for recirocal");
+    
+    /* check gnc_numeric_div */
+    /* -60 / 20 = -3 */
+    a = gnc_numeric_create(-60, 1);
+    b = gnc_numeric_create(2, -10);
+    ans = gnc_numeric_div(a, b, GNC_DENOM_RECIPROCAL(1), GNC_HOW_RND_NEVER);
+    check_binary_op (gnc_numeric_create(-3, -1),
+                     ans, a, b, "expected %s got %s = %s / %s for recirocal");
+
+    /* 60 / 20 = 3 */
+    a = gnc_numeric_create(60, 1);
+    b = gnc_numeric_create(2, -10);
+    ans = gnc_numeric_div(a, b, GNC_DENOM_RECIPROCAL(1), GNC_HOW_RND_NEVER);
+    check_binary_op (gnc_numeric_create(3, -1),
+                     ans, a, b, "expected %s got %s = %s / %s for recirocal");
+    
+
+}
   
 /* ======================================================= */
 
@@ -757,6 +851,7 @@
 	check_neg();
 	check_add_subtract();
 	check_mult_div ();
+	check_reciprocal();
 }
 
 int



More information about the gnucash-changes mailing list