162a8b7409
Not purely cosmetic because it breaks navigation with { and } in the One True Editor.
139 lines
2.9 KiB
JavaScript
139 lines
2.9 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_bigint_map()
|
|
{
|
|
var m = new Map();
|
|
assert(m.size, 0);
|
|
|
|
for (let i = 0n; i < 1337n; i++) {
|
|
const r = m.set(i, i.toString());
|
|
assert(r, m);
|
|
}
|
|
assert(m.size, 1337);
|
|
|
|
for (let i = 0n; i < 1337n; i++) {
|
|
const r = m.get(i);
|
|
assert(r, i.toString());
|
|
}
|
|
assert(m.get(1337n), undefined);
|
|
assert(m.size, 1337);
|
|
|
|
for (let i = 0n; i < 1337n; i++)
|
|
assert(m.delete(i));
|
|
assert(!m.delete(1337n));
|
|
assert(m.size, 0);
|
|
}
|
|
|
|
test_bigint1();
|
|
test_bigint2();
|
|
test_bigint_map();
|