| description( |
| 'Test for ES6 sticky flag regular expression processing' |
| ); |
| |
| function asString(o) |
| { |
| if (o === null) |
| return "<null>"; |
| |
| return o.toString(); |
| } |
| |
| function testStickyExec(testDescription, re, str, beginLastIndex, expected) |
| { |
| re.lastIndex = beginLastIndex; |
| |
| let failures = 0; |
| |
| for (let iter = 0; iter < expected.length; iter++) { |
| let lastIndexStart = re.lastIndex; |
| |
| let result = re.exec(str); |
| |
| if (result != expected[iter]) { |
| testFailed(testDescription + ", iteration " + iter + ", from lastIndex: " + lastIndexStart + |
| ", expected \"" + asString(expected[iter]) + "\", got \"" + asString(result) + "\""); |
| failures++; |
| } |
| } |
| |
| if (failures) |
| testFailed(testDescription + " - failed: " + failures + " tests"); |
| else |
| testPassed(testDescription); |
| } |
| |
| function testStickyMatch(testDescription, re, str, beginLastIndex, expected) |
| { |
| re.lastIndex = beginLastIndex; |
| |
| let failures = 0; |
| |
| for (var iter = 0; iter < expected.length; iter++) { |
| let lastIndexStart = re.lastIndex; |
| |
| let result = str.match(re); |
| let correctResult = false; |
| if (expected[iter] === null || result === null) |
| correctResult = (expected[iter] === result); |
| else if (result.length == expected[iter].length) { |
| correctResult = true; |
| for (let i = 0; i < result.length; i++) { |
| if (result[i] != expected[iter][i]) |
| correctResult = false; |
| } |
| } |
| |
| if (!correctResult) { |
| testFailed(testDescription + ", iteration " + iter + ", from lastIndex: " + lastIndexStart + |
| ", expected \"" + asString(expected[iter]) + "\", got \"" + asString(result) + "\""); |
| failures++; |
| } |
| } |
| |
| if (failures) |
| testFailed(testDescription + " - failed: " + failures + " tests"); |
| else |
| testPassed(testDescription); |
| } |
| |
| |
| testStickyExec("Repeating Pattern", new RegExp("abc", "y"), "abcabcabc", 0, ["abc", "abc", "abc", null]); |
| testStickyExec("Test lastIndex resets", /\d/y, "12345", 0, ["1", "2", "3", "4", "5", null, "1", "2", "3", "4", "5", null]); |
| testStickyExec("Ignore Case", new RegExp("test", "iy"), "TESTtestTest", 0, ["TEST", "test", "Test", null]); |
| testStickyExec("Alternates, differing lengths long to short", new RegExp("bb|a", "y"), "a", 0, ["a", null]); |
| testStickyExec("Alternates, differing lengths long to short with mutliple matches ", new RegExp("abc|ab|a", "y"), "aababcaabcab", 0, ["a", "ab", "abc", "a", "abc", "ab", null]); |
| testStickyExec("Alternates, differing lengths, short to long", new RegExp("Dog |Cat |Mouse ", "y"), "Mouse Dog Cat ", 0, ["Mouse ", "Dog ", "Cat ", null]); |
| testStickyExec("BOL Anchored, starting at 0", /^X/y, "XXX", 0, ["X", null]); |
| testStickyExec("BOL Anchored, starting at 1", /^X/y, "XXX", 1, [null, "X", null]); |
| testStickyExec("EOL Anchored, not at EOL", /#$/y, "##", 0, [null]); |
| testStickyExec("EOL Anchored, at EOL", /#$/y, "##", 1, ["#", null]); |
| testStickyExec("Lookahead Assertion", /\d+(?=-)/y, "212-555-1212", 0, ["212", null]); |
| testStickyExec("Lookahead Negative Assertion", /\d+(?!\d)/y, "212-555-1212", 0, ["212", null]); |
| testStickyExec("Subpatterns - exec", /(\d+)(?:-|$)/y, "212-555-1212", 0, ["212-,212", "555-,555", "1212,1212"], null); |
| testStickyMatch("Subpatterns - match", /(\d+)(?:-|$)/y, "212-555-1212", 0, [["212-", "212"], ["555-", "555"], ["1212", "1212"]], null); |
| testStickyExec("Fixed Count", /\d{4}/y, "123456789", 0, ["1234", "5678", null]); |
| testStickyExec("Greedy", /\d*/y, "12345 67890", 0, ["12345", ""]); |
| testStickyMatch("Non-greedy", /\w+?./y, "abcdefg", 0, [["ab"], ["cd"], ["ef"], null]); |
| testStickyExec("Greedy/Non-greedy", /\s*(\d+)/y, " 1234 324512 74352", 0, [" 1234,1234", " 324512,324512", " 74352,74352", null]); |
| testStickyExec("Counted Range", /(\w+\s+){1,3}/y, "The quick brown fox jumped over the ", 0, ["The quick brown ,brown ", "fox jumped over ,over ", "the ,the ", null]); |
| testStickyMatch("Character Classes", /[0-9A-F]/iy, "fEEd123X", 0, [["f"], ["E"], ["E"], ["d"], ["1"], ["2"], ["3"], null]); |
| testStickyExec("Unmatched Greedy", /^\s*|\s*$/y, "ab", 1, [null]); |
| testStickyExec("Global Flag - exec", /\s*(\+|[0-9]+)\s*/gy, "3 + 4", 0, ["3 ,3", "+ ,+", "4,4", null]); |
| testStickyMatch("Global Flag - match", /\s*(\+|[0-9]+)\s*/gy, "3 + 4", 0, [["3 ", "+ ", "4"], ["3 ", "+ ", "4"]]); |
| testStickyMatch("Global Flag - Alternates, long to short", /x.|[\d]/gy, ".a", 0, [null]); |
| testStickyExec("Unicode Flag - Any Character", /./uy, "a@\u{10402}1\u202a\u{12345}", 0, ["a", "@", "\u{10402}", "1", "\u202a", "\u{12345}", null]); |
| testStickyMatch("Unicode & Ignore Case Flags", /(?:\u{118c0}|\u{10cb0}|\w):/iuy, "a:\u{118a0}:x:\u{10cb0}", 0, [["a:"], ["\u{118a0}:"], ["x:"], null]); |
| testStickyExec("Multiline", /(?:\w+ *)+(?:\n|$)/my, "Line One\nLine Two", 0, ["Line One\n", "Line Two", null]); |
| testStickyMatch("Multiline with BOL Anchor", /^\d*\s?/my, "13574\n295\n99", 0, [["13574\n"], ["295\n"], ["99"], null]); |
| testStickyExec("Multiline with EOL Anchor at start of Alternative", /.{2}|(?=$)./my, "\n", 0, [null]); |
| |
| // Verify that String.search starts at 0 even with the sticky flag. |
| var re = new RegExp("\\d+\\s", "y"); |
| shouldBe('"123 1234 ".search(re)', '0'); |
| shouldBe('"123 1234 ".search(re)', '0'); |
| // Verify that String.search doesn't advance past 0 with the sticky flag. |
| shouldBe('" 123 1234 ".search(re)', '-1'); |
| |
| re.lastIndex = 0; |
| shouldBeTrue('re.test("123 1234 ")'); |
| shouldBe('re.lastIndex', '4'); |
| shouldBeTrue('re.test("123 1234 ")'); |
| shouldBe('re.lastIndex', '9'); |
| shouldBeFalse('re.test("123 1234 ")'); |
| |