mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 13:42:44 +00:00 
			
		
		
		
	 0d96468e9b
			
		
	
	
		0d96468e9b
		
	
	
	
	
		
			
			RegExp legacy static properties Spec url is https://github.com/tc39/proposal-regexp-legacy-features
		
			
				
	
	
		
			198 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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"]);
 | |
| });
 |