quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

test_qjscalc.js (5860B)


      1 "use math";
      2 "use strict";
      3 
      4 function assert(actual, expected, message) {
      5     if (arguments.length == 1)
      6         expected = true;
      7 
      8     if (actual === expected)
      9         return;
     10 
     11     if (actual !== null && expected !== null
     12     &&  typeof actual == 'object' && typeof expected == 'object'
     13     &&  actual.toString() === expected.toString())
     14         return;
     15 
     16     throw Error("assertion failed: got |" + actual + "|" +
     17                 ", expected |" + expected + "|" +
     18                 (message ? " (" + message + ")" : ""));
     19 }
     20 
     21 function assertThrows(err, func)
     22 {
     23     var ex;
     24     ex = false;
     25     try {
     26         func();
     27     } catch(e) {
     28         ex = true;
     29         assert(e instanceof err);
     30     }
     31     assert(ex, true, "exception expected");
     32 }
     33 
     34 // load more elaborate version of assert if available
     35 try { __loadScript("test_assert.js"); } catch(e) {}
     36 
     37 /*----------------*/
     38 
     39 function pow(a, n)
     40 {
     41     var r, i;
     42     r = 1;
     43     for(i = 0; i < n; i++)
     44         r *= a;
     45     return r;
     46 }
     47 
     48 function test_integer()
     49 {
     50     var a, r;
     51     a = pow(3, 100);
     52     assert((a - 1) != a);
     53     assert(a == 515377520732011331036461129765621272702107522001);
     54     assert(a == 0x5a4653ca673768565b41f775d6947d55cf3813d1);
     55     assert(Integer.isInteger(1) === true);
     56     assert(Integer.isInteger(1.0) === false);
     57 
     58     assert(Integer.floorLog2(0) === -1);
     59     assert(Integer.floorLog2(7) === 2);
     60 
     61     r = 1 << 31;
     62     assert(r, 2147483648, "1 << 31 === 2147483648");
     63 
     64     r = 1 << 32;
     65     assert(r, 4294967296, "1 << 32 === 4294967296");
     66 
     67     r = (1 << 31) < 0;
     68     assert(r, false, "(1 << 31) < 0 === false");
     69 
     70     assert(typeof 1 === "number");
     71     assert(typeof 9007199254740991 === "number");
     72     assert(typeof 9007199254740992 === "bigint");
     73 }
     74 
     75 function test_float()
     76 {
     77     assert(typeof 1.0 === "bigfloat");
     78     assert(1 == 1.0);
     79     assert(1 !== 1.0);
     80 }
     81 
     82 /* jscalc tests */
     83 
     84 function test_modulo()
     85 {
     86     var i, p, a, b;
     87 
     88     /* Euclidian modulo operator */
     89     assert((-3) % 2 == 1);
     90     assert(3 % (-2) == 1);
     91 
     92     p = 101;
     93     for(i = 1; i < p; i++) {
     94         a = Integer.invmod(i, p);
     95         assert(a >= 0 && a < p);
     96         assert((i * a) % p == 1);
     97     }
     98 
     99     assert(Integer.isPrime(2^107-1));
    100     assert(!Integer.isPrime((2^107-1) * (2^89-1)));
    101     a = Integer.factor((2^89-1)*2^3*11*13^2*1009);
    102     assert(a == [ 2,2,2,11,13,13,1009,618970019642690137449562111 ]);
    103 }
    104 
    105 function test_fraction()
    106 {
    107     assert((1/3 + 1).toString(), "4/3")
    108     assert((2/3)^30, 1073741824/205891132094649);
    109     assert(1/3 < 2/3);
    110     assert(1/3 < 1);
    111     assert(1/3 == 1.0/3);
    112     assert(1.0/3 < 2/3);
    113 }
    114 
    115 function test_mod()
    116 {
    117     var a, b, p;
    118 
    119     a = Mod(3, 101);
    120     b = Mod(-1, 101);
    121     assert((a + b) == Mod(2, 101));
    122     assert(a ^ 100 == Mod(1, 101));
    123 
    124     p = 2 ^ 607 - 1; /* mersenne prime */
    125     a = Mod(3, p) ^ (p - 1);
    126     assert(a == Mod(1, p));
    127 }
    128 
    129 function test_polynomial()
    130 {
    131     var a, b, q, r, t, i;
    132     a = (1 + X) ^ 4;
    133     assert(a == X^4+4*X^3+6*X^2+4*X+1);
    134 
    135     r = (1 + X);
    136     q = (1+X+X^2);
    137     b = (1 - X^2);
    138     a = q * b + r;
    139     t = Polynomial.divrem(a, b);
    140     assert(t[0] == q);
    141     assert(t[1] == r);
    142 
    143     a = 1 + 2*X + 3*X^2;
    144     assert(a.apply(0.1) == 1.23);
    145 
    146     a = 1-2*X^2+2*X^3;
    147     assert(deriv(a) == (6*X^2-4*X));
    148     assert(deriv(integ(a)) == a);
    149 
    150     a = (X-1)*(X-2)*(X-3)*(X-4)*(X-0.1);
    151     r = polroots(a);
    152     for(i = 0; i < r.length; i++) {
    153         b = abs(a.apply(r[i]));
    154         assert(b <= 1e-13);
    155     }
    156 }
    157 
    158 function test_poly_mod()
    159 {
    160     var a, p;
    161 
    162     /* modulo using polynomials */
    163     p = X^2 + X + 1;
    164     a = PolyMod(3+X, p) ^ 10;
    165     assert(a == PolyMod(-3725*X-18357, p));
    166 
    167     a = PolyMod(1/X, 1+X^2);
    168     assert(a == PolyMod(-X, X^2+1));
    169 }
    170 
    171 function test_rfunc()
    172 {
    173     var a;
    174     a = (X+1)/((X+1)*(X-1));
    175     assert(a == 1/(X-1));
    176     a = (X + 2) / (X - 2);
    177     assert(a.apply(1/3) == -7/5);
    178 
    179     assert(deriv((X^2-X+1)/(X-1)) == (X^2-2*X)/(X^2-2*X+1));
    180 }
    181 
    182 function test_series()
    183 {
    184     var a, b;
    185     a = 1+X+O(X^5);
    186     b = a.inverse();
    187     assert(b == 1-X+X^2-X^3+X^4+O(X^5));
    188     assert(deriv(b) == -1+2*X-3*X^2+4*X^3+O(X^4));
    189     assert(deriv(integ(b)) == b);
    190 
    191     a = Series(1/(1-X), 5);
    192     assert(a == 1+X+X^2+X^3+X^4+O(X^5));
    193     b = a.apply(0.1);
    194     assert(b == 1.1111);
    195 
    196     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));
    197     assert(sin(X+O(X^6)) == X-1/6*X^3+1/120*X^5+O(X^6));
    198     assert(cos(X+O(X^6)) == 1-1/2*X^2+1/24*X^4+O(X^6));
    199     assert(tan(X+O(X^8)) == X+1/3*X^3+2/15*X^5+17/315*X^7+O(X^8));
    200         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));
    201 }
    202 
    203 function test_matrix()
    204 {
    205     var a, b, r;
    206     a = [[1, 2],[3, 4]];
    207     b = [3, 4];
    208     r = a * b;
    209     assert(r == [11, 25]);
    210     r = (a^-1) * 2;
    211     assert(r == [[-4, 2],[3, -1]]);
    212 
    213     assert(norm2([1,2,3]) == 14);
    214 
    215     assert(diag([1,2,3]) == [ [ 1, 0, 0 ], [ 0, 2, 0 ], [ 0, 0, 3 ] ]);
    216     assert(trans(a) == [ [ 1, 3 ], [ 2, 4 ] ]);
    217     assert(trans([1,2,3]) == [[1,2,3]]);
    218     assert(trace(a) == 5);
    219 
    220     assert(charpoly(Matrix.hilbert(4)) == X^4-176/105*X^3+3341/12600*X^2-41/23625*X+1/6048000);
    221     assert(det(Matrix.hilbert(4)) == 1/6048000);
    222 
    223     a = [[1,2,1],[-2,-3,1],[3,5,0]];
    224     assert(rank(a) == 2);
    225     assert(ker(a) == [ [ 5 ], [ -3 ], [ 1 ] ]);
    226 
    227     assert(dp([1, 2, 3], [3, -4, -7]) === -26);
    228     assert(cp([1, 2, 3], [3, -4, -7]) == [ -2, 16, -10 ]);
    229 }
    230 
    231 function assert_eq(a, ref)
    232 {
    233     assert(abs(a / ref - 1.0) <= 1e-15);
    234 }
    235 
    236 function test_trig()
    237 {
    238     assert_eq(sin(1/2), 0.479425538604203);
    239     assert_eq(sin(2+3*I), 9.154499146911428-4.168906959966565*I);
    240     assert_eq(cos(2+3*I), -4.189625690968807-9.109227893755337*I);
    241     assert_eq((2+0.5*I)^(1.1-0.5*I), 2.494363021357619-0.23076804554558092*I);
    242     assert_eq(sqrt(2*I), 1 + I);
    243 }
    244 
    245 test_integer();
    246 test_float();
    247 
    248 test_modulo();
    249 test_fraction();
    250 test_mod();
    251 test_polynomial();
    252 test_poly_mod();
    253 test_rfunc();
    254 test_series();
    255 test_matrix();
    256 test_trig();