You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.8 KiB
48 lines
1.8 KiB
const fs = require('fs');
|
|
const LineBreaker = require('../');
|
|
const assert = require('assert');
|
|
|
|
describe('unicode line break tests', function () {
|
|
// these tests are weird, possibly incorrect or just tailored differently. we skip them.
|
|
const skip = [
|
|
125, 127, 815, 1161, 1163, 1165, 1167, 1331, 2189, 2191, 2873, 2875, 3567, 3739, 4081, 4083,
|
|
4425, 4427, 4473, 4475, 4597, 4599, 4645, 4647, 4943, 5109, 5111, 5459, 6149, 6151, 6153, 6155,
|
|
6489, 6491, 6663, 6833, 6835, 7005, 7007, 7177, 7179, 7477, 7486, 7491, 7576, 7577, 7578, 7579,
|
|
7580, 7581, 7583, 7584, 7585, 7586, 7587, 7604, 7610, 7611
|
|
];
|
|
|
|
const data = fs.readFileSync(__dirname + '/LineBreakTest.txt', 'utf8');
|
|
const lines = data.split('\n');
|
|
|
|
return lines.forEach(function (line, i) {
|
|
let rowNumber = i + 1;
|
|
let bk;
|
|
if (!line || /^#/.test(line)) { return; }
|
|
|
|
const [cols, comment] = line.split('#');
|
|
const codePoints = cols.split(/\s*[×÷]\s*/).slice(1, -1).map(c => parseInt(c, 16));
|
|
const str = String.fromCodePoint(...codePoints);
|
|
|
|
const breaker = new LineBreaker(str);
|
|
const breaks = [];
|
|
let last = 0;
|
|
while (bk = breaker.nextBreak()) {
|
|
breaks.push(str.slice(last, bk.position));
|
|
last = bk.position;
|
|
}
|
|
|
|
const expected = cols.split(/\s*÷\s*/).slice(0, -1).map(function (c) {
|
|
let codes = c.split(/\s*×\s*/);
|
|
if (codes[0] === '') { codes.shift(); }
|
|
codes = codes.map(c => parseInt(c, 16));
|
|
return String.fromCodePoint(...codes);
|
|
});
|
|
|
|
if (skip.includes(rowNumber)) {
|
|
it.skip(cols, function () { });
|
|
return;
|
|
}
|
|
|
|
it(cols, () => assert.deepStrictEqual(breaks, expected, rowNumber + ' ' + JSON.stringify(breaks) + ' != ' + JSON.stringify(expected) + ' #' + comment));
|
|
});
|
|
});
|