[Gnucash-changes] add random-addition tests

Linas Vepstas linas at cvs.gnucash.org
Fri Jun 25 18:52:37 EDT 2004


Log Message:
-----------
add random-addition tests

Modified Files:
--------------
    gnucash/src/engine/test:
        Makefile.am
        test-numeric.c

Revision Data
-------------
Index: test-numeric.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/test/test-numeric.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lsrc/engine/test/test-numeric.c -Lsrc/engine/test/test-numeric.c -u -r1.1 -r1.2
--- src/engine/test/test-numeric.c
+++ src/engine/test/test-numeric.c
@@ -60,46 +60,12 @@
 main(int argc, char ** argv) {
   gnc_numeric a = gnc_numeric_create(1, 3);
   gnc_numeric b = gnc_numeric_create(1, 4);
-  gnc_numeric c;
   gnc_numeric d = gnc_numeric_create(1, 2);
   
   gnc_numeric err;
   int i;
   gint64 v;
 
-  printf("add 100ths (banker's): %s + %s = %s\n",
-         gnc_numeric_print(a), gnc_numeric_print(b),
-         gnc_numeric_print(gnc_numeric_add(a, b, 100,
-                                           GNC_RND_ROUND)));
-  
-  c = gnc_numeric_add_with_error(a, b, 100, GNC_RND_ROUND, &err);
-  printf("add 100ths/error : %s + %s = %s + (error) %s\n\n",
-         gnc_numeric_print(a), gnc_numeric_print(b),
-         gnc_numeric_print(c),
-         gnc_numeric_print(err));
-  
-  printf("sub exact : %s - %s = %s\n",
-         gnc_numeric_print(a), gnc_numeric_print(b),
-         gnc_numeric_print(gnc_numeric_sub(a, b, GNC_DENOM_AUTO, 
-                                           GNC_DENOM_EXACT)));
-  
-  printf("sub least : %s - %s = %s\n",
-         gnc_numeric_print(a), gnc_numeric_print(b),
-         gnc_numeric_print(gnc_numeric_sub(a, b, 
-                                           GNC_DENOM_AUTO, 
-                                           GNC_DENOM_REDUCE)));
-  
-  printf("sub 100ths : %s - %s = %s\n",
-         gnc_numeric_print(a), gnc_numeric_print(b),
-         gnc_numeric_print(gnc_numeric_sub(a, b, 100,
-                                           GNC_RND_ROUND)));
-  
-  c = gnc_numeric_sub_with_error(a, b, 100, GNC_RND_FLOOR, &err);
-  printf("sub 100ths/error : %s - %s = %s + (error) %s\n\n",
-         gnc_numeric_print(a), gnc_numeric_print(b),
-         gnc_numeric_print(c),
-         gnc_numeric_print(err));
-  
   printf("mul exact : %s * %s = %s\n",
          gnc_numeric_print(a), gnc_numeric_print(b),
          gnc_numeric_print(gnc_numeric_mul(a, b, GNC_DENOM_AUTO, 
@@ -233,16 +199,100 @@
 }
 #endif
 
+/* Make sure that the equivalence operator we use for 
+ * later tests actually works */
 static void
-run_test (void)
+check_equality_operator (void)
+{
+	gnc_numeric a = gnc_numeric_create (42, 58);
+	gnc_numeric b = gnc_numeric_create (42, 58);
+	gnc_numeric c = gnc_numeric_create (40, 58);
+	
+	do_test (gnc_numeric_eq(a, a), "expected self-equivalence");
+	do_test (gnc_numeric_eq(a, b), "expected equivalence");
+	do_test (0 == gnc_numeric_eq(a, c), "expected inequivalence");
+}
+	
+static void
+check_add_subtract (void)
 {
   gnc_numeric a = gnc_numeric_create(1, 3);
   gnc_numeric b = gnc_numeric_create(1, 4);
 
-  check_binary_op (gnc_numeric_create(9,12), 
+  check_binary_op (gnc_numeric_create(7,12), 
                    gnc_numeric_add(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
 						 a, b, "expected %s got %s = %s + %s for add exact");
   
+  check_binary_op (gnc_numeric_create(58,100), 
+                   gnc_numeric_add(a, b, 100, GNC_RND_ROUND),
+						 a, b, "expected %s got %s = %s + %s for add 100ths (banker's)");
+  
+  check_binary_op (gnc_numeric_create(1,12), 
+                   gnc_numeric_sub(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
+						 a, b, "expected %s got %s = %s - %s for sub exact");
+  
+  check_binary_op (gnc_numeric_create(1,12), 
+                   gnc_numeric_sub(a, b, GNC_DENOM_AUTO, GNC_DENOM_REDUCE),
+						 a, b, "expected %s got %s = %s - %s for sub least");
+  
+  check_binary_op (gnc_numeric_create(8,100), 
+                   gnc_numeric_sub(a, b, 100, GNC_RND_ROUND),
+						 a, b, "expected %s got %s = %s - %s for add 100ths (banker's)");
+  
+#if CHECK_ERRORS_TOO
+  gnc_numeric c;
+  c = gnc_numeric_add_with_error(a, b, 100, GNC_RND_ROUND, &err);
+  printf("add 100ths/error : %s + %s = %s + (error) %s\n\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(c),
+         gnc_numeric_print(err));
+  
+  c = gnc_numeric_sub_with_error(a, b, 100, GNC_RND_FLOOR, &err);
+  printf("sub 100ths/error : %s - %s = %s + (error) %s\n\n",
+         gnc_numeric_print(a), gnc_numeric_print(b),
+         gnc_numeric_print(c),
+         gnc_numeric_print(err));
+  
+#endif
+
+	/* Add and subtract some random numbers */
+	int i;
+	for (i=0; i<1000; i++)
+	{
+		gnc_numeric e;
+		gint64 deno = rand() +1;
+		gint64 na = get_random_gint64();
+		gint64 nb = get_random_gint64();
+		gint64 ne;
+
+		/* avoid overflow; */
+		na /=2;
+		nb /=2;
+		
+		a = gnc_numeric_create(na, deno);
+		b = gnc_numeric_create(nb, deno);
+
+		/* Add */
+		ne = na+nb;
+		e = gnc_numeric_create(ne, deno);
+		check_binary_op (e,
+                   gnc_numeric_add(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
+						 a, b, "expected %s got %s = %s + %s for exact addition");
+
+		/* Subtract */
+		ne = na-nb;
+		e = gnc_numeric_create(ne, deno);
+		check_binary_op (e,
+                   gnc_numeric_sub(a, b, GNC_DENOM_AUTO, GNC_DENOM_EXACT),
+						 a, b, "expected %s got %s = %s - %s for exact subtraction");
+	}
+}
+
+static void
+run_test (void)
+{
+	check_equality_operator ();
+	check_add_subtract();
 }
 
 static void
Index: Makefile.am
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/test/Makefile.am,v
retrieving revision 1.35
retrieving revision 1.36
diff -Lsrc/engine/test/Makefile.am -Lsrc/engine/test/Makefile.am -u -r1.35 -r1.36
--- src/engine/test/Makefile.am
+++ src/engine/test/Makefile.am
@@ -25,6 +25,7 @@
   test-link \
   test-load-engine \
   test-guid \
+  test-numeric \
   test-date \
   test-object \
   test-commodities \
@@ -63,6 +64,7 @@
   test-group-vs-book \
   test-load-engine \
   test-lots \
+  test-numeric \
   test-object \
   test-period \
   test-query \


More information about the gnucash-changes mailing list