aureooms-js-integer
Version:
integer code bricks for JavaScript
88 lines (73 loc) • 1.99 kB
JavaScript
import test from 'ava' ;
import { randint } from 'aureooms-js-random' ;
import * as integer from '../../../src' ;
var check = function(ctor, r, e){
var endianess = (e === integer.badd_t) ? 'big endian' : 'little endian' ;
var name = `integer.add (${ctor.name}, ${r}, ${endianess})` ;
var todouble_t = function(r, e){
if(e === integer.badd_t){
return function(a, i0, i1){
var x = 0, y = 1;
while(--i1 >= i0){
x += a[i1] * y;
y *= r;
}
return x;
};
}
else{
return function(a, i0, i1){
var x = 0, y = 1;
while(i0 < i1){
x += a[i0] * y;
y *= r;
++i0;
}
return x;
};
}
};
var todouble = todouble_t(r, e);
var add = e(r);
var lsb = function(a){ return e === integer.badd_t ? a.length - 1 : 0; };
test(name, function(assert){
var n = 10, m = 10, i, j;
var OP = [];
var RE = [];
var LO = [];
for(i = 0; i < m; ++i){
RE.push([]);
LO.push([]);
OP.push(new ctor(2));
OP[i][lsb(OP[i])] = randint(0, r);
}
for(j = m; j < m + n; ++j){
RE.push([]);
LO.push([]);
OP.push(new ctor(1));
OP[j][0] = randint(0, r);
}
for(i = 0; i < m + n; ++i){
for(j = i; j < m + n; ++j){
var a = OP[i][lsb(OP[i])];
var b = OP[j][lsb(OP[j])];
var sum = a + b;
RE[i][j] = new ctor(2);
LO[i][j] = new ctor(1);
add(OP[i], 0, OP[i].length, OP[j], 0, OP[j].length, RE[i][j], 0, 2);
add(OP[i], lsb(OP[i]), lsb(OP[i])+1, OP[j], lsb(OP[j]), lsb(OP[j]) + 1, LO[i][j], 0, 1);
assert.deepEqual(todouble(RE[i][j], 0, 2), sum, a + ' + ' + b + ' ' + RE[i][j][0] + ' ' + RE[i][j][1]);
assert.deepEqual(LO[i][j][0], sum % r, a + ' + ' + b + ' % ' + r);
}
}
});
};
var TRAITS = [
[Uint8Array, Math.pow(2, 8)],
[Uint16Array, Math.pow(2, 16)],
[Uint32Array, Math.pow(2, 32)]
];
var ENDIANESS = [integer.badd_t, integer.ladd_t];
for(var i = 0; i < TRAITS.length; ++i)
for(var j = 0; j < ENDIANESS.length; ++j)
check(TRAITS[i][0], TRAITS[i][1], ENDIANESS[j]);