/** * Return a random double where U_DOUBLE_MIN <= ran <= U_DOUBLE_MAX. */ static double randomDouble(void) { double ran = 0; if (!initialized) { srand((unsigned)time(NULL)); initialized = TRUE; } #if 0 int32_t i; do { /* Assume rand has at least 12 bits of precision */ for (i = 0; i < sizeof(ran); i += 1) { ((char*)&ran)[i] = (char)((rand() & 0x0FF0) >> 4); } } while (_isnan(ran)); #else int64_t numerator = randomInt64(); int64_t denomenator; do { denomenator = randomInt64(); } while (denomenator == 0); ran = (double)numerator / (double)denomenator; #endif return ran; }
static int64_t randomInRange(void) { int64_t value; if (ranInt != 0) { value = randomInt64() % ranInt; if (value < 0) { value = -value; } value += ranMin; } else { do { value = randomInt64(); } while (value < ranMin || value > ranMax); } return value; }
static void testLocale(const char *localeID, int32_t lcid, NumberFormat *wnf, UBool currency, TestLog *log) { for (int n = 0; n < LOOP_COUNT; n += 1) { UnicodeString u3Buffer, u6Buffer, udBuffer; UnicodeString w3Buffer, w6Buffer, wdBuffer; double d = randomDouble(); int32_t i32 = randomInt32(); int64_t i64 = randomInt64(); getWindowsFormat(lcid, currency, wdBuffer, L"%.16f", d); getWindowsFormat(lcid, currency, w3Buffer, L"%I32d", i32); getWindowsFormat(lcid, currency, w6Buffer, L"%I64d", i64); wnf->format(d, udBuffer); if (udBuffer.compare(wdBuffer) != 0) { UnicodeString locale(localeID); log->errln("Double format error for locale " + locale + ": got " + udBuffer + " expected " + wdBuffer); } wnf->format(i32, u3Buffer); if (u3Buffer.compare(w3Buffer) != 0) { UnicodeString locale(localeID); log->errln("int32_t format error for locale " + locale + ": got " + u3Buffer + " expected " + w3Buffer); } wnf->format(i64, u6Buffer); if (u6Buffer.compare(w6Buffer) != 0) { UnicodeString locale(localeID); log->errln("int64_t format error for locale " + locale + ": got " + u6Buffer + " expected " + w6Buffer); } } }