Permalink
Browse files

now using tap instead of expresso

  • Loading branch information...
1 parent 4935cbb commit e39901e415d085ceec09fbf1c793685ae20b2e09 @substack committed May 18, 2012
Showing with 539 additions and 493 deletions.
  1. +3 −4 package.json
  2. +205 −0 test/arithmetic.js
  3. +0 −437 test/big.js
  4. +15 −0 test/bit_length.js
  5. +49 −0 test/bitwise.js
  6. +43 −34 test/buf.js
  7. +20 −0 test/cmp.js
  8. +27 −0 test/create.js
  9. +11 −0 test/gcd.js
  10. +11 −0 test/invertm.js
  11. +13 −0 test/mod.js
  12. +40 −0 test/pow.js
  13. +58 −0 test/primes.js
  14. +17 −0 test/rand.js
  15. +14 −18 test/seed.js
  16. +13 −0 test/shift.js
View
7 package.json
@@ -23,16 +23,15 @@
"url" : "http://substack.net"
},
"devDependencies" : {
- "expresso" : ">=0.6.0",
- "binary" : ">=0.1.7",
- "put" : ">=0.0.5"
+ "tap" : "~0.2.5",
+ "put" : "~0.0.6"
},
"license" : "MIT/X11",
"engine" : {
"node" : ">=0.2.0"
},
"scripts" : {
"install" : "node-waf configure build",
- "test" : "expresso"
+ "test" : "tap test/*.js"
}
}
View
205 test/arithmetic.js
@@ -0,0 +1,205 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('add', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = (i + j).toString();
+ t.same(bigint(i).add(j).toString(), ks);
+ t.same(bigint(i).add(js).toString(), ks);
+ t.same(bigint(i).add(bigint(j)).toString(), ks);
+ t.same(bigint.add(i, j).toString(), ks);
+ }
+ }
+
+ t.same(
+ bigint(
+ '201781752444966478956292456789265633588628356858680927185287861892'
+ + '9889675589272409635031813235465496971529430565627918846694860512'
+ + '1492948268400884893722767401972695174353441'
+ ).add(
+ '939769862972759638577945343130228368606420083646071622223953046277'
+ + '3784500359975110887672142614667937014937371109558223563373329424'
+ + '0624814097369771481147215472578762824607080'
+ ).toString(),
+ '1141551615417726117534237799919494002195048440504752549409240908170367'
+ + '41759492475205227039558501334339864668016751861424100681899362117762'
+ + '365770656374869982874551457998960521'
+ );
+ t.end();
+});
+
+test('sub', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = (i - j).toString();
+ t.same(bigint(i).sub(j).toString(), ks);
+ t.same(bigint(i).sub(js).toString(), ks);
+ t.same(bigint(i).sub(bigint(j)).toString(), ks);
+ t.same(bigint.sub(i, j).toString(), ks);
+ }
+ }
+
+ t.same(
+ bigint(
+ '635849762218952604062459342660379446997761295162166888134051068531'
+ + '9813941775949841573516110003093332652267534768664621969514455380'
+ + '8051168706779408804756208386011014197185296'
+ ).sub(
+ '757617343536280696839135295661092954931163607913400460585109207644'
+ + '7966483882748233585856350085641718822741649072106343655764769889'
+ + '6399869016678013515043471880323279258685478'
+ ).toString(),
+ '-121767581317328092776675953000713507933402312751233572451058139112815'
+ + '25421067983920123402400825483861704741143034417216862503145088348700'
+ + '309898604710287263494312265061500182'
+ );
+ t.end();
+});
+
+test('mul', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = (i * j).toString();
+ t.same(bigint(i).mul(j).toString(), ks);
+ t.same(bigint(i).mul(js).toString(), ks);
+ t.same(bigint(i).mul(bigint(j)).toString(), ks);
+ t.same(bigint.mul(i, j).toString(), ks);
+ }
+ }
+
+ t.same(
+ bigint(
+ '433593290010590489671135819286259593426549306666324008679782084292'
+ + '2446494189019075159822930571858728009485237489829138626896756141'
+ + '8738958337632249177044975686477011571044266'
+ ).mul(
+ '127790264841901718791915669264129510947625523373763053776083279450'
+ + '3886212911067061184379695097643279217271150419129022856601771338'
+ + '794256383410400076210073482253089544155377'
+ ).toString(),
+ '5540900136412485758752141142221047463857522755277604708501015732755989'
+ + '17659432099233635577634197309727815375309484297883528869192732141328'
+ + '99346769031695550850320602049507618052164677667378189154076988316301'
+ + '23719953859959804490669091769150047414629675184805332001182298088891'
+ + '58079529848220802017396422115936618644438110463469902675126288489182'
+ + '82'
+ );
+
+ t.same(
+ bigint('10000000000000000000000000000').mul(-123).toString(),
+ '-1230000000000000000000000000000'
+ );
+ t.end();
+});
+
+test('div', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = Math.floor(i / j).toString();
+ if (ks.match(/^-?\d+$/)) { // ignore exceptions
+ t.same(bigint(i).div(j).toString(), ks);
+ t.same(bigint(i).div(js).toString(), ks);
+ t.same(bigint(i).div(bigint(j)).toString(), ks);
+ t.same(bigint.div(i, j).toString(), ks);
+ }
+ }
+ }
+
+ t.same(
+ bigint(
+ '433593290010590489671135819286259593426549306666324008679782084292'
+ + '2446494189019075159822930571858728009485237489829138626896756141'
+ + '8738958337632249177044975686477011571044266'
+ ).div(
+ '127790264841901718791915669264129510947625523373763053776083279450'
+ + '3886212911067061184379695097643279217271150419129022856601771338'
+ + '794256383410400076210073482253089544155377'
+ ).toString(),
+ '33'
+ );
+ t.end();
+});
+
+test('abs', function (t) {
+ t.same(
+ bigint(
+ '433593290010590489671135819286259593426549306666324008679782084292'
+ + '2446494189019075159822930571858728009485237489829138626896756141'
+ + '8738958337632249177044975686477011571044266'
+ ).abs().toString(),
+ '4335932900105904896711358192862595934265493066663240086797820842922446'
+ + '49418901907515982293057185872800948523748982913862689675614187389583'
+ + '37632249177044975686477011571044266'
+ );
+
+ t.same(
+ bigint(
+ '-43359329001059048967113581928625959342654930666632400867978208429'
+ + '2244649418901907515982293057185872800948523748982913862689675614'
+ + '18738958337632249177044975686477011571044266'
+ ).abs().toString(),
+ '4335932900105904896711358192862595934265493066663240086797820842922446'
+ + '49418901907515982293057185872800948523748982913862689675614187389583'
+ + '37632249177044975686477011571044266'
+ );
+ t.end();
+});
+
+test('neg', function (t) {
+ t.same(
+ bigint(
+ '433593290010590489671135819286259593426549306666324008679782084292'
+ + '2446494189019075159822930571858728009485237489829138626896756141'
+ + '8738958337632249177044975686477011571044266'
+ ).neg().toString(),
+ '-433593290010590489671135819286259593426549306666324008679782084292244'
+ + '64941890190751598229305718587280094852374898291386268967561418738958'
+ + '337632249177044975686477011571044266'
+ );
+
+ t.same(
+ bigint(
+ '-43359329001059048967113581928625959342654930666632400867978208429'
+ + '2244649418901907515982293057185872800948523748982913862689675614'
+ + '18738958337632249177044975686477011571044266'
+ ).neg().toString(),
+ '4335932900105904896711358192862595934265493066663240086797820842922446'
+ + '49418901907515982293057185872800948523748982913862689675614187389583'
+ + '37632249177044975686477011571044266'
+ );
+ t.end();
+});
+
+test('mod', function (t) {
+ for (var i = 0; i < 10; i++) {
+ for (var j = 0; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ if (!isNaN(i % j)) {
+ var ks = (i % j).toString();
+ t.same(bigint(i).mod(j).toString(), ks);
+ t.same(bigint(i).mod(js).toString(), ks);
+ t.same(bigint(i).mod(bigint(j)).toString(), ks);
+ t.same(bigint.mod(i, j).toString(), ks);
+ }
+ }
+ }
+
+ t.same(
+ bigint('486541542410442549118519277483401413')
+ .mod('1802185856709793916115771381388554')
+ .toString()
+ ,
+ '1753546955507985683376775889880387'
+ );
+ t.end();
+});
View
437 test/big.js
@@ -1,437 +0,0 @@
-var assert = require('assert');
-var bigint = require('../');
-
-exports.create = function () {
- assert.eql(bigint(1337).toString(), '1337');
- assert.eql(bigint('1337').toString(), '1337');
- assert.eql(new bigint('100').toString(), '100');
- assert.eql(
- new bigint('55555555555555555555555555').toString(),
- '55555555555555555555555555'
- );
-
- assert.eql(Number(bigint('1e+100').toString()), 1e+100);
- assert.eql(Number(bigint('1.23e+45').toString()), 1.23e+45);
- for (var i = 0; i < 10; i++) {
- assert.eql(
- bigint('1.23456e+' + i).toString(),
- Math.floor(1.23456 * Math.pow(10,i))
- );
- }
-
- assert.eql(bigint('1.23e-45').toString(), '0');
-
- assert.throws(function() { bigint(undefined); });
- assert.throws(function() { bigint(null); });
-};
-
-exports.add = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = (i + j).toString();
- assert.eql(bigint(i).add(j).toString(), ks);
- assert.eql(bigint(i).add(js).toString(), ks);
- assert.eql(bigint(i).add(bigint(j)).toString(), ks);
- assert.eql(bigint.add(i, j).toString(), ks);
- }
- }
-
- assert.eql(
- bigint(
- '201781752444966478956292456789265633588628356858680927185287861892'
- + '9889675589272409635031813235465496971529430565627918846694860512'
- + '1492948268400884893722767401972695174353441'
- ).add(
- '939769862972759638577945343130228368606420083646071622223953046277'
- + '3784500359975110887672142614667937014937371109558223563373329424'
- + '0624814097369771481147215472578762824607080'
- ).toString(),
- '1141551615417726117534237799919494002195048440504752549409240908170367'
- + '41759492475205227039558501334339864668016751861424100681899362117762'
- + '365770656374869982874551457998960521'
- );
-};
-
-exports.sub = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = (i - j).toString();
- assert.eql(bigint(i).sub(j).toString(), ks);
- assert.eql(bigint(i).sub(js).toString(), ks);
- assert.eql(bigint(i).sub(bigint(j)).toString(), ks);
- assert.eql(bigint.sub(i, j).toString(), ks);
- }
- }
-
- assert.eql(
- bigint(
- '635849762218952604062459342660379446997761295162166888134051068531'
- + '9813941775949841573516110003093332652267534768664621969514455380'
- + '8051168706779408804756208386011014197185296'
- ).sub(
- '757617343536280696839135295661092954931163607913400460585109207644'
- + '7966483882748233585856350085641718822741649072106343655764769889'
- + '6399869016678013515043471880323279258685478'
- ).toString(),
- '-121767581317328092776675953000713507933402312751233572451058139112815'
- + '25421067983920123402400825483861704741143034417216862503145088348700'
- + '309898604710287263494312265061500182'
- );
-};
-
-exports.mul = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = (i * j).toString();
- assert.eql(bigint(i).mul(j).toString(), ks);
- assert.eql(bigint(i).mul(js).toString(), ks);
- assert.eql(bigint(i).mul(bigint(j)).toString(), ks);
- assert.eql(bigint.mul(i, j).toString(), ks);
- }
- }
-
- assert.eql(
- bigint(
- '433593290010590489671135819286259593426549306666324008679782084292'
- + '2446494189019075159822930571858728009485237489829138626896756141'
- + '8738958337632249177044975686477011571044266'
- ).mul(
- '127790264841901718791915669264129510947625523373763053776083279450'
- + '3886212911067061184379695097643279217271150419129022856601771338'
- + '794256383410400076210073482253089544155377'
- ).toString(),
- '5540900136412485758752141142221047463857522755277604708501015732755989'
- + '17659432099233635577634197309727815375309484297883528869192732141328'
- + '99346769031695550850320602049507618052164677667378189154076988316301'
- + '23719953859959804490669091769150047414629675184805332001182298088891'
- + '58079529848220802017396422115936618644438110463469902675126288489182'
- + '82'
- );
-
- assert.eql(
- bigint('10000000000000000000000000000').mul(-123).toString(),
- '-1230000000000000000000000000000'
- );
-};
-
-exports.div = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = Math.floor(i / j).toString();
- if (ks.match(/^-?\d+$/)) { // ignore exceptions
- assert.eql(bigint(i).div(j).toString(), ks);
- assert.eql(bigint(i).div(js).toString(), ks);
- assert.eql(bigint(i).div(bigint(j)).toString(), ks);
- assert.eql(bigint.div(i, j).toString(), ks);
- }
- }
- }
-
- assert.eql(
- bigint(
- '433593290010590489671135819286259593426549306666324008679782084292'
- + '2446494189019075159822930571858728009485237489829138626896756141'
- + '8738958337632249177044975686477011571044266'
- ).div(
- '127790264841901718791915669264129510947625523373763053776083279450'
- + '3886212911067061184379695097643279217271150419129022856601771338'
- + '794256383410400076210073482253089544155377'
- ).toString(),
- '33'
- );
-};
-
-exports.abs = function () {
- assert.eql(
- bigint(
- '433593290010590489671135819286259593426549306666324008679782084292'
- + '2446494189019075159822930571858728009485237489829138626896756141'
- + '8738958337632249177044975686477011571044266'
- ).abs().toString(),
- '4335932900105904896711358192862595934265493066663240086797820842922446'
- + '49418901907515982293057185872800948523748982913862689675614187389583'
- + '37632249177044975686477011571044266'
- );
-
- assert.eql(
- bigint(
- '-43359329001059048967113581928625959342654930666632400867978208429'
- + '2244649418901907515982293057185872800948523748982913862689675614'
- + '18738958337632249177044975686477011571044266'
- ).abs().toString(),
- '4335932900105904896711358192862595934265493066663240086797820842922446'
- + '49418901907515982293057185872800948523748982913862689675614187389583'
- + '37632249177044975686477011571044266'
- );
-};
-
-exports.neg = function () {
- assert.eql(
- bigint(
- '433593290010590489671135819286259593426549306666324008679782084292'
- + '2446494189019075159822930571858728009485237489829138626896756141'
- + '8738958337632249177044975686477011571044266'
- ).neg().toString(),
- '-433593290010590489671135819286259593426549306666324008679782084292244'
- + '64941890190751598229305718587280094852374898291386268967561418738958'
- + '337632249177044975686477011571044266'
- );
-
- assert.eql(
- bigint(
- '-43359329001059048967113581928625959342654930666632400867978208429'
- + '2244649418901907515982293057185872800948523748982913862689675614'
- + '18738958337632249177044975686477011571044266'
- ).neg().toString(),
- '4335932900105904896711358192862595934265493066663240086797820842922446'
- + '49418901907515982293057185872800948523748982913862689675614187389583'
- + '37632249177044975686477011571044266'
- );
-};
-
-exports.mod = function () {
- for (var i = 0; i < 10; i++) {
- for (var j = 0; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- if (!isNaN(i % j)) {
- var ks = (i % j).toString();
- assert.eql(bigint(i).mod(j).toString(), ks);
- assert.eql(bigint(i).mod(js).toString(), ks);
- assert.eql(bigint(i).mod(bigint(j)).toString(), ks);
- assert.eql(bigint.mod(i, j).toString(), ks);
- }
- }
- }
-
- assert.eql(
- bigint('486541542410442549118519277483401413')
- .mod('1802185856709793916115771381388554')
- .toString()
- ,
- '1753546955507985683376775889880387'
- );
-};
-
-exports.cmp = function () {
- for (var i = -10; i <= 10; i++) {
- var bi = bigint(i);
-
- for (var j = -10; j <= 10; j++) {
- [ j, bigint(j) ].forEach(function (jj) {
- assert.eql(bi.lt(jj), i < j);
- assert.eql(bi.le(jj), i <= j);
- assert.eql(bi.eq(jj), i === j);
- assert.eql(bi.ne(jj), i !== j);
- assert.eql(bi.gt(jj), i > j);
- assert.eql(bi.ge(jj), i >= j);
- });
- }
- }
-};
-
-exports.powm = function () {
- var twos = [ 2, '2', bigint(2), bigint('2') ]
- var tens = [ 100000, '100000', bigint(100000), bigint(100000) ];
- twos.forEach(function (two) {
- tens.forEach(function (t) {
- assert.eql(
- bigint('111111111').powm(two, t).toString(),
- '54321'
- );
- });
- });
-
- assert.eql(
- bigint('624387628734576238746587435')
- .powm(2732, '457676874367586')
- .toString()
- ,
- '335581885073251'
- );
-};
-
-exports.pow = function () {
- [ 2, '2', bigint(2), bigint('2') ].forEach(function (two) {
- assert.eql(
- bigint('111111111').pow(two).toString(),
- '12345678987654321'
- );
- });
-
- assert.eql(
- bigint('3487438743234789234879').pow(22).toString(),
- '861281136448465709000943928980299119292959327175552412961995332536782980636409994680542395362634321718164701236369695670918217801815161694902810780084448291245512671429670376051205638247649202527956041058237646154753587769450973231275642223337064356190945030999709422512682440247294915605076918925272414789710234097768366414400280590151549041536921814066973515842848197905763447515344747881160891303219471850554054186959791307149715821010152303317328860351766337716947079041'
- );
-};
-
-exports.and = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = (i & j).toString();
- assert.eql(bigint(i).and(j).toString(), ks);
- assert.eql(bigint(i).and(js).toString(), ks);
- assert.eql(bigint(i).and(bigint(j)).toString(), ks);
- assert.eql(bigint.and(i, j).toString(), ks);
- }
- }
-};
-
-exports.or = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = (i | j).toString();
- assert.eql(bigint(i).or(j).toString(), ks);
- assert.eql(bigint(i).or(js).toString(), ks);
- assert.eql(bigint(i).or(bigint(j)).toString(), ks);
- assert.eql(bigint.or(i, j).toString(), ks);
- }
- }
-};
-
-exports.xor = function () {
- for (var i = -10; i < 10; i++) {
- for (var j = -10; j < 10; j++) {
- var is = i.toString();
- var js = j.toString();
- var ks = (i ^ j).toString();
- assert.eql(bigint(i).xor(j).toString(), ks);
- assert.eql(bigint(i).xor(js).toString(), ks);
- assert.eql(bigint(i).xor(bigint(j)).toString(), ks);
- assert.eql(bigint.xor(i, j).toString(), ks);
- }
- }
-};
-
-exports.rand = function () {
- for (var i = 1; i < 1000; i++) {
- var x = bigint(i).rand().toNumber();
- assert.ok(0 <= x && x < i);
-
- var y = bigint(i).rand(i + 10).toNumber();
- assert.ok(i <= y && y < i + 10);
-
- var z = bigint.rand(i, i + 10).toNumber();
- assert.ok(i <= z && z < i + 10);
- }
-};
-
-exports.primes = function () {
- var ps = { 2 : true, 3 : true, 5 : true, 7 : true };
- for (var i = 0; i <= 10; i++) {
- assert.eql(bigint(i).probPrime(), ps[i] ? true : false);
- }
-
- var ns = {
- 2 : 3,
- 3 : 5,
- 15313 : 15319,
- 222919 : 222931,
- 611939 : 611951,
- 334214459 : '334214467',
- 961748927 : '961748941',
- 9987704933 : '9987704953',
- };
-
- Object.keys(ns).forEach(function (n) {
- assert.eql(
- bigint(n).nextPrime().toString(),
- ns[n].toString()
- );
- });
-
- var uniques = [
- '3', '11', '37', '101', '9091', '9901', '333667', '909091', '99990001',
- '999999000001', '9999999900000001', '909090909090909091',
- '1111111111111111111', '11111111111111111111111',
- '900900900900990990990991',
- ];
-
- var wagstaff = [
- '3', '11', '43', '683', '2731', '43691', '174763', '2796203',
- '715827883', '2932031007403', '768614336404564651',
- '201487636602438195784363', '845100400152152934331135470251',
- '56713727820156410577229101238628035243',
- ];
-
- var big = [
- '4669523849932130508876392554713407521319117239637943224980015676156491',
- '54875133386847519273109693154204970395475080920935355580245252923343305939004903',
- '204005728266090048777253207241416669051476369216501266754813821619984472224780876488344279',
- '2074722246773485207821695222107608587480996474721117292752992589912196684750549658310084416732550077',
- '5628290459057877291809182450381238927697314822133923421169378062922140081498734424133112032854812293',
- ];
-
- [ uniques, wagstaff, big ].forEach(function (xs) {
- xs.forEach(function (x) {
- var p = bigint(x).probPrime();
- assert.ok(p === true || p === 'maybe');
- });
- });
-};
-
-exports.invertm = function () {
- // numbers from http://www.itl.nist.gov/fipspubs/fip186.htm appendix 5
- var q = bigint('b20db0b101df0c6624fc1392ba55f77d577481e5', 16);
- var k = bigint('79577ddcaafddc038b865b19f8eb1ada8a2838c6', 16);
- var kinv = k.invertm(q);
- assert.eql(kinv.toString(16), '2784e3d672d972a74e22c67f4f4f726ecc751efa');
-};
-
-exports.shift = function () {
- assert.eql(bigint(37).shiftLeft(2).toString(), (37 << 2).toString()); // 148
- assert.eql(bigint(37).shiftRight(2).toString(), (37 >> 2).toString()); // 9
-
- assert.equal(
- bigint(2).pow(Math.pow(2,10)).shiftRight(4).toString(),
- bigint(2).pow(Math.pow(2,10)).div(16).toString()
- );
-};
-
-exports.mod = function () {
- assert.eql(bigint(55555).mod(2).toString(), '1');
- assert.eql(
- bigint('1234567').mod(
- bigint('4321')
- ).toNumber(),
- 1234567 % 4321
- );
-};
-
-exports.bitlength = function () {
-
- var bl = bigint(
- '433593290010590489671135819286259593426549306666324008679782084292'
- + '2446494189019075159822930571858728009485237489829138626896756141'
- + '873895833763224917704497568647701157104426'
- ).bitLength();
-
- assert.equal(bl> 0, true);
-};
-
-exports.gcd = function () {
- var b1 = bigint('234897235923342343242');
- var b2 = bigint('234790237101762305340234');
- var expected = bigint('6');
-
- assert.equal(b1.gcd(b2).toString(), expected.toString());
-};
-
-if (process.argv[1] === __filename) {
- assert.eql = assert.deepEqual;
- Object.keys(exports).forEach(function (ex) {
- exports[ex]();
- });
-}
View
15 test/bit_length.js
@@ -0,0 +1,15 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('bit length', function (t) {
+
+ var bl = bigint(
+ '433593290010590489671135819286259593426549306666324008679782084292'
+ + '2446494189019075159822930571858728009485237489829138626896756141'
+ + '873895833763224917704497568647701157104426'
+ ).bitLength();
+
+ t.equal(bl> 0, true);
+
+ t.end();
+});
View
49 test/bitwise.js
@@ -0,0 +1,49 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('xor', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = (i ^ j).toString();
+ t.same(bigint(i).xor(j).toString(), ks);
+ t.same(bigint(i).xor(js).toString(), ks);
+ t.same(bigint(i).xor(bigint(j)).toString(), ks);
+ t.same(bigint.xor(i, j).toString(), ks);
+ }
+ }
+
+ t.end();
+});
+
+test('and', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = (i & j).toString();
+ t.same(bigint(i).and(j).toString(), ks);
+ t.same(bigint(i).and(js).toString(), ks);
+ t.same(bigint(i).and(bigint(j)).toString(), ks);
+ t.same(bigint.and(i, j).toString(), ks);
+ }
+ }
+ t.end();
+});
+
+test('or', function (t) {
+ for (var i = -10; i < 10; i++) {
+ for (var j = -10; j < 10; j++) {
+ var is = i.toString();
+ var js = j.toString();
+ var ks = (i | j).toString();
+ t.same(bigint(i).or(j).toString(), ks);
+ t.same(bigint(i).or(js).toString(), ks);
+ t.same(bigint(i).or(bigint(j)).toString(), ks);
+ t.same(bigint.or(i, j).toString(), ks);
+ }
+ }
+
+ t.end();
+});
View
77 test/buf.js
@@ -1,11 +1,11 @@
-var assert = require('assert');
+var test = require('tap').test;
var bigint = require('../');
var put = require('put');
-exports.buf_be = function () {
+test('buf be', function (t) {
var buf1 = new Buffer([1,2,3,4]);
var num = bigint.fromBuffer(buf1, { size : 4 }).toNumber();
- assert.eql(
+ t.same(
num,
1*Math.pow(256, 3)
+ 2 * Math.pow(256, 2)
@@ -14,26 +14,28 @@ exports.buf_be = function () {
);
var buf2 = put().word32be(num).buffer();
- assert.eql(buf1, buf2,
+ t.same(buf1, buf2,
'[ ' + [].slice.call(buf1) + ' ] != [ ' + [].slice.call(buf2) + ' ]'
);
-};
+ t.end();
+});
-exports.buf_le = function () {
+test('buf le', function (t) {
var buf1 = new Buffer([1,2,3,4]);
var num = bigint
.fromBuffer(buf1, { size : 4, endian : 'little' })
.toNumber()
;
var buf2 = put().word32le(num).buffer();
- assert.eql(buf1, buf2,
+ t.same(buf1, buf2,
'[ ' + [].join.call(buf1, ',')
+ ' ] != [ '
+ [].join.call(buf2, ',') + ' ]'
);
-};
+ t.end();
+});
-exports.buf_be_le = function () {
+test('buf be le', function (t) {
var buf_be = new Buffer([1,2,3,4,5,6,7,8]);
var buf_le = new Buffer([4,3,2,1,8,7,6,5]);
@@ -46,10 +48,11 @@ exports.buf_be_le = function () {
.toString()
;
- assert.eql(num_be, num_le);
-};
+ t.same(num_be, num_le);
+ t.end();
+});
-exports.buf_high_bits = function () {
+test('buf high bits', function (t) {
var buf_be = new Buffer([
201,202,203,204,
205,206,207,208
@@ -68,10 +71,11 @@ exports.buf_high_bits = function () {
.toString()
;
- assert.eql(num_be, num_le);
-};
+ t.same(num_be, num_le);
+ t.end();
+});
-exports.buf_to_from = function () {
+test('buf to from', function (t) {
var nums = [
0, 1, 10, 15, 3, 16,
7238, 1337, 31337, 505050,
@@ -85,19 +89,21 @@ exports.buf_to_from = function () {
var b = bigint(num);
var u = b.toBuffer();
- assert.ok(u);
- assert.eql(
+ t.ok(u);
+ t.same(
bigint.fromBuffer(u).toString(),
b.toString()
);
});
- assert.throws(function () {
+ t.throws(function () {
bigint(-1).toBuffer(); // can't pack negative numbers yet
});
-};
+
+ t.end();
+});
-exports.toBuf = function () {
+test('toBuf', function (t) {
var buf = new Buffer([ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f ]);
var b = bigint(
0x0a * 256*256*256*256*256
@@ -108,53 +114,55 @@ exports.toBuf = function () {
+ 0x0f
);
- assert.eql(b.toString(16), 'a0b0c0d0e0f');
+ t.same(b.toString(16), 'a0b0c0d0e0f');
- assert.eql(
+ t.same(
[].slice.call(b.toBuffer({ endian : 'big', size : 2 })),
[ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f ]
);
- assert.eql(
+ t.same(
[].slice.call(b.toBuffer({ endian : 'little', size : 2 })),
[ 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e ]
);
- assert.eql(
+ t.same(
bigint.fromBuffer(buf).toString(16),
b.toString(16)
);
- assert.eql(
+ t.same(
[].slice.call(bigint(43135012110).toBuffer({
endian : 'little', size : 4
})),
[ 0x0a, 0x00, 0x00, 0x00, 0x0e, 0x0d, 0x0c, 0x0b ]
);
- assert.eql(
+ t.same(
[].slice.call(bigint(43135012110).toBuffer({
endian : 'big', size : 4
})),
[ 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e ]
);
-};
+ t.end();
+});
-exports.zeroPad = function () {
+test('zero pad', function (t) {
var b = bigint(0x123456);
- assert.eql(
+ t.same(
[].slice.call(b.toBuffer({ endian : 'big', size:4 })),
[ 0x00, 0x12, 0x34, 0x56 ]
);
- assert.eql(
+ t.same(
[].slice.call(b.toBuffer({ endian : 'little', size:4 })),
[ 0x56, 0x34, 0x12, 0x00 ]
);
-};
+ t.end();
+});
-exports.toMpint = function () {
+test('to mpint', function (t) {
// test values taken directly out of
// http://tools.ietf.org/html/rfc4251#page-10
@@ -176,10 +184,11 @@ exports.toMpint = function () {
var buf0 = bigint(key, 16).toBuffer('mpint');
var buf1 = refs[key];
- assert.eql(
+ t.same(
buf0, buf1,
buf0.inspect() + ' != ' + buf1.inspect()
+ ' for bigint(' + key + ')'
);
});
-};
+ t.end();
+});
View
20 test/cmp.js
@@ -0,0 +1,20 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('cmp', function (t) {
+ for (var i = -10; i <= 10; i++) {
+ var bi = bigint(i);
+
+ for (var j = -10; j <= 10; j++) {
+ [ j, bigint(j) ].forEach(function (jj) {
+ t.same(bi.lt(jj), i < j);
+ t.same(bi.le(jj), i <= j);
+ t.same(bi.eq(jj), i === j);
+ t.same(bi.ne(jj), i !== j);
+ t.same(bi.gt(jj), i > j);
+ t.same(bi.ge(jj), i >= j);
+ });
+ }
+ }
+ t.end();
+});
View
27 test/create.js
@@ -0,0 +1,27 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('create', function (t) {
+ t.same(bigint(1337).toString(), '1337');
+ t.same(bigint('1337').toString(), '1337');
+ t.same(new bigint('100').toString(), '100');
+ t.same(
+ new bigint('55555555555555555555555555').toString(),
+ '55555555555555555555555555'
+ );
+
+ t.same(Number(bigint('1e+100').toString()), 1e+100);
+ t.same(Number(bigint('1.23e+45').toString()), 1.23e+45);
+ for (var i = 0; i < 10; i++) {
+ t.same(
+ bigint('1.23456e+' + i).toString(),
+ Math.floor(1.23456 * Math.pow(10,i))
+ );
+ }
+
+ t.same(bigint('1.23e-45').toString(), '0');
+
+ t.throws(function() { bigint(undefined); });
+ t.throws(function() { bigint(null); });
+ t.end();
+});
View
11 test/gcd.js
@@ -0,0 +1,11 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('gcd', function (t) {
+ var b1 = bigint('234897235923342343242');
+ var b2 = bigint('234790237101762305340234');
+ var expected = bigint('6');
+
+ t.equal(b1.gcd(b2).toString(), expected.toString());
+ t.end();
+});
View
11 test/invertm.js
@@ -0,0 +1,11 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('invertm', function (t) {
+ // numbers from http://www.itl.nist.gov/fipspubs/fip186.htm appendix 5
+ var q = bigint('b20db0b101df0c6624fc1392ba55f77d577481e5', 16);
+ var k = bigint('79577ddcaafddc038b865b19f8eb1ada8a2838c6', 16);
+ var kinv = k.invertm(q);
+ t.same(kinv.toString(16), '2784e3d672d972a74e22c67f4f4f726ecc751efa');
+ t.end();
+});
View
13 test/mod.js
@@ -0,0 +1,13 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('mod', function (t) {
+ t.same(bigint(55555).mod(2).toString(), '1');
+ t.same(
+ bigint('1234567').mod(
+ bigint('4321')
+ ).toNumber(),
+ 1234567 % 4321
+ );
+ t.end();
+});
View
40 test/pow.js
@@ -0,0 +1,40 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('powm', function (t) {
+ var twos = [ 2, '2', bigint(2), bigint('2') ]
+ var tens = [ 100000, '100000', bigint(100000), bigint(100000) ];
+ twos.forEach(function (two) {
+ tens.forEach(function (t) {
+ t.same(
+ bigint('111111111').powm(two, t).toString(),
+ '54321'
+ );
+ });
+ });
+
+ t.same(
+ bigint('624387628734576238746587435')
+ .powm(2732, '457676874367586')
+ .toString()
+ ,
+ '335581885073251'
+ );
+ t.end();
+});
+
+test('pow', function (t) {
+ [ 2, '2', bigint(2), bigint('2') ].forEach(function (two) {
+ t.same(
+ bigint('111111111').pow(two).toString(),
+ '12345678987654321'
+ );
+ });
+
+ t.same(
+ bigint('3487438743234789234879').pow(22).toString(),
+ '861281136448465709000943928980299119292959327175552412961995332536782980636409994680542395362634321718164701236369695670918217801815161694902810780084448291245512671429670376051205638247649202527956041058237646154753587769450973231275642223337064356190945030999709422512682440247294915605076918925272414789710234097768366414400280590151549041536921814066973515842848197905763447515344747881160891303219471850554054186959791307149715821010152303317328860351766337716947079041'
+ );
+
+ t.end();
+});
View
58 test/primes.js
@@ -0,0 +1,58 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('primes', function (t) {
+ var ps = { 2 : true, 3 : true, 5 : true, 7 : true };
+ for (var i = 0; i <= 10; i++) {
+ t.same(bigint(i).probPrime(), ps[i] ? true : false);
+ }
+
+ var ns = {
+ 2 : 3,
+ 3 : 5,
+ 15313 : 15319,
+ 222919 : 222931,
+ 611939 : 611951,
+ 334214459 : '334214467',
+ 961748927 : '961748941',
+ 9987704933 : '9987704953',
+ };
+
+ Object.keys(ns).forEach(function (n) {
+ t.same(
+ bigint(n).nextPrime().toString(),
+ ns[n].toString()
+ );
+ });
+
+ var uniques = [
+ '3', '11', '37', '101', '9091', '9901', '333667', '909091', '99990001',
+ '999999000001', '9999999900000001', '909090909090909091',
+ '1111111111111111111', '11111111111111111111111',
+ '900900900900990990990991',
+ ];
+
+ var wagstaff = [
+ '3', '11', '43', '683', '2731', '43691', '174763', '2796203',
+ '715827883', '2932031007403', '768614336404564651',
+ '201487636602438195784363', '845100400152152934331135470251',
+ '56713727820156410577229101238628035243',
+ ];
+
+ var big = [
+ '4669523849932130508876392554713407521319117239637943224980015676156491',
+ '54875133386847519273109693154204970395475080920935355580245252923343305939004903',
+ '204005728266090048777253207241416669051476369216501266754813821619984472224780876488344279',
+ '2074722246773485207821695222107608587480996474721117292752992589912196684750549658310084416732550077',
+ '5628290459057877291809182450381238927697314822133923421169378062922140081498734424133112032854812293',
+ ];
+
+ [ uniques, wagstaff, big ].forEach(function (xs) {
+ xs.forEach(function (x) {
+ var p = bigint(x).probPrime();
+ t.ok(p === true || p === 'maybe');
+ });
+ });
+
+ t.end();
+});
View
17 test/rand.js
@@ -0,0 +1,17 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('rand', function (t) {
+ for (var i = 1; i < 1000; i++) {
+ var x = bigint(i).rand().toNumber();
+ t.ok(0 <= x && x < i);
+
+ var y = bigint(i).rand(i + 10).toNumber();
+ t.ok(i <= y && y < i + 10);
+
+ var z = bigint.rand(i, i + 10).toNumber();
+ t.ok(i <= z && z < i + 10);
+ }
+
+ t.end();
+});
View
32 test/seed.js
@@ -1,40 +1,36 @@
-var assert = require('assert');
+var test = require('tap').test;
var exec = require('child_process').exec;
-exports.rand = function () {
- var to = setTimeout(function () {
- assert.fail('never executed');
- }, 5000);
+test('rand', function (t) {
+ t.plan(9);
- var cmd = 'node -e \'console.log(require('
+ var cmd = process.execPath + ' -e \'console.log(require('
+ JSON.stringify(__dirname + '/../')
+ ').rand(1000).toString())\''
;
exec(cmd, function (err1, r1) {
exec(cmd, function (err2, r2) {
- clearTimeout(to);
+ t.ok(!err1);
+ t.ok(!err2);
- assert.ok(!err1);
- assert.ok(!err2);
-
- assert.ok(
+ t.ok(
r1.match(/^\d+\n/),
JSON.stringify(r1) + ' is not an integer'
);
- assert.ok(
+ t.ok(
r2.match(/^\d+\n/),
JSON.stringify(r2) + ' is not an integer'
);
var n1 = parseInt(r1.split('\n')[0], 10);
var n2 = parseInt(r2.split('\n')[0], 10);
- assert.ok(n1 >= 0, 'n1 >= 0');
- assert.ok(n2 >= 0, 'n2 >= 0');
- assert.ok(n1 < 1000, 'n1 < 1000');
- assert.ok(n2 < 1000, 'n2 < 1000');
+ t.ok(n1 >= 0, 'n1 >= 0');
+ t.ok(n2 >= 0, 'n2 >= 0');
+ t.ok(n1 < 1000, 'n1 < 1000');
+ t.ok(n2 < 1000, 'n2 < 1000');
- assert.ok(n1 != n2, 'n1 != n2');
+ t.ok(n1 != n2, 'n1 != n2');
})
});
-}
+});
View
13 test/shift.js
@@ -0,0 +1,13 @@
+var test = require('tap').test;
+var bigint = require('../');
+
+test('shift', function (t) {
+ t.same(bigint(37).shiftLeft(2).toString(), (37 << 2).toString()); // 148
+ t.same(bigint(37).shiftRight(2).toString(), (37 >> 2).toString()); // 9
+
+ t.equal(
+ bigint(2).pow(Math.pow(2,10)).shiftRight(4).toString(),
+ bigint(2).pow(Math.pow(2,10)).div(16).toString()
+ );
+ t.end();
+});

0 comments on commit e39901e

Please sign in to comment.