From 2291561fbfcd7f77aece510bb4bcf1c1a5d4372e Mon Sep 17 00:00:00 2001 From: Derek Atkins Date: Sun, 4 Jul 2004 17:10:38 +0000 Subject: [PATCH] get test-query to fail consistently. PERR() when xaccTransGetSharePrice() overflows. Loop test-query, and start the rng to fail consistently. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@10156 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/engine/Transaction.c | 16 ++++++++++++++-- src/engine/test/test-query.c | 9 ++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/engine/Transaction.c b/src/engine/Transaction.c index 25b64a69f0..255aa59716 100644 --- a/src/engine/Transaction.c +++ b/src/engine/Transaction.c @@ -2805,7 +2805,7 @@ xaccSplitGetValue (const Split * cs) gnc_numeric xaccSplitGetSharePrice (const Split * split) { - gnc_numeric amt, val; + gnc_numeric amt, val, price; if(!split) { return gnc_numeric_create(1, 1); @@ -2826,10 +2826,22 @@ xaccSplitGetSharePrice (const Split * split) } return gnc_numeric_create(0, 1); } - return gnc_numeric_div(val, amt, + price = gnc_numeric_div(val, amt, GNC_DENOM_AUTO, GNC_HOW_DENOM_SIGFIGS(PRICE_SIGFIGS) | GNC_HOW_RND_ROUND); + + /* During random checks we can get some very weird prices. Let's + * handle some overflow and other error conditions by returning + * zero. But still print an error to let us know it happened. + */ + if (gnc_numeric_check(price)) { + PERR("Computing Shares Price Failed (%d): [ %lld / %lld ] / [ %lld / %lld ]", + gnc_numeric_check(price), val.num, val.denom, amt.num, amt.denom); + return gnc_numeric_create(0,1); + } + + return price; } /********************************************************************\ diff --git a/src/engine/test/test-query.c b/src/engine/test/test-query.c index d52223a33d..0db3b73a2d 100644 --- a/src/engine/test/test-query.c +++ b/src/engine/test/test-query.c @@ -66,13 +66,20 @@ run_test (void) static void main_helper (void *closure, int argc, char **argv) { + int i; + gnc_module_load("gnucash/engine", 0); g_log_set_always_fatal( G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING ); xaccLogDisable (); - run_test (); + /* Always start from the same random seed so we fail consistently */ + srand(0); + + /* Loop the test. */ + for (i=0; i < 10; i++) + run_test (); success("queries seem to work");