const fs = require('fs') const test = require('tape') const GraphemeSplitter = require('../index') function ucs2encode(array) { return array.map( value => { let output = ''; if (value > 0xFFFF) { value -= 0x10000; output += String.fromCharCode(value >>> 10 & 0x3FF | 0xD800); value = 0xDC00 | value & 0x3FF; } output += String.fromCharCode(value); return output; }).join(''); } function testDataFromLine(line) { const codePoints = line.split(/\s*[×÷]\s*/).map(c => parseInt(c, 16)); const input = ucs2encode(codePoints); const expected = line.split(/\s*÷\s*/) .map(sequence => { const codePoints = sequence.split(/\s*×\s*/).map(c => parseInt(c, 16)) return ucs2encode(codePoints) }); return { input, expected }; } const testData = fs.readFileSync('tests/GraphemeBreakTest.txt', 'utf-8') .split('\n') .filter(line => line != null && line.length > 0 && !line.startsWith('#')) .map(line => line.split('#')[0]) .map(testDataFromLine); // --------------------------------------------------------------------------- // Test cases // --------------------------------------------------------------------------- test('splitGraphemes returns properly split list from string', t => { const splitter = new GraphemeSplitter(); t.plan(testData.length); testData.forEach( ({ input, expected }) => { const result = splitter.splitGraphemes(input); t.deepLooseEqual(result, expected); }); t.end(); }); test('iterateGraphemes returns properly split iterator from string', t => { const splitter = new GraphemeSplitter(); t.plan(testData.length); testData.forEach( ({ input, expected }) => { const result = splitter.iterateGraphemes(input); t.deepLooseEqual([...result], expected); }); t.end(); }); test('countGraphemes returns the correct number of graphemes in string', t => { const splitter = new GraphemeSplitter(); t.plan(testData.length); testData.forEach( ({ input, expected }) => { const result = splitter.countGraphemes(input); t.equal(result, expected.length); }); t.end(); });