const assert = require('assert'); const UnicodeTrieBuilder = require('../builder'); const UnicodeTrie = require('../'); describe('unicode trie', () => { it('set', () => { const trie = new UnicodeTrieBuilder(10, 666); trie.set(0x4567, 99); assert.equal(trie.get(0x4566), 10); assert.equal(trie.get(0x4567), 99); assert.equal(trie.get(-1), 666); assert.equal(trie.get(0x110000), 666); }); it('set -> compacted trie', () => { const t = new UnicodeTrieBuilder(10, 666); t.set(0x4567, 99); const trie = t.freeze(); assert.equal(trie.get(0x4566), 10); assert.equal(trie.get(0x4567), 99); assert.equal(trie.get(-1), 666); assert.equal(trie.get(0x110000), 666); }); it('setRange', () => { const trie = new UnicodeTrieBuilder(10, 666); trie.setRange(13, 6666, 7788, false); trie.setRange(6000, 7000, 9900, true); assert.equal(trie.get(12), 10); assert.equal(trie.get(13), 7788); assert.equal(trie.get(5999), 7788); assert.equal(trie.get(6000), 9900); assert.equal(trie.get(7000), 9900); assert.equal(trie.get(7001), 10); assert.equal(trie.get(0x110000), 666); }); it('setRange -> compacted trie', () => { const t = new UnicodeTrieBuilder(10, 666); t.setRange(13, 6666, 7788, false); t.setRange(6000, 7000, 9900, true); const trie = t.freeze(); assert.equal(trie.get(12), 10); assert.equal(trie.get(13), 7788); assert.equal(trie.get(5999), 7788); assert.equal(trie.get(6000), 9900); assert.equal(trie.get(7000), 9900); assert.equal(trie.get(7001), 10); assert.equal(trie.get(0x110000), 666); }); it('toBuffer written in little-endian', () => { const trie = new UnicodeTrieBuilder(); trie.set(0x4567, 99); const buf = trie.toBuffer(); const bufferExpected = new Buffer.from([0, 72, 0, 0, 0, 0, 0, 0, 128, 36, 0, 0, 123, 123, 206, 144, 235, 128, 2, 143, 67, 96, 225, 171, 23, 55, 54, 38, 231, 47, 44, 127, 233, 90, 109, 194, 92, 246, 126, 197, 131, 223, 31, 56, 102, 78, 154, 20, 108, 117, 88, 244, 93, 192, 190, 218, 229, 156, 12, 107, 86, 235, 125, 96, 102, 0, 129, 15, 239, 109, 219, 204, 58, 151, 92, 52, 126, 152, 198, 14, 0]); assert.equal(buf.toString('hex'), bufferExpected.toString('hex')); }); it('should work with compressed serialization format', () => { const t = new UnicodeTrieBuilder(10, 666); t.setRange(13, 6666, 7788, false); t.setRange(6000, 7000, 9900, true); const buf = t.toBuffer(); const trie = new UnicodeTrie(buf); assert.equal(trie.get(12), 10); assert.equal(trie.get(13), 7788); assert.equal(trie.get(5999), 7788); assert.equal(trie.get(6000), 9900); assert.equal(trie.get(7000), 9900); assert.equal(trie.get(7001), 10); assert.equal(trie.get(0x110000), 666); }); const rangeTests = [ { ranges: [ [ 0, 0, 0, 0 ], [ 0, 0x40, 0, 0 ], [ 0x40, 0xe7, 0x1234, 0 ], [ 0xe7, 0x3400, 0, 0 ], [ 0x3400, 0x9fa6, 0x6162, 0 ], [ 0x9fa6, 0xda9e, 0x3132, 0 ], [ 0xdada, 0xeeee, 0x87ff, 0 ], [ 0xeeee, 0x11111, 1, 0 ], [ 0x11111, 0x44444, 0x6162, 0 ], [ 0x44444, 0x60003, 0, 0 ], [ 0xf0003, 0xf0004, 0xf, 0 ], [ 0xf0004, 0xf0006, 0x10, 0 ], [ 0xf0006, 0xf0007, 0x11, 0 ], [ 0xf0007, 0xf0040, 0x12, 0 ], [ 0xf0040, 0x110000, 0, 0 ] ], check: [ [ 0, 0 ], [ 0x40, 0 ], [ 0xe7, 0x1234 ], [ 0x3400, 0 ], [ 0x9fa6, 0x6162 ], [ 0xda9e, 0x3132 ], [ 0xdada, 0 ], [ 0xeeee, 0x87ff ], [ 0x11111, 1 ], [ 0x44444, 0x6162 ], [ 0xf0003, 0 ], [ 0xf0004, 0xf ], [ 0xf0006, 0x10 ], [ 0xf0007, 0x11 ], [ 0xf0040, 0x12 ], [ 0x110000, 0 ] ] }, { // set some interesting overlapping ranges ranges: [ [ 0, 0, 0, 0 ], [ 0x21, 0x7f, 0x5555, 1 ], [ 0x2f800, 0x2fedc, 0x7a, 1 ], [ 0x72, 0xdd, 3, 1 ], [ 0xdd, 0xde, 4, 0 ], [ 0x201, 0x240, 6, 1 ], // 3 consecutive blocks with the same pattern but [ 0x241, 0x280, 6, 1 ], // discontiguous value ranges, testing utrie2_enum() [ 0x281, 0x2c0, 6, 1 ], [ 0x2f987, 0x2fa98, 5, 1 ], [ 0x2f777, 0x2f883, 0, 1 ], [ 0x2f900, 0x2ffaa, 1, 0 ], [ 0x2ffaa, 0x2ffab, 2, 1 ], [ 0x2ffbb, 0x2ffc0, 7, 1 ] ], check: [ [ 0, 0 ], [ 0x21, 0 ], [ 0x72, 0x5555 ], [ 0xdd, 3 ], [ 0xde, 4 ], [ 0x201, 0 ], [ 0x240, 6 ], [ 0x241, 0 ], [ 0x280, 6 ], [ 0x281, 0 ], [ 0x2c0, 6 ], [ 0x2f883, 0 ], [ 0x2f987, 0x7a ], [ 0x2fa98, 5 ], [ 0x2fedc, 0x7a ], [ 0x2ffaa, 1 ], [ 0x2ffab, 2 ], [ 0x2ffbb, 0 ], [ 0x2ffc0, 7 ], [ 0x110000, 0 ] ] }, { // use a non-zero initial value ranges: [ [ 0, 0, 9, 0 ], // non-zero initial value. [ 0x31, 0xa4, 1, 0 ], [ 0x3400, 0x6789, 2, 0 ], [ 0x8000, 0x89ab, 9, 1 ], [ 0x9000, 0xa000, 4, 1 ], [ 0xabcd, 0xbcde, 3, 1 ], [ 0x55555, 0x110000, 6, 1 ], // highStart { const result = []; for (let test of rangeTests) { let initialValue = 0; let errorValue = 0x0bad; let i = 0; if (test.ranges[i][1] < 0) { errorValue = test.ranges[i][2]; i++; } initialValue = test.ranges[i++][2]; var trie = new UnicodeTrieBuilder(initialValue, errorValue); for (let range of test.ranges.slice(i)) { trie.setRange(range[0], range[1] - 1, range[2], range[3] !== 0); } var frozen = trie.freeze(); var start = 0; result.push(test.check.map((check) => { let end; const result1 = []; for (start = start, end = check[0]; start < end; start++) { assert.equal(trie.get(start), check[1]); result1.push(assert.equal(frozen.get(start), check[1])); } return result1; })); } }); });