test.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. // #!/usr/bin/env mocha -R spec
  2. assert.equal = equal;
  3. assert.ok = assert;
  4. var exported = ("undefined" !== typeof require) ? require("../int64-buffer") : window;
  5. var Uint64LE = exported.Uint64LE;
  6. var Int64LE = exported.Int64LE;
  7. var Uint64BE = exported.Uint64BE;
  8. var Int64BE = exported.Int64BE;
  9. var reduce = Array.prototype.reduce;
  10. var forEach = Array.prototype.forEach;
  11. var BUFFER = ("undefined" !== typeof Buffer) && Buffer;
  12. var ARRAYBUFFER = ("undefined" !== typeof ArrayBuffer) && ArrayBuffer;
  13. var UINT8ARRAY = ("undefined" !== typeof Uint8Array) && Uint8Array;
  14. var STORAGES = {array: Array, buffer: BUFFER, uint8array: UINT8ARRAY, arraybuffer: ARRAYBUFFER, arraylike: ArrayLike};
  15. var itBuffer = BUFFER ? it : it.skip;
  16. var itArrayBuffer = ARRAYBUFFER ? it : it.skip;
  17. allTests("Uint64BE", "Int64BE");
  18. allTests("Uint64LE", "Int64LE");
  19. miscTests();
  20. function allTests(uint64Name, int64Name) {
  21. var LE = uint64Name.indexOf("LE") > -1;
  22. var ZERO = [0, 0, 0, 0, 0, 0, 0, 0];
  23. var POS1 = [0, 0, 0, 0, 0, 0, 0, 1];
  24. var NEG1 = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
  25. var POSB = [0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0];
  26. var NEGB = [0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10];
  27. var POS7 = [0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]; // INT64_MAX
  28. var NEG7 = [0x80, 0, 0, 0, 0, 0, 0, 1]; // -INT64_MAX
  29. var NEG8 = [0x80, 0, 0, 0, 0, 0, 0, 0]; // INT64_MIN
  30. var H0LF = [0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF];
  31. var H1L0 = [0, 0, 0, 1, 0, 0, 0, 0];
  32. var H1LF = [0, 0, 0, 1, 0xFF, 0xFF, 0xFF, 0xFF];
  33. var HFL0 = [0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0];
  34. var SAMPLES = [ZERO, POS1, NEG1, POSB, NEGB, POS7, NEG7, NEG8, H0LF, H1L0, H1LF, HFL0];
  35. var INPUT0 = [0, 0.5, "0", "-0", NaN, Infinity, null, "X"];
  36. var INPUT1 = [1, 1.5, "1", "1.5", true];
  37. var FLOAT_MAX = Math.pow(2, 53);
  38. // BE -> LE
  39. SAMPLES.forEach(function(array) {
  40. if (LE) array.reverse();
  41. });
  42. describe(uint64Name, function() {
  43. uint64BasicTests();
  44. uintMoreTests();
  45. bufferTest(uint64Name);
  46. });
  47. describe(int64Name, function() {
  48. int64BasicTests();
  49. intMoreTests();
  50. bufferTest(int64Name);
  51. });
  52. function uint64BasicTests() {
  53. var Uint64Class = exported[uint64Name];
  54. describe(uint64Name, function() {
  55. it(uint64Name + "()", function() {
  56. assert.equal(Uint64Class() - 0, 0);
  57. });
  58. it(uint64Name + "(number)", function() {
  59. assert.equal(Uint64Class(123456789) - 0, 123456789);
  60. });
  61. it(uint64Name + "(high,low)", function() {
  62. assert.equal(Uint64Class(0x12345678, 0x90abcdef).toString(16), "1234567890abcdef");
  63. assert.equal(Uint64Class(0x90abcdef, 0x12345678).toString(16), "90abcdef12345678");
  64. });
  65. it(uint64Name + "(string,raddix)", function() {
  66. assert.equal(Uint64Class("1234567890123456").toString(), "1234567890123456");
  67. assert.equal(Uint64Class("1234567890123456", 10).toString(10), "1234567890123456");
  68. assert.equal(Uint64Class("1234567890abcdef", 16).toString(16), "1234567890abcdef");
  69. });
  70. it(uint64Name + "().toNumber()", function() {
  71. var val = Uint64Class(1).toNumber();
  72. assert.ok("number" === typeof val);
  73. assert.equal(val, 1);
  74. });
  75. it(uint64Name + "().toString()", function() {
  76. var val = Uint64Class(1).toString();
  77. assert.ok("string" === typeof val);
  78. assert.equal(val, "1");
  79. });
  80. it(uint64Name + "().toString(10)", function() {
  81. var col = 1;
  82. var val = 1;
  83. var str = "1";
  84. while (val < FLOAT_MAX) {
  85. assert.equal(Uint64Class(val).toString(10), str);
  86. col = (col + 1) % 10;
  87. val = val * 10 + col;
  88. str += col;
  89. }
  90. });
  91. it(uint64Name + "().toString(16)", function() {
  92. var val = 1;
  93. var col = 1;
  94. var str = "1";
  95. while (val < FLOAT_MAX) {
  96. assert.equal(Uint64Class(val).toString(16), str);
  97. col = (col + 1) % 10;
  98. val = val * 16 + col;
  99. str += col;
  100. }
  101. });
  102. it(uint64Name + "().toJSON()", function() {
  103. SAMPLES.forEach(function(array) {
  104. var c = Uint64Class(array);
  105. assert.equal(c.toJSON(), c.toString(10));
  106. });
  107. });
  108. it(uint64Name + "().toArray()", function() {
  109. var val = Uint64Class(1).toArray();
  110. assert.ok(val instanceof Array);
  111. assert.equal(toHex(val), toHex(POS1));
  112. });
  113. itBuffer(uint64Name + "().toBuffer()", function() {
  114. var val = Uint64Class(1).toBuffer();
  115. assert.ok(BUFFER.isBuffer(val));
  116. assert.equal(toHex(val), toHex(POS1));
  117. });
  118. itArrayBuffer(uint64Name + "().toArrayBuffer()", function() {
  119. var val = Uint64Class(1).toArrayBuffer();
  120. assert.ok(val instanceof ArrayBuffer);
  121. assert.equal(val.byteLength, 8);
  122. assert.equal(toHex(new Uint8Array(val)), toHex(POS1));
  123. });
  124. });
  125. }
  126. function int64BasicTests() {
  127. var Int64Class = exported[int64Name];
  128. describe(int64Name, function() {
  129. it(int64Name + "()", function() {
  130. assert.equal(Int64Class() - 0, 0);
  131. });
  132. it(int64Name + "(number)", function() {
  133. assert.equal(Int64Class(-123456789) - 0, -123456789);
  134. });
  135. it(int64Name + "(high,low)", function() {
  136. assert.equal(Int64Class(0x12345678, 0x90abcdef).toString(16), "1234567890abcdef");
  137. assert.equal(Int64Class(0xFFFFFFFF, 0xFFFFFFFF) - 0, -1);
  138. });
  139. it(int64Name + "(string,raddix)", function() {
  140. assert.equal(Int64Class("1234567890123456").toString(), "1234567890123456");
  141. assert.equal(Int64Class("1234567890123456", 10).toString(10), "1234567890123456");
  142. assert.equal(Int64Class("1234567890abcdef", 16).toString(16), "1234567890abcdef");
  143. });
  144. it(int64Name + "(array,offset)", function() {
  145. var buf = [].concat(NEG1, NEG1);
  146. var val = Int64Class(buf, 4, -2);
  147. assert.equal(val.toString(16), "-2");
  148. assert.equal(val.toNumber(), -2);
  149. });
  150. it(int64Name + "().toNumber()", function() {
  151. var val = Int64Class(-1).toNumber();
  152. assert.ok("number" === typeof val);
  153. assert.equal(val, -1);
  154. });
  155. it(int64Name + "().toString()", function() {
  156. var val = Int64Class(-1).toString();
  157. assert.ok("string" === typeof val);
  158. assert.equal(val, "-1");
  159. });
  160. it(int64Name + "().toString(10)", function() {
  161. var col = 1;
  162. var val = -1;
  163. var str = "-1";
  164. while (val > FLOAT_MAX) {
  165. assert.equal(Int64Class(val).toString(10), str);
  166. col = (col + 1) % 10;
  167. val = val * 10 - col;
  168. str += col;
  169. }
  170. });
  171. it(int64Name + "().toString(16)", function() {
  172. var col = 1;
  173. var val = -1;
  174. var str = "-1";
  175. while (val > FLOAT_MAX) {
  176. assert.equal(Int64Class(val).toString(16), str);
  177. col = (col + 1) % 10;
  178. val = val * 16 - col;
  179. str += col;
  180. }
  181. });
  182. it(int64Name + "().toJSON()", function() {
  183. SAMPLES.forEach(function(array) {
  184. var c = Int64Class(array);
  185. assert.equal(c.toJSON(), c.toString(10));
  186. });
  187. });
  188. it(int64Name + "().toArray()", function() {
  189. var val = Int64Class(-1).toArray();
  190. assert.ok(val instanceof Array);
  191. assert.equal(toHex(val), toHex(NEG1));
  192. val = Int64Class(val, 0, 1).toArray();
  193. assert.ok(val instanceof Array);
  194. assert.equal(toHex(val), toHex(POS1));
  195. });
  196. itBuffer(int64Name + "().toBuffer()", function() {
  197. var val = Int64Class(-1).toBuffer();
  198. assert.ok(BUFFER.isBuffer(val));
  199. assert.equal(toHex(val), toHex(NEG1));
  200. val = Int64Class(val, 0, 1).toBuffer();
  201. assert.ok(BUFFER.isBuffer(val));
  202. assert.equal(toHex(val), toHex(POS1));
  203. });
  204. itArrayBuffer(int64Name + "().toArrayBuffer()", function() {
  205. var val = Int64Class(-1).toArrayBuffer();
  206. assert.ok(val instanceof ArrayBuffer);
  207. assert.equal(val.byteLength, 8);
  208. assert.equal(toHex(new Uint8Array(val)), toHex(NEG1));
  209. val = Int64Class(val, 0, 1).toArrayBuffer();
  210. assert.ok(val instanceof ArrayBuffer);
  211. assert.equal(val.byteLength, 8);
  212. assert.equal(toHex(new Uint8Array(val)), toHex(POS1));
  213. });
  214. });
  215. }
  216. function bufferTest(className) {
  217. describe(className, function() {
  218. Object.keys(STORAGES).forEach(function(storageName) {
  219. storageTests(className, storageName);
  220. });
  221. Object.keys(STORAGES).forEach(function(storageName) {
  222. if (storageName === "array") return;
  223. storageSourceTests(className, storageName);
  224. });
  225. });
  226. }
  227. function storageTests(className, storageName) {
  228. var Int64Class = exported[className];
  229. var StorageClass = STORAGES[storageName];
  230. var itSkip = StorageClass ? it : it.skip;
  231. var highpos = LE ? 15 : 8;
  232. var lowpos = LE ? 8 : 15;
  233. itSkip(className + "(" + storageName + ",offset)", function() {
  234. var buffer = new StorageClass(24);
  235. var raw = buffer;
  236. if (isArrayBuffer(buffer)) buffer = (raw = new Uint8Array(buffer)).buffer;
  237. for (var i = 0; i < 24; i++) {
  238. raw[i] = i;
  239. }
  240. var val = new Int64Class(buffer, 8);
  241. var higher = LE ? 0x0f0e0d0c0b : 0x08090A0B0C;
  242. assert.equal(Math.round(val.toNumber() / 0x1000000), higher); // check only higher 48bits
  243. var hex = LE ? "f0e0d0c0b0a0908" : "8090a0b0c0d0e0f";
  244. assert.equal(val.toString(16), hex);
  245. var out = val.toArray();
  246. assert.equal(toHex(out), "08090a0b0c0d0e0f");
  247. assert.ok(out instanceof Array);
  248. if (BUFFER) {
  249. out = val.toBuffer();
  250. assert.equal(toHex(out), "08090a0b0c0d0e0f");
  251. assert.ok(BUFFER.isBuffer(out));
  252. }
  253. if (UINT8ARRAY) {
  254. out = val.toArrayBuffer();
  255. assert.equal(toHex(new Uint8Array(out)), "08090a0b0c0d0e0f");
  256. assert.ok(out instanceof ArrayBuffer);
  257. }
  258. });
  259. itSkip(className + "(" + storageName + ",offset,number)", function() {
  260. var buffer = new StorageClass(24);
  261. var val = new Int64Class(buffer, 8, 1234567890);
  262. assert.equal(val.toNumber(), 1234567890);
  263. assert.equal(val.toString(), "1234567890");
  264. assert.equal(val.toJSON(), "1234567890");
  265. if (isArrayBuffer(buffer)) buffer = new Uint8Array(buffer);
  266. assert.equal(buffer[highpos], 0);
  267. assert.equal(buffer[lowpos], 1234567890 & 255);
  268. });
  269. itSkip(className + "(" + storageName + ",offset,high,low)", function() {
  270. var buffer = new StorageClass(24);
  271. var val = new Int64Class(buffer, 8, 0x12345678, 0x90abcdef);
  272. assert.equal(val.toString(16), "1234567890abcdef");
  273. if (isArrayBuffer(buffer)) buffer = new Uint8Array(buffer);
  274. assert.equal(buffer[highpos], 0x12);
  275. assert.equal(buffer[lowpos], 0xef);
  276. });
  277. itSkip(className + "(" + storageName + ",offset,string,raddix)", function() {
  278. var buffer = new StorageClass(24);
  279. var val = new Int64Class(buffer, 8, "1234567890", 16);
  280. assert.equal(val.toNumber(), 0x1234567890);
  281. assert.equal(val.toString(16), "1234567890");
  282. assert.equal(val.toJSON(), (0x1234567890).toString());
  283. if (isArrayBuffer(buffer)) buffer = new Uint8Array(buffer);
  284. assert.equal(buffer[highpos], 0);
  285. assert.equal(buffer[lowpos], 0x1234567890 & 255);
  286. });
  287. itSkip(className + "(" + storageName + ",offset,array,offset)", function() {
  288. var buffer = new StorageClass(16);
  289. var src = LE ? [].concat(POSB, NEGB) : [].concat(NEGB, POSB);
  290. var val = Int64Class(buffer, 8, src, 4);
  291. assert.equal(val.toString(16), "7654321012345678");
  292. if (isArrayBuffer(buffer)) buffer = new Uint8Array(buffer);
  293. assert.equal(buffer[8], src[4]);
  294. assert.equal(buffer[15], src[11]);
  295. });
  296. }
  297. function storageSourceTests(className, storageName) {
  298. var Int64Class = exported[className];
  299. var StorageClass = STORAGES[storageName];
  300. var itSkip = StorageClass ? it : it.skip;
  301. itSkip(className + "(array,offset," + storageName + ",offset)", function() {
  302. var buffer = new Array(16);
  303. var src = LE ? [].concat(POSB, NEGB) : [].concat(NEGB, POSB);
  304. var copy = src.slice();
  305. if (storageName === "buffer") {
  306. // Buffer.from(arraybuffer) available since Node v4.5.0
  307. // https://nodejs.org/en/blog/release/v4.5.0/
  308. src = Buffer.from(src);
  309. } else if (storageName === "uint8array") {
  310. src = new UINT8ARRAY(src);
  311. } else if (storageName === "arraybuffer") {
  312. src = (new UINT8ARRAY(src)).buffer;
  313. } else if (storageName === "arraylike") {
  314. src = new ArrayLike(src);
  315. }
  316. var val = Int64Class(buffer, 8, src, 4);
  317. assert.ok(val.buffer instanceof Array);
  318. assert.equal(val.toString(16), "7654321012345678");
  319. if (isArrayBuffer(buffer)) buffer = new Uint8Array(buffer);
  320. assert.equal(buffer[8], copy[4]);
  321. assert.equal(buffer[15], copy[11]);
  322. });
  323. }
  324. function uintMoreTests() {
  325. var Uint64Class = exported[uint64Name];
  326. describe(uint64Name + "(string)", function() {
  327. // rount-trip by string
  328. it(uint64Name + "(''+" + uint64Name + "())", function() {
  329. SAMPLES.forEach(function(array) {
  330. var c = "" + Uint64Class(array);
  331. var d = "" + Uint64Class(c);
  332. assert.equal(d, c);
  333. });
  334. });
  335. });
  336. describe(uint64Name + "(array)", function() {
  337. forEach.call([
  338. [0x0000000000000000, 0, 0, 0, 0, 0, 0, 0, 0], // 0
  339. [0x0000000000000001, 0, 0, 0, 0, 0, 0, 0, 1], // 1
  340. [0x00000000FFFFFFFF, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF],
  341. [0x4000000000000000, 0x40, 0, 0, 0, 0, 0, 0, 0],
  342. [0x7FFFFFFF00000000, 0x7F, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0],
  343. [0x8000000000000000, 0x80, 0, 0, 0, 0, 0, 0, 0],
  344. [0x8000000100000000, 0x80, 0, 0, 1, 0, 0, 0, 0],
  345. [0xFFFFFFFF00000000, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0]
  346. ], function(exp) {
  347. var val = exp.shift();
  348. if (LE) exp.reverse();
  349. it(toHex(exp), function() {
  350. var c = new Uint64Class(exp);
  351. assert.equal(toHex(c.buffer), toHex(exp));
  352. assert.equal(c - 0, val);
  353. assert.equal(c.toNumber(), val);
  354. assert.equal(c.toString(16), toString16(val));
  355. });
  356. });
  357. });
  358. describe(uint64Name + "(high1)", function() {
  359. reduce.call([
  360. [0, 0, 0, 0, 0, 0, 0, 1], // 1
  361. [0, 0, 0, 0, 0, 0, 1, 0], // 256
  362. [0, 0, 0, 0, 0, 1, 0, 0], // 65536
  363. [0, 0, 0, 0, 1, 0, 0, 0],
  364. [0, 0, 0, 1, 0, 0, 0, 0],
  365. [0, 0, 1, 0, 0, 0, 0, 0],
  366. [0, 1, 0, 0, 0, 0, 0, 0],
  367. [1, 0, 0, 0, 0, 0, 0, 0]
  368. ], function(val, exp) {
  369. if (LE) exp.reverse();
  370. it(toHex(exp), function() {
  371. var c = new Uint64Class(val);
  372. assert.equal(toHex(c.buffer), toHex(exp));
  373. assert.equal(c - 0, val);
  374. assert.equal(c.toNumber(), val);
  375. assert.equal(c.toString(16), toString16(val));
  376. });
  377. return val * 256;
  378. }, 1);
  379. });
  380. describe(uint64Name + "(high32)", function() {
  381. reduce.call([
  382. [0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF],
  383. [0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0],
  384. [0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0],
  385. [0, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0],
  386. [0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0]
  387. ], function(val, exp) {
  388. if (LE) exp.reverse();
  389. it(toHex(exp), function() {
  390. var c = new Uint64Class(val);
  391. assert.equal(toHex(c.buffer), toHex(exp));
  392. assert.equal(c - 0, val);
  393. assert.equal(c.toNumber(), val);
  394. assert.equal(c.toString(16), toString16(val));
  395. });
  396. return val * 256;
  397. }, 0xFFFFFFFF);
  398. });
  399. }
  400. function intMoreTests() {
  401. var Int64Class = exported[int64Name];
  402. describe(int64Name + "(array)", function() {
  403. forEach.call([
  404. [0x0000000000000000, 0, 0, 0, 0, 0, 0, 0, 0], // 0
  405. [0x0000000000000001, 0, 0, 0, 0, 0, 0, 0, 1], // 1
  406. [0x00000000FFFFFFFF, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF],
  407. [-0x00000000FFFFFFFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0, 1],
  408. [0x4000000000000000, 0x40, 0, 0, 0, 0, 0, 0, 0],
  409. [-0x4000000000000000, 0xC0, 0, 0, 0, 0, 0, 0, 0],
  410. [0x7FFFFFFF00000000, 0x7F, 0xFF, 0xFF, 0xFF, 0, 0, 0, 0],
  411. [-0x7FFFFFFF00000000, 0x80, 0, 0, 1, 0, 0, 0, 0],
  412. [-1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
  413. ], function(exp) {
  414. var val = exp.shift();
  415. if (LE) exp.reverse();
  416. it(toHex(exp), function() {
  417. var c = new Int64Class(exp);
  418. assert.equal(toHex(c.buffer), toHex(exp));
  419. assert.equal(c - 0, val);
  420. assert.equal(c.toNumber(), val);
  421. assert.equal(c.toString(16), toString16(val));
  422. });
  423. });
  424. });
  425. describe(int64Name + "(low1)", function() {
  426. reduce.call([
  427. [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE], // -2
  428. [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF], // -257
  429. [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF], // -65537
  430. [0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF],
  431. [0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF],
  432. [0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
  433. [0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF],
  434. [0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
  435. ], function(val, exp) {
  436. if (LE) exp.reverse();
  437. it(toHex(exp), function() {
  438. var c = new Int64Class(val);
  439. assert.equal(toHex(c.buffer), toHex(exp));
  440. assert.equal(c - 0, val);
  441. assert.equal(c.toNumber(), val);
  442. });
  443. return (val * 256) + 255;
  444. }, -2);
  445. });
  446. describe(int64Name + "(low31)", function() {
  447. reduce.call([
  448. [0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0, 0, 0],
  449. [0xFF, 0xFF, 0xFF, 0x80, 0, 0, 0, 0xFF],
  450. [0xFF, 0xFF, 0x80, 0, 0, 0, 0xFF, 0xFF],
  451. [0xFF, 0x80, 0, 0, 0, 0xFF, 0xFF, 0xFF],
  452. [0x80, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF]
  453. ], function(val, exp) {
  454. if (LE) exp.reverse();
  455. it(toHex(exp), function() {
  456. var c = new Int64Class(val);
  457. assert.equal(toHex(c.buffer), toHex(exp));
  458. assert.equal(c - 0, val);
  459. assert.equal(c.toNumber(), val);
  460. });
  461. return (val * 256) + 255;
  462. }, -2147483648);
  463. });
  464. describe(int64Name + "(0)", function() {
  465. INPUT0.forEach(function(val) {
  466. var view = ("string" === typeof val) ? '"' + val + '"' : val;
  467. var hex = toHex(ZERO);
  468. it(toHex(ZERO) + " = " + view, function() {
  469. var c = new Uint64LE(val);
  470. assert.equal(toHex(c.toArray()), hex);
  471. assert.equal(c.toString(), "0");
  472. assert.equal(c.toNumber(), 0);
  473. });
  474. });
  475. });
  476. describe(int64Name + "(array,offset,0)", function() {
  477. INPUT0.forEach(function(val) {
  478. var view = ("string" === typeof val) ? '"' + val + '"' : val;
  479. var hex = toHex(ZERO);
  480. var buf = [].concat(POSB, NEGB);
  481. it(toHex(ZERO) + " = " + view, function() {
  482. var c = new Int64Class(buf, 4, val);
  483. assert.equal(toHex(c.toArray()), hex);
  484. assert.equal(c.toString(), "0");
  485. assert.equal(c.toNumber(), 0);
  486. });
  487. });
  488. });
  489. describe(int64Name + "(1)", function() {
  490. INPUT1.forEach(function(val) {
  491. var view = ("string" === typeof val) ? '"' + val + '"' : val;
  492. var hex = toHex(POS1);
  493. it(toHex(POS1) + " = " + view, function() {
  494. var c = new Int64Class(val);
  495. assert.equal(toHex(c.toArray()), hex);
  496. assert.equal(c.toString(), "1");
  497. assert.equal(c.toNumber(), 1);
  498. });
  499. });
  500. });
  501. describe(int64Name + "(array,offset,1)", function() {
  502. INPUT1.forEach(function(val) {
  503. var view = ("string" === typeof val) ? '"' + val + '"' : val;
  504. var hex = toHex(POS1);
  505. var buf = [].concat(POSB, NEGB);
  506. it(toHex(POS1) + " = " + view, function() {
  507. var c = new Int64Class(buf, 4, val);
  508. assert.equal(toHex(c.toArray()), hex);
  509. assert.equal(c.toString(), "1");
  510. assert.equal(c.toNumber(), 1);
  511. });
  512. });
  513. });
  514. describe(int64Name + "(string)", function() {
  515. // rount-trip by string
  516. it(int64Name + "(''+" + int64Name + "())", function() {
  517. SAMPLES.forEach(function(array) {
  518. var c = "" + Int64Class(array);
  519. var d = "" + Int64Class(c);
  520. assert.equal(d, c);
  521. });
  522. });
  523. // round-trip with negative value
  524. it(int64Name + "('-'+" + int64Name + "())", function() {
  525. SAMPLES.forEach(function(array) {
  526. if (array === NEG8) return; // skip -INT64_MIN overflow
  527. var c = "" + Int64Class(array);
  528. var d = (c === "0") ? c : (c[0] === "-") ? c.substr(1) : "-" + c;
  529. var e = "" + Int64Class(d);
  530. var f = (e === "0") ? e : (e[0] === "-") ? e.substr(1) : "-" + e;
  531. assert.equal(f, c);
  532. });
  533. });
  534. });
  535. describe("raw", function() {
  536. it(int64Name + "(array).toArray(raw)", function() {
  537. var buf = ZERO.slice();
  538. var c = new Int64Class(buf);
  539. var mirror = c.toArray(true);
  540. var copied = c.toArray(false);
  541. buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = buf[7] = 0xFF;
  542. assert.equal(toHex(mirror), toHex(NEG1));
  543. assert.equal(toHex(copied), toHex(ZERO));
  544. });
  545. itBuffer(int64Name + "(buffer).toBuffer(raw)", function() {
  546. var buf = Buffer.from(ZERO);
  547. var c = new Int64Class(buf);
  548. var mirror = c.toBuffer(true);
  549. var copied = c.toBuffer(false);
  550. buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = buf[7] = 0xFF;
  551. assert.equal(toHex(mirror), toHex(NEG1));
  552. assert.equal(toHex(copied), toHex(ZERO));
  553. });
  554. itArrayBuffer(int64Name + "(uint8array).toArrayBuffer(raw)", function() {
  555. var buf = new Uint8Array(ZERO);
  556. var c = new Int64Class(buf);
  557. var mirror = new Uint8Array(c.toArrayBuffer(true));
  558. var copied = new Uint8Array(c.toArrayBuffer(false));
  559. buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = buf[7] = 0xFF;
  560. assert.equal(toHex(mirror), toHex(NEG1));
  561. assert.equal(toHex(copied), toHex(ZERO));
  562. });
  563. itArrayBuffer(int64Name + "(arraybuffer).toArrayBuffer(raw)", function() {
  564. var buf = new Uint8Array(ZERO);
  565. var c = new Int64Class(buf.buffer);
  566. var mirror = new Uint8Array(c.toArrayBuffer(true));
  567. var copied = new Uint8Array(c.toArrayBuffer(false));
  568. buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = buf[7] = 0xFF;
  569. assert.equal(toHex(mirror), toHex(NEG1));
  570. assert.equal(toHex(copied), toHex(ZERO));
  571. });
  572. });
  573. }
  574. }
  575. function miscTests() {
  576. describe("Misc", function() {
  577. it("Uint64BE.isUint64BE(Uint64BE())", function() {
  578. assert.ok(Uint64BE.isUint64BE(Uint64BE()));
  579. assert.ok(!Uint64BE.isUint64BE(Int64BE()));
  580. });
  581. it("Int64BE.isInt64BE(Int64BE())", function() {
  582. assert.ok(Int64BE.isInt64BE(Int64BE()));
  583. assert.ok(!Int64BE.isInt64BE(Uint64BE()));
  584. });
  585. it("Uint64LE.isUint64LE(Uint64LE())", function() {
  586. assert.ok(Uint64LE.isUint64LE(Uint64LE()));
  587. assert.ok(!Uint64LE.isUint64LE(Int64LE()));
  588. });
  589. it("Int64LE.isInt64LE(Int64LE())", function() {
  590. assert.ok(Int64LE.isInt64LE(Int64LE()));
  591. assert.ok(!Int64LE.isInt64LE(Uint64LE()));
  592. });
  593. });
  594. }
  595. function ArrayLike(arg) {
  596. if (!(this instanceof ArrayLike)) return new ArrayLike(arg);
  597. var i;
  598. if (arg && arg.length) {
  599. this.length = arg.length;
  600. for (i = 0; i < this.length; i++) this[i] = arg[i];
  601. } else {
  602. this.length = arg;
  603. for (i = 0; i < this.length; i++) this[i] = 0;
  604. }
  605. }
  606. function isArrayBuffer(buffer) {
  607. return (ARRAYBUFFER && buffer instanceof ArrayBuffer);
  608. }
  609. function toHex(array) {
  610. return Array.prototype.map.call(array, function(val) {
  611. return val > 15 ? val.toString(16) : "0" + val.toString(16);
  612. }).join("");
  613. }
  614. function toString16(val) {
  615. var str = val.toString(16);
  616. if (str.indexOf("e+") < 0) return str;
  617. // IE8-10 may return "4(e+15)" style of string
  618. return Math.floor(val / 0x100000000).toString(16) + lpad((val % 0x100000000).toString(16), 8);
  619. }
  620. function lpad(str, len) {
  621. return "00000000".substr(0, len - str.length) + str;
  622. }
  623. function assert(value) {
  624. if (!value) throw new Error(value + " = " + true);
  625. }
  626. function equal(actual, expected) {
  627. if (actual != expected) throw new Error(actual + " = " + expected);
  628. }