diamante-js-xdr
Version:
Read/write XDR encoded data structures (RFC 4506)
319 lines (315 loc) • 8.79 kB
JavaScript
import {
encodeBigIntFromBits,
formatIntName,
sliceBigInt
} from '../../src/bigint-encoder';
describe('encodeBigIntWithPrecision', function () {
it(`encodes values correctly`, () => {
const testCases = [
// i64
[[0], 64, false, 0n],
[[-1], 64, false, -1n],
[['-15258'], 64, false, -15258n],
[[-0x8000000000000000n], 64, false, -0x8000000000000000n],
[[0x7fffffffffffffffn], 64, false, 0x7fffffffffffffffn],
[[1, -0x80000000n], 64, false, -0x7fffffffffffffffn],
[[-1, -1], 64, false, -1n],
[[-2, 0x7fffffffn], 64, false, 0x7ffffffffffffffen],
[[345, -345], 64, false, -0x158fffffea7n],
// u64
[[0], 64, true, 0n],
[[1n], 64, true, 1n],
[[0xffffffffffffffffn], 64, true, 0xffffffffffffffffn],
[[0n, 0n], 64, true, 0n],
[[1, 0], 64, true, 1n],
[[-1, -1], 64, true, 0xffffffffffffffffn],
[[-2, -1], 64, true, 0xfffffffffffffffen],
// i128
[[0], 128, false, 0n],
[[-1], 128, false, -1n],
[['-15258'], 128, false, -15258n],
[
[-0x80000000000000000000000000000000n],
128,
false,
-0x80000000000000000000000000000000n
],
[
[ ],
128,
false,
0x7fffffffffffffffffffffffffffffffn
],
[[1, -2147483648], 128, false, -0x7fffffffffffffffffffffffn],
[[-1, -1], 128, false, -1n],
[
[-1, 0x7fffffffffffffffn],
128,
false,
0x7fffffffffffffffffffffffffffffffn
],
[
[ ],
128,
false,
0x7fffffffffffffffffffffffffffffffn
],
[
[ ],
128,
false,
-0x80000000000000000000000000000000n
],
[
[ ],
128,
false,
-0x7fffffffffffffffffffffffffffffffn
],
[
[ ],
128,
false,
-0x7fffffffffffffffffffffffffffffffn
],
[[345, 345n, '345', 0x159], 128, false, 0x159000001590000015900000159n],
// u128
[[0], 128, true, 0n],
[[1n], 128, true, 1n],
[
[ ],
128,
true,
0xffffffffffffffffffffffffffffffffn
],
[[0n, 0n], 128, true, 0n],
[[1, 0], 128, true, 1n],
[[-1, -1], 128, true, 0xffffffffffffffffffffffffffffffffn],
[[-2, -1], 128, true, 0xfffffffffffffffffffffffffffffffen],
[
[ ],
128,
true,
0x7fffffffffffffff5cffffffffffffffn
],
[
[ ],
128,
true,
0x80000000ffffffff0000000100000001n
],
[[345, 345n, '345', 0x159], 128, false, 0x159000001590000015900000159n],
// i256
[[0], 256, false, 0n],
[[-1], 256, false, -1n],
[['-15258'], 256, false, -15258n],
[
[-0x8000000000000000000000000000000000000000000000000000000000000000n],
256,
false,
-0x8000000000000000000000000000000000000000000000000000000000000000n
],
[
[ ],
256,
false,
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn
],
[
[ ],
256,
false,
-0x7fffffffffffffffffffffffffffffffffffffffn
],
[[-1, -1], 256, false, -1n],
[
[-1, 0x7fffffffffffffffn],
256,
false,
0x7fffffffffffffffffffffffffffffffffffffffffffffffn
],
[
[
0xffffffffffffffffffffffffffffffffn,
0x7fffffffffffffffffffffffffffffffn
],
256,
false,
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn
],
[
[ ],
256,
false,
-0x8000000000000000000000000000000000000000000000000000000000000000n
],
[
[ ],
256,
false,
-0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn
],
[
[ ],
256,
false,
-0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn
],
[
[ ],
256,
false,
-0x158fffffffffffffea6fffffffffffffea6fffffffffffffea7n
],
[
[ ],
256,
false,
-0x7fffffff8fffffff9fffffffafffffffbfffffffcfffffffdffffffffn
],
[
[ ],
256,
false,
-0x7fffffff800000005fffffffa00000003fffffffc00000001ffffffffn
],
// u256
[[0], 256, true, 0n],
[[1n], 256, true, 1n],
[
[ ],
256,
true,
0xffffffffffffffffffffffffffffffffn
],
[[0n, 0n], 256, true, 0n],
[[1, 0], 256, true, 1n],
[
[-1, -1],
256,
true,
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn
],
[
[-2, -1],
256,
true,
0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffen
],
[
[
0x5cffffffffffffffffffffffffffffffn,
0x7fffffffffffffffffffffffffffffffn
],
256,
true,
0x7fffffffffffffffffffffffffffffff5cffffffffffffffffffffffffffffffn
],
[
[ ],
256,
true,
0xffffffff80000000ffffffffffffffff00000000000000010000000000000001n
],
[
[
1558245471070191615n,
1558245471070191615n,
'1558245471070191615',
0x159fffffffffffffn
],
256,
false,
0x159fffffffffffff159fffffffffffff159fffffffffffff159fffffffffffffn
],
[
[ ],
256,
false,
0x0000000800000007000000060000000500000004000000030000000200000001n
]
];
for (let [args, bits, unsigned, expected] of testCases) {
try {
const actual = encodeBigIntFromBits(args, bits, unsigned);
expect(actual).to.eq(
expected,
`bigint values for ${formatIntName(
bits,
unsigned
)} out of range: [${args.join()}]`
);
} catch (e) {
e.message = `Encoding [${args.join()}] => ${formatIntName(
bits,
unsigned
)} BigInt failed with error: ${e.message}`;
throw e;
}
}
});
});
describe('sliceBigInt', function () {
it(`slices values correctly`, () => {
const testCases = [
[ ]],
[ ]],
[-1n, 64, 32, [-1n, -1n]],
[ ]],
[
0x7fffffffffffffff5cffffffffffffffn,
128,
64,
[ ]
],
[
0x80000000ffffffff0000000100000001n,
128,
32,
[ ]
],
[
-0x158fffffffffffffea6fffffffffffffea6fffffffffffffea7n,
256,
64,
[ ]
],
[
0x0000000800000007000000060000000500000004000000030000000200000001n,
256,
32,
[ ]
],
[
-0x7fffffff8fffffff9fffffffafffffffbfffffffcfffffffdffffffffn,
256,
32,
[ ]
],
[
-0x7fffffff800000005fffffffa00000003fffffffc00000001ffffffffn,
256,
32,
[ ]
]
];
for (let [value, size, sliceSize, expected] of testCases) {
try {
const actual = sliceBigInt(value, size, sliceSize);
expect(actual).to.eql(
expected,
`Invalid ${formatIntName(
size,
false
)} / ${sliceSize} slicing result for ${value}`
);
} catch (e) {
e.message = `Slicing ${value} for ${formatIntName(
size,
false
)} / ${sliceSize} failed with error: ${e.message}`;
throw e;
}
}
});
});