ICU-104 added test for llong

X-SVN-Rev: 7185
This commit is contained in:
Doug Felt 2001-11-29 23:49:09 +00:00
parent 3ce10fb69c
commit 851c47136f
2 changed files with 606 additions and 0 deletions

View file

@ -9,6 +9,9 @@
#include "unicode/tblcoll.h"
#include "unicode/coleitr.h"
#include "unicode/ures.h"
#include "llong.h"
#include <string.h>
// import com.ibm.text.RuleBasedNumberFormat;
// import com.ibm.test.TestFmwk;
@ -42,6 +45,7 @@ void IntlTestRBNF::runIndexedTest(int32_t index, UBool exec, const char* &name,
TESTCASE(8, TestThaiSpellout);
TESTCASE(9, TestAPI);
TESTCASE(10, TestFractionalRuleSet);
TESTCASE(11, TestLLong);
default:
name = "";
break;
@ -260,6 +264,603 @@ void IntlTestRBNF::TestFractionalRuleSet()
}
}
#define LLAssert(a) \
if (!(a)) errln("FAIL: " #a)
static int ustrcmp(const UChar* lhs, const UChar* rhs) {
while ((*lhs == *rhs) && *lhs) {
++lhs;
++rhs;
}
return *lhs - *rhs;
}
void IntlTestRBNF::TestLLong()
{
// constant (shouldn't really be public)
LLAssert(llong(llong::kD32).asDouble() == llong::kD32);
// internal constructor (shouldn't really be public)
LLAssert(llong(0, 1).asDouble() == 1);
LLAssert(llong(1, 0).asDouble() == llong::kD32);
LLAssert(llong(-1, -1).asDouble() == -1);
// public empty constructor
LLAssert(llong().asDouble() == 0);
// public int32_t constructor
LLAssert(llong((int32_t)0).asInt() == (int32_t)0);
LLAssert(llong((int32_t)1).asInt() == (int32_t)1);
LLAssert(llong((int32_t)-1).asInt() == (int32_t)-1);
LLAssert(llong((int32_t)0x7fffffff).asInt() == (int32_t)0x7fffffff);
LLAssert(llong((int32_t)0xffffffff).asInt() == (int32_t)-1);
LLAssert(llong((int32_t)0x80000000).asInt() == (int32_t)0x80000000);
// public int16_t constructor
LLAssert(llong((int16_t)0).asInt() == (int16_t)0);
LLAssert(llong((int16_t)1).asInt() == (int16_t)1);
LLAssert(llong((int16_t)-1).asInt() == (int16_t)-1);
LLAssert(llong((int16_t)0x7fff).asInt() == (int16_t)0x7fff);
LLAssert(llong((int16_t)0xffff).asInt() == (int16_t)0xffff);
LLAssert(llong((int16_t)0x8000).asInt() == (int16_t)0x8000);
// public int8_t constructor
LLAssert(llong((int8_t)0).asInt() == (int8_t)0);
LLAssert(llong((int8_t)1).asInt() == (int8_t)1);
LLAssert(llong((int8_t)-1).asInt() == (int8_t)-1);
LLAssert(llong((int8_t)0x7f).asInt() == (int8_t)0x7f);
LLAssert(llong((int8_t)0xff).asInt() == (int8_t)0xff);
LLAssert(llong((int8_t)0x80).asInt() == (int8_t)0x80);
// public uint16_t constructor
LLAssert(llong((uint16_t)0).asUInt() == (uint16_t)0);
LLAssert(llong((uint16_t)1).asUInt() == (uint16_t)1);
LLAssert(llong((uint16_t)-1).asUInt() == (uint16_t)-1);
LLAssert(llong((uint16_t)0x7fff).asUInt() == (uint16_t)0x7fff);
LLAssert(llong((uint16_t)0xffff).asUInt() == (uint16_t)0xffff);
LLAssert(llong((uint16_t)0x8000).asUInt() == (uint16_t)0x8000);
// public uint32_t constructor
LLAssert(llong((uint32_t)0).asUInt() == (uint32_t)0);
LLAssert(llong((uint32_t)1).asUInt() == (uint32_t)1);
LLAssert(llong((uint32_t)-1).asUInt() == (uint32_t)-1);
LLAssert(llong((uint32_t)0x7fffffff).asUInt() == (uint32_t)0x7fffffff);
LLAssert(llong((uint32_t)0xffffffff).asUInt() == (uint32_t)-1);
LLAssert(llong((uint32_t)0x80000000).asUInt() == (uint32_t)0x80000000);
// public double constructor
LLAssert(llong((double)0).asDouble() == (double)0);
LLAssert(llong((double)1).asDouble() == (double)1);
LLAssert(llong((double)0x7fffffff).asDouble() == (double)0x7fffffff);
LLAssert(llong((double)0x80000000).asDouble() == (double)0x80000000);
LLAssert(llong((double)0x80000001).asDouble() == (double)0x80000001);
// can't access uprv_maxmantissa, so fake it
double maxmantissa = (llong((int32_t)1) << 40).asDouble();
LLAssert(llong(maxmantissa).asDouble() == maxmantissa);
LLAssert(llong(-maxmantissa).asDouble() == -maxmantissa);
// copy constructor
LLAssert(llong(llong(0, 1)).asDouble() == 1);
LLAssert(llong(llong(1, 0)).asDouble() == llong::kD32);
LLAssert(llong(llong(-1, -1)).asDouble() == -1);
// asInt - test unsigned to signed narrowing conversion
LLAssert(llong((uint32_t)-1).asInt() == (int32_t)0x7fffffff);
LLAssert(llong(-1, 0).asInt() == (int32_t)0x80000000);
// asUInt - test signed to unsigned narrowing conversion
LLAssert(llong((int32_t)-1).asUInt() == (uint32_t)-1);
LLAssert(llong((int32_t)0x80000000).asUInt() == (uint32_t)0x80000000);
// asDouble already tested
// operator=
LLAssert((llong(2,3) = llong((uint32_t)-1)).asUInt() == (uint32_t)-1);
// operator <<=
LLAssert((llong(1, 1) <<= 0) == llong(1, 1));
LLAssert((llong(1, 1) <<= 31) == llong(0x80000000, 0x80000000));
LLAssert((llong(1, 1) <<= 32) == llong(1, 0));
LLAssert((llong(1, 1) <<= 63) == llong(0x80000000, 0));
LLAssert((llong(1, 1) <<= 64) == llong(1, 1)); // only lower 6 bits are used
LLAssert((llong(1, 1) <<= -1) == llong(0x80000000, 0)); // only lower 6 bits are used
// operator <<
LLAssert((llong((int32_t)1) << 5).asUInt() == 32);
// operator >>= (sign extended)
LLAssert((llong(0x7fffa0a0, 0xbcbcdfdf) >>= 16) == llong(0x7fff,0xa0a0bcbc));
LLAssert((llong(0x8000789a, 0xbcde0000) >>= 16) == llong(0xffff8000,0x789abcde));
LLAssert((llong(0x80000000, 0) >>= 63) == llong(0xffffffff, 0xffffffff));
LLAssert((llong(0x80000000, 0) >>= 47) == llong(0xffffffff, 0xffff0000));
LLAssert((llong(0x80000000, 0x80000000) >> 64) == llong(0x80000000, 0x80000000)); // only lower 6 bits are used
LLAssert((llong(0x80000000, 0) >>= -1) == llong(0xffffffff, 0xffffffff)); // only lower 6 bits are used
// operator >> sign extended)
LLAssert((llong(0x8000789a, 0xbcde0000) >> 16) == llong(0xffff8000,0x789abcde));
// ushr (right shift without sign extension)
LLAssert(llong(0x7fffa0a0, 0xbcbcdfdf).ushr(16) == llong(0x7fff,0xa0a0bcbc));
LLAssert(llong(0x8000789a, 0xbcde0000).ushr(16) == llong(0x00008000,0x789abcde));
LLAssert(llong(0x80000000, 0).ushr(63) == llong(0, 1));
LLAssert(llong(0x80000000, 0).ushr(47) == llong(0, 0x10000));
LLAssert(llong(0x80000000, 0x80000000).ushr(64) == llong(0x80000000, 0x80000000)); // only lower 6 bits are used
LLAssert(llong(0x80000000, 0).ushr(-1) == llong(0, 1)); // only lower 6 bits are used
// operator&(llong)
LLAssert((llong(0x55555555, 0x55555555) & llong(0xaaaaffff, 0xffffaaaa)) == llong(0x00005555, 0x55550000));
// operator|(llong)
LLAssert((llong(0x55555555, 0x55555555) | llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffffff, 0xffffffff));
// operator^(llong)
LLAssert((llong(0x55555555, 0x55555555) ^ llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffaaaa, 0xaaaaffff));
// operator&(uint32)
LLAssert((llong(0x55555555, 0x55555555) & (uint32_t)0xffffaaaa) == llong(0, 0x55550000));
// operator|(uint32)
LLAssert((llong(0x55555555, 0x55555555) | (uint32_t)0xffffaaaa) == llong(0x55555555, 0xffffffff));
// operator^(uint32)
LLAssert((llong(0x55555555, 0x55555555) ^ (uint32_t)0xffffaaaa) == llong(0x55555555, 0xaaaaffff));
// operator~
LLAssert(~llong(0x55555555, 0x55555555) == llong(0xaaaaaaaa, 0xaaaaaaaa));
// operator&=(llong)
LLAssert((llong(0x55555555, 0x55555555) &= llong(0xaaaaffff, 0xffffaaaa)) == llong(0x00005555, 0x55550000));
// operator|=(llong)
LLAssert((llong(0x55555555, 0x55555555) |= llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffffff, 0xffffffff));
// operator^=(llong)
LLAssert((llong(0x55555555, 0x55555555) ^= llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffaaaa, 0xaaaaffff));
// operator&=(uint32)
LLAssert((llong(0x55555555, 0x55555555) &= (uint32_t)0xffffaaaa) == llong(0, 0x55550000));
// operator|=(uint32)
LLAssert((llong(0x55555555, 0x55555555) |= (uint32_t)0xffffaaaa) == llong(0x55555555, 0xffffffff));
// operator^=(uint32)
LLAssert((llong(0x55555555, 0x55555555) ^= (uint32_t)0xffffaaaa) == llong(0x55555555, 0xaaaaffff));
// operator==
LLAssert(llong() == llong(0, 0));
LLAssert(llong(1,0) == llong(1, 0));
LLAssert(llong(0,1) == llong(0, 1));
// operator!=
LLAssert(llong(1,0) != llong(1,1));
LLAssert(llong(0,1) != llong(1,1));
LLAssert(llong(0xffffffff,0xffffffff) != llong(0x7fffffff, 0xffffffff));
// operator>
LLAssert(llong(1, 1) > llong(1, 0));
LLAssert(llong(0, 0x80000000) > llong(0, 0x7fffffff));
LLAssert(llong(0x80000000, 1) > llong(0x80000000, 0));
LLAssert(llong(1, 0) > llong(0, 0x7fffffff));
LLAssert(llong(1, 0) > llong(0, 0xffffffff));
LLAssert(llong(0, 0) > llong(0x80000000, 1));
// operator<
LLAssert(llong(1, 0) < llong(1, 1));
LLAssert(llong(0, 0x7fffffff) < llong(0, 0x80000000));
LLAssert(llong(0x80000000, 0) < llong(0x80000000, 1));
LLAssert(llong(0, 0x7fffffff) < llong(1, 0));
LLAssert(llong(0, 0xffffffff) < llong(1, 0));
LLAssert(llong(0x80000000, 1) < llong(0, 0));
// operator>=
LLAssert(llong(1, 1) >= llong(1, 0));
LLAssert(llong(0, 0x80000000) >= llong(0, 0x7fffffff));
LLAssert(llong(0x80000000, 1) >= llong(0x80000000, 0));
LLAssert(llong(1, 0) >= llong(0, 0x7fffffff));
LLAssert(llong(1, 0) >= llong(0, 0xffffffff));
LLAssert(llong(0, 0) >= llong(0x80000000, 1));
LLAssert(llong() >= llong(0, 0));
LLAssert(llong(1,0) >= llong(1, 0));
LLAssert(llong(0,1) >= llong(0, 1));
// operator<=
LLAssert(llong(1, 0) <= llong(1, 1));
LLAssert(llong(0, 0x7fffffff) <= llong(0, 0x80000000));
LLAssert(llong(0x80000000, 0) <= llong(0x80000000, 1));
LLAssert(llong(0, 0x7fffffff) <= llong(1, 0));
LLAssert(llong(0, 0xffffffff) <= llong(1, 0));
LLAssert(llong(0x80000000, 1) <= llong(0, 0));
LLAssert(llong() <= llong(0, 0));
LLAssert(llong(1,0) <= llong(1, 0));
LLAssert(llong(0,1) <= llong(0, 1));
// operator==(int32)
LLAssert(llong() == (int32_t)0);
LLAssert(llong(0,1) == (int32_t)1);
// operator!=(int32)
LLAssert(llong(1,0) != (int32_t)0);
LLAssert(llong(0,1) != (int32_t)2);
LLAssert(llong(0,0xffffffff) != (int32_t)-1);
// operator>(int32)
LLAssert(llong(0, 0x80000000) > (int32_t)0x7fffffff);
LLAssert(llong(0xffffffff, 0xffffffff) > (int32_t)-2);
LLAssert(llong(1, 0) > (int32_t)0x7fffffff);
LLAssert(llong(0, 0) > (int32_t)-1);
// operator<(int32)
LLAssert(llong(0, 0x7ffffffe) < (int32_t)0x7fffffff);
LLAssert(llong(0xffffffff, 0xfffffffe) < (int32_t)-1);
// operator>=(int32)
LLAssert(llong(0, 0x80000000) >= (int32_t)0x7fffffff);
LLAssert(llong(0xffffffff, 0xffffffff) >= (int32_t)-2);
LLAssert(llong(1, 0) >= (int32_t)0x7fffffff);
LLAssert(llong(0, 0) >= (int32_t)-1);
LLAssert(llong() >= (int32_t)0);
LLAssert(llong(0,1) >= (int32_t)1);
// operator<=(int32)
LLAssert(llong(0, 0x7ffffffe) <= (int32_t)0x7fffffff);
LLAssert(llong(0xffffffff, 0xfffffffe) <= (int32_t)-1);
LLAssert(llong() <= (int32_t)0);
LLAssert(llong(0,1) <= (int32_t)1);
// unsigned >
LLAssert(llong((int32_t)-1).ugt(llong(0x7fffffff, 0xffffffff)));
// unsigned <
LLAssert(llong(0x7fffffff, 0xffffffff).ult(llong((int32_t)-1)));
// unsigned >=
LLAssert(llong((int32_t)-1).uge(llong(0x7fffffff, 0xffffffff)));
LLAssert(llong((int32_t)-1).uge(llong((int32_t)-1)));
// unsigned <=
LLAssert(llong(0x7fffffff, 0xffffffff).ule(llong((int32_t)-1)));
LLAssert(llong((int32_t)-1).ule(llong((int32_t)-1)));
// prefix inc
LLAssert(llong(1, 0) == ++llong(0,0xffffffff));
// prefix dec
LLAssert(llong(0,0xffffffff) == --llong(1, 0));
// postfix inc
{
llong n(0, 0xffffffff);
LLAssert(llong(0, 0xffffffff) == n++);
LLAssert(llong(1, 0) == n);
}
// postfix dec
{
llong n(1, 0);
LLAssert(llong(1, 0) == n--);
LLAssert(llong(0, 0xffffffff) == n);
}
// unary minus
LLAssert(llong(0, 0) == -llong(0, 0));
LLAssert(llong(0xffffffff, 0xffffffff) == -llong(0, 1));
LLAssert(llong(0, 1) == -llong(0xffffffff, 0xffffffff));
LLAssert(llong(0x7fffffff, 0xffffffff) == -llong(0x80000000, 1));
LLAssert(llong(0x80000000, 0) == -llong(0x80000000, 0)); // !!! we don't handle overflow
// operator-=
{
llong n;
LLAssert((n -= llong(0, 1)) == llong(0xffffffff, 0xffffffff));
LLAssert(n == llong(0xffffffff, 0xffffffff));
n = llong(1, 0);
LLAssert((n -= llong(0, 1)) == llong(0, 0xffffffff));
LLAssert(n == llong(0, 0xffffffff));
}
// operator-
{
llong n;
LLAssert((n - llong(0, 1)) == llong(0xffffffff, 0xffffffff));
LLAssert(n == llong(0, 0));
n = llong(1, 0);
LLAssert((n - llong(0, 1)) == llong(0, 0xffffffff));
LLAssert(n == llong(1, 0));
}
// operator+=
{
llong n(0xffffffff, 0xffffffff);
LLAssert((n += llong(0, 1)) == llong(0, 0));
LLAssert(n == llong(0, 0));
n = llong(0, 0xffffffff);
LLAssert((n += llong(0, 1)) == llong(1, 0));
LLAssert(n == llong(1, 0));
}
// operator+
{
llong n(0xffffffff, 0xffffffff);
LLAssert((n + llong(0, 1)) == llong(0, 0));
LLAssert(n == llong(0xffffffff, 0xffffffff));
n = llong(0, 0xffffffff);
LLAssert((n + llong(0, 1)) == llong(1, 0));
LLAssert(n == llong(0, 0xffffffff));
}
// operator*=, operator*
// small and large values, positive, &NEGative, zero
// also test commutivity
{
const llong ZERO;
const llong ONE(0, 1);
const llong NEG_ONE((int32_t)-1);
const llong THREE(0, 3);
const llong NEG_THREE((int32_t)-3);
const llong TWO_TO_16(0, 0x10000);
const llong NEG_TWO_TO_16 = -TWO_TO_16;
const llong TWO_TO_32(1, 0);
const llong NEG_TWO_TO_32 = -TWO_TO_32;
const llong NINE(0, 9);
const llong NEG_NINE = -NINE;
const llong TWO_TO_16X3(0, 0x00030000);
const llong NEG_TWO_TO_16X3 = -TWO_TO_16X3;
const llong TWO_TO_32X3(3, 0);
const llong NEG_TWO_TO_32X3 = -TWO_TO_32X3;
const llong TWO_TO_48(0x10000, 0);
const llong NEG_TWO_TO_48 = -TWO_TO_48;
const llong* values[] = {
&ZERO, &ONE, &NEG_ONE, &THREE, &NEG_THREE, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_32, &NEG_TWO_TO_32
};
const llong* answers[][9] = {
{ &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO },
{ &ZERO, &ONE, &NEG_ONE, &THREE, &NEG_THREE, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_32, &NEG_TWO_TO_32 },
{ &ZERO, &NEG_ONE, &ONE, &NEG_THREE, &THREE, &NEG_TWO_TO_16, &TWO_TO_16, &NEG_TWO_TO_32, &TWO_TO_32 },
{ &ZERO, &THREE, &NEG_THREE, &NINE, &NEG_NINE, &TWO_TO_16X3, &NEG_TWO_TO_16X3, &TWO_TO_32X3, &NEG_TWO_TO_32X3 },
{ &ZERO, &NEG_THREE, &THREE, &NEG_NINE, &NINE, &NEG_TWO_TO_16X3, &TWO_TO_16X3, &NEG_TWO_TO_32X3, &TWO_TO_32X3 },
{ &ZERO, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_16X3, &NEG_TWO_TO_16X3, &TWO_TO_32, &NEG_TWO_TO_32, &TWO_TO_48, &NEG_TWO_TO_48 },
{ &ZERO, &NEG_TWO_TO_16, &TWO_TO_16, &NEG_TWO_TO_16X3, &TWO_TO_16X3, &NEG_TWO_TO_32, &TWO_TO_32, &NEG_TWO_TO_48, &TWO_TO_48 },
{ &ZERO, &TWO_TO_32, &NEG_TWO_TO_32, &TWO_TO_32X3, &NEG_TWO_TO_32X3, &TWO_TO_48, &NEG_TWO_TO_48, &ZERO, &ZERO },
{ &ZERO, &NEG_TWO_TO_32, &TWO_TO_32, &NEG_TWO_TO_32X3, &TWO_TO_32X3, &NEG_TWO_TO_48, &TWO_TO_48, &ZERO, &ZERO },
};
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
const llong lhs = *values[i];
const llong rhs = *values[j];
const llong ans = *answers[i][j];
llong n = lhs;
LLAssert((n *= rhs) == ans);
LLAssert(n == ans);
n = lhs;
LLAssert((n * rhs) == ans);
LLAssert(n == lhs);
}
}
}
// operator/=, operator/
// test num = 0, div = 0, pos/neg, > 2^32, div > num
{
const llong ZERO;
const llong ONE(0, 1);
const llong NEG_ONE = -ONE;
const llong MAX(0x7fffffff, 0xffffffff);
const llong MIN(0x80000000, 0);
const llong TWO(0, 2);
const llong NEG_TWO = -TWO;
const llong FIVE(0, 5);
const llong NEG_FIVE = -FIVE;
const llong TWO_TO_32(1, 0);
const llong NEG_TWO_TO_32 = -TWO_TO_32;
const llong TWO_TO_32d5 = llong(TWO_TO_32.asDouble()/5.0);
const llong NEG_TWO_TO_32d5 = -TWO_TO_32d5;
const llong TWO_TO_32X5 = TWO_TO_32 * FIVE;
const llong NEG_TWO_TO_32X5 = -TWO_TO_32X5;
const llong* tuples[][3] = { // lhs, rhs, ans
{ &ZERO, &ZERO, &ZERO },
{ &ONE, &ZERO,&MAX },
{ &NEG_ONE, &ZERO, &MIN },
{ &ONE, &ONE, &ONE },
{ &ONE, &NEG_ONE, &NEG_ONE },
{ &NEG_ONE, &ONE, &NEG_ONE },
{ &NEG_ONE, &NEG_ONE, &ONE },
{ &FIVE, &TWO, &TWO },
{ &FIVE, &NEG_TWO, &NEG_TWO },
{ &NEG_FIVE, &TWO, &NEG_TWO },
{ &NEG_FIVE, &NEG_TWO, &TWO },
{ &TWO, &FIVE, &ZERO },
{ &TWO, &NEG_FIVE, &ZERO },
{ &NEG_TWO, &FIVE, &ZERO },
{ &NEG_TWO, &NEG_FIVE, &ZERO },
{ &TWO_TO_32, &TWO_TO_32, &ONE },
{ &TWO_TO_32, &NEG_TWO_TO_32, &NEG_ONE },
{ &NEG_TWO_TO_32, &TWO_TO_32, &NEG_ONE },
{ &NEG_TWO_TO_32, &NEG_TWO_TO_32, &ONE },
{ &TWO_TO_32, &FIVE, &TWO_TO_32d5 },
{ &TWO_TO_32, &NEG_FIVE, &NEG_TWO_TO_32d5 },
{ &NEG_TWO_TO_32, &FIVE, &NEG_TWO_TO_32d5 },
{ &NEG_TWO_TO_32, &NEG_FIVE, &TWO_TO_32d5 },
{ &TWO_TO_32X5, &FIVE, &TWO_TO_32 },
{ &TWO_TO_32X5, &NEG_FIVE, &NEG_TWO_TO_32 },
{ &NEG_TWO_TO_32X5, &FIVE, &NEG_TWO_TO_32 },
{ &NEG_TWO_TO_32X5, &NEG_FIVE, &TWO_TO_32 },
{ &TWO_TO_32X5, &TWO_TO_32, &FIVE },
{ &TWO_TO_32X5, &NEG_TWO_TO_32, &NEG_FIVE },
{ &NEG_TWO_TO_32X5, &NEG_TWO_TO_32, &FIVE },
{ &NEG_TWO_TO_32X5, &TWO_TO_32, &NEG_FIVE }
};
const int TUPLE_COUNT = sizeof(tuples)/sizeof(tuples[0]);
for (int i = 0; i < TUPLE_COUNT; ++i) {
const llong lhs = *tuples[i][0];
const llong rhs = *tuples[i][1];
const llong ans = *tuples[i][2];
llong n = lhs;
if (!((n /= rhs) == ans)) {
errln("fail: (n /= rhs) == ans");
}
LLAssert(n == ans);
n = lhs;
LLAssert((n / rhs) == ans);
LLAssert(n == lhs);
}
}
//operator%=, operator%
{
const llong ZERO;
const llong ONE(0, 1);
const llong TWO(0, 2);
const llong THREE(0,3);
const llong FOUR(0, 4);
const llong FIVE(0, 5);
const llong SIX(0, 6);
const llong NEG_ONE = -ONE;
const llong NEG_TWO = -TWO;
const llong NEG_THREE = -THREE;
const llong NEG_FOUR = -FOUR;
const llong NEG_FIVE = -FIVE;
const llong NEG_SIX = -SIX;
const llong NINETY_NINE(0, 99);
const llong HUNDRED(0, 100);
const llong HUNDRED_ONE(0, 101);
const llong BIG(0x12345678, 0x9abcdef0);
const llong BIG_FIVE(BIG * FIVE);
const llong BIG_FIVEm1 = BIG_FIVE - ONE;
const llong BIG_FIVEp1 = BIG_FIVE + ONE;
const llong* tuples[][3] = {
{ &ZERO, &FIVE, &ZERO },
{ &ONE, &FIVE, &ONE },
{ &TWO, &FIVE, &TWO },
{ &THREE, &FIVE, &THREE },
{ &FOUR, &FIVE, &FOUR },
{ &FIVE, &FIVE, &ZERO },
{ &SIX, &FIVE, &ONE },
{ &ZERO, &NEG_FIVE, &ZERO },
{ &ONE, &NEG_FIVE, &ONE },
{ &TWO, &NEG_FIVE, &TWO },
{ &THREE, &NEG_FIVE, &THREE },
{ &FOUR, &NEG_FIVE, &FOUR },
{ &FIVE, &NEG_FIVE, &ZERO },
{ &SIX, &NEG_FIVE, &ONE },
{ &NEG_ONE, &FIVE, &NEG_ONE },
{ &NEG_TWO, &FIVE, &NEG_TWO },
{ &NEG_THREE, &FIVE, &NEG_THREE },
{ &NEG_FOUR, &FIVE, &NEG_FOUR },
{ &NEG_FIVE, &FIVE, &ZERO },
{ &NEG_SIX, &FIVE, &NEG_ONE },
{ &NEG_ONE, &NEG_FIVE, &NEG_ONE },
{ &NEG_TWO, &NEG_FIVE, &NEG_TWO },
{ &NEG_THREE, &NEG_FIVE, &NEG_THREE },
{ &NEG_FOUR, &NEG_FIVE, &NEG_FOUR },
{ &NEG_FIVE, &NEG_FIVE, &ZERO },
{ &NEG_SIX, &NEG_FIVE, &NEG_ONE },
{ &NINETY_NINE, &FIVE, &FOUR },
{ &HUNDRED, &FIVE, &ZERO },
{ &HUNDRED_ONE, &FIVE, &ONE },
{ &BIG_FIVEm1, &FIVE, &FOUR },
{ &BIG_FIVE, &FIVE, &ZERO },
{ &BIG_FIVEp1, &FIVE, &ONE }
};
const int TUPLE_COUNT = sizeof(tuples)/sizeof(tuples[0]);
for (int i = 0; i < TUPLE_COUNT; ++i) {
const llong lhs = *tuples[i][0];
const llong rhs = *tuples[i][1];
const llong ans = *tuples[i][2];
llong n = lhs;
if (!((n %= rhs) == ans)) {
errln("fail: (n %= rhs) == ans");
}
LLAssert(n == ans);
n = lhs;
LLAssert((n % rhs) == ans);
LLAssert(n == lhs);
}
}
// pow
LLAssert(llong(0, 0).pow(0) == llong(0, 0));
LLAssert(llong(0, 0).pow(2) == llong(0, 0));
LLAssert(llong(0, 2).pow(0) == llong(0, 1));
LLAssert(llong(0, 2).pow(2) == llong(0, 4));
LLAssert(llong(0, 2).pow(32) == llong(1, 0));
LLAssert(llong(0, 5).pow(10) == llong((double)5.0 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5));
// absolute value
{
const llong n(0xffffffff,0xffffffff);
LLAssert(n.abs() == llong(0, 1));
}
// atoll
const char empty[] = { 0 };
const char zero[] = { 0x30, 0 };
const char neg_one[] = { 0x2d, 0x31, 0 };
const char neg_12345[] = { 0x2d, 0x31, 0x32, 0x33, 0x34, 0x35, 0 };
const char big1[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0 };
const char big2[] = { 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0 };
LLAssert(llong::atoll(empty) == llong(0, 0));
LLAssert(llong::atoll(zero) == llong(0, 0));
LLAssert(llong::atoll(neg_one) == llong(0xffffffff, 0xffffffff));
LLAssert(llong::atoll(neg_12345) == -llong(0, 12345));
LLAssert(llong::atoll(big1, 16) == llong(0x12345678, 0x9abcdef0));
LLAssert(llong::atoll(big2, 16) == llong(0xffffffff, 0xffffffff));
// u_atoll
const UChar uempty[] = { 0 };
const UChar uzero[] = { 0x30, 0 };
const UChar uneg_one[] = { 0x2d, 0x31, 0 };
const UChar uneg_12345[] = { 0x2d, 0x31, 0x32, 0x33, 0x34, 0x35, 0 };
const UChar ubig1[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0 };
const UChar ubig2[] = { 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0 };
LLAssert(llong::utoll(uempty) == llong(0, 0));
LLAssert(llong::utoll(uzero) == llong(0, 0));
LLAssert(llong::utoll(uneg_one) == llong(0xffffffff, 0xffffffff));
LLAssert(llong::utoll(uneg_12345) == -llong(0, 12345));
LLAssert(llong::utoll(ubig1, 16) == llong(0x12345678, 0x9abcdef0));
LLAssert(llong::utoll(ubig2, 16) == llong(0xffffffff, 0xffffffff));
// lltoa
{
char buf[64]; // ascii
LLAssert((llong(0, 0).lltoa(buf, sizeof(buf)) == 1) && (strcmp(buf, zero) == 0));
LLAssert((llong(0xffffffff, 0xffffffff).lltoa(buf, sizeof(buf)) == 2) && (strcmp(buf, neg_one) == 0));
LLAssert(((-llong(0, 12345)).lltoa(buf, sizeof(buf)) == 6) && (strcmp(buf, neg_12345) == 0));
LLAssert((llong(0x12345678, 0x9abcdef0).lltoa(buf, sizeof(buf), 16) == 16) && (strcmp(buf, big1) == 0));
}
// u_lltoa
{
UChar buf[64];
LLAssert((llong(0, 0).lltou(buf, sizeof(buf)) == 1) && (ustrcmp(buf, uzero) == 0));
LLAssert((llong(0xffffffff, 0xffffffff).lltou(buf, sizeof(buf)) == 2) && (ustrcmp(buf, uneg_one) == 0));
LLAssert(((-llong(0, 12345)).lltou(buf, sizeof(buf)) == 6) && (ustrcmp(buf, uneg_12345) == 0));
LLAssert((llong(0x12345678, 0x9abcdef0).lltou(buf, sizeof(buf), 16) == 16) && (ustrcmp(buf, ubig1) == 0));
}
}
void
IntlTestRBNF::TestEnglishSpellout()
{

View file

@ -30,6 +30,11 @@ class IntlTestRBNF : public IntlTest {
*/
virtual void TestFractionalRuleSet();
/**
* Perform API tests on llong
*/
virtual void TestLLong();
/**
* Perform a simple spot check on the English spellout rules
*/