| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
- function createMessage(message, prefix) {
- prefix = (prefix != undefined) ? prefix + ": " : "";
- return prefix + message;
- }
- function assertSplit(re, messagePrefix) {
- var str = "a,ab,ba,b,";
- var result = str.split(re);
- assert.areEqual(3, result.length, createMessage("Sticky = true, RegExp.split() result's length", messagePrefix));
- assert.areEqual("", result[0], createMessage("Sticky = true, RegExp.split() result[0]", messagePrefix));
- assert.areEqual("ab,b", result[1], createMessage("Sticky = true, RegExp.split() result[1]", messagePrefix));
- assert.areEqual("b,", result[2], createMessage("Sticky = true, RegExp.split() result[2]", messagePrefix));
- assert.areEqual(0, re.lastIndex, createMessage("Sticky = true, lastIndex result on RegExp.split()", messagePrefix));
- }
- function assertSplitWithSingleCharacterPattern(re, messagePrefix) {
- var str = "abaca";
- var result = str.split(re);
- assert.areEqual(4, result.length, createMessage("Sticky = true, RegExp.split() result's length", messagePrefix));
- assert.areEqual("", result[0], createMessage("Sticky = true, RegExp.split() result", messagePrefix));
- assert.areEqual("b", result[1], createMessage("Sticky = true, RegExp.split() result", messagePrefix));
- assert.areEqual("c", result[2], createMessage("Sticky = true, RegExp.split() result", messagePrefix));
- assert.areEqual("", result[3], createMessage("Sticky = true, RegExp.split() result", messagePrefix));
- assert.areEqual(0, re.lastIndex, createMessage("Sticky = true, lastIndex result on RegExp.split()", messagePrefix));
- }
- function createReplaceValue(replaceValueType) {
- return replaceValueType === "string" ? "1" : function () { return "1"; };
- }
- var tests = [
- {
- name: "RegExp.test() - matches for the beginning of string, otherwise terminates if sticky = true",
- body: function () {
- var str = "abcababc";
- var re = /abc/y;
- assert.isTrue(re.test(str), "Sticky = true, RegExp.test() result");
- assert.isTrue(re.lastIndex == 3, "Sticky = true, lastIndex result on RegExp.test()");
- assert.isFalse(re.test(str), "Sticky = true, RegExp.test() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, lastIndex result on RegExp.test()");
- assert.isTrue(re.test(str), "Sticky = true, RegExp.test() result");
- assert.isTrue(re.lastIndex == 3, "Sticky = true, lastIndex result on RegExp.test()");
- }
- },
- {
- name: "RegExp.exec() - matches for the beginning of string, otherwise terminates if sticky = true",
- body: function () {
- var str = "abcababc";
- var re = /abc/y;
- assert.isTrue(re.exec(str) == "abc", "Sticky = true, RegExp.exec() result");
- assert.isTrue(re.lastIndex == 3, "Sticky = true, lastIndex result on RegExp.exec()");
- assert.isTrue(re.exec(str) == null, "Sticky = true, RegExp.exec() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, lastIndex result on RegExp.exec()");
- }
- },
- {
- name: "RegExp.match() - matches for the beginning of string, otherwise terminates if sticky = true",
- body: function () {
- var str = "abcababc";
- var re = /abc/y;
- assert.isTrue(str.match(re) == "abc", "Sticky = true, RegExp.match() result");
- assert.isTrue(re.lastIndex == 3, "Sticky = true, lastIndex result on RegExp.match()");
- assert.isTrue(str.match(re) == null, "Sticky = true, RegExp.match() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, lastIndex result on RegExp.match()");
- }
- },
- {
- name: "RegExp.match() - matches for the beginning of string, otherwise terminates if sticky = true with lastindex set",
- body: function () {
- var str = "abcabcababc";
- var re = /abc/y;
- re.lastIndex = 3;
- assert.isTrue(str.match(re) == "abc", "Sticky = true, RegExp.match() result");
- assert.isTrue(re.lastIndex == 6, "Sticky = true, lastIndex result on RegExp.match()");
- assert.isTrue(str.match(re) == null, "Sticky = true, RegExp.match() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, lastIndex result on RegExp.match()");
- }
- },
- {
- name: "RegExp.search() - matches for the beginning of string, otherwise terminates if sticky = true",
- body: function () {
- var str = "ababcabc";
- var re = /abc/y;
- assert.isTrue(str.search(re) == -1, "Sticky = true, RegExp.search() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, lastIndex result on RegExp.search()");
- assert.isTrue(str.search(re) == -1, "Sticky = true, RegExp.search() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, lastIndex result on RegExp.search()");
- }
- },
- {
- name: "RegExp.replace() - matches for the beginning of string, otherwise terminates if sticky = true",
- body: function () {
- function assertReplace(replaceValueType) {
- var str = "abcabcababc";
- var re = /abc/y;
- var replaceValue = createReplaceValue(replaceValueType);
- assert.isTrue(str.replace(re, replaceValue) == "1abcababc", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 3, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- assert.isTrue(str.replace(re, replaceValue) == "abc1ababc", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 6, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- assert.isTrue(str.replace(re, replaceValue) == "abcabcababc", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- }
- ["string", "function"].forEach(assertReplace);
- }
- },
- {
- name: "RegExp.replace() - matches for the beginning of string, otherwise terminates if sticky = true, lastIndex set",
- body: function () {
- function assertReplace(replaceValueType) {
- var str = "abcabcababc";
- var re = /abc/y;
- re.lastIndex = 4;
- var replaceValue = createReplaceValue(replaceValueType);
- assert.isTrue(str.replace(re, replaceValue) == "abcabcababc", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- }
- ["string", "function"].forEach(assertReplace);
- }
- },
- {
- name: "RegExp.replace() - matches for the beginning of string, otherwise terminates if sticky = true, global = true",
- body: function () {
- function assertReplace(replaceValueType) {
- var str = "abcabcababc";
- var re = /abc/gy;
- var replaceValue = createReplaceValue(replaceValueType);
- assert.isTrue(str.replace(re, replaceValue) == "11ababc", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- assert.isTrue(str.replace(re, replaceValue) == "11ababc", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- }
- ["string", "function"].forEach(assertReplace);
- }
- },
- {
- name: "RegExp.replace() - matches for the beginning of string, otherwise terminates if global = true",
- body: function () {
- function assertReplace(replaceValueType) {
- var str = "abcabcababc";
- var re = /abc/g;
- var replaceValue = createReplaceValue(replaceValueType);
- assert.isTrue(str.replace(re, replaceValue) == "11ab1", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- assert.isTrue(str.replace(re, replaceValue) == "11ab1", "Sticky = true, replaceValue type = " + replaceValueType + ", RegExp.replace() result");
- assert.isTrue(re.lastIndex == 0, "Sticky = true, replaceValue type = " + replaceValueType + ", lastIndex result on RegExp.replace()");
- }
- ["string", "function"].forEach(assertReplace);
- }
- },
- {
- name: "RegExp.replace() - returns the input string as it is when lastIndex >= input length",
- body: function () {
- function assertReplace(replaceValueType) {
- var str = "abc";
- var re = /a/y;
- var lastIndex = str.length;
- re.lastIndex = lastIndex;
- var replaceValue = createReplaceValue(replaceValueType);
- var result = str.replace(re, replaceValue);
- var messageBase = "Input length: " + str.length + ", lastIndex = " + lastIndex + ", replaceValue type = " + replaceValueType;
- var message = messageBase + ", result";
- assert.areEqual(str, result, message);
- var message = messageBase + ", lastIndex after replace()";
- assert.areEqual(0, re.lastIndex, message);
- }
- ["string", "function"].forEach(assertReplace);
- }
- },
- {
- name: "RegExp.split() - ignores sticky flag if created via literal",
- body: function () {
- var re = /a,/y;
- assertSplit(re);
- }
- },
- {
- name: "RegExp.split() - ignores sticky flag if created via constructor",
- body: function () {
- var re = new RegExp("a,", "y");
- assertSplit(re, "Non-RegExp pattern");
- var re2 = new RegExp(re);
- assertSplit(re2, "RegExp pattern, 'flags' aren't present");
- var re3 = new RegExp(re, "y", "RegExp pattern, 'flags' are present");
- assertSplit(re3);
- var re4 = new RegExp("A,", "y");
- "asd".split(re);
- var re5 = new RegExp(re4, "i");
- assertSplit(re2, "Changed flags");
- }
- },
- {
- name: "RegExp.split() - ignores sticky flag if created via RegExp.prototype.compile",
- body: function () {
- var re = /./.compile("a,", "y");
- assertSplit(re, "Non-RegExp pattern");
- var re2 = /./.compile(re);
- assertSplit(re2, "RegExp pattern");
- }
- },
- {
- name: "RegExp.split() - ignores sticky flag if single-character pattern",
- body: function () {
- var reCaseSensitive = /a/y;
- assertSplitWithSingleCharacterPattern(reCaseSensitive, "Case-sensitive");
- var reCaseInsensitive = /A/iy;
- assertSplitWithSingleCharacterPattern(reCaseInsensitive, "Case-insensitive");
- }
- },
- {
- name: "RegExp.split() - result is propagated to the constructor",
- body: function () {
- var str = "abac";
- var re = /(a[c]?)/y;
- var result = str.split(re);
- // If the actual result is "a", that means we propagated "re"s original pattern
- // as opposed to the separate one for split().
- assert.areEqual("ac", RegExp.$1);
- }
- },
- {
- name: "RegExp.split() - ignores lastIndex",
- body: function () {
- var re = /a,/y;
- re.lastIndex = 3;
- assertSplit(re);
- }
- }
- ];
- testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });
|