re2-latin1
Version:
Bindings for RE2: fast, safe alternative to backtracking regular expression engines.
282 lines (206 loc) • 6.14 kB
JavaScript
"use strict";
var unit = require("heya-unit");
var RE2 = require("../re2");
// tests
unit.add(module, [
function test_generalCtr(t) {
"use strict";
eval(t.TEST("!!RE2"));
eval(t.TEST("RE2.toString() === 'function RE2() { [native code] }'"));
eval(t.TEST("!!RE2.prototype"));
},
function test_generalInst(t) {
"use strict";
var re1 = new RE2("\\d+");
eval(t.TEST("!!re1"));
eval(t.TEST("re1 instanceof RE2"));
var re2 = RE2("\\d+");
eval(t.TEST("!!re2"));
eval(t.TEST("re2 instanceof RE2"));
compare(re1, re2, t);
re1 = new RE2("\\d+", "m");
eval(t.TEST("!!re1"));
eval(t.TEST("re1 instanceof RE2"));
re2 = RE2("\\d+", "m");
eval(t.TEST("!!re2"));
eval(t.TEST("re2 instanceof RE2"));
compare(re1, re2, t);
},
function test_instErrors(t) {
try {
var re = new RE2([]);
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
try {
var re = new RE2({});
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
try {
var re = new RE2(new Date());
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
try {
var re = new RE2(null);
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
try {
var re = new RE2();
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
try {
var re = RE2();
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
try {
var re = RE2({ toString() { throw "corner"; } });
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e instanceof TypeError"));
}
},
function test_generalIn(t) {
"use strict";
var re = new RE2("\\d+");
eval(t.TEST("'exec' in re"));
eval(t.TEST("'test' in re"));
eval(t.TEST("'match' in re"));
eval(t.TEST("'replace' in re"));
eval(t.TEST("'search' in re"));
eval(t.TEST("'split' in re"));
eval(t.TEST("'source' in re"));
eval(t.TEST("'flags' in re"));
eval(t.TEST("'global' in re"));
eval(t.TEST("'ignoreCase' in re"));
eval(t.TEST("'multiline' in re"));
eval(t.TEST("'sticky' in re"));
eval(t.TEST("'lastIndex' in re"));
},
function test_generalPresent(t) {
"use strict";
var re = new RE2("\\d+");
eval(t.TEST("typeof re.exec == 'function'"));
eval(t.TEST("typeof re.test == 'function'"));
eval(t.TEST("typeof re.match == 'function'"));
eval(t.TEST("typeof re.replace == 'function'"));
eval(t.TEST("typeof re.search == 'function'"));
eval(t.TEST("typeof re.split == 'function'"));
eval(t.TEST("typeof re.source == 'string'"));
eval(t.TEST("typeof re.flags == 'string'"));
eval(t.TEST("typeof re.global == 'boolean'"));
eval(t.TEST("typeof re.ignoreCase == 'boolean'"));
eval(t.TEST("typeof re.multiline == 'boolean'"));
eval(t.TEST("typeof re.sticky == 'boolean'"));
eval(t.TEST("typeof re.lastIndex == 'number'"));
},
function test_generalLastIndex(t) {
"use strict";
var re = new RE2("\\d+");
eval(t.TEST("re.lastIndex === 0"));
re.lastIndex = 5;
eval(t.TEST("re.lastIndex === 5"));
re.lastIndex = 0;
eval(t.TEST("re.lastIndex === 0"));
},
function test_generalRegExp(t) {
"use strict";
var re1 = new RegExp("\\d+");
var re2 = new RE2("\\d+");
compare(re1, re2, t);
re2 = new RE2(re1);
compare(re1, re2, t);
re1 = new RegExp("a", "ig");
re2 = new RE2("a", "ig");
compare(re1, re2, t);
re2 = new RE2(re1);
compare(re1, re2, t);
re1 = /\s/gm;
re2 = new RE2("\\s", "mg");
compare(re1, re2, t);
re2 = new RE2(re1);
compare(re1, re2, t);
re2 = new RE2(/\s/gm);
compare(/\s/gm, re2, t);
re1 = new RE2("b", "gm");
re2 = new RE2(re1);
compare(re1, re2, t);
},
function test_utf8(t) {
"use strict";
var s = "Привет!";
eval(t.TEST("s.length === 7"));
eval(t.TEST("RE2.getUtf8Length(s) === 13"));
var b = new Buffer(s);
eval(t.TEST("b.length === 13"));
eval(t.TEST("RE2.getUtf16Length(b) === 7"));
var s2 = "\u{1F603}";
eval(t.TEST("s2.length === 2"));
eval(t.TEST("RE2.getUtf8Length(s2) === 4"));
var b2 = new Buffer(s2);
eval(t.TEST("b2.length === 4"));
eval(t.TEST("RE2.getUtf16Length(b2) === 2"));
var s3 = "\uD83D";
eval(t.TEST("s3.length === 1"));
eval(t.TEST("RE2.getUtf8Length(s3) === 3"));
var s4 = "🤡";
eval(t.TEST("s4.length === 2"));
eval(t.TEST("RE2.getUtf8Length(s4) === 4"));
eval(t.TEST("RE2.getUtf16Length(Buffer.from(s4, 'utf8')) === s4.length"));
var b3 = new Buffer([0xF0]);
eval(t.TEST("b3.length === 1"));
eval(t.TEST("RE2.getUtf16Length(b3) === 2"));
try {
RE2.getUtf8Length({ toString() { throw "corner"; } });
t.test(false); // shouldn't be here
} catch(e) {
eval(t.TEST("e === 'corner'"));
}
eval(t.TEST("RE2.getUtf16Length({ toString() { throw 'corner'; } }) === -1"));
},
function test_flags(t) {
"use strict";
var re = new RE2("a", "u");
eval(t.TEST("re.flags === 'u'"));
re = new RE2("a", "iu");
eval(t.TEST("re.flags === 'iu'"));
re = new RE2("a", "mu");
eval(t.TEST("re.flags === 'mu'"));
re = new RE2("a", "gu");
eval(t.TEST("re.flags === 'gu'"));
re = new RE2("a", "yu");
eval(t.TEST("re.flags === 'uy'"));
re = new RE2("a", "yiu");
eval(t.TEST("re.flags === 'iuy'"));
re = new RE2("a", "yigu");
eval(t.TEST("re.flags === 'giuy'"));
re = new RE2("a", "miu");
eval(t.TEST("re.flags === 'imu'"));
re = new RE2("a", "ygu");
eval(t.TEST("re.flags === 'guy'"));
re = new RE2("a", "myu");
eval(t.TEST("re.flags === 'muy'"));
re = new RE2("a", "migyu");
eval(t.TEST("re.flags === 'gimuy'"));
}
]);
// utilitites
function compare(re1, re2, t) {
// compares regular expression objects
eval(t.TEST("re1.source === re2.source"));
eval(t.TEST("re1.global === re2.global"));
eval(t.TEST("re1.ignoreCase === re2.ignoreCase"));
eval(t.TEST("re1.multiline === re2.multiline"));
// eval(t.TEST("re1.unicode === re2.unicode"));
eval(t.TEST("re1.sticky === re2.sticky"));
}