[Gnucash-changes] add more equivalence checks

Linas Vepstas linas at cvs.gnucash.org
Fri Jun 25 19:36:39 EDT 2004


Log Message:
-----------
add more equivalence checks

Modified Files:
--------------
    gnucash/src/engine/test:
        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.2
retrieving revision 1.3
diff -Lsrc/engine/test/test-numeric.c -Lsrc/engine/test/test-numeric.c -u -r1.2 -r1.3
--- src/engine/test/test-numeric.c
+++ src/engine/test/test-numeric.c
@@ -15,6 +15,7 @@
 #include "test-engine-stuff.h"
 #include "gnc-numeric.h"
 
+#define NREPS 3000
 
 
 static char *
@@ -34,17 +35,36 @@
 }
 
 static void
+check_unary_op (gnc_numeric expected, 
+                gnc_numeric actual, 
+                gnc_numeric input, 
+                const char * errmsg)
+{
+	char *e = gnc_numeric_print (expected);
+	char *r = gnc_numeric_print (actual);
+	char *a = gnc_numeric_print (input);
+	char *str = g_strdup_printf (errmsg, e,r, a);
+	
+	do_test (gnc_numeric_eq(expected, actual), str);
+	
+	g_free (a);
+	g_free (r);
+	g_free (e);
+	g_free (str);
+}
+
+static void
 check_binary_op (gnc_numeric expected, 
                  gnc_numeric actual, 
-					  gnc_numeric input_a, 
-					  gnc_numeric input_b, 
-					  const char * errmsg)
+                 gnc_numeric input_a, 
+                 gnc_numeric input_b, 
+                 const char * errmsg)
 {
 	char *e = gnc_numeric_print (expected);
 	char *r = gnc_numeric_print (actual);
 	char *a = gnc_numeric_print (input_a);
 	char *b = gnc_numeric_print (input_b);
-	char * str = g_strdup_printf (errmsg, e,r,a,b);
+	char *str = g_strdup_printf (errmsg, e,r,a,b);
 	
 	do_test (gnc_numeric_eq(expected, actual), str);
 	
@@ -208,9 +228,45 @@
 	gnc_numeric b = gnc_numeric_create (42, 58);
 	gnc_numeric c = gnc_numeric_create (40, 58);
 	
+	/* Check strict equivalence and non-equivalence */
 	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");
+
+
+	/* Check common factor elimination (needed for equality checks) */
+	gnc_numeric one = gnc_numeric_create (1,1);
+	gnc_numeric rone = gnc_numeric_create (1000000,1000000);
+	rone = gnc_numeric_reduce (rone);
+	do_test (gnc_numeric_eq(one, rone), "reduce to one");
+
+	gnc_numeric four = gnc_numeric_create (4,1);
+	gnc_numeric rfour = gnc_numeric_create (480,120);
+	rfour = gnc_numeric_reduce (rfour);
+	do_test (gnc_numeric_eq(four, rfour), "reduce to four");
+
+	
+	int i;
+	/* lim keeps denominotor in the range of 2^30 */
+	gint64 lim = RAND_MAX / (1<<15);
+	for (i=0; i<NREPS; i++) 
+	{
+		gint64 deno = rand() / lim;
+		gint64 mult = rand() / lim;
+		gint64 numer = get_random_gint64() / (1<<16);
+
+		gnc_numeric val = gnc_numeric_create (numer, deno);
+		gnc_numeric mval = gnc_numeric_create (numer*mult, deno*mult);
+		
+		/* The reduced version should be equivalent */
+		gnc_numeric bval = gnc_numeric_reduce (val);
+		gnc_numeric rval = gnc_numeric_reduce (mval);
+		check_unary_op (bval, rval, mval, "expected %s = %s = reduce(%s)");
+		
+		/* The unreduced versions should be equal */
+		do_test (gnc_numeric_equal(val, mval), "equal");
+	}
+	
 }
 	
 static void
@@ -257,7 +313,7 @@
 
 	/* Add and subtract some random numbers */
 	int i;
-	for (i=0; i<1000; i++)
+	for (i=0; i<NREPS; i++)
 	{
 		gnc_numeric e;
 		gint64 deno = rand() +1;


More information about the gnucash-changes mailing list