assert = require 'assert' UnicodeTrieBuilder = require '../builder' UnicodeTrie = require '../' describe 'unicode trie', -> it 'set', -> 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', -> t = new UnicodeTrieBuilder 10, 666 t.set 0x4567, 99 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', -> 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', -> t = new UnicodeTrieBuilder 10, 666 t.setRange 13, 6666, 7788, false t.setRange 6000, 7000, 9900, true 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 'should work with compressed serialization format', -> t = new UnicodeTrieBuilder 10, 666 t.setRange 13, 6666, 7788, false t.setRange 6000, 7000, 9900, true buf = t.toBuffer() 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 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 for test in rangeTests initialValue = 0 errorValue = 0x0bad i = 0 if test.ranges[i][1] < 0 errorValue = test.ranges[i][2] i++ initialValue = test.ranges[i++][2] trie = new UnicodeTrieBuilder initialValue, errorValue for range in test.ranges[i...] trie.setRange range[0], range[1] - 1, range[2], range[3] isnt 0 frozen = trie.freeze() start = 0 for check in test.check for start in [start...check[0]] by 1 assert.equal trie.get(start), check[1] assert.equal frozen.get(start), check[1]