icu-bidi
Version:
Bindings to the ICU (55) Unicode BiDi algorithm
270 lines (268 loc) • 8.96 kB
JavaScript
// Check results of bidi algorithm!
require('should');
describe('Bidi algorithm', function() {
var ubidi = require('../');
it('should handle unidirectional LTR text', function() {
var p = ubidi.Paragraph('The quick brown fox jumped');
p.should.have.property('getParaLevel');
p.getParaLevel().should.equal(0);
p.getLevelAt(0).should.equal(0);
p.getDirection().should.equal('ltr');
p.getLength().should.equal(26);
p.getProcessedLength().should.equal(26);
p.getResultLength().should.equal(26);
p.countParagraphs().should.equal(1);
p.getParagraphByIndex(0).should.eql({
index: 0,
start: 0,
limit: 26,
level: 0,
dir: 'ltr'
});
p.getParagraph(1).should.eql({
index: 0,
start: 0,
limit: 26,
level: 0,
dir: 'ltr'
});
p.countRuns().should.equal(1);
var run = p.getVisualRun(0);
run.should.have.property('dir');
run.should.have.property('logicalStart');
run.should.have.property('length');
run.dir.should.equal('ltr');
run.logicalStart.should.equal(0);
run.length.should.equal(26);
var i;
for (i = 0; i < p.getLength(); i++) {
p.getLogicalIndex(p.getVisualIndex(i)).should.equal(i);
p.getVisualIndex(p.getLogicalIndex(i)).should.equal(i);
}
p.getVisualIndex(0).should.equal(0);
p.getLogicalIndex(0).should.equal(0);
});
it('should handle unidirectional RTL text', function() {
var p = ubidi.Paragraph('עִבְרִית', {paraLevel: ubidi.DEFAULT_RTL});
p.should.have.property('getParaLevel');
p.getParaLevel().should.equal(1);
p.getLevelAt(0).should.equal(1);
p.getDirection().should.equal('rtl');
p.getLength().should.equal(8);
p.getProcessedLength().should.equal(8);
p.getResultLength().should.equal(8);
p.countParagraphs().should.equal(1);
p.getParagraphByIndex(0).should.eql({
index: 0,
start: 0,
limit: 8,
level: 1,
dir: 'rtl'
});
p.getParagraph(1).should.eql({
index: 0,
start: 0,
limit: 8,
level: 1,
dir: 'rtl'
});
p.countRuns().should.equal(1);
var run = p.getVisualRun(0);
run.should.have.property('dir');
run.should.have.property('logicalStart');
run.should.have.property('length');
run.dir.should.equal('rtl');
run.logicalStart.should.equal(0);
run.length.should.equal(8);
var i;
for (i = 0; i < p.getLength(); i++) {
p.getLogicalIndex(p.getVisualIndex(i)).should.equal(i);
p.getVisualIndex(p.getLogicalIndex(i)).should.equal(i);
}
p.getVisualIndex(0).should.equal(7);
p.getLogicalIndex(0).should.equal(7);
});
it('should handle neutral text in LTR context', function() {
var p = ubidi.Paragraph(' ');
p.getParaLevel().should.equal(0);
p.getLevelAt(0).should.equal(0);
p.getDirection().should.equal('ltr');
p.countRuns().should.equal(1);
p.getVisualRun(0).should.eql({
dir: 'ltr',
logicalStart: 0,
length: 1
});
});
it('should handle neutral text in RTL context', function() {
var p = ubidi.Paragraph(' ', {paraLevel: ubidi.DEFAULT_RTL});
p.getParaLevel().should.equal(1);
p.getLevelAt(0).should.equal(1);
p.getDirection().should.equal('rtl');
p.countRuns().should.equal(1);
p.getVisualRun(0).should.eql({
dir: 'rtl',
logicalStart: 0,
length: 1
});
});
it('should handle mixed LTR + RTL text in LTR context', function() {
var e = 'English';
var h = 'עִבְרִית';
var p = ubidi.Paragraph('(' + e + ' ' + h + ')'); // ltr context
p.should.have.property('getParaLevel');
p.getParaLevel().should.equal(0);
p.getDirection().should.equal('mixed');
p.countRuns().should.equal(3);
var run0 = p.getVisualRun(0);
run0.should.eql({
dir: 'ltr',
logicalStart: 0,
length: 9
});
var run1 = p.getVisualRun(1);
run1.should.eql({
dir: 'rtl',
logicalStart: 9,
length: 8
});
var run2 = p.getVisualRun(2);
run2.should.eql({
dir: 'ltr',
logicalStart: 17,
length: 1
});
var run3 = p.getLogicalRun(1);
run3.should.eql({
logicalLimit: 9,
level: 0,
dir: 'ltr'
});
var run4 = p.getLogicalRun(e.length + h.length);
run4.should.eql({
logicalLimit: 17,
level: 1,
dir: 'rtl'
});
});
it('should handle mixed LTR + RTL text in RTL context', function() {
var e = 'English';
var h = 'עִבְרִית';
var p = ubidi.Paragraph('(' + e + ' ' + h + ')',
{paraLevel: ubidi.DEFAULT_RTL}); // rtl context
p.should.have.property('getParaLevel');
p.getParaLevel().should.equal(0);
p.getDirection().should.equal('mixed');
p.countRuns().should.equal(3);
var run0 = p.getVisualRun(0);
run0.should.eql({
dir: 'ltr',
logicalStart: 0,
length: 9
});
var run1 = p.getVisualRun(1);
run1.should.eql({
dir: 'rtl',
logicalStart: 9,
length: 8
});
var run2 = p.getVisualRun(2);
run2.should.eql({
dir: 'ltr',
logicalStart: 17,
length: 1
});
var run3 = p.getLogicalRun(1);
run3.should.eql({
logicalLimit: 9,
level: 0,
dir: 'ltr'
});
var run4 = p.getLogicalRun(e.length + h.length);
run4.should.eql({
logicalLimit: 17,
level: 1,
dir: 'rtl'
});
});
it('should handle separate line contexts', function() {
var e = 'English';
var h = 'עִבְרִית';
var p = ubidi.Paragraph('(' + e + ' ' + h + ')');
p.getDirection().should.equal('mixed');
var l1 = p.setLine(0, e.length+2);
var l2 = p.setLine(e.length+2, p.getLength());
l1.getLength().should.equal(9);
l2.getLength().should.equal(9);
l1.countRuns().should.equal(1);
l1.getVisualRun(0).should.eql({
dir: 'ltr',
logicalStart: 0,
length: 9
});
l2.countRuns().should.equal(2);
l2.getVisualRun(0).should.eql({
dir: 'rtl',
logicalStart: 0,
length: 8
});
l2.getVisualRun(1).should.eql({
dir: 'ltr',
logicalStart: 8,
length: 1
});
});
it('should handle prologue contexts', function() {
var h = 'עִבְרִית';
var p1 = new ubidi.Paragraph('.-=', {
paraLevel: ubidi.DEFAULT_LTR
});
p1.getDirection().should.equal('ltr');
var p2 = new ubidi.Paragraph('.-=', {
paraLevel: ubidi.DEFAULT_LTR,
prologue: h
});
p2.getDirection().should.equal('rtl');
});
it('should handle epilogue contexts', function() {
var h = 'עִבְרִית';
var hrev = 'תיִרְבִע';
var p1 = new ubidi.Paragraph('.-='+h+'-+*', {
paraLevel: ubidi.LTR
});
p1.getDirection().should.equal('mixed');
p1.writeReordered(ubidi.Reordered.DO_MIRRORING).
should.equal('.-='+hrev+'-+*');
var p2 = new ubidi.Paragraph('.-='+h+'-+*', {
paraLevel: ubidi.LTR,
epilogue: ' \u0634'
});
p2.getDirection().should.equal('mixed');
p2.writeReordered(ubidi.Reordered.DO_MIRRORING).
should.equal('.-=*+-'+hrev);
});
it('should handle multiple paragraphs', function() {
var e = 'English';
var h = 'עִבְרִית';
var p = new ubidi.Paragraph(e + '\n' + h);
p.countParagraphs().should.equal(2);
var para1 = p.getParagraphByIndex(0);
var para2 = p.getParagraphByIndex(1);
para1.should.eql({
index: 0,
start: 0,
limit: 8,
level: 0,
dir: 'ltr'
});
para2.should.eql({
index: 1,
start: 8,
limit: 16,
level: 1,
dir: 'rtl'
});
p.getParagraph(3).should.eql(para1);
p.getParagraph(e.length + 4).should.eql(para2);
});
});