123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- // NOTE: This file came from https://github.com/v8/v8/blob/main/test/mjsunit/regexp-static.js
- // and was modified to match LibJS test framework.
- test("basic functionality", () => {
- var re = /((\d+)\.(\d+))/;
- var s = "abc123.456def";
- re.exec(s);
- expect(RegExp.input).toBe(s);
- expect(RegExp["$_"]).toBe(s);
- expect(RegExp.lastMatch).toBe("123.456");
- expect(RegExp["$&"]).toBe("123.456");
- expect(RegExp.lastParen).toBe("456");
- expect(RegExp["$+"]).toBe("456");
- expect(RegExp.leftContext).toBe("abc");
- expect(RegExp["$`"]).toBe("abc");
- expect(RegExp.rightContext).toBe("def");
- expect(RegExp["$'"]).toBe("def");
- expect(RegExp.$1).toBe("123.456");
- expect(RegExp.$2).toBe("123");
- expect(RegExp.$3).toBe("456");
- expect(RegExp.$4).toBe("");
- expect(RegExp.$5).toBe("");
- expect(RegExp.$6).toBe("");
- expect(RegExp.$7).toBe("");
- expect(RegExp.$8).toBe("");
- expect(RegExp.$9).toBe("");
- });
- test("They should be read only", () => {
- RegExp["$1"] = "fisk";
- expect(RegExp.$1).toBe("123.456");
- RegExp.input = Number();
- expect(typeof RegExp.input).toBe(typeof String());
- });
- test("They should be read only (strict mode)", () => {
- "use strict";
- try {
- RegExp["$1"] = "fisk";
- expect(true).toBeFalse(); // SHOULD NOT REACH HERE
- } catch (e) {
- expect(String(e)).toBe("TypeError: Cannot set property '$1' of [object RegExpConstructor]");
- expect(RegExp.$1).toBe("123.456");
- }
- RegExp.input = Number();
- expect(typeof RegExp.input).toBe(typeof String());
- });
- test("the original accessor vs the alias accessor", () => {
- expect(Object.getOwnPropertyDescriptor(RegExp, "input").get).not.toBe(
- Object.getOwnPropertyDescriptor(RegExp, "$_").get
- );
- expect(Object.getOwnPropertyDescriptor(RegExp, "input").set).not.toBe(
- Object.getOwnPropertyDescriptor(RegExp, "$_").set
- );
- expect(Object.getOwnPropertyDescriptor(RegExp, "lastMatch").get).not.toBe(
- Object.getOwnPropertyDescriptor(RegExp, "$&").get
- );
- expect(Object.getOwnPropertyDescriptor(RegExp, "lastParen").get).not.toBe(
- Object.getOwnPropertyDescriptor(RegExp, "$+").get
- );
- expect(Object.getOwnPropertyDescriptor(RegExp, "leftContext").get).not.toBe(
- Object.getOwnPropertyDescriptor(RegExp, "$`").get
- );
- expect(Object.getOwnPropertyDescriptor(RegExp, "rightContext").get).not.toBe(
- Object.getOwnPropertyDescriptor(RegExp, "$'").get
- );
- });
- test("match should all behave as if exec were called.", () => {
- var re = /((\d+)\.(\d+))/;
- var s = "ghi789.012jkl";
- s.match(re);
- expect(RegExp.input).toBe(s);
- expect(RegExp["$_"]).toBe(s);
- expect(RegExp.lastMatch).toBe("789.012");
- expect(RegExp["$&"]).toBe("789.012");
- expect(RegExp.lastParen).toBe("012");
- expect(RegExp["$+"]).toBe("012");
- expect(RegExp.leftContext).toBe("ghi");
- expect(RegExp["$`"]).toBe("ghi");
- expect(RegExp.rightContext).toBe("jkl");
- expect(RegExp["$'"]).toBe("jkl");
- expect(RegExp.$1).toBe("789.012");
- expect(RegExp.$2).toBe("789");
- expect(RegExp.$3).toBe("012");
- expect(RegExp.$4).toBe("");
- expect(RegExp.$5).toBe("");
- expect(RegExp.$6).toBe("");
- expect(RegExp.$7).toBe("");
- expect(RegExp.$8).toBe("");
- expect(RegExp.$9).toBe("");
- });
- test("replace should all behave as if exec were called.", () => {
- var re = /((\d+)\.(\d+))/;
- var s = "abc123.456def";
- s.replace(re, "whocares");
- expect(RegExp.input).toBe(s);
- expect(RegExp["$_"]).toBe(s);
- expect(RegExp.lastMatch).toBe("123.456");
- expect(RegExp["$&"]).toBe("123.456");
- expect(RegExp.lastParen).toBe("456");
- expect(RegExp["$+"]).toBe("456");
- expect(RegExp.leftContext).toBe("abc");
- expect(RegExp["$`"]).toBe("abc");
- expect(RegExp.rightContext).toBe("def");
- expect(RegExp["$'"]).toBe("def");
- expect(RegExp.$1).toBe("123.456");
- expect(RegExp.$2).toBe("123");
- expect(RegExp.$3).toBe("456");
- expect(RegExp.$4).toBe("");
- expect(RegExp.$5).toBe("");
- expect(RegExp.$6).toBe("");
- expect(RegExp.$7).toBe("");
- expect(RegExp.$8).toBe("");
- expect(RegExp.$9).toBe("");
- });
- test("test should all behave as if exec were called.", () => {
- var re = /((\d+)\.(\d+))/;
- var s = "ghi789.012jkl";
- re.test(s);
- expect(RegExp.input).toBe(s);
- expect(RegExp["$_"]).toBe(s);
- expect(RegExp.lastMatch).toBe("789.012");
- expect(RegExp["$&"]).toBe("789.012");
- expect(RegExp.lastParen).toBe("012");
- expect(RegExp["$+"]).toBe("012");
- expect(RegExp.leftContext).toBe("ghi");
- expect(RegExp["$`"]).toBe("ghi");
- expect(RegExp.rightContext).toBe("jkl");
- expect(RegExp["$'"]).toBe("jkl");
- expect(RegExp.$1).toBe("789.012");
- expect(RegExp.$2).toBe("789");
- expect(RegExp.$3).toBe("012");
- expect(RegExp.$4).toBe("");
- expect(RegExp.$5).toBe("");
- expect(RegExp.$6).toBe("");
- expect(RegExp.$7).toBe("");
- expect(RegExp.$8).toBe("");
- expect(RegExp.$9).toBe("");
- });
- test("replace must interleave matching and replacing when a global regexp is matched and replaced with the result of a function", () => {
- var re = /(.)/g;
- function f() {
- return RegExp.$1;
- }
- expect("abcd".replace(re, f)).toBe("dddd");
- });
- test("the last parenthesis didn't match.", () => {
- expect(/foo(?:a(x))?/.exec("foobx")).toEqual(["foo", undefined]);
- expect(RegExp.lastParen).toBe("");
- });
- test("$1 to $9", () => {
- for (var i = 1; i <= 9; i++) {
- var haystack = "foo";
- var re_text = "^foo";
- for (var j = 0; j < i - 1; j++) {
- haystack += "x";
- re_text += "(x)";
- }
- re_text += "(?:a(x))?";
- haystack += "bx";
- var re = new RegExp(re_text);
- expect(re.test(haystack)).toBeTrue();
- for (var j = 1; j < i - 1; j++) {
- expect(RegExp["$" + j]).toBe("x");
- }
- expect(RegExp["$" + i]).toBe("");
- }
- });
- test("save the correct string as the last subject", () => {
- var foo =
- "lsdfj sldkfj sdklfj læsdfjl sdkfjlsdk fjsdl fjsdljskdj flsj flsdkj flskd regexp: /foobar/\nldkfj sdlkfj sdkl";
- expect(/^([a-z]+): (.*)/.test(foo.substring(foo.indexOf("regexp:")))).toBeTrue();
- expect(RegExp.$1).toBe("regexp");
- });
- test("calling with no argument is the same as calling with undefined.", () => {
- expect(/^undefined$/.test()).toBeTrue();
- expect(/^undefined$/.exec()).toEqual(["undefined"]);
- });
|