mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13090 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
5631500dda
commit
85a99a1987
@ -541,33 +541,52 @@ check_mult_div (void)
|
|||||||
gint64 v;
|
gint64 v;
|
||||||
gnc_numeric c, d;
|
gnc_numeric c, d;
|
||||||
gnc_numeric amt_a, amt_tot, frac, val_tot, val_a;
|
gnc_numeric amt_a, amt_tot, frac, val_tot, val_a;
|
||||||
|
gnc_numeric a, b;
|
||||||
|
|
||||||
gnc_numeric a = gnc_numeric_create(2, 6);
|
a = gnc_numeric_create(-100, 100);
|
||||||
gnc_numeric b = gnc_numeric_create(1, 4);
|
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),
|
check_binary_op (gnc_numeric_create(2,24),
|
||||||
gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
|
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),
|
check_binary_op (gnc_numeric_create(1,12),
|
||||||
gnc_numeric_mul(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE),
|
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),
|
check_binary_op (gnc_numeric_create(8,100),
|
||||||
gnc_numeric_mul(a, b, 100, GNC_HOW_RND_ROUND),
|
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),
|
check_binary_op (gnc_numeric_create(8,6),
|
||||||
gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT),
|
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),
|
check_binary_op (gnc_numeric_create(4,3),
|
||||||
gnc_numeric_div(a, b, GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE),
|
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),
|
check_binary_op (gnc_numeric_create(133,100),
|
||||||
gnc_numeric_div(a, b, 100, GNC_HOW_RND_ROUND),
|
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
|
#if CHECK_ERRORS_TOO
|
||||||
gnc_numeric c;
|
gnc_numeric c;
|
||||||
@ -742,6 +761,81 @@ check_mult_div (void)
|
|||||||
frac, a, b,
|
frac, a, b,
|
||||||
"expected %s got %s = %s / %s for mult sigfigs");
|
"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 @@ run_test (void)
|
|||||||
check_neg();
|
check_neg();
|
||||||
check_add_subtract();
|
check_add_subtract();
|
||||||
check_mult_div ();
|
check_mult_div ();
|
||||||
|
check_reciprocal();
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
Reference in New Issue
Block a user