UNPKG

@trivechain/triveasset-protocol

Version:

TriveAsset Protocol provides the definition, encode and decode functions that recognize a TriveAsset Encoding

240 lines (223 loc) 9.19 kB
const issuanceFlagsEncoder = require('../index').IssuanceFlagsEncoder const assert = require('assert') const consumer = function (buff) { let curr = 0 return function consume(len) { return buff.slice(curr, (curr += len)) } } describe('Test issue flags encoder', function () { it('should return the right decoding', function (done) { this.timeout(0) const testCase = [ { divisibility: 0, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 1, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 2, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 3, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 4, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 5, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 6, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 7, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 8, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 9, lockStatus: false, aggregationPolicy: 'aggregatable' }, { divisibility: 10, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 11, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 12, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 13, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 14, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 15, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 0, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 1, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 2, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 3, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 4, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 5, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 6, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 7, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 8, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 9, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 10, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 11, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 12, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 13, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 14, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 15, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 0, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 0, lockStatus: true, aggregationPolicy: 'dispersed' }, ] for (let i = 0; i < testCase.length; i++) { const code = issuanceFlagsEncoder.encode(testCase[i]) const decode = issuanceFlagsEncoder.decode(consumer(code)) assert.strictEqual( decode.divisibility, testCase[i].divisibility, 'Divisibility encode has problems' ) assert.strictEqual( decode.lockStatus, testCase[i].lockStatus, 'LockStatus encode has problems' ) assert.strictEqual( decode.aggregationPolicy, testCase[i].aggregationPolicy, 'Aggregate policy has problems' ) } done() }) it('should use aggregatable for policy if not defined', function (done) { const code = issuanceFlagsEncoder.encode({ divisibility: 0, lockStatus: false, }) const decode = issuanceFlagsEncoder.decode(consumer(code)) assert.strictEqual( decode.aggregationPolicy, 'aggregatable', 'Aggregate policy has problems' ) done() }) it('should restrict the divisibility to 0 if aggregationPolicy is dispersed', function (done) { this.timeout(0) const testCase = [ { divisibility: 1, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 2, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 3, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 4, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 5, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 6, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 7, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 8, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 9, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 10, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 11, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 12, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 13, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 14, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 15, lockStatus: false, aggregationPolicy: 'dispersed' }, { divisibility: 1, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 2, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 3, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 4, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 5, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 6, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 7, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 8, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 9, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 10, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 11, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 12, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 13, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 14, lockStatus: true, aggregationPolicy: 'dispersed' }, { divisibility: 15, lockStatus: true, aggregationPolicy: 'dispersed' }, ] for (let i = 0; i < testCase.length; i++) { const code = issuanceFlagsEncoder.encode(testCase[i]) const decode = issuanceFlagsEncoder.decode(consumer(code)) assert.strictEqual( decode.divisibility, 0, 'Divisibility encode has problems' ) assert.strictEqual( decode.lockStatus, testCase[i].lockStatus, 'LockStatus encode has problems' ) assert.strictEqual( decode.aggregationPolicy, testCase[i].aggregationPolicy, 'Aggregate policy has problems' ) } done() }) it('should fail for wrong divisibility', function (done) { this.timeout(0) const testCase = [ { divisibility: 82, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 21, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: -8, lockStatus: true, aggregationPolicy: 'aggregatable' }, { divisibility: 0xff, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 1000, lockStatus: true, aggregationPolicy: 'aggregatable', }, { divisibility: -1, lockStatus: false, aggregationPolicy: 'aggregatable', }, { divisibility: 16, lockStatus: false, aggregationPolicy: 'aggregatable', }, ] for (let i = 0; i < testCase.length; i++) { assert.throws( function () { issuanceFlagsEncoder.encode(testCase[i]) }, /Divisibility not in range/, 'Wrong fail' ) } done() }) it('should fail for invalid aggregation policy', function (done) { this.timeout(0) const testCase = [ // aggregatable typos are on purpose... { divisibility: 2, lockStatus: false, aggregationPolicy: 1 }, { divisibility: 3, lockStatus: true, aggregationPolicy: 2 }, { divisibility: 4, lockStatus: false, aggregationPolicy: 'AGGREGATABL' }, { divisibility: 5, lockStatus: true, aggregationPolicy: 'aggregat' }, ] for (let i = 0; i < testCase.length; i++) { assert.throws( function () { issuanceFlagsEncoder.encode(testCase[i]) }, /Invalid aggregation policy/, 'Wrong fail' ) } done() }) })