summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-03-18 18:29:10 +0100
committerFabrice Bellard <fabrice@bellard.org>2025-03-18 18:29:10 +0100
commit61e8b9442840bf94a2a9b0b872c8b3a197c1eac3 (patch)
treea9a3bee4f06eed73e9ea9a440c3193cb5b613501 /tests
parent837a69758874339a75560d99cea665f1966799c8 (diff)
downloadquickjs-61e8b9442840bf94a2a9b0b872c8b3a197c1eac3.tar.gz
quickjs-61e8b9442840bf94a2a9b0b872c8b3a197c1eac3.zip
removed bignum support and qjscalc - added optimized BigInt implementation
Diffstat (limited to 'tests')
-rw-r--r--tests/microbench.js33
-rw-r--r--tests/test_bigfloat.js279
-rw-r--r--tests/test_bigint.js249
-rw-r--r--tests/test_bignum.js114
-rw-r--r--tests/test_op_overloading.js207
-rw-r--r--tests/test_qjscalc.js256
6 files changed, 255 insertions, 883 deletions
diff --git a/tests/microbench.js b/tests/microbench.js
index 63790b6..871770e 100644
--- a/tests/microbench.js
+++ b/tests/microbench.js
@@ -687,29 +687,6 @@ function float_arith(n)
return n * 1000;
}
-function bigfloat_arith(n)
-{
- var i, j, sum, a, incr, a0;
- global_res = 0;
- a0 = BigFloat("0.1");
- incr = BigFloat("1.1");
- for(j = 0; j < n; j++) {
- sum = 0;
- a = a0;
- for(i = 0; i < 1000; i++) {
- sum += a * a;
- a += incr;
- }
- global_res += sum;
- }
- return n * 1000;
-}
-
-function float256_arith(n)
-{
- return BigFloatEnv.setPrec(bigfloat_arith.bind(null, n), 237, 19);
-}
-
function bigint_arith(n, bits)
{
var i, j, sum, a, incr, a0, sum0;
@@ -728,6 +705,11 @@ function bigint_arith(n, bits)
return n * 1000;
}
+function bigint32_arith(n)
+{
+ return bigint_arith(n, 32);
+}
+
function bigint64_arith(n)
{
return bigint_arith(n, 64);
@@ -1231,13 +1213,10 @@ function main(argc, argv, g)
if (typeof BigInt === "function") {
/* BigInt test */
+ test_list.push(bigint32_arith);
test_list.push(bigint64_arith);
test_list.push(bigint256_arith);
}
- if (typeof BigFloat === "function") {
- /* BigFloat test */
- test_list.push(float256_arith);
- }
test_list.push(sort_bench);
for (i = 1; i < argc;) {
diff --git a/tests/test_bigfloat.js b/tests/test_bigfloat.js
deleted file mode 100644
index c35fb72..0000000
--- a/tests/test_bigfloat.js
+++ /dev/null
@@ -1,279 +0,0 @@
-"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) {}
-
-/*----------------*/
-
-/* 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_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]);
-}
-
-function test_bigfloat()
-{
- var e, a, b, sqrt2;
-
- assert(typeof 1n === "bigint");
- assert(typeof 1l === "bigfloat");
- assert(1 == 1.0l);
- assert(1 !== 1.0l);
-
- test_less(2l, 3l);
- test_eq(3l, 3l);
-
- test_less(2, 3l);
- test_eq(3, 3l);
-
- test_less(2.1, 3l);
- test_eq(Math.sqrt(9), 3l);
-
- test_less(2n, 3l);
- test_eq(3n, 3l);
-
- e = new BigFloatEnv(128);
- assert(e.prec == 128);
- a = BigFloat.sqrt(2l, e);
- assert(a === BigFloat.parseFloat("0x1.6a09e667f3bcc908b2fb1366ea957d3e", 0, e));
- assert(e.inexact === true);
- assert(BigFloat.fpRound(a) == 0x1.6a09e667f3bcc908b2fb1366ea95l);
-
- b = BigFloatEnv.setPrec(BigFloat.sqrt.bind(null, 2), 128);
- assert(a === b);
-
- assert(BigFloat.isNaN(BigFloat(NaN)));
- assert(BigFloat.isFinite(1l));
- assert(!BigFloat.isFinite(1l/0l));
-
- assert(BigFloat.abs(-3l) === 3l);
- assert(BigFloat.sign(-3l) === -1l);
-
- assert(BigFloat.exp(0.2l) === 1.2214027581601698339210719946396742l);
- assert(BigFloat.log(3l) === 1.0986122886681096913952452369225256l);
- assert(BigFloat.pow(2.1l, 1.6l) === 3.277561666451861947162828744873745l);
-
- assert(BigFloat.sin(-1l) === -0.841470984807896506652502321630299l);
- assert(BigFloat.cos(1l) === 0.5403023058681397174009366074429766l);
- assert(BigFloat.tan(0.1l) === 0.10033467208545054505808004578111154l);
-
- assert(BigFloat.asin(0.3l) === 0.30469265401539750797200296122752915l);
- assert(BigFloat.acos(0.4l) === 1.1592794807274085998465837940224159l);
- assert(BigFloat.atan(0.7l) === 0.610725964389208616543758876490236l);
- assert(BigFloat.atan2(7.1l, -5.1l) === 2.1937053809751415549388104628759813l);
-
- assert(BigFloat.floor(2.5l) === 2l);
- assert(BigFloat.ceil(2.5l) === 3l);
- assert(BigFloat.trunc(-2.5l) === -2l);
- assert(BigFloat.round(2.5l) === 3l);
-
- assert(BigFloat.fmod(3l,2l) === 1l);
- assert(BigFloat.remainder(3l,2l) === -1l);
-
- /* string conversion */
- assert((1234.125l).toString(), "1234.125");
- assert((1234.125l).toFixed(2), "1234.13");
- assert((1234.125l).toFixed(2, "down"), "1234.12");
- assert((1234.125l).toExponential(), "1.234125e+3");
- assert((1234.125l).toExponential(5), "1.23413e+3");
- assert((1234.125l).toExponential(5, BigFloatEnv.RNDZ), "1.23412e+3");
- assert((1234.125l).toPrecision(6), "1234.13");
- assert((1234.125l).toPrecision(6, BigFloatEnv.RNDZ), "1234.12");
-
- /* string conversion with binary base */
- assert((0x123.438l).toString(16), "123.438");
- assert((0x323.438l).toString(16), "323.438");
- assert((0x723.438l).toString(16), "723.438");
- assert((0xf23.438l).toString(16), "f23.438");
- assert((0x123.438l).toFixed(2, BigFloatEnv.RNDNA, 16), "123.44");
- assert((0x323.438l).toFixed(2, BigFloatEnv.RNDNA, 16), "323.44");
- assert((0x723.438l).toFixed(2, BigFloatEnv.RNDNA, 16), "723.44");
- assert((0xf23.438l).toFixed(2, BigFloatEnv.RNDNA, 16), "f23.44");
- assert((0x0.0000438l).toFixed(6, BigFloatEnv.RNDNA, 16), "0.000044");
- assert((0x1230000000l).toFixed(1, BigFloatEnv.RNDNA, 16), "1230000000.0");
- assert((0x123.438l).toPrecision(5, BigFloatEnv.RNDNA, 16), "123.44");
- assert((0x123.438l).toPrecision(5, BigFloatEnv.RNDZ, 16), "123.43");
- assert((0x323.438l).toPrecision(5, BigFloatEnv.RNDNA, 16), "323.44");
- assert((0x723.438l).toPrecision(5, BigFloatEnv.RNDNA, 16), "723.44");
- assert((-0xf23.438l).toPrecision(5, BigFloatEnv.RNDD, 16), "-f23.44");
- assert((0x123.438l).toExponential(4, BigFloatEnv.RNDNA, 16), "1.2344p+8");
-}
-
-function test_bigdecimal()
-{
- assert(1m === 1m);
- assert(1m !== 2m);
- test_less(1m, 2m);
- test_eq(2m, 2m);
-
- test_less(1, 2m);
- test_eq(2, 2m);
-
- test_less(1.1, 2m);
- test_eq(Math.sqrt(4), 2m);
-
- test_less(2n, 3m);
- test_eq(3n, 3m);
-
- assert(BigDecimal("1234.1") === 1234.1m);
- assert(BigDecimal(" 1234.1") === 1234.1m);
- assert(BigDecimal(" 1234.1 ") === 1234.1m);
-
- assert(BigDecimal(0.1) === 0.1m);
- assert(BigDecimal(123) === 123m);
- assert(BigDecimal(true) === 1m);
-
- assert(123m + 1m === 124m);
- assert(123m - 1m === 122m);
-
- assert(3.2m * 3m === 9.6m);
- assert(10m / 2m === 5m);
- assertThrows(RangeError, () => { 10m / 3m } );
-
- assert(10m % 3m === 1m);
- assert(-10m % 3m === -1m);
-
- assert(1234.5m ** 3m === 1881365963.625m);
- assertThrows(RangeError, () => { 2m ** 3.1m } );
- assertThrows(RangeError, () => { 2m ** -3m } );
-
- assert(BigDecimal.sqrt(2m,
- { roundingMode: "half-even",
- maximumSignificantDigits: 4 }) === 1.414m);
- assert(BigDecimal.sqrt(101m,
- { roundingMode: "half-even",
- maximumFractionDigits: 3 }) === 10.050m);
- assert(BigDecimal.sqrt(0.002m,
- { roundingMode: "half-even",
- maximumFractionDigits: 3 }) === 0.045m);
-
- assert(BigDecimal.round(3.14159m,
- { roundingMode: "half-even",
- maximumFractionDigits: 3 }) === 3.142m);
-
- assert(BigDecimal.add(3.14159m, 0.31212m,
- { roundingMode: "half-even",
- maximumFractionDigits: 2 }) === 3.45m);
- assert(BigDecimal.sub(3.14159m, 0.31212m,
- { roundingMode: "down",
- maximumFractionDigits: 2 }) === 2.82m);
- assert(BigDecimal.mul(3.14159m, 0.31212m,
- { roundingMode: "half-even",
- maximumFractionDigits: 3 }) === 0.981m);
- assert(BigDecimal.mod(3.14159m, 0.31211m,
- { roundingMode: "half-even",
- maximumFractionDigits: 4 }) === 0.0205m);
- assert(BigDecimal.div(20m, 3m,
- { roundingMode: "half-even",
- maximumSignificantDigits: 3 }) === 6.67m);
- assert(BigDecimal.div(20m, 3m,
- { roundingMode: "half-even",
- maximumFractionDigits: 50 }) ===
- 6.66666666666666666666666666666666666666666666666667m);
-
- /* string conversion */
- assert((1234.125m).toString(), "1234.125");
- assert((1234.125m).toFixed(2), "1234.13");
- assert((1234.125m).toFixed(2, "down"), "1234.12");
- assert((1234.125m).toExponential(), "1.234125e+3");
- assert((1234.125m).toExponential(5), "1.23413e+3");
- assert((1234.125m).toExponential(5, "down"), "1.23412e+3");
- assert((1234.125m).toPrecision(6), "1234.13");
- assert((1234.125m).toPrecision(6, "down"), "1234.12");
- assert((-1234.125m).toPrecision(6, "floor"), "-1234.13");
-}
-
-test_bigint_ext();
-test_bigfloat();
-test_bigdecimal();
diff --git a/tests/test_bigint.js b/tests/test_bigint.js
new file mode 100644
index 0000000..a0d028c
--- /dev/null
+++ b/tests/test_bigint.js
@@ -0,0 +1,249 @@
+"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_bigint3()
+{
+ assert(Number(0xffffffffffffffffn), 18446744073709552000);
+ assert(Number(-0xffffffffffffffffn), -18446744073709552000);
+ assert(100000000000000000000n == 1e20, true);
+ assert(100000000000000000001n == 1e20, false);
+ assert((1n << 100n).toString(10), "1267650600228229401496703205376");
+ assert((-1n << 100n).toString(36), "-3ewfdnca0n6ld1ggvfgg");
+ assert((1n << 100n).toString(8), "2000000000000000000000000000000000");
+
+ assert(0x5a4653ca673768565b41f775n << 78n, 8443945299673273647701379149826607537748959488376832n);
+ assert(-0x5a4653ca673768565b41f775n << 78n, -8443945299673273647701379149826607537748959488376832n);
+ assert(0x5a4653ca673768565b41f775n >> 78n, 92441n);
+ assert(-0x5a4653ca673768565b41f775n >> 78n, -92442n);
+
+ assert(~0x5a653ca6n, -1516584103n);
+ assert(0x5a463ca6n | 0x67376856n, 2138537206n);
+ assert(0x5a463ca6n & 0x67376856n, 1107699718n);
+ assert(0x5a463ca6n ^ 0x67376856n, 1030837488n);
+
+ assert(3213213213213213432453243n / 123434343439n, 26031760073331n);
+ assert(-3213213213213213432453243n / 123434343439n, -26031760073331n);
+ assert(-3213213213213213432453243n % -123434343439n, -26953727934n);
+ assert(3213213213213213432453243n % 123434343439n, 26953727934n);
+
+ assert((-2n) ** 127n, -170141183460469231731687303715884105728n);
+ assert((2n) ** 127n, 170141183460469231731687303715884105728n);
+ assert((-256n) ** 11n, -309485009821345068724781056n);
+ assert((7n) ** 20n, 79792266297612001n);
+}
+
+/* pi computation */
+
+/* return floor(log2(a)) for a > 0 and 0 for a = 0 */
+function floor_log2(a)
+{
+ var k_max, a1, k, i;
+ k_max = 0n;
+ while ((a >> (2n ** k_max)) != 0n) {
+ k_max++;
+ }
+ k = 0n;
+ a1 = a;
+ for(i = k_max - 1n; i >= 0n; i--) {
+ a1 = a >> (2n ** i);
+ if (a1 != 0n) {
+ a = a1;
+ k |= (1n << i);
+ }
+ }
+ return k;
+}
+
+/* return ceil(log2(a)) for a > 0 */
+function ceil_log2(a)
+{
+ return floor_log2(a - 1n) + 1n;
+}
+
+/* return floor(sqrt(a)) (not efficient but simple) */
+function int_sqrt(a)
+{
+ var l, u, s;
+ if (a == 0n)
+ return a;
+ l = ceil_log2(a);
+ u = 1n << ((l + 1n) / 2n);
+ /* u >= floor(sqrt(a)) */
+ for(;;) {
+ s = u;
+ u = ((a / s) + s) / 2n;
+ if (u >= s)
+ break;
+ }
+ return s;
+}
+
+/* return pi * 2**prec */
+function calc_pi(prec) {
+ const CHUD_A = 13591409n;
+ const CHUD_B = 545140134n;
+ const CHUD_C = 640320n;
+ const CHUD_C3 = 10939058860032000n; /* C^3/24 */
+ const CHUD_BITS_PER_TERM = 47.11041313821584202247; /* log2(C/12)*3 */
+
+ /* return [P, Q, G] */
+ function chud_bs(a, b, need_G) {
+ var c, P, Q, G, P1, Q1, G1, P2, Q2, G2;
+ if (a == (b - 1n)) {
+ G = (2n * b - 1n) * (6n * b - 1n) * (6n * b - 5n);
+ P = G * (CHUD_B * b + CHUD_A);
+ if (b & 1n)
+ P = -P;
+ Q = b * b * b * CHUD_C3;
+ } else {
+ c = (a + b) >> 1n;
+ [P1, Q1, G1] = chud_bs(a, c, true);
+ [P2, Q2, G2] = chud_bs(c, b, need_G);
+ P = P1 * Q2 + P2 * G1;
+ Q = Q1 * Q2;
+ if (need_G)
+ G = G1 * G2;
+ else
+ G = 0n;
+ }
+ return [P, Q, G];
+ }
+
+ var n, P, Q, G;
+ /* number of serie terms */
+ n = BigInt(Math.ceil(Number(prec) / CHUD_BITS_PER_TERM)) + 10n;
+ [P, Q, G] = chud_bs(0n, n, false);
+ Q = (CHUD_C / 12n) * (Q << prec) / (P + Q * CHUD_A);
+ G = int_sqrt(CHUD_C << (2n * prec));
+ return (Q * G) >> prec;
+}
+
+function compute_pi(n_digits) {
+ var r, n_digits, n_bits, out;
+ /* we add more bits to reduce the probability of bad rounding for
+ the last digits */
+ n_bits = BigInt(Math.ceil(n_digits * Math.log2(10))) + 32n;
+ r = calc_pi(n_bits);
+ r = ((10n ** BigInt(n_digits)) * r) >> n_bits;
+ out = r.toString();
+ return out[0] + "." + out.slice(1);
+}
+
+function test_pi()
+{
+ assert(compute_pi(2000), "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009");
+}
+
+test_bigint1();
+test_bigint2();
+test_bigint3();
+test_pi();
diff --git a/tests/test_bignum.js b/tests/test_bignum.js
deleted file mode 100644
index 1520d82..0000000
--- a/tests/test_bignum.js
+++ /dev/null
@@ -1,114 +0,0 @@
-"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") } );
-}
-
-test_bigint1();
-test_bigint2();
diff --git a/tests/test_op_overloading.js b/tests/test_op_overloading.js
deleted file mode 100644
index 269abb2..0000000
--- a/tests/test_op_overloading.js
+++ /dev/null
@@ -1,207 +0,0 @@
-"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 + ")" : ""));
-}
-
-/* operators overloading with Operators.create() */
-function test_operators_create() {
- class Vec2
- {
- constructor(x, y) {
- this.x = x;
- this.y = y;
- }
- static mul_scalar(p1, a) {
- var r = new Vec2();
- r.x = p1.x * a;
- r.y = p1.y * a;
- return r;
- }
- toString() {
- return "Vec2(" + this.x + "," + this.y + ")";
- }
- }
-
- Vec2.prototype[Symbol.operatorSet] = Operators.create(
- {
- "+"(p1, p2) {
- var r = new Vec2();
- r.x = p1.x + p2.x;
- r.y = p1.y + p2.y;
- return r;
- },
- "-"(p1, p2) {
- var r = new Vec2();
- r.x = p1.x - p2.x;
- r.y = p1.y - p2.y;
- return r;
- },
- "=="(a, b) {
- return a.x == b.x && a.y == b.y;
- },
- "<"(a, b) {
- var r;
- /* lexicographic order */
- if (a.x == b.x)
- r = (a.y < b.y);
- else
- r = (a.x < b.x);
- return r;
- },
- "++"(a) {
- var r = new Vec2();
- r.x = a.x + 1;
- r.y = a.y + 1;
- return r;
- }
- },
- {
- left: Number,
- "*"(a, b) {
- return Vec2.mul_scalar(b, a);
- }
- },
- {
- right: Number,
- "*"(a, b) {
- return Vec2.mul_scalar(a, b);
- }
- });
-
- var a = new Vec2(1, 2);
- var b = new Vec2(3, 4);
- var r;
-
- r = a * 2 + 3 * b;
- assert(r.x === 11 && r.y === 16);
- assert(a == a, true);
- assert(a == b, false);
- assert(a != a, false);
- assert(a < b, true);
- assert(a <= b, true);
- assert(b < a, false);
- assert(b <= a, false);
- assert(a <= a, true);
- assert(a >= a, true);
- a++;
- assert(a.x === 2 && a.y === 3);
- r = ++a;
- assert(a.x === 3 && a.y === 4);
- assert(r === a);
-}
-
-/* operators overloading thru inheritance */
-function test_operators()
-{
- var Vec2;
-
- function mul_scalar(p1, a) {
- var r = new Vec2();
- r.x = p1.x * a;
- r.y = p1.y * a;
- return r;
- }
-
- var vec2_ops = Operators({
- "+"(p1, p2) {
- var r = new Vec2();
- r.x = p1.x + p2.x;
- r.y = p1.y + p2.y;
- return r;
- },
- "-"(p1, p2) {
- var r = new Vec2();
- r.x = p1.x - p2.x;
- r.y = p1.y - p2.y;
- return r;
- },
- "=="(a, b) {
- return a.x == b.x && a.y == b.y;
- },
- "<"(a, b) {
- var r;
- /* lexicographic order */
- if (a.x == b.x)
- r = (a.y < b.y);
- else
- r = (a.x < b.x);
- return r;
- },
- "++"(a) {
- var r = new Vec2();
- r.x = a.x + 1;
- r.y = a.y + 1;
- return r;
- }
- },
- {
- left: Number,
- "*"(a, b) {
- return mul_scalar(b, a);
- }
- },
- {
- right: Number,
- "*"(a, b) {
- return mul_scalar(a, b);
- }
- });
-
- Vec2 = class Vec2 extends vec2_ops
- {
- constructor(x, y) {
- super();
- this.x = x;
- this.y = y;
- }
- toString() {
- return "Vec2(" + this.x + "," + this.y + ")";
- }
- }
-
- var a = new Vec2(1, 2);
- var b = new Vec2(3, 4);
- var r;
-
- r = a * 2 + 3 * b;
- assert(r.x === 11 && r.y === 16);
- assert(a == a, true);
- assert(a == b, false);
- assert(a != a, false);
- assert(a < b, true);
- assert(a <= b, true);
- assert(b < a, false);
- assert(b <= a, false);
- assert(a <= a, true);
- assert(a >= a, true);
- a++;
- assert(a.x === 2 && a.y === 3);
- r = ++a;
- assert(a.x === 3 && a.y === 4);
- assert(r === a);
-}
-
-function test_default_op()
-{
- assert(Object(1) + 2, 3);
- assert(Object(1) + true, 2);
- assert(-Object(1), -1);
-}
-
-test_operators_create();
-test_operators();
-test_default_op();
diff --git a/tests/test_qjscalc.js b/tests/test_qjscalc.js
deleted file mode 100644
index e97dd31..0000000
--- a/tests/test_qjscalc.js
+++ /dev/null
@@ -1,256 +0,0 @@
-"use math";
-"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 pow(a, n)
-{
- var r, i;
- r = 1;
- for(i = 0; i < n; i++)
- r *= a;
- return r;
-}
-
-function test_integer()
-{
- var a, r;
- a = pow(3, 100);
- assert((a - 1) != a);
- assert(a == 515377520732011331036461129765621272702107522001);
- assert(a == 0x5a4653ca673768565b41f775d6947d55cf3813d1);
- assert(Integer.isInteger(1) === true);
- assert(Integer.isInteger(1.0) === false);
-
- assert(Integer.floorLog2(0) === -1);
- assert(Integer.floorLog2(7) === 2);
-
- r = 1 << 31;
- assert(r, 2147483648, "1 << 31 === 2147483648");
-
- r = 1 << 32;
- assert(r, 4294967296, "1 << 32 === 4294967296");
-
- r = (1 << 31) < 0;
- assert(r, false, "(1 << 31) < 0 === false");
-
- assert(typeof 1 === "number");
- assert(typeof 9007199254740991 === "number");
- assert(typeof 9007199254740992 === "bigint");
-}
-
-function test_float()
-{
- assert(typeof 1.0 === "bigfloat");
- assert(1 == 1.0);
- assert(1 !== 1.0);
-}
-
-/* jscalc tests */
-
-function test_modulo()
-{
- var i, p, a, b;
-
- /* Euclidian modulo operator */
- assert((-3) % 2 == 1);
- assert(3 % (-2) == 1);
-
- p = 101;
- for(i = 1; i < p; i++) {
- a = Integer.invmod(i, p);
- assert(a >= 0 && a < p);
- assert((i * a) % p == 1);
- }
-
- assert(Integer.isPrime(2^107-1));
- assert(!Integer.isPrime((2^107-1) * (2^89-1)));
- a = Integer.factor((2^89-1)*2^3*11*13^2*1009);
- assert(a == [ 2,2,2,11,13,13,1009,618970019642690137449562111 ]);
-}
-
-function test_fraction()
-{
- assert((1/3 + 1).toString(), "4/3")
- assert((2/3)^30, 1073741824/205891132094649);
- assert(1/3 < 2/3);
- assert(1/3 < 1);
- assert(1/3 == 1.0/3);
- assert(1.0/3 < 2/3);
-}
-
-function test_mod()
-{
- var a, b, p;
-
- a = Mod(3, 101);
- b = Mod(-1, 101);
- assert((a + b) == Mod(2, 101));
- assert(a ^ 100 == Mod(1, 101));
-
- p = 2 ^ 607 - 1; /* mersenne prime */
- a = Mod(3, p) ^ (p - 1);
- assert(a == Mod(1, p));
-}
-
-function test_polynomial()
-{
- var a, b, q, r, t, i;
- a = (1 + X) ^ 4;
- assert(a == X^4+4*X^3+6*X^2+4*X+1);
-
- r = (1 + X);
- q = (1+X+X^2);
- b = (1 - X^2);
- a = q * b + r;
- t = Polynomial.divrem(a, b);
- assert(t[0] == q);
- assert(t[1] == r);
-
- a = 1 + 2*X + 3*X^2;
- assert(a.apply(0.1) == 1.23);
-
- a = 1-2*X^2+2*X^3;
- assert(deriv(a) == (6*X^2-4*X));
- assert(deriv(integ(a)) == a);
-
- a = (X-1)*(X-2)*(X-3)*(X-4)*(X-0.1);
- r = polroots(a);
- for(i = 0; i < r.length; i++) {
- b = abs(a.apply(r[i]));
- assert(b <= 1e-13);
- }
-}
-
-function test_poly_mod()
-{
- var a, p;
-
- /* modulo using polynomials */
- p = X^2 + X + 1;
- a = PolyMod(3+X, p) ^ 10;
- assert(a == PolyMod(-3725*X-18357, p));
-
- a = PolyMod(1/X, 1+X^2);
- assert(a == PolyMod(-X, X^2+1));
-}
-
-function test_rfunc()
-{
- var a;
- a = (X+1)/((X+1)*(X-1));
- assert(a == 1/(X-1));
- a = (X + 2) / (X - 2);
- assert(a.apply(1/3) == -7/5);
-
- assert(deriv((X^2-X+1)/(X-1)) == (X^2-2*X)/(X^2-2*X+1));
-}
-
-function test_series()
-{
- var a, b;
- a = 1+X+O(X^5);
- b = a.inverse();
- assert(b == 1-X+X^2-X^3+X^4+O(X^5));
- assert(deriv(b) == -1+2*X-3*X^2+4*X^3+O(X^4));
- assert(deriv(integ(b)) == b);
-
- a = Series(1/(1-X), 5);
- assert(a == 1+X+X^2+X^3+X^4+O(X^5));
- b = a.apply(0.1);
- assert(b == 1.1111);
-
- assert(exp(3*X^2+O(X^10)) == 1+3*X^2+9/2*X^4+9/2*X^6+27/8*X^8+O(X^10));
- assert(sin(X+O(X^6)) == X-1/6*X^3+1/120*X^5+O(X^6));
- assert(cos(X+O(X^6)) == 1-1/2*X^2+1/24*X^4+O(X^6));
- assert(tan(X+O(X^8)) == X+1/3*X^3+2/15*X^5+17/315*X^7+O(X^8));
- assert((1+X+O(X^6))^(2+X) == 1+2*X+2*X^2+3/2*X^3+5/6*X^4+5/12*X^5+O(X^6));
-}
-
-function test_matrix()
-{
- var a, b, r;
- a = [[1, 2],[3, 4]];
- b = [3, 4];
- r = a * b;
- assert(r == [11, 25]);
- r = (a^-1) * 2;
- assert(r == [[-4, 2],[3, -1]]);
-
- assert(norm2([1,2,3]) == 14);
-
- assert(diag([1,2,3]) == [ [ 1, 0, 0 ], [ 0, 2, 0 ], [ 0, 0, 3 ] ]);
- assert(trans(a) == [ [ 1, 3 ], [ 2, 4 ] ]);
- assert(trans([1,2,3]) == [[1,2,3]]);
- assert(trace(a) == 5);
-
- assert(charpoly(Matrix.hilbert(4)) == X^4-176/105*X^3+3341/12600*X^2-41/23625*X+1/6048000);
- assert(det(Matrix.hilbert(4)) == 1/6048000);
-
- a = [[1,2,1],[-2,-3,1],[3,5,0]];
- assert(rank(a) == 2);
- assert(ker(a) == [ [ 5 ], [ -3 ], [ 1 ] ]);
-
- assert(dp([1, 2, 3], [3, -4, -7]) === -26);
- assert(cp([1, 2, 3], [3, -4, -7]) == [ -2, 16, -10 ]);
-}
-
-function assert_eq(a, ref)
-{
- assert(abs(a / ref - 1.0) <= 1e-15);
-}
-
-function test_trig()
-{
- assert_eq(sin(1/2), 0.479425538604203);
- assert_eq(sin(2+3*I), 9.154499146911428-4.168906959966565*I);
- assert_eq(cos(2+3*I), -4.189625690968807-9.109227893755337*I);
- assert_eq((2+0.5*I)^(1.1-0.5*I), 2.494363021357619-0.23076804554558092*I);
- assert_eq(sqrt(2*I), 1 + I);
-}
-
-test_integer();
-test_float();
-
-test_modulo();
-test_fraction();
-test_mod();
-test_polynomial();
-test_poly_mod();
-test_rfunc();
-test_series();
-test_matrix();
-test_trig();