152 lines
3.3 KiB
JavaScript
152 lines
3.3 KiB
JavaScript
"use strict";
|
|
|
|
function assert(actual, expected, message) {
|
|
if (arguments.length == 1)
|
|
expected = true;
|
|
|
|
if (actual === expected)
|
|
return;
|
|
|
|
if (actual !== null && expected !== null
|
|
&& typeof actual == 'object' && typeof expected == 'object'
|
|
&& actual.toString() === expected.toString())
|
|
return;
|
|
|
|
throw Error("assertion failed: got |" + actual + "|" +
|
|
", expected |" + expected + "|" +
|
|
(message ? " (" + message + ")" : ""));
|
|
}
|
|
|
|
function assertThrows(err, func)
|
|
{
|
|
var ex;
|
|
ex = false;
|
|
try {
|
|
func();
|
|
} catch(e) {
|
|
ex = true;
|
|
assert(e instanceof err);
|
|
}
|
|
assert(ex, true, "exception expected");
|
|
}
|
|
|
|
// load more elaborate version of assert if available
|
|
try { __loadScript("test_assert.js"); } catch(e) {}
|
|
|
|
/*----------------*/
|
|
|
|
function bigint_pow(a, n)
|
|
{
|
|
var r, i;
|
|
r = 1n;
|
|
for(i = 0n; i < n; i++)
|
|
r *= a;
|
|
return r;
|
|
}
|
|
|
|
/* a must be < b */
|
|
function test_less(a, b)
|
|
{
|
|
assert(a < b);
|
|
assert(!(b < a));
|
|
assert(a <= b);
|
|
assert(!(b <= a));
|
|
assert(b > a);
|
|
assert(!(a > b));
|
|
assert(b >= a);
|
|
assert(!(a >= b));
|
|
assert(a != b);
|
|
assert(!(a == b));
|
|
}
|
|
|
|
/* a must be numerically equal to b */
|
|
function test_eq(a, b)
|
|
{
|
|
assert(a == b);
|
|
assert(b == a);
|
|
assert(!(a != b));
|
|
assert(!(b != a));
|
|
assert(a <= b);
|
|
assert(b <= a);
|
|
assert(!(a < b));
|
|
assert(a >= b);
|
|
assert(b >= a);
|
|
assert(!(a > b));
|
|
}
|
|
|
|
function test_bigint1()
|
|
{
|
|
var a, r;
|
|
|
|
test_less(2n, 3n);
|
|
test_eq(3n, 3n);
|
|
|
|
test_less(2, 3n);
|
|
test_eq(3, 3n);
|
|
|
|
test_less(2.1, 3n);
|
|
test_eq(Math.sqrt(4), 2n);
|
|
|
|
a = bigint_pow(3n, 100n);
|
|
assert((a - 1n) != a);
|
|
assert(a == 515377520732011331036461129765621272702107522001n);
|
|
assert(a == 0x5a4653ca673768565b41f775d6947d55cf3813d1n);
|
|
|
|
r = 1n << 31n;
|
|
assert(r, 2147483648n, "1 << 31n === 2147483648n");
|
|
|
|
r = 1n << 32n;
|
|
assert(r, 4294967296n, "1 << 32n === 4294967296n");
|
|
}
|
|
|
|
function test_bigint2()
|
|
{
|
|
assert(BigInt(""), 0n);
|
|
assert(BigInt(" 123"), 123n);
|
|
assert(BigInt(" 123 "), 123n);
|
|
assertThrows(SyntaxError, () => { BigInt("+") } );
|
|
assertThrows(SyntaxError, () => { BigInt("-") } );
|
|
assertThrows(SyntaxError, () => { BigInt("\x00a") } );
|
|
assertThrows(SyntaxError, () => { BigInt(" 123 r") } );
|
|
}
|
|
|
|
function test_divrem(div1, a, b, q)
|
|
{
|
|
var div, divrem, t;
|
|
div = BigInt[div1];
|
|
divrem = BigInt[div1 + "rem"];
|
|
assert(div(a, b) == q);
|
|
t = divrem(a, b);
|
|
assert(t[0] == q);
|
|
assert(a == b * q + t[1]);
|
|
}
|
|
|
|
function test_idiv1(div, a, b, r)
|
|
{
|
|
test_divrem(div, a, b, r[0]);
|
|
test_divrem(div, -a, b, r[1]);
|
|
test_divrem(div, a, -b, r[2]);
|
|
test_divrem(div, -a, -b, r[3]);
|
|
}
|
|
|
|
/* QuickJS BigInt extensions */
|
|
function test_bigint_ext()
|
|
{
|
|
var r;
|
|
assert(BigInt.floorLog2(0n) === -1n);
|
|
assert(BigInt.floorLog2(7n) === 2n);
|
|
|
|
assert(BigInt.sqrt(0xffffffc000000000000000n) === 17592185913343n);
|
|
r = BigInt.sqrtrem(0xffffffc000000000000000n);
|
|
assert(r[0] === 17592185913343n);
|
|
assert(r[1] === 35167191957503n);
|
|
|
|
test_idiv1("tdiv", 3n, 2n, [1n, -1n, -1n, 1n]);
|
|
test_idiv1("fdiv", 3n, 2n, [1n, -2n, -2n, 1n]);
|
|
test_idiv1("cdiv", 3n, 2n, [2n, -1n, -1n, 2n]);
|
|
test_idiv1("ediv", 3n, 2n, [1n, -2n, -1n, 2n]);
|
|
}
|
|
|
|
test_bigint1();
|
|
test_bigint2();
|
|
test_bigint_ext();
|