blob: d596e5df88a6455e08896827efdbd8699a080c04 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.lang;
import com.google.gwt.lang.LongLib.Const;
import com.google.gwt.lang.LongLibBase.LongEmul;
import junit.framework.TestCase;
/**
* Test the LongLib class. The magic numbers being testing against were computed
* by using a Java println on normal Java longs.
*/
public class LongLibTestBase extends TestCase {
static {
LongLibBase.RUN_IN_JVM = true;
}
static void assertEquals(LongEmul expected, LongEmul actual) {
assertTrue("expected=" + LongLib.toString(expected) + " actual="
+ LongLib.toString(actual), LongLib.eq(expected, actual));
}
public void testAdditive() {
{
final LongEmul n1 = LongLib.fromInt(1234);
final LongEmul n2 = LongLib.fromInt(9876);
assertEquals(LongLib.fromInt(11110), LongLib.add(n1, n2));
assertEquals(LongLib.fromInt(-8642), LongLib.sub(n1, n2));
}
{
final LongEmul n1 = LongLib.fromInt(-1234);
final LongEmul n2 = LongLib.fromInt(9876);
assertEquals(LongLib.fromInt(8642), LongLib.add(n1, n2));
assertEquals(LongLib.fromInt(-11110), LongLib.sub(n1, n2));
}
{
final LongEmul n1 = LongLib.fromInt(-1234);
final LongEmul n2 = LongLib.fromInt(-9876);
assertEquals(LongLib.fromInt(-11110), LongLib.add(n1, n2));
assertEquals(LongLib.fromInt(8642), LongLib.sub(n1, n2));
}
{
final LongEmul n1 = longFromBits(0x12345678, 0xabcdabcd);
final LongEmul n2 = longFromBits(0x77773333, 0x22224444);
assertEquals(longFromBits(0x89ab89ab, 0xcdeff011), LongLib.add(n1, n2));
assertEquals(longFromBits(0x9abd2345, 0x89ab6789), LongLib.sub(n1, n2));
}
}
public void testBitOps() {
{
final LongEmul n1 = LongLib.fromInt(1234);
final LongEmul n2 = LongLib.fromInt(9876);
assertEquals(LongLib.fromInt(1168), LongLib.and(n1, n2));
assertEquals(LongLib.fromInt(9942), LongLib.or(n1, n2));
assertEquals(LongLib.fromInt(8774), LongLib.xor(n1, n2));
assertEquals(LongLib.fromInt(-1235), LongLib.not(n1));
assertEquals(LongLib.fromInt(-9877), LongLib.not(n2));
}
{
final LongEmul n1 = LongLib.fromInt(-1234);
final LongEmul n2 = LongLib.fromInt(9876);
assertEquals(LongLib.fromInt(8708), LongLib.and(n1, n2));
assertEquals(LongLib.fromInt(-66), LongLib.or(n1, n2));
assertEquals(LongLib.fromInt(-8774), LongLib.xor(n1, n2));
assertEquals(LongLib.fromInt(1233), LongLib.not(n1));
assertEquals(LongLib.fromInt(-9877), LongLib.not(n2));
}
{
final LongEmul n1 = LongLib.shl(LongLib.fromInt(0x1234), 32);
final LongEmul n2 = LongLib.shl(LongLib.fromInt(0x9876), 32);
assertEquals(LongLib.shl(LongLib.fromInt(0x1034), 32),
LongLib.and(n1, n2));
assertEquals(LongLib.shl(LongLib.fromInt(0x9a76), 32), LongLib.or(n1, n2));
assertEquals(LongLib.shl(LongLib.fromInt(0x8a42), 32),
LongLib.xor(n1, n2));
assertEquals(longFromBits(0xffffedcb, 0xffffffff), LongLib.not(n1));
assertEquals(longFromBits(0xffff6789, 0xffffffff), LongLib.not(n2));
}
}
public void testComparisons() {
assertTrue(LongLib.lt(LongLib.fromInt(10), LongLib.fromInt(11)));
assertTrue(LongLib.lte(LongLib.fromInt(10), LongLib.fromInt(11)));
assertTrue(!LongLib.eq(LongLib.fromInt(10), LongLib.fromInt(11)));
assertTrue(!LongLib.gte(LongLib.fromInt(10), LongLib.fromInt(11)));
assertTrue(!LongLib.gt(LongLib.fromInt(10), LongLib.fromInt(11)));
assertTrue(!LongLib.lt(LongLib.fromInt(10), LongLib.fromInt(10)));
assertTrue(LongLib.lte(LongLib.fromInt(10), LongLib.fromInt(10)));
assertTrue(LongLib.eq(LongLib.fromInt(10), LongLib.fromInt(10)));
assertTrue(LongLib.gte(LongLib.fromInt(10), LongLib.fromInt(10)));
assertTrue(!LongLib.gt(LongLib.fromInt(10), LongLib.fromInt(10)));
assertTrue(!LongLib.lt(LongLib.fromInt(12), LongLib.fromInt(11)));
assertTrue(!LongLib.lte(LongLib.fromInt(12), LongLib.fromInt(11)));
assertTrue(!LongLib.eq(LongLib.fromInt(12), LongLib.fromInt(11)));
assertTrue(LongLib.gte(LongLib.fromInt(12), LongLib.fromInt(11)));
assertTrue(LongLib.gt(LongLib.fromInt(12), LongLib.fromInt(11)));
assertTrue(LongLib.gt(LongLib.fromInt(-10), LongLib.fromInt(-11)));
assertTrue(LongLib.gt(LongLib.fromInt(10), LongLib.fromInt(-11)));
assertTrue(!LongLib.gt(LongLib.fromInt(-10), LongLib.fromInt(11)));
assertTrue(LongLib.gte(LongLib.fromInt(-10), LongLib.fromInt(-11)));
assertTrue(LongLib.gte(LongLib.fromInt(-10), LongLib.fromInt(-10)));
assertTrue(!LongLib.lt(LongLib.fromInt(-10), LongLib.fromInt(-11)));
assertTrue(!LongLib.lte(LongLib.fromInt(-10), LongLib.fromInt(-11)));
assertTrue(LongLib.lte(LongLib.fromInt(-10), LongLib.fromInt(-10)));
assertTrue(LongLib.eq(LongLib.fromInt(-10), LongLib.fromInt(-10)));
assertTrue(!LongLib.neq(LongLib.fromInt(-10), LongLib.fromInt(-10)));
// the following three comparisons cannot be implemented by
// subtracting the arguments, because the subtraction causes an overflow
final LongEmul largeNeg = longFromBits(0x82341234, 0x0);
final LongEmul largePos = longFromBits(0x12341234, 0x0);
assertTrue(LongLib.lt(largeNeg, largePos));
assertTrue(LongLib.lt(Const.MIN_VALUE, LongLib.fromInt(0)));
assertTrue(LongLib.gt(LongLib.fromInt(0), Const.MIN_VALUE));
final LongEmul largePosPlusOne = LongLib.add(largePos, LongLib.fromInt(1));
assertTrue(LongLib.lt(largePos, largePosPlusOne));
assertTrue(LongLib.lte(largePos, largePosPlusOne));
assertTrue(!LongLib.eq(largePos, largePosPlusOne));
assertTrue(!LongLib.gte(largePos, largePosPlusOne));
assertTrue(!LongLib.gt(largePos, largePosPlusOne));
assertTrue(!LongLib.lt(largePos, largePos));
assertTrue(LongLib.lte(largePos, largePos));
assertTrue(LongLib.eq(largePos, largePos));
assertTrue(LongLib.gte(largePos, largePos));
assertTrue(!LongLib.gt(largePos, largePos));
assertTrue(!LongLib.lt(largePosPlusOne, largePos));
assertTrue(!LongLib.lte(largePosPlusOne, largePos));
assertTrue(!LongLib.eq(largePosPlusOne, largePos));
assertTrue(LongLib.gte(largePosPlusOne, largePos));
assertTrue(LongLib.gt(largePosPlusOne, largePos));
}
public void testConversions() {
assertEquals(10, LongLib.toInt(longFromBits(0, 10)));
assertEquals(-10, LongLib.toInt(longFromBits(0, -10)));
assertEquals(-10, LongLib.toInt(longFromBits(100, -10)));
assertEquals(-10, LongLib.toInt(longFromBits(-100000, -10)));
}
public void testDiv() {
LongEmul deadBeef = longFromBits(0xdeadbeef, 0xdeadbeef);
LongEmul ten = LongLib.fromInt(10);
assertEquals(longFromBits(0xfcaaf97e, 0x63115fe5), LongLib.div(
deadBeef, ten));
assertEquals(Const.ZERO, LongLib.div(Const.ONE, Const.TWO));
assertEquals(longFromBits(0x3fffffff, 0xffffffff), LongLib.div(
Const.MAX_VALUE, Const.TWO));
assertEquals(Const.ZERO, LongLib.div(Const.ZERO, LongLib.fromInt(1000)));
assertEquals(Const.ONE, LongLib.div(Const.MIN_VALUE, Const.MIN_VALUE));
assertEquals(Const.ZERO, LongLib.div(LongLib.fromInt(1000), Const.MIN_VALUE));
assertEquals("-1125899906842624", LongLib.toString(LongLib.div(Const.MIN_VALUE, LongLib.fromInt(8192))));
assertEquals("-1125762484664320", LongLib.toString(LongLib.div(Const.MIN_VALUE, LongLib.fromInt(8193))));
assertEquals(Const.ZERO, LongLib.div(LongLib.fromInt(-1000), LongLib.fromInt(8192)));
assertEquals(Const.ZERO, LongLib.div(LongLib.fromInt(-1000), LongLib.fromInt(8193)));
assertEquals(LongLib.fromInt(-122070), LongLib.div(LongLib.fromInt(-1000000000), LongLib.fromInt(8192)));
assertEquals(LongLib.fromInt(-122055), LongLib.div(LongLib.fromInt(-1000000000), LongLib.fromInt(8193)));
assertEquals(LongLib.fromInt(122070), LongLib.div(LongLib.fromInt(1000000000), LongLib.fromInt(8192)));
assertEquals(LongLib.fromInt(122055), LongLib.div(LongLib.fromInt(1000000000), LongLib.fromInt(8193)));
assertEquals(longFromBits(0x1fffff, 0xffffffff), LongLib.div(Const.MAX_VALUE, longFromBits(0x00000000, 0x00000400)));
assertEquals(longFromBits(0x1fff, 0xffffffff), LongLib.div(Const.MAX_VALUE, longFromBits(0x00000000, 0x00040000)));
assertEquals(longFromBits(0x1f, 0xffffffff), LongLib.div(Const.MAX_VALUE, longFromBits(0x00000000, 0x04000000)));
assertEquals(LongLib.fromInt(536870911), LongLib.div(Const.MAX_VALUE, longFromBits(0x00000004, 0x00000000)));
assertEquals(LongLib.fromInt(2097151), LongLib.div(Const.MAX_VALUE, longFromBits(0x00000400, 0x00000000)));
assertEquals(LongLib.fromInt(8191), LongLib.div(Const.MAX_VALUE, longFromBits(0x00040000, 0x00000000)));
assertEquals(LongLib.fromInt(31), LongLib.div(Const.MAX_VALUE, longFromBits(0x04000000, 0x00000000)));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00000000, 0x00000300));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00000000, 0x30000000));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00300000, 0x00000000));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00300000, 0x00000300));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00300000, 0x30000000));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00000000, 0x30000300));
LongLib.div(Const.MAX_VALUE, longFromBits(0x00300000, 0x30000300));
}
public void testFactorial() {
LongEmul fact18 = fact(LongLib.fromInt(18));
LongEmul fact17 = fact(LongLib.fromInt(17));
assertEquals(LongLib.fromInt(18), LongLib.div(fact18, fact17));
}
public void testFromDouble() {
assertEquals("4611686018427387904", LongLib.toString(LongLib.fromDouble(Math.pow(2, 62))));
assertEquals("35184372088832", LongLib.toString(LongLib.fromDouble(Math.pow(2, 45))));
assertEquals("35184372088832", LongLib.toString(LongLib.fromDouble(Math.pow(2, 45))));
assertEquals("17592186044417", LongLib.toString(LongLib.fromDouble(Math.pow(2, 44) + 1)));
assertEquals("17592186044416", LongLib.toString(LongLib.fromDouble(Math.pow(2, 44))));
assertEquals("17592186044415", LongLib.toString(LongLib.fromDouble(Math.pow(2, 44) - 1)));
assertEquals("8796093022208", LongLib.toString(LongLib.fromDouble(Math.pow(2, 43))));
assertEquals(LongLib.fromInt(8388608), LongLib.fromDouble(Math.pow(2, 23)));
assertEquals(LongLib.fromInt(4194305), LongLib.fromDouble(Math.pow(2, 22) + 1));
assertEquals(LongLib.fromInt(4194304), LongLib.fromDouble(Math.pow(2, 22)));
assertEquals(LongLib.fromInt(4194303), LongLib.fromDouble(Math.pow(2, 22) - 1));
assertEquals(LongLib.fromInt(2097152), LongLib.fromDouble(Math.pow(2, 21)));
assertEquals(LongLib.fromInt(1048576), LongLib.fromDouble(Math.pow(2, 20)));
// these tests are based on JLS3, section 5.1.3
assertEquals(LongLib.fromInt(10), LongLib.fromDouble(10.5));
assertEquals(LongLib.fromInt(-10), LongLib.fromDouble(-10.5));
assertEquals(LongLib.shl(LongLib.fromInt(1), 55),
LongLib.fromDouble(Math.pow(2.0, 55) + 0.5));
assertEquals(LongLib.neg(LongLib.shl(LongLib.fromInt(1), 55)),
LongLib.fromDouble(-Math.pow(2.0, 55) - 0.5));
assertEquals(LongLib.fromInt(0), LongLib.fromDouble(Double.NaN));
assertEquals(Const.MAX_VALUE, LongLib.fromDouble(Math.pow(2.0, 100)));
assertEquals(Const.MAX_VALUE, LongLib.fromDouble(Double.POSITIVE_INFINITY));
assertEquals(Const.MIN_VALUE, LongLib.fromDouble(-Math.pow(2.0, 100)));
assertEquals(Const.MIN_VALUE, LongLib.fromDouble(Double.NEGATIVE_INFINITY));
}
public void testMinMax() {
assertEquals(Const.MIN_VALUE, LongLib.shl(LongLib.fromInt(1), 63));
assertEquals(Const.MAX_VALUE, LongLib.neg(LongLib.add(Const.MIN_VALUE,
LongLib.fromInt(1))));
}
public void testMod() {
assertEquals(LongLib.fromInt(0), LongLib.mod(Const.ZERO, LongLib.fromInt(1000)));
assertEquals(LongLib.fromInt(0), LongLib.mod(Const.MIN_VALUE, Const.MIN_VALUE));
assertEquals(LongLib.fromInt(1000), LongLib.mod(LongLib.fromInt(1000), Const.MIN_VALUE));
assertEquals(LongLib.fromInt(0), LongLib.mod(Const.MIN_VALUE, LongLib.fromInt(8192)));
assertEquals(LongLib.fromInt(-2048), LongLib.mod(Const.MIN_VALUE, LongLib.fromInt(8193)));
assertEquals(LongLib.fromInt(-1000), LongLib.mod(LongLib.fromInt(-1000), LongLib.fromInt(8192)));
assertEquals(LongLib.fromInt(-1000), LongLib.mod(LongLib.fromInt(-1000), LongLib.fromInt(8193)));
assertEquals(LongLib.fromInt(-2560), LongLib.mod(LongLib.fromInt(-1000000000), LongLib.fromInt(8192)));
assertEquals(LongLib.fromInt(-3385), LongLib.mod(LongLib.fromInt(-1000000000), LongLib.fromInt(8193)));
assertEquals(LongLib.fromInt(2560), LongLib.mod(LongLib.fromInt(1000000000), LongLib.fromInt(8192)));
assertEquals(LongLib.fromInt(3385), LongLib.mod(LongLib.fromInt(1000000000), LongLib.fromInt(8193)));
assertEquals(longFromBits(0x0, 0x3ff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x00000000, 0x00000400)));
assertEquals(longFromBits(0x0, 0x3ffff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x00000000, 0x00040000)));
assertEquals(longFromBits(0x0, 0x3ffffff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x00000000, 0x04000000)));
assertEquals(longFromBits(0x3, 0xffffffff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x00000004, 0x00000000)));
assertEquals(longFromBits(0x3ff, 0xffffffff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x00000400, 0x00000000)));
assertEquals(longFromBits(0x3ffff, 0xffffffff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x00040000, 0x00000000)));
assertEquals(longFromBits(0x3ffffff, 0xffffffff), LongLib.mod(Const.MAX_VALUE, longFromBits(0x04000000, 0x00000000)));
}
public void testMultiplicative() {
assertEquals(LongLib.fromInt(3333), LongLib.mul(LongLib.fromInt(1111),
LongLib.fromInt(3)));
assertEquals(LongLib.fromInt(-3333), LongLib.mul(LongLib.fromInt(1111),
LongLib.fromInt(-3)));
assertEquals(LongLib.fromInt(-3333), LongLib.mul(LongLib.fromInt(-1111),
LongLib.fromInt(3)));
assertEquals(LongLib.fromInt(3333), LongLib.mul(LongLib.fromInt(-1111),
LongLib.fromInt(-3)));
assertEquals(LongLib.fromInt(0), LongLib.mul(LongLib.fromInt(100),
LongLib.fromInt(0)));
assertEquals(longFromBits(0x7ff63f7c, 0x1df4d840), LongLib.mul(
longFromBits(0x12345678, 0x12345678), longFromBits(0x1234, 0x12345678)));
assertEquals(longFromBits(0x7ff63f7c, 0x1df4d840), LongLib.mul(
longFromBits(0xf2345678, 0x12345678), longFromBits(0x1234, 0x12345678)));
assertEquals(longFromBits(0x297e3f7c, 0x1df4d840), LongLib.mul(
longFromBits(0xf2345678, 0x12345678), longFromBits(0xffff1234,
0x12345678)));
assertEquals(LongLib.fromInt(0), LongLib.mul(Const.MIN_VALUE,
LongLib.fromInt(2)));
assertEquals(Const.MIN_VALUE, LongLib.mul(Const.MIN_VALUE,
LongLib.fromInt(1)));
assertEquals(Const.MIN_VALUE, LongLib.mul(Const.MIN_VALUE,
LongLib.fromInt(-1)));
assertEquals(LongLib.fromInt(1), LongLib.div(LongLib.fromInt(5),
LongLib.fromInt(5)));
assertEquals(LongLib.fromInt(333), LongLib.div(LongLib.fromInt(1000),
LongLib.fromInt(3)));
assertEquals(LongLib.fromInt(-333), LongLib.div(LongLib.fromInt(1000),
LongLib.fromInt(-3)));
assertEquals(LongLib.fromInt(-333), LongLib.div(LongLib.fromInt(-1000),
LongLib.fromInt(3)));
assertEquals(LongLib.fromInt(333), LongLib.div(LongLib.fromInt(-1000),
LongLib.fromInt(-3)));
assertEquals(LongLib.fromInt(0), LongLib.div(LongLib.fromInt(3),
LongLib.fromInt(1000)));
assertEquals(longFromBits(0x1003d0, 0xe84f5ae8), LongLib.div(longFromBits(
0x12345678, 0x12345678), longFromBits(0x0, 0x123)));
assertEquals(longFromBits(0x0, 0x10003), LongLib.div(longFromBits(
0x12345678, 0x12345678), longFromBits(0x1234, 0x12345678)));
assertEquals(longFromBits(0xffffffff, 0xffff3dfe), LongLib.div(
longFromBits(0xf2345678, 0x12345678), longFromBits(0x1234, 0x12345678)));
assertEquals(longFromBits(0x0, 0xeda), LongLib.div(longFromBits(0xf2345678,
0x12345678), longFromBits(0xffff1234, 0x12345678)));
try {
LongLib.div(LongLib.fromInt(1), LongLib.fromInt(0));
fail("Expected an ArithmeticException");
} catch (ArithmeticException e) {
}
assertEquals(longFromBits(0xc0000000, 0x00000000), LongLib.div(
Const.MIN_VALUE, LongLib.fromInt(2)));
assertEquals(Const.MIN_VALUE, LongLib.div(Const.MIN_VALUE,
LongLib.fromInt(1)));
assertEquals(Const.MIN_VALUE, LongLib.div(Const.MIN_VALUE,
LongLib.fromInt(-1))); // JLS3 section 15.17.2
}
public void testNegate() {
assertEquals(LongLib.fromInt(-1), LongLib.neg(LongLib.fromInt(1)));
assertEquals(LongLib.fromInt(1), LongLib.neg(LongLib.fromInt(-1)));
// JLS3 15.15.4
assertEquals(Const.MIN_VALUE, LongLib.neg(Const.MIN_VALUE));
}
public void testShift() {
assertEquals(longFromBits(0xd048d115, 0x9d159c00), LongLib.shl(
longFromBits(0x12341234, 0x45674567), 10));
assertEquals(longFromBits(0x48d04, 0x8d1159d1), LongLib.shr(longFromBits(
0x12341234, 0x45674567), 10));
assertEquals(longFromBits(0x48d04, 0x8d1159d1), LongLib.shru(longFromBits(
0x12341234, 0x45674567), 10));
assertEquals(longFromBits(0xd048d115, 0x9d159c00), LongLib.shl(
longFromBits(0x92341234, 0x45674567), 10));
assertEquals(longFromBits(0xffe48d04, 0x8d1159d1), LongLib.shr(
longFromBits(0x92341234, 0x45674567), 10));
assertEquals(LongLib.fromInt(67108863), LongLib.shr(longFromBits(0xFFFFFFF,
0xFFFFFFFF), 34));
assertEquals(longFromBits(0x248d04, 0x8d1159d1), LongLib.shru(longFromBits(
0x92341234, 0x45674567), 10));
assertEquals(LongLib.fromInt(-1), LongLib.shr(LongLib.fromInt(-1), 10));
assertEquals(LongLib.fromInt(-1), LongLib.shr(LongLib.fromInt(-1), 63));
assertEquals(LongLib.fromInt(-1 << 5), LongLib.shl(LongLib.fromInt(-1), 5));
assertEquals(LongLib.fromInt(-1), LongLib.shl(LongLib.fromInt(-1), 0));
assertEquals(LongLib.neg(longFromBits(0x40000000, 0x00000000)),
LongLib.shr(LongLib.shl(LongLib.fromInt(1), 63), 1));
assertEquals(LongLib.fromInt(0), LongLib.shl(LongLib.shl(
LongLib.fromInt(-1), 32), 32));
assertEquals(Const.MIN_VALUE, LongLib.shl(Const.MIN_VALUE, 0));
assertEquals(LongLib.fromInt(0), LongLib.shl(Const.MIN_VALUE, 1));
assertEquals(longFromBits(0xfffffffc, 0x00000000), LongLib.shr(
LongLib.neg(longFromBits(8, 0)), 1));
assertEquals(longFromBits(0x7ffffffc, 0x0), LongLib.shru(
LongLib.neg(longFromBits(8, 0)), 1));
assertEquals(longFromBits(0x00723456, 0x789abcde), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 8));
assertEquals(longFromBits(0x00007234, 0x56789abc), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 16));
assertEquals(longFromBits(0x00000072, 0x3456789a), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 24));
assertEquals(longFromBits(0x00000007, 0x23456789), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 28));
assertEquals(longFromBits(0x00000000, 0x72345678), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 32));
assertEquals(longFromBits(0x00000000, 0x07234567), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 36));
assertEquals(longFromBits(0x00000000, 0x00723456), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 40));
assertEquals(longFromBits(0x00000000, 0x00072345), LongLib.shr(
longFromBits(0x72345678, 0x9abcde00), 44));
assertEquals(longFromBits(0x00000000, 0x00007234), LongLib.shr(
longFromBits(0x72345678, 0x9abcdef0), 48));
assertEquals(longFromBits(0x00723456, 0x789abcde), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 8));
assertEquals(longFromBits(0x00007234, 0x56789abc), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 16));
assertEquals(longFromBits(0x00000072, 0x3456789a), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 24));
assertEquals(longFromBits(0x00000007, 0x23456789), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 28));
assertEquals(longFromBits(0x00000000, 0x72345678), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 32));
assertEquals(longFromBits(0x00000000, 0x07234567), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 36));
assertEquals(longFromBits(0x00000000, 0x00723456), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 40));
assertEquals(longFromBits(0x00000000, 0x00072345), LongLib.shru(
longFromBits(0x72345678, 0x9abcde00), 44));
assertEquals(longFromBits(0x00000000, 0x00007234), LongLib.shru(
longFromBits(0x72345678, 0x9abcdef0), 48));
assertEquals(longFromBits(0xff923456, 0x789abcde), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 8));
assertEquals(longFromBits(0xffff9234, 0x56789abc), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 16));
assertEquals(longFromBits(0xffffff92, 0x3456789a), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 24));
assertEquals(longFromBits(0xfffffff9, 0x23456789), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 28));
assertEquals(longFromBits(0xffffffff, 0x92345678), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 32));
assertEquals(longFromBits(0xffffffff, 0xf9234567), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 36));
assertEquals(longFromBits(0xffffffff, 0xff923456), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 40));
assertEquals(longFromBits(0xffffffff, 0xfff92345), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 44));
assertEquals(longFromBits(0xffffffff, 0xffff9234), LongLib.shr(
longFromBits(0x92345678, 0x9abcdef0), 48));
assertEquals(longFromBits(0x00923456, 0x789abcde), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 8));
assertEquals(longFromBits(0x00009234, 0x56789abc), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 16));
assertEquals(longFromBits(0x00000092, 0x3456789a), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 24));
assertEquals(longFromBits(0x00000009, 0x23456789), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 28));
assertEquals(longFromBits(0x00000000, 0x92345678), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 32));
assertEquals(longFromBits(0x00000000, 0x09234567), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 36));
assertEquals(longFromBits(0x00000000, 0x00923456), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 40));
assertEquals(longFromBits(0x00000000, 0x00092345), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 44));
assertEquals(longFromBits(0x00000000, 0x00009234), LongLib.shru(
longFromBits(0x92345678, 0x9abcdef0), 48));
}
// Issue 1198, and also a good exercise of several methods.
public void testToHexString() {
LongEmul deadbeaf12341234 = longFromBits(0xdeadbeaf, 0x12341234);
assertEquals("0", toHexString(Const.ZERO));
assertEquals("deadbeaf12341234", toHexString(deadbeaf12341234));
}
public void testToString() {
assertEquals("0", LongLib.toString(LongLib.fromInt(0)));
assertEquals("1", LongLib.toString(LongLib.fromInt(1)));
assertEquals("-1", LongLib.toString(LongLib.fromInt(-1)));
assertEquals("-10", LongLib.toString(LongLib.fromInt(-10)));
assertEquals("-9223372036854775808", LongLib.toString(Const.MIN_VALUE));
int top = 922337201;
int bottom = 967490662;
LongEmul fullnum = LongLib.add(LongLib.mul(LongLib.fromInt(1000000000),
LongLib.fromInt(top)), LongLib.fromInt(bottom));
assertEquals("922337201967490662", LongLib.toString(fullnum));
assertEquals("-922337201967490662", LongLib.toString(LongLib.neg(fullnum)));
}
private LongEmul fact(LongEmul n) {
if (LongLib.eq(n, LongLib.fromInt(0))) {
return LongLib.fromInt(1);
} else {
return LongLib.mul(n, fact(LongLib.sub(n, LongLib.fromInt(1))));
}
}
private LongEmul longFromBits(int top, int bottom) {
LongEmul topHalf = LongLib.shl(LongLib.fromInt(top), 32);
LongEmul bottomHalf = LongLib.fromInt(bottom);
if (LongLib.lt(bottomHalf, Const.ZERO)) {
bottomHalf = LongLib.add(bottomHalf, LongLib.shl(LongLib.fromInt(1), 32));
}
LongEmul total = LongLib.add(topHalf, bottomHalf);
return total;
}
private String toHexString(LongEmul x) {
LongEmul zero = LongLib.fromInt(0);
if (LongLib.eq(x, zero)) {
return "0";
}
String[] hexDigits = new String[] {
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f"};
String hexStr = "";
while (!LongLib.eq(x, zero)) {
int nibble = LongLib.toInt(x) & 0xF;
hexStr = hexDigits[nibble] + hexStr;
x = LongLib.shru(x, 4);
}
return hexStr;
}
}