UNPKG

@cakoose/re2

Version:

Bindings for RE2: fast, safe alternative to backtracking regular expression engines.

165 lines (131 loc) 5.47 kB
"use strict"; var unit = require("heya-unit"); var RE2 = require("../re2"); // tests unit.add(module, [ // These tests are copied from MDN: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace function test_replaceString(t) { "use strict"; var re = new RE2(/apples/gi); var result = re.replace("Apples are round, and apples are juicy.", "oranges"); eval(t.TEST("result === 'oranges are round, and oranges are juicy.'")); re = new RE2(/xmas/i); result = re.replace("Twas the night before Xmas...", "Christmas"); eval(t.TEST("result === 'Twas the night before Christmas...'")); re = new RE2(/(\w+)\s(\w+)/); result = re.replace("John Smith", "$2, $1"); eval(t.TEST("result === 'Smith, John'")); }, function test_replaceFunReplacer(t) { "use strict"; function replacer(match, p1, p2, p3, offset, string) { // p1 is nondigits, p2 digits, and p3 non-alphanumerics return [p1, p2, p3].join(' - '); } var re = new RE2(/([^\d]*)(\d*)([^\w]*)/); var result = re.replace("abc12345#$*%", replacer); eval(t.TEST("result === 'abc - 12345 - #$*%'")); }, function test_replaceFunUpper(t) { "use strict"; function upperToHyphenLower(match) { return '-' + match.toLowerCase(); } var re = new RE2(/[A-Z]/g); var result = re.replace("borderTop", upperToHyphenLower); eval(t.TEST("result === 'border-top'")); }, function test_replaceFunConvert(t) { "use strict"; function convert(str, p1, offset, s) { return ((p1 - 32) * 5/9) + 'C'; } var re = new RE2(/(\d+(?:\.\d*)?)F\b/g); eval(t.TEST("re.replace('32F', convert) === '0C'")); eval(t.TEST("re.replace('41F', convert) === '5C'")); eval(t.TEST("re.replace('50F', convert) === '10C'")); eval(t.TEST("re.replace('59F', convert) === '15C'")); eval(t.TEST("re.replace('68F', convert) === '20C'")); eval(t.TEST("re.replace('77F', convert) === '25C'")); eval(t.TEST("re.replace('86F', convert) === '30C'")); eval(t.TEST("re.replace('95F', convert) === '35C'")); eval(t.TEST("re.replace('104F', convert) === '40C'")); eval(t.TEST("re.replace('113F', convert) === '45C'")); eval(t.TEST("re.replace('212F', convert) === '100C'")); }, { test: function test_replaceFunLoop(t) { "use strict"; RE2(/(x_*)|(-)/g).replace("x-x_", function(match, p1, p2) { if (p1) { t.info("on: " + p1.length); } if (p2) { t.info("off: 1"); } }); }, logs: [ {text: "on: 1"}, {text: "off: 1"}, {text: "on: 2"} ] }, // Unicode tests function test_replaceStrUnicode(t) { "use strict"; var re = new RE2(/яблоки/gi); var result = re.replace("Яблоки красны, яблоки сочны.", "апельсины"); eval(t.TEST("result === 'апельсины красны, апельсины сочны.'")); re = new RE2(/иван/i); result = re.replace("Могуч Иван Иванов...", "Сидор"); eval(t.TEST("result === 'Могуч Сидор Иванов...'")); re = new RE2(/иван/ig); result = re.replace("Могуч Иван Иванов...", "Сидор"); eval(t.TEST("result === 'Могуч Сидор Сидоров...'")); re = new RE2(/([а-яё]+)\s+([а-яё]+)/i); result = re.replace("Пётр Петров", "$2, $1"); eval(t.TEST("result === 'Петров, Пётр'")); }, function test_replaceFunUnicode(t) { "use strict"; function replacer(match, offset, string) { t.test(typeof offset == "number"); t.test(typeof string == "string"); t.test(offset === 0 || offset === 7); t.test(string === "ИВАН и пЁтр"); return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase(); } var re = new RE2(/(?:иван|пётр|сидор)/ig); var result = re.replace("ИВАН и пЁтр", replacer); eval(t.TEST("result === 'Иван и Пётр'")); }, // Buffer tests function test_replaceStrBuffer(t) { "use strict"; var re = new RE2(/яблоки/gi); var result = re.replace(new Buffer("Яблоки красны, яблоки сочны."), "апельсины"); eval(t.TEST("result instanceof Buffer")); eval(t.TEST("result.toString() === 'апельсины красны, апельсины сочны.'")); result = re.replace(new Buffer("Яблоки красны, яблоки сочны."), new Buffer("апельсины")); eval(t.TEST("result instanceof Buffer")); eval(t.TEST("result.toString() === 'апельсины красны, апельсины сочны.'")); result = re.replace("Яблоки красны, яблоки сочны.", new Buffer("апельсины")); eval(t.TEST("typeof result == 'string'")); eval(t.TEST("result === 'апельсины красны, апельсины сочны.'")); }, function test_replaceFunBuffer(t) { "use strict"; function replacer(match, offset, string) { eval(t.TEST("match instanceof Buffer")); eval(t.TEST("typeof offset == 'number'")); eval(t.TEST("typeof string == 'string'")); eval(t.TEST("offset === 0 || offset === 12")); eval(t.TEST("string === 'ИВАН и пЁтр'")); var s = match.toString(); return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase(); } replacer.useBuffers = true; var re = new RE2(/(?:иван|пётр|сидор)/ig); var result = re.replace("ИВАН и пЁтр", replacer); eval(t.TEST("typeof result == 'string'")); eval(t.TEST("result === 'Иван и Пётр'")); } ]);