Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681/* * Copyright 2008 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
var m, re, b, i, obj;
ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);RegExp.leftContext = "abc";ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);
re = /a+/;ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
m = re.exec(" aabaaa");ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);ok(m.index === 1, "m.index = " + m.index);ok(m.input === " aabaaa", "m.input = " + m.input);ok(m.length === 1, "m.length = " + m.length);ok(m[0] === "aa", "m[0] = " + m[0]);ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "baaa", "RegExp.rightContext = " + RegExp.rightContext);
m = re.exec(" aabaaa");ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);ok(m.index === 1, "m.index = " + m.index);ok(m.input === " aabaaa", "m.input = " + m.input);ok(m.length === 1, "m.length = " + m.length);ok(m[0] === "aa", "m[0] = " + m[0]);ok(m.propertyIsEnumerable("0"), "m.0 is not enumerable");ok(m.propertyIsEnumerable("input"), "m.input is not enumerable");ok(m.propertyIsEnumerable("index"), "m.index is not enumerable");ok(m.propertyIsEnumerable("lastIndex"), "m.lastIndex is not enumerable");ok(m.propertyIsEnumerable("length") === false, "m.length is not enumerable");ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "baaa", "RegExp.rightContext = " + RegExp.rightContext);
m = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/.exec( "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");ok(m === null, "m is not null");
re = /a+/g;ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
m = re.exec(" aabaaa");ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);ok(m.index === 1, "m.index = " + m.index);ok(m.lastIndex == 3, "m.lastIndex = " + m.lastIndex);ok(m.input === " aabaaa", "m.input = " + m.input);ok(m.length === 1, "m.length = " + m.length);ok(m[0] === "aa", "m[0] = " + m[0]);
m = re.exec(" aabaaa");ok(re.lastIndex === 7, "re.lastIndex = " + re.lastIndex);ok(m.index === 4, "m.index = " + m.index);ok(m.input === " aabaaa", "m.input = " + m.input);ok(m.length === 1, "m.length = " + m.length);ok(m[0] === "aaa", "m[0] = " + m[0]);
m = re.exec(" aabaaa");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);ok(m === null, "m is not null");
re.exec(" a");ok(re.lastIndex === 16, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext);
m = re.exec(" a");ok(m === null, "m is not null");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
m = re.exec(" a");ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex);
m = re.exec();ok(m === null, "m is not null");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
m = /(a|b)+|(c)/.exec("aa");ok(m[0] === "aa", "m[0] = " + m[0]);ok(m[1] === "a", "m[1] = " + m[1]);ok(m[2] === "", "m[2] = " + m[2]);
b = re.test(" a ");ok(b === true, "re.test(' a ') returned " + b);ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " ", "RegExp.rightContext = " + RegExp.rightContext);
b = re.test(" a ");ok(b === false, "re.test(' a ') returned " + b);ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " ", "RegExp.rightContext = " + RegExp.rightContext);
re = /\[([^\[]+)\]/g;m = re.exec(" [test] ");ok(re.lastIndex === 7, "re.lastIndex = " + re.lastIndex);ok(m.index === 1, "m.index = " + m.index);ok(m.input === " [test] ", "m.input = " + m.input);ok(m.length === 2, "m.length = " + m.length);ok(m[0] === "[test]", "m[0] = " + m[0]);ok(m[1] === "test", "m[1] = " + m[1]);
b = /a*/.test();ok(b === true, "/a*/.test() returned " + b);ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "undefined", "RegExp.rightContext = " + RegExp.rightContext);
b = /f/.test();ok(b === true, "/f/.test() returned " + b);ok(RegExp.leftContext === "unde", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "ined", "RegExp.rightContext = " + RegExp.rightContext);
b = /abc/.test();ok(b === false, "/abc/.test() returned " + b);ok(RegExp.leftContext === "unde", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "ined", "RegExp.rightContext = " + RegExp.rightContext);
m = "abcabc".match(re = /ca/);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 1, "m.length is not 1");ok(m["0"] === "ca", "m[0] is not \"ca\"");ok(m.constructor === Array, "unexpected m.constructor");ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === "ab", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "bc", "RegExp.rightContext = " + RegExp.rightContext);
m = "abcabc".match(/ab/);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 1, "m.length is not 1");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "cabc", "RegExp.rightContext = " + RegExp.rightContext);
m = "abcabc".match(/ab/g);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(m["1"] === "ab", "m[1] is not \"ab\"");/* ok(m.input === "abcabc", "m.input = " + m.input); */
m = "abcabc".match(/Ab/g);ok(typeof(m) === "object", "typeof m is not object");ok(m === null, "m is not null");
m = "abcabc".match(/Ab/gi);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(m["1"] === "ab", "m[1] is not \"ab\"");ok(RegExp.leftContext === "abc", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "c", "RegExp.rightContext = " + RegExp.rightContext);
m = "aaabcabc".match(/a+b/g);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "aaab", "m[0] is not \"ab\"");ok(m["1"] === "ab", "m[1] is not \"ab\"");
m = "aaa\\\\cabc".match(/\\/g);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "\\", "m[0] is not \"\\\"");ok(m["1"] === "\\", "m[1] is not \"\\\"");
m = "abcabc".match(new RegExp("ab"));ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 1, "m.length is not 1");ok(m["0"] === "ab", "m[0] is not \"ab\"");
m = "abcabc".match(new RegExp("ab","g"));ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(m["1"] === "ab", "m[1] is not \"ab\"");ok(RegExp.leftContext === "abc", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "c", "RegExp.rightContext = " + RegExp.rightContext);
m = "abcabc".match(new RegExp(/ab/g));ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(m["1"] === "ab", "m[1] is not \"ab\"");
m = "abcabc".match(new RegExp("ab","g", "test"));ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length is not 2");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(m["1"] === "ab", "m[1] is not \"ab\"");ok(m.index === 3, "m.index = " + m.index);ok(m.input === "abcabc", "m.input = " + m.input);ok(m.lastIndex === 5, "m.lastIndex = " + m.lastIndex);
m = "abcabcg".match("ab", "g");ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 1, "m.length is not 1");ok(m["0"] === "ab", "m[0] is not \"ab\"");ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "cabcg", "RegExp.rightContext = " + RegExp.rightContext);
m = "abcabc".match();ok(m === null, "m is not null");ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "cabcg", "RegExp.rightContext = " + RegExp.rightContext);
m = "abcabc".match(/(a)(b)cabc/);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 3, "m.length is not 3");ok(m[0] === "abcabc", "m[0] is not \"abc\"");ok(m[1] === "a", "m[1] is not \"a\"");ok(m[2] === "b", "m[2] is not \"b\"");
re = /(a)bcabc/;re.lastIndex = -3;m = "abcabc".match(re);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length = " + m.length + "expected 3");ok(m[0] === "abcabc", "m[0] is not \"abc\"");ok(m[1] === "a", "m[1] is not \"a\"");ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
re = /(a)bcabc/;re.lastIndex = 2;m = "abcabcxxx".match(re);ok(typeof(m) === "object", "typeof m is not object");ok(m.length === 2, "m.length = " + m.length + "expected 3");ok(m[0] === "abcabc", "m[0] is not \"abc\"");ok(m[1] === "a", "m[1] is not \"a\"");ok(m.input === "abcabcxxx", "m.input = " + m.input);ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
r = "- [test] -".replace(re = /\[([^\[]+)\]/g, "success");ok(r === "- success -", "r = " + r + " expected '- success -'");ok(re.lastIndex === 8, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === "- ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " -", "RegExp.rightContext = " + RegExp.rightContext);
r = "[test] [test]".replace(/\[([^\[]+)\]/g, "aa");ok(r === "aa aa", "r = " + r + "aa aa");ok(RegExp.leftContext === "[test] ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext);
r = "[test] [test]".replace(/\[([^\[]+)\]/, "aa");ok(r === "aa [test]", "r = " + r + " expected 'aa [test]'");
r = "- [test] -".replace(/\[([^\[]+)\]/g);ok(r === "- undefined -", "r = " + r + " expected '- undefined -'");
r = "- [test] -".replace(/\[([^\[]+)\]/g, true);ok(r === "- true -", "r = " + r + " expected '- true -'");
r = "- [test] -".replace(/\[([^\[]+)\]/g, true, "test");ok(r === "- true -", "r = " + r + " expected '- true -'");ok(RegExp.leftContext === "- ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " -", "RegExp.rightContext = " + RegExp.rightContext);
var tmp = 0;
function replaceFunc1(m, off, str) { ok(arguments.length === 3, "arguments.length = " + arguments.length);
switch(tmp) { case 0: ok(m === "[test1]", "m = " + m + " expected [test1]"); ok(off === 0, "off = " + off + " expected 0"); ok(RegExp.leftContext === "- ", "RegExp.leftContext = " + RegExp.leftContext); ok(RegExp.rightContext === " -", "RegExp.rightContext = " + RegExp.rightContext); break; case 1: ok(m === "[test2]", "m = " + m + " expected [test2]"); ok(off === 8, "off = " + off + " expected 8"); ok(RegExp.leftContext === "- ", "RegExp.leftContext = " + RegExp.leftContext); ok(RegExp.rightContext === " -", "RegExp.rightContext = " + RegExp.rightContext); break; default: ok(false, "unexpected call"); }
ok(str === "[test1] [test2]", "str = " + arguments[3]); return "r" + tmp++;}
r = "[test1] [test2]".replace(/\[[^\[]+\]/g, replaceFunc1);ok(r === "r0 r1", "r = " + r + " expected 'r0 r1'");ok(RegExp.leftContext === "[test1] ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext);
tmp = 0;
function replaceFunc2(m, subm, off, str) { ok(arguments.length === 4, "arguments.length = " + arguments.length);
switch(tmp) { case 0: ok(subm === "test1", "subm = " + subm); ok(m === "[test1]", "m = " + m + " expected [test1]"); ok(off === 0, "off = " + off + " expected 0"); break; case 1: ok(subm === "test2", "subm = " + subm); ok(m === "[test2]", "m = " + m + " expected [test2]"); ok(off === 8, "off = " + off + " expected 8"); break; default: ok(false, "unexpected call"); }
ok(str === "[test1] [test2]", "str = " + arguments[3]); return "r" + tmp++;}
r = "[test1] [test2]".replace(/\[([^\[]+)\]/g, replaceFunc2);ok(r === "r0 r1", "r = '" + r + "' expected 'r0 r1'");
r = "$1,$2".replace(/(\$(\d))/g, "$$1-$1$2");ok(r === "$1-$11,$1-$22", "r = '" + r + "' expected '$1-$11,$1-$22'");ok(RegExp.leftContext === "$1,", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext);
r = "abc &1 123".replace(/(\&(\d))/g, "$&");ok(r === "abc &1 123", "r = '" + r + "' expected 'abc &1 123'");ok(RegExp.leftContext === "abc ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " 123", "RegExp.rightContext = " + RegExp.rightContext);
r = "abc &1 123".replace(/(\&(\d))/g, "$'");ok(r === "abc 123 123", "r = '" + r + "' expected 'abc 123 123'");
r = "abc &1 123".replace(/(\&(\d))/g, "$`");ok(r === "abc abc 123", "r = '" + r + "' expected 'abc abc 123'");
r = "abc &1 123".replace(/(\&(\d))/g, "$3");ok(r === "abc $3 123", "r = '" + r + "' expected 'abc $3 123'");
r = "abc &1 123".replace(/(\&(\d))/g, "$");ok(r === "abc $ 123", "r = '" + r + "' expected 'abc $ 123'");
r = "abc &1 123".replace(/(\&(\d))/g, "$a");ok(r === "abc $a 123", "r = '" + r + "' expected 'abc $a 123'");
r = "abc &1 123".replace(/(\&(\d))/g, "$11");ok(r === "abc &11 123", "r = '" + r + "' expected 'abc &11 123'");
r = "abc &1 123".replace(/(\&(\d))/g, "$0");ok(r === "abc $0 123", "r = '" + r + "' expected 'abc $0 123'");
/a/.test("a");r = "1 2 3".replace("2", "$&");ok(r === "1 $& 3", "r = '" + r + "' expected '1 $& 3'");ok(RegExp.leftContext === "", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "", "RegExp.rightContext = " + RegExp.rightContext);
r = "1 2 3".replace("2", "$'");ok(r === "1 $' 3", "r = '" + r + "' expected '1 $' 3'");
r = "1,,2,3".split(/,+/g);ok(r.length === 3, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(r[2] === "3", "r[2] = " + r[2]);ok(RegExp.leftContext === "1,,2", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "3", "RegExp.rightContext = " + RegExp.rightContext);
r = "1,,2,3".split(/,+/g, 2);ok(r.length === 2, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(RegExp.leftContext === "1,,2", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "3", "RegExp.rightContext = " + RegExp.rightContext);
r = "1,,2,3".split(/,+/g, 1);ok(r.length === 1, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(RegExp.leftContext === "1", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "2,3", "RegExp.rightContext = " + RegExp.rightContext);
r = "1,,2,3".split(/,+/);ok(r.length === 3, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(r[2] === "3", "r[2] = " + r[2]);
r = "1,,2,".split(/,+/);ok(r.length === 2, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);
re = /,+/;r = "1,,2,".split(re);ok(r.length === 2, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
re = /,+/g;r = "1,,2,".split(re);ok(r.length === 2, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
r = "1 12 \t3".split(re = /\s+/).join(";");ok(r === "1;12;3", "r = " + r);ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
r = "123".split(re = /\s+/).join(";");ok(r === "123", "r = " + r);ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
r = "1ab2aab3".split(/(a+)b/);ok(r.length === 3, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(r[2] === "3", "r[2] = " + r[2]);
r = "A<B>bold</B>and<CODE>coded</CODE>".split(/<(\/)?([^<>]+)>/) ;ok(r.length === 4, "r.length = " + r.length);
/* another standard violation */r = "1 12 \t3".split(re = /(\s)+/g).join(";");ok(r === "1;12;3", "r = " + r);ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === "1 12", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "3", "RegExp.rightContext = " + RegExp.rightContext);
re = /,+/;re.lastIndex = 4;r = "1,,2,".split(re);ok(r.length === 2, "r.length = " + r.length);ok(r[0] === "1", "r[0] = " + r[0]);ok(r[1] === "2", "r[1] = " + r[1]);ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
re = /abc[^d]/g;ok(re.source === "abc[^d]", "re.source = '" + re.source + "', expected 'abc[^d]'");
re = /a\bc[^d]/g;ok(re.source === "a\\bc[^d]", "re.source = '" + re.source + "', expected 'a\\bc[^d]'");
re = /abc/;ok(re === RegExp(re), "re !== RegExp(re)");
re = RegExp("abc[^d]", "g");ok(re.source === "abc[^d]", "re.source = '" + re.source + "', expected 'abc[^d]'");
re = /abc/;ok(re === RegExp(re, undefined), "re !== RegExp(re, undefined)");
re = /abc/;ok(re === RegExp(re, undefined, 1), "re !== RegExp(re, undefined, 1)");
re = /a/g;ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");
m = re.exec(" a ");ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2");ok(m.index === 1, "m.index = " + m.index + " expected 1");ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " ", "RegExp.rightContext = " + RegExp.rightContext);
m = re.exec(" a ");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");ok(m === null, "m = " + m + " expected null");
re.lastIndex = 2;m = re.exec(" a a ");ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex + " expected 4");ok(m.index === 3, "m.index = " + m.index + " expected 3");
re.lastIndex = "2";ok(re.lastIndex === "2", "re.lastIndex = " + re.lastIndex + " expected '2'");m = re.exec(" a a ");ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex + " expected 4");ok(m.index === 3, "m.index = " + m.index + " expected 3");
var li = 0;var obj = new Object();obj.valueOf = function() { return li; };
re.lastIndex = obj;ok(re.lastIndex === obj, "re.lastIndex = " + re.lastIndex + " expected obj");li = 2;m = re.exec(" a a ");ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2");ok(m.index === 1, "m.index = " + m.index + " expected 1");
re.lastIndex = 3;re.lastIndex = "test";ok(re.lastIndex === "test", "re.lastIndex = " + re.lastIndex + " expected 'test'");m = re.exec(" a a ");ok(re.lastIndex === 2 || re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 2 or 0");if(re.lastIndex != 0) ok(m.index === 1, "m.index = " + m.index + " expected 1");else ok(m === null, "m = " + m + " expected null");
re.lastIndex = 0;re.lastIndex = 3.9;ok(re.lastIndex === 3.9, "re.lastIndex = " + re.lastIndex + " expected 3.9");m = re.exec(" a a ");ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex + " expected 4");ok(m.index === 3, "m.index = " + m.index + " expected 3");
obj.valueOf = function() { throw 0; }re.lastIndex = obj;ok(re.lastIndex === obj, "unexpected re.lastIndex");m = re.exec(" a a ");ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2");ok(m.index === 1, "m.index = " + m.index + " expected 1");
re.lastIndex = -3;ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3");m = re.exec(" a a ");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");ok(m === null, "m = " + m + " expected null");
re.lastIndex = -1;ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1");m = re.exec(" ");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");ok(m === null, "m = " + m + " expected null");
re = /a/;re.lastIndex = -3;ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3");m = re.exec(" a a ");ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 0");ok(m.index === 1, "m = " + m + " expected 1");ok(RegExp.leftContext === " ", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === " a ", "RegExp.rightContext = " + RegExp.rightContext);
re.lastIndex = -1;ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1");m = re.exec(" ");ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");ok(m === null, "m = " + m + " expected null");
re = /aa/g;i = 'baacd'.search(re);ok(i === 1, "'baacd'.search(re) = " + i);ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === "b", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "cd", "RegExp.rightContext = " + RegExp.rightContext);
re.lastIndex = 2;i = 'baacdaa'.search(re);ok(i === 1, "'baacd'.search(re) = " + i);ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
re = /aa/;i = 'baacd'.search(re);ok(i === 1, "'baacd'.search(re) = " + i);ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
re.lastIndex = 2;i = 'baacdaa'.search(re);ok(i === 1, "'baacd'.search(re) = " + i);ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === "b", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "cdaa", "RegExp.rightContext = " + RegExp.rightContext);
re = /d/g;re.lastIndex = 1;i = 'abc'.search(re);ok(i === -1, "'abc'.search(/d/g) = " + i);ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);ok(RegExp.leftContext === "b", "RegExp.leftContext = " + RegExp.leftContext);ok(RegExp.rightContext === "cdaa", "RegExp.rightContext = " + RegExp.rightContext);
i = 'abcdde'.search(/[df]/);ok(i === 3, "'abc'.search(/[df]/) = " + i);
i = 'abcdde'.search(/[df]/, "a");ok(i === 3, "'abc'.search(/[df]/) = " + i);
i = 'abcdde'.search("[df]");ok(i === 3, "'abc'.search(/d*/) = " + i);
obj = { toString: function() { return "abc"; }};i = String.prototype.search.call(obj, "b");ok(i === 1, "String.prototype.seatch.apply(obj, 'b') = " + i);
i = " undefined ".search();ok(i === null, "' undefined '.search() = " + i);
tmp = "=)".replace(/=/, "?");ok(tmp === "?)", "'=)'.replace(/=/, '?') = " + tmp);
tmp = " ".replace(/^\s*|\s*$/g, "y");ok(tmp === "yy", '" ".replace(/^\s*|\s*$/g, "y") = ' + tmp);
tmp = "xxx".replace(/^\s*|\s*$/g, "");ok(tmp === "xxx", '"xxx".replace(/^\s*|\s*$/g, "y") = ' + tmp);
tmp = "xxx".replace(/^\s*|\s*$/g, "y");ok(tmp === "yxxxy", '"xxx".replace(/^\s*|\s*$/g, "y") = ' + tmp);
tmp = "x/y".replace(/[/]/, "*");ok(tmp === "x*y", '"x/y".replace(/[/]/, "*") = ' + tmp);
tmp = "x/y".replace(/[xy/]/g, "*");ok(tmp === "***", '"x/y".replace(/[xy/]/, "*") = ' + tmp);
/(b)/.exec("abc");ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1);ok("$2" in RegExp, "RegExp.$2 doesn't exist");ok(RegExp.$2 === "", "RegExp.$2 = " + RegExp.$2);ok(RegExp.$9 === "", "RegExp.$9 = " + RegExp.$9);ok(!("$10" in RegExp), "RegExp.$10 exists");
/(b)(b)(b)(b)(b)(b)(b)(b)(b)(b)(b)/.exec("abbbbbbbbbbbc");ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1);ok(RegExp.$2 === "b", "[2] RegExp.$2 = " + RegExp.$2);ok(RegExp.$9 === "b", "RegExp.$9 = " + RegExp.$9);ok(!("$10" in RegExp), "RegExp.$10 exists");
/(b)/.exec("abc");ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1);ok("$2" in RegExp, "RegExp.$2 doesn't exist");ok(RegExp.$2 === "", "RegExp.$2 = " + RegExp.$2);ok(RegExp.$9 === "", "RegExp.$9 = " + RegExp.$9);ok(!("$10" in RegExp), "RegExp.$10 exists");
RegExp.$1 = "a";ok(RegExp.$1 === "b", "RegExp.$1 = " + RegExp.$1);
ok(/abc/.toString() === "/abc/", "/abc/.toString() = " + /abc/.toString());ok(/\//.toString() === "/\\//", "/\//.toString() = " + /\//.toString());tmp = new RegExp("abc/");ok(tmp.toString() === "/abc//", "(new RegExp(\"abc/\")).toString() = " + tmp.toString());ok(/abc/g.toString() === "/abc/g", "/abc/g.toString() = " + /abc/g.toString());ok(/abc/i.toString() === "/abc/i", "/abc/i.toString() = " + /abc/i.toString());ok(/abc/ig.toString() === "/abc/ig", "/abc/ig.toString() = " + /abc/ig.toString());ok(/abc/mgi.toString() === "/abc/igm", "/abc/mgi.toString() = " + /abc/mgi.toString());tmp = new RegExp("abc/", "mgi");ok(tmp.toString() === "/abc//igm", "(new RegExp(\"abc/\")).toString() = " + tmp.toString());ok(/abc/.toString(1, false, "3") === "/abc/", "/abc/.toString(1, false, \"3\") = " + /abc/.toString());
re = /x/;ok(re.ignoreCase === false, "re.ignoreCase = " + re.ignoreCase);ok(re.multiline === false, "re.multiline = " + re.multiline);ok(re.global === false, "re.global = " + re.global);re = /x/i;ok(re.ignoreCase === true, "re.ignoreCase = " + re.ignoreCase);ok(re.multiline === false, "re.multiline = " + re.multiline);ok(re.global === false, "re.global = " + re.global);re = new RegExp("xxx", "gi");ok(re.ignoreCase === true, "re.ignoreCase = " + re.ignoreCase);ok(re.multiline === false, "re.multiline = " + re.multiline);ok(re.global === true, "re.global = " + re.global);re = /x/mg;ok(re.ignoreCase === false, "re.ignoreCase = " + re.ignoreCase);ok(re.multiline === true, "re.multiline = " + re.multiline);ok(re.global === true, "re.global = " + re.global);
reportSuccess();