r23493 - gnucash/trunk/src - Handle RAND_MAX < 2^32 in get_random_gint64()
John Ralls
jralls at code.gnucash.org
Thu Dec 5 16:54:19 EST 2013
Author: jralls
Date: 2013-12-05 16:54:18 -0500 (Thu, 05 Dec 2013)
New Revision: 23493
Trac: http://svn.gnucash.org/trac/changeset/23493
Modified:
gnucash/trunk/src/engine/test-core/test-engine-stuff.c
gnucash/trunk/src/test-core/test-stuff.c
gnucash/trunk/src/test-core/test-stuff.h
Log:
Handle RAND_MAX < 2^32 in get_random_gint64()
MacOSX, for example, sets RAND_MAX at 65535, which rather limits the
size of random gint64s on that platform.
Fixing this revealed some odd behavior in creating random interest rates,
so created a specific function for that with a somewhat more reasonable
approach.
Modified: gnucash/trunk/src/engine/test-core/test-engine-stuff.c
===================================================================
--- gnucash/trunk/src/engine/test-core/test-engine-stuff.c 2013-12-05 20:33:59 UTC (rev 23492)
+++ gnucash/trunk/src/engine/test-core/test-engine-stuff.c 2013-12-05 21:54:18 UTC (rev 23493)
@@ -467,17 +467,23 @@
* The loop is to "make sure" we get there. We might
* want to make this dependent on "deno" in the future.
*/
- do
- {
- numer = get_random_gint64() / 1000000;
- }
- while ((numer >> 31) > 0x1FFFF);
+ numer = get_random_gint64 () % (2ULL << 48);
if (0 == numer) numer = 1;
/* Make sure we have a non-zero denominator */
if (0 == deno) deno = 1;
return gnc_numeric_create(numer, deno);
}
+static gnc_numeric
+get_random_rate (void)
+{
+ /* Large rates blow up xaccSplitAssignToLot, so we clamp the rate
+ * at a smallish value */
+ gint64 numer = get_random_gint64 () % (2ULL << 24);
+ gint64 denom = 100LL;
+ return gnc_numeric_create (numer, denom);
+}
+
/* ================================================================= */
/* Commodity stuff */
@@ -1315,7 +1321,8 @@
xaccSplitGetAccount(ret)));
do
{
- rate = gnc_numeric_abs(get_random_gnc_numeric());
+ /* Large rates blow up xaccSplitAssignLot */
+ rate = get_random_rate ();
amt = gnc_numeric_mul(val, rate,
GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
amt = gnc_numeric_convert(amt, denom, GNC_HOW_RND_ROUND_HALF_UP);
Modified: gnucash/trunk/src/test-core/test-stuff.c
===================================================================
--- gnucash/trunk/src/test-core/test-stuff.c 2013-12-05 20:33:59 UTC (rev 23492)
+++ gnucash/trunk/src/test-core/test-stuff.c 2013-12-05 21:54:18 UTC (rev 23493)
@@ -313,14 +313,40 @@
return get_random_string_without (NULL);
}
+gint32
+get_random_gint32 (void)
+{
+ gint32 ret = 0;
+
+ if (RAND_MAX > (1 << 15))
+ return rand ();
+
+ if (RAND_MAX > (1 << 7))
+ {
+ ret = rand ();
+ ret <<= 16;
+ ret += rand ();
+ return ret;
+ }
+
+ ret = rand ();
+ ret <<= 8;
+ ret += rand ();
+ ret <<= 8;
+ ret += rand ();
+ ret <<= 8;
+ ret += rand ();
+ return ret;
+}
+
gint64
get_random_gint64(void)
{
gint64 ret = 0;
- ret = rand();
+ ret = get_random_gint32 ();
ret <<= 32;
- ret += rand();
+ ret += get_random_gint32 ();
return ret;
}
Modified: gnucash/trunk/src/test-core/test-stuff.h
===================================================================
--- gnucash/trunk/src/test-core/test-stuff.h 2013-12-05 20:33:59 UTC (rev 23492)
+++ gnucash/trunk/src/test-core/test-stuff.h 2013-12-05 21:54:18 UTC (rev 23493)
@@ -124,6 +124,7 @@
gchar* get_random_string(void);
gchar * get_random_string_length_in_range(int minlen, int maxlen);
gchar* get_random_string_without(const char *exclude_chars);
+gint32 get_random_gint32 (void);
gint64 get_random_gint64(void);
double get_random_double(void);
const char* get_random_string_in_array(const char* str_list[]);
More information about the gnucash-changes
mailing list