UNPKG

@bsv/sdk

Version:

BSV Blockchain Software Development Kit

285 lines (260 loc) 9.28 kB
/* eslint-env jest */ import BigNumber from '../../primitives/BigNumber' describe('BN.js/Binary', function () { describe('.shl()', function () { it('should shl numbers', function () { expect(new BigNumber('69527932928').shln(13).toString(16)).toEqual( '2060602000000' ) expect(new BigNumber('69527932928').shln(45).toString(16)).toEqual( '206060200000000000000' ) }) it('should ushl numbers', function () { expect(new BigNumber('69527932928').ushln(13).toString(16)).toEqual( '2060602000000' ) expect(new BigNumber('69527932928').ushln(45).toString(16)).toEqual( '206060200000000000000' ) }) }) describe('.shr()', function () { it('should shr numbers', function () { expect(new BigNumber('69527932928').shrn(13).toString(16)).toEqual( '818180' ) expect(new BigNumber('69527932928').shrn(17).toString(16)).toEqual( '81818' ) expect(new BigNumber('69527932928').shrn(256).toString(16)).toEqual('0') }) it('should ushr numbers', function () { expect(new BigNumber('69527932928').ushrn(13).toString(16)).toEqual( '818180' ) expect(new BigNumber('69527932928').ushrn(17).toString(16)).toEqual( '81818' ) expect(new BigNumber('69527932928').ushrn(256).toString(16)).toEqual('0') }) }) describe('.bincn()', function () { it('should increment bit', function () { expect(new BigNumber(0).bincn(1).toString(16)).toEqual('2') expect(new BigNumber(2).bincn(1).toString(16)).toEqual('4') expect(new BigNumber(2).bincn(1).bincn(1).toString(16)).toEqual( new BigNumber(2).bincn(2).toString(16) ) expect(new BigNumber(0xffffff).bincn(1).toString(16)).toEqual('1000001') expect(new BigNumber(2).bincn(63).toString(16)).toEqual( '8000000000000002' ) }) }) describe('.imaskn()', function () { it('should mask bits in-place', function () { expect(new BigNumber(0).imaskn(1).toString(16)).toEqual('0') expect(new BigNumber(3).imaskn(1).toString(16)).toEqual('1') expect(new BigNumber('123456789', 16).imaskn(4).toString(16)).toEqual( '9' ) expect(new BigNumber('123456789', 16).imaskn(16).toString(16)).toEqual( '6789' ) expect(new BigNumber('123456789', 16).imaskn(28).toString(16)).toEqual( '3456789' ) }) it('should not mask when number is bigger than length', function () { expect(new BigNumber(0xe3).imaskn(56).toString(16)).toEqual('e3') expect(new BigNumber(0xe3).imaskn(26).toString(16)).toEqual('e3') }) }) describe('.testn()', function () { it('should support test specific bit', function () { [ 'ff', 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' ].forEach(function (hex) { const bn = new BigNumber(hex, 16) const bl = bn.bitLength() for (let i = 0; i < bl; ++i) { expect(bn.testn(i)).toEqual(true) } // test off the end expect(bn.testn(bl)).toEqual(false) }) const xbits = '01111001010111001001000100011101' + '11010011101100011000111001011101' + '10010100111000000001011000111101' + '01011111001111100100011110000010' + '01011010100111010001010011000100' + '01101001011110100001001111100110' + '001110010111' const x = new BigNumber( '23478905234580795234378912401239784125643978256123048348957342' ) for (let i = 0; i < x.bitLength(); ++i) { expect(x.testn(i)).toEqual(xbits.charAt(i) === '1') } }) it('should have short-cuts', function () { const x = new BigNumber('abcd', 16) expect(!x.testn(128)).toEqual(true) }) }) describe('.and()', function () { it('should and numbers', function () { expect( new BigNumber('1010101010101010101010101010101010101010', 2) .and(new BigNumber('101010101010101010101010101010101010101', 2)) .toString(2) ).toEqual('0') }) it('should and numbers of different limb-length', function () { expect( new BigNumber('abcd0000ffff', 16) .and(new BigNumber('abcd', 16)) .toString(16) ).toEqual('abcd') }) }) describe('.iand()', function () { it('should iand numbers', function () { expect( new BigNumber('1010101010101010101010101010101010101010', 2) .iand(new BigNumber('101010101010101010101010101010101010101', 2)) .toString(2) ).toEqual('0') expect( new BigNumber('1000000000000000000000000000000000000001', 2) .iand(new BigNumber('1', 2)) .toString(2) ).toEqual('1') expect( new BigNumber('1', 2) .iand(new BigNumber('1000000000000000000000000000000000000001', 2)) .toString(2) ).toEqual('1') }) }) describe('.or()', function () { it('should or numbers', function () { expect( new BigNumber('1010101010101010101010101010101010101010', 2) .or(new BigNumber('101010101010101010101010101010101010101', 2)) .toString(2) ).toEqual('1111111111111111111111111111111111111111') }) it('should or numbers of different limb-length', function () { expect( new BigNumber('abcd00000000', 16) .or(new BigNumber('abcd', 16)) .toString(16) ).toEqual('abcd0000abcd') }) }) describe('.ior()', function () { it('should ior numbers', function () { expect( new BigNumber('1010101010101010101010101010101010101010', 2) .ior(new BigNumber('101010101010101010101010101010101010101', 2)) .toString(2) ).toEqual('1111111111111111111111111111111111111111') expect( new BigNumber('1000000000000000000000000000000000000000', 2) .ior(new BigNumber('1', 2)) .toString(2) ).toEqual('1000000000000000000000000000000000000001') expect( new BigNumber('1', 2) .ior(new BigNumber('1000000000000000000000000000000000000000', 2)) .toString(2) ).toEqual('1000000000000000000000000000000000000001') }) }) describe('.xor()', function () { it('should xor numbers', function () { expect( new BigNumber('11001100110011001100110011001100', 2) .xor(new BigNumber('1100110011001100110011001100110', 2)) .toString(2) ).toEqual('10101010101010101010101010101010') }) }) describe('.ixor()', function () { it('should ixor numbers', function () { expect( new BigNumber('11001100110011001100110011001100', 2) .ixor(new BigNumber('1100110011001100110011001100110', 2)) .toString(2) ).toEqual('10101010101010101010101010101010') expect( new BigNumber('11001100110011001100110011001100', 2) .ixor(new BigNumber('1', 2)) .toString(2) ).toEqual('11001100110011001100110011001101') expect( new BigNumber('1', 2) .ixor(new BigNumber('11001100110011001100110011001100', 2)) .toString(2) ).toEqual('11001100110011001100110011001101') }) it('should and numbers of different limb-length', function () { expect( new BigNumber('abcd0000ffff', 16) .ixor(new BigNumber('abcd', 16)) .toString(16) ).toEqual('abcd00005432') }) }) describe('.setn()', function () { it('should allow single bits to be set', function () { expect(new BigNumber(0).setn(2, true).toString(2)).toEqual('100') expect(new BigNumber(0).setn(27, true).toString(2)).toEqual( '1000000000000000000000000000' ) expect(new BigNumber(0).setn(63, true).toString(16)).toEqual( new BigNumber(1).iushln(63).toString(16) ) expect( new BigNumber('1000000000000000000000000001', 2) .setn(27, false) .toString(2) ).toEqual('1') expect(new BigNumber('101', 2).setn(2, false).toString(2)).toEqual('1') }) }) describe('.notn()', function () { it('should allow bitwise negation', function () { expect(new BigNumber('111000111', 2).notn(9).toString(2)).toEqual( '111000' ) expect(new BigNumber('000111000', 2).notn(9).toString(2)).toEqual( '111000111' ) expect(new BigNumber('111000111', 2).notn(9).toString(2)).toEqual( '111000' ) expect(new BigNumber('000111000', 2).notn(9).toString(2)).toEqual( '111000111' ) expect(new BigNumber('111000111', 2).notn(32).toString(2)).toEqual( '11111111111111111111111000111000' ) expect(new BigNumber('000111000', 2).notn(32).toString(2)).toEqual( '11111111111111111111111111000111' ) expect(new BigNumber('111000111', 2).notn(68).toString(2)).toEqual( '11111111111111111111111111111111' + '111111111111111111111111111000111000' ) expect(new BigNumber('000111000', 2).notn(68).toString(2)).toEqual( '11111111111111111111111111111111' + '111111111111111111111111111111000111' ) }) }) })