[Gnucash-changes] expanded equality checks, begine multiply checks
Linas Vepstas
linas at cvs.gnucash.org
Fri Jun 25 23:32:29 EDT 2004
Log Message:
-----------
expanded equality checks, begine multiply 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.4
retrieving revision 1.5
diff -Lsrc/engine/test/test-numeric.c -Lsrc/engine/test/test-numeric.c -u -r1.4 -r1.5
--- src/engine/test/test-numeric.c
+++ src/engine/test/test-numeric.c
@@ -35,7 +35,8 @@
}
static void
-check_unary_op (gnc_numeric expected,
+check_unary_op (gboolean (*eqtest) (gnc_numeric, gnc_numeric),
+ gnc_numeric expected,
gnc_numeric actual,
gnc_numeric input,
const char * errmsg)
@@ -45,7 +46,7 @@
char *a = gnc_numeric_print (input);
char *str = g_strdup_printf (errmsg, e,r, a);
- do_test (gnc_numeric_eq(expected, actual), str);
+ do_test (eqtest(expected, actual), str);
g_free (a);
g_free (r);
@@ -86,16 +87,6 @@
int i;
gint64 v;
- 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,
- GNC_DENOM_EXACT)));
-
- printf("mul least : %s * %s = %s\n",
- gnc_numeric_print(a), gnc_numeric_print(b),
- gnc_numeric_print(gnc_numeric_mul(a, b, GNC_DENOM_AUTO,
- GNC_DENOM_REDUCE)));
-
printf("mul 100ths : %s * %s = %s\n",
gnc_numeric_print(a), gnc_numeric_print(b),
gnc_numeric_print(gnc_numeric_mul(a, b, 100,
@@ -219,6 +210,12 @@
}
#endif
+static gboolean
+gnc_numeric_unequal (gnc_numeric a, gnc_numeric b)
+{
+ return (0 == gnc_numeric_equal (a,b));
+}
+
/* Make sure that the equivalence operator we use for
* later tests actually works */
static void
@@ -245,7 +242,7 @@
rfour = gnc_numeric_reduce (rfour);
do_test (gnc_numeric_eq(four, rfour), "reduce to four");
- /* Check equality operator for some large nuer/denom values */
+ /* Check equality operator for some large numer/denom values */
gint64 numer = 1<<30;
numer <<= 30; /* we don't trust cpp to compute 1<<60 correctly */
gint64 deno = 1<<30;
@@ -292,12 +289,34 @@
/* 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)");
+ check_unary_op (gnc_numeric_eq,
+ bval, rval, mval, "expected %s = %s = reduce(%s)");
/* The unreduced versions should be equal */
- do_test (gnc_numeric_equal(val, mval), "equal");
+ check_unary_op (gnc_numeric_equal,
+ val, mval, mval, "expected %s = %s");
+
+ /* Certain modulo's should be very cleary un-equal; this
+ * helps stop funky modulo-64 aliasing in compares that
+ * might creep in. */
+ int m=0;
+ gint64 f = mval.denom;
+ while (f%2 == 0)
+ {
+ f >>= 1;
+ m++;
+ }
+ if (m)
+ {
+ gint64 nn = 1 << (32-m);
+ nn <<= 32;
+ nn += mval.num;
+ val = gnc_numeric_create (2*nn, 2*mval.denom);
+ check_unary_op (gnc_numeric_unequal,
+ val, mval, mval, "expected unequality %s != %s");
+
+ }
}
-
}
static void
@@ -376,10 +395,28 @@
}
static void
+check_mult_div (void)
+{
+ gnc_numeric a = gnc_numeric_create(1, 3);
+ gnc_numeric b = gnc_numeric_create(1, 4);
+
+ check_binary_op (gnc_numeric_create(1,12),
+ gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_DENOM_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_DENOM_REDUCE),
+ a, b, "expected %s got %s = %s * %s for mult reduce");
+
+}
+
+
+static void
run_test (void)
{
check_equality_operator ();
check_add_subtract();
+ check_mult_div ();
}
static void
More information about the gnucash-changes
mailing list