multiformats
Version:
Interface for multihash, multicodec, multibase and CID
122 lines (117 loc) • 4.17 kB
JavaScript
var bytes = require('../src/bytes.js');
var assert = require('assert');
var base16$1 = require('../src/bases/base16.js');
var base32$1 = require('../src/bases/base32.js');
var base58 = require('../src/bases/base58.js');
var base64Browser = require('../src/bases/base64-browser.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var assert__default = /*#__PURE__*/_interopDefaultLegacy(assert);
const {base16, base32, base58btc, base64} = {
...base16$1,
...base32$1,
...base58,
...base64Browser
};
const same = assert__default['default'].deepStrictEqual;
const test = it;
const testThrow = (fn, message) => {
try {
fn();
} catch (e) {
if (e.message !== message)
throw e;
return;
}
throw new Error('Test failed to throw');
};
describe('multibase', () => {
test('browser', () => {
same(!!base64Browser.__browser, !!process.browser);
});
for (const base of [
base16,
base32,
base58btc,
base64
]) {
describe(`basics ${ base.name }`, () => {
test('encode/decode', () => {
const string = base.encode(bytes.fromString('test'));
same(string[0], base.prefix);
const buffer = base.decode(string);
same(buffer, bytes.fromString('test'));
});
test('pristine backing buffer', () => {
const string = base.encode(bytes.fromString('test'));
const buffer = base.decode(string);
const expected = bytes.fromString('test');
same(new Uint8Array(buffer).join(','), new Uint8Array(expected.buffer).join(','));
});
test('empty', () => {
const str = base.encode(bytes.fromString(''));
same(str, base.prefix);
same(base.decode(str), bytes.fromString(''));
});
test('bad chars', () => {
const str = base.prefix + '#$%^&*&^%$#';
const msg = base === base58btc ? 'Non-base58 character' : `invalid ${ base.name } character`;
testThrow(() => base.decode(str), msg);
});
});
}
test('encode string failure', () => {
const msg = 'Unknown type, must be binary type';
testThrow(() => base32.encode('asdf'), msg);
testThrow(() => base32.encoder.encode('asdf'), msg);
});
test('decode int failure', () => {
const msg = 'Can only multibase decode strings';
testThrow(() => base32.decode(1), msg);
testThrow(() => base32.decoder.decode(1), msg);
});
const buff = bytes.fromString('test');
const baseTest = bases => {
for (const base of Object.values(bases)) {
if (base && base.name) {
test(`encode/decode ${ base.name }`, () => {
const encoded = base.encode(buff);
const decoded = base.decode(encoded);
same(decoded, buff);
same(encoded, base.encoder.encode(buff));
same(buff, base.decoder.decode(encoded));
});
}
}
};
describe('base16', () => {
baseTest(base16$1);
});
describe('base32', () => {
baseTest(base32$1);
});
describe('base58', () => {
baseTest(base58);
});
describe('base64', () => {
baseTest(base64Browser);
});
describe('multibase mismatch', () => {
const b64 = base64.encode(bytes.fromString('test'));
const msg = `Unable to decode multibase string "${ b64 }", base32 decoder only supports inputs prefixed with ${ base32.prefix }`;
testThrow(() => base32.decode(b64), msg);
});
describe('decoder composition', () => {
const base = base32.decoder.or(base58btc.decoder);
const b32 = base32.encode(bytes.fromString('test'));
same(base.decode(b32), bytes.fromString('test'));
const b58 = base58btc.encode(bytes.fromString('test'));
same(base.decode(b58), bytes.fromString('test'));
const b64 = base64.encode(bytes.fromString('test'));
const msg = `Unable to decode multibase string "${ b64 }", only inputs prefixed with ${ base32.prefix },${ base58btc.prefix } are supported`;
testThrow(() => base.decode(b64), msg);
const baseExt = base.or(base64);
same(baseExt.decode(b64), bytes.fromString('test'));
testThrow(() => base.decode(b64), msg);
});
});
;