astro-ghostcms/.pnpm-store/v3/files/26/f0a39f3af1d97d92c7efe555bc8...

244 lines
7.4 KiB
Plaintext
Raw Permalink Normal View History

2024-02-14 14:10:47 +00:00
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<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', () => {
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;
}));
}
});
});