You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
6.4 KiB
CoffeeScript
219 lines
6.4 KiB
CoffeeScript
7 years ago
|
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<U+ffff with non-initialValue
|
||
|
[ 0xcccc, 0x55555, 6, 1 ]
|
||
|
],
|
||
|
|
||
|
check: [
|
||
|
[ 0, 9 ], # non-zero initialValue
|
||
|
[ 0x31, 9 ],
|
||
|
[ 0xa4, 1 ],
|
||
|
[ 0x3400, 9 ],
|
||
|
[ 0x6789, 2 ],
|
||
|
[ 0x9000, 9 ],
|
||
|
[ 0xa000, 4 ],
|
||
|
[ 0xabcd, 9 ],
|
||
|
[ 0xbcde, 3 ],
|
||
|
[ 0xcccc, 9 ],
|
||
|
[ 0x110000, 6 ]
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
# empty or single-value tries, testing highStart==0
|
||
|
ranges: [
|
||
|
[ 0, 0, 3, 0 ] # Only the element with the initial value.
|
||
|
]
|
||
|
|
||
|
check: [
|
||
|
[ 0, 3 ],
|
||
|
[ 0x110000, 3 ]
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
ranges: [
|
||
|
[ 0, 0, 3, 0 ] # Initial value = 3
|
||
|
[ 0, 0x110000, 5, 1 ]
|
||
|
],
|
||
|
|
||
|
check: [
|
||
|
[ 0, 3 ]
|
||
|
[ 0x110000, 5 ]
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
|
||
|
it 'should pass range tests', ->
|
||
|
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]
|
||
|
|