[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