@trivechain/triveasset-protocol
Version:
TriveAsset Protocol provides the definition, encode and decode functions that recognize a TriveAsset Encoding
310 lines (286 loc) • 8.27 kB
JavaScript
/* eslint-env mocha */
const paymentEncoder = require('../index').BurnPaymentEncoder
const assert = require('assert')
const consumer = function (buff) {
let curr = 0
return function consume(len) {
return buff.slice(curr, (curr += len))
}
}
describe('Payment Decode Encode', function () {
it('should return the right decoding', function (done) {
const testCase = [
{ skip: false, range: false, percent: true, output: 12, amount: 3213213 },
{ skip: true, range: false, percent: false, output: 14, amount: 321321 },
{ skip: false, range: false, percent: false, output: 2, amount: 321321 },
{ skip: true, range: true, percent: false, output: 0, amount: 1000000 },
{
skip: false,
range: false,
percent: true,
output: 1,
amount: 321321321,
},
{
skip: true,
range: true,
percent: false,
output: 5,
amount: 10000003321,
},
{
skip: false,
range: false,
percent: true,
output: 20,
amount: 100000021000,
},
{
skip: true,
range: false,
percent: false,
output: 22,
amount: 1000000210002,
},
{ skip: false, range: false, percent: true, output: 11, amount: 321 },
{ skip: true, range: true, percent: true, output: 10, amount: 1 },
{
skip: true,
range: true,
percent: true,
output: 10,
amount: 1323004030000,
},
]
for (let i = 0; i < testCase.length; i++) {
const code = paymentEncoder.encode(testCase[i])
const decode = paymentEncoder.decode(consumer(code))
assert.strictEqual(testCase[i].skip, decode.skip)
assert.strictEqual(testCase[i].range, decode.range)
assert.strictEqual(testCase[i].percent, decode.percent)
assert.strictEqual(testCase[i].output, decode.output)
assert.strictEqual(testCase[i].amount, decode.amount)
}
done()
})
it('should return the right encoding for burn', function (done) {
const testCase1 = paymentEncoder.encode({
skip: false,
percent: false,
amount: 13,
burn: true,
})
const testCase2 = paymentEncoder.encode({
skip: true,
percent: false,
amount: 123,
burn: true,
})
const testCase3 = paymentEncoder.encode({
skip: false,
percent: true,
amount: 25,
burn: true,
})
const testCase4 = paymentEncoder.encode({
skip: true,
percent: true,
amount: 10,
burn: true,
})
assert.deepEqual(testCase1, Buffer.from([0x1f, 0x0d]))
assert.deepEqual(testCase2, Buffer.from([0x9f, 0x27, 0xb0]))
assert.deepEqual(testCase3, Buffer.from([0x3f, 0x19]))
assert.deepEqual(testCase4, Buffer.from([0xbf, 0x0a]))
done()
})
it('should return the right decoding for burn', function (done) {
const testCases = [
{ skip: false, percent: false, amount: 3213213, burn: true },
{ skip: true, percent: false, amount: 3213213, burn: true },
{ skip: false, percent: true, amount: 50, burn: true },
{ skip: true, percent: true, amount: 13, burn: true },
]
for (let i = 0; i < testCases.length; i++) {
const code = paymentEncoder.encode(testCases[i])
const decode = paymentEncoder.decode(consumer(code))
assert.strictEqual(testCases[i].skip, decode.skip)
assert.strictEqual(testCases[i].percent, decode.percent)
assert.strictEqual(testCases[i].burn, decode.burn)
assert.strictEqual(testCases[i].amount, decode.amount)
}
done()
})
it('should return the right decoding for bulk operations', function (done) {
const testCase = [
{ skip: false, range: false, percent: true, output: 12, amount: 3213213 },
{ skip: true, range: false, percent: false, output: 14, amount: 321321 },
{ skip: false, range: false, percent: false, output: 2, amount: 321321 },
{ skip: true, range: true, percent: false, output: 0, amount: 1000000 },
{
skip: false,
range: false,
percent: true,
output: 1,
amount: 321321321,
},
{
skip: true,
range: true,
percent: false,
output: 5,
amount: 10000003321,
},
{
skip: false,
range: false,
percent: true,
output: 20,
amount: 100000021000,
},
{
skip: true,
range: false,
percent: false,
output: 22,
amount: 1000000210002,
},
{ skip: false, range: false, percent: true, output: 11, amount: 321 },
{ skip: true, range: true, percent: true, output: 10, amount: 1 },
{
skip: true,
range: true,
percent: true,
output: 10,
amount: 1323004030000,
},
]
const code = paymentEncoder.encodeBulk(testCase)
const decode = paymentEncoder.decodeBulk(consumer(code))
for (let i = 0; i < testCase.length; i++) {
assert.strictEqual(testCase[i].skip, decode[i].skip)
assert.strictEqual(testCase[i].range, decode[i].range)
assert.strictEqual(testCase[i].percent, decode[i].percent)
assert.strictEqual(testCase[i].output, decode[i].output)
assert.strictEqual(testCase[i].amount, decode[i].amount)
}
done()
})
it('should throw output value out of bounds error', function (done) {
const testCases = [
{ skip: false, range: false, percent: true, output: 32, amount: 3213213 },
{ skip: true, range: true, percent: false, output: 8192, amount: 321321 },
]
for (let i = 0; i < testCases.length; i++) {
assert.throws(
function () {
paymentEncoder.encode(testCases[i])
},
/Output value is out of bounds/,
'Should Throw Error'
)
}
done()
})
it('should throw output value out of bounds for burn case', function (done) {
const testCase = {
skip: false,
range: false,
percent: false,
output: 31,
amount: 123192,
}
assert.throws(
function () {
paymentEncoder.encode(testCase, true)
},
/Received range and output values reserved to represent burn/,
'Should Throw Error'
)
done()
})
it('should throw output value negative error', function (done) {
const testCase = {
skip: true,
range: true,
percent: false,
output: -1,
amount: 321321,
}
assert.throws(
function () {
paymentEncoder.encode(testCase)
},
/Output Can't be negative/,
'Should Throw Error'
)
done()
})
it('should throw no output error', function (done) {
const testCases = [
{ skip: true, range: true, percent: true, amount: 1323004030000 },
{
skip: true,
range: true,
percent: true,
amount: 1323004030000,
burn: false,
},
]
for (let i = 0; i < testCases.length; i++) {
assert.throws(
function () {
paymentEncoder.encode(testCases[i])
},
/Needs output value/,
'Should Throw Error'
)
}
done()
})
it('should throw both burn and output value are specified', function (done) {
const testCase = {
skip: true,
percent: true,
output: 12,
amount: 1323004030000,
burn: true,
}
assert.throws(
function () {
paymentEncoder.encode(testCase)
},
/Received both burn and output/,
'Should Throw Error'
)
done()
})
it('should throw both burn and range are specified', function (done) {
const testCase = {
skip: true,
range: true,
percent: true,
amount: 1323004030000,
burn: true,
}
assert.throws(
function () {
paymentEncoder.encode(testCase)
},
/Received both burn and range/,
'Should Throw Error'
)
done()
})
it('should throw no amount error', function (done) {
const testCase = { skip: true, range: true, percent: true, output: 12 }
assert.throws(
function () {
paymentEncoder.encode(testCase)
},
/Needs amount value/,
'Should Throw Error'
)
done()
})
})