RegExp.legacy.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // NOTE: This file came from https://github.com/v8/v8/blob/main/test/mjsunit/regexp-static.js
  2. // and was modified to match LibJS test framework.
  3. test("basic functionality", () => {
  4. var re = /((\d+)\.(\d+))/;
  5. var s = "abc123.456def";
  6. re.exec(s);
  7. expect(RegExp.input).toBe(s);
  8. expect(RegExp["$_"]).toBe(s);
  9. expect(RegExp.lastMatch).toBe("123.456");
  10. expect(RegExp["$&"]).toBe("123.456");
  11. expect(RegExp.lastParen).toBe("456");
  12. expect(RegExp["$+"]).toBe("456");
  13. expect(RegExp.leftContext).toBe("abc");
  14. expect(RegExp["$`"]).toBe("abc");
  15. expect(RegExp.rightContext).toBe("def");
  16. expect(RegExp["$'"]).toBe("def");
  17. expect(RegExp.$1).toBe("123.456");
  18. expect(RegExp.$2).toBe("123");
  19. expect(RegExp.$3).toBe("456");
  20. expect(RegExp.$4).toBe("");
  21. expect(RegExp.$5).toBe("");
  22. expect(RegExp.$6).toBe("");
  23. expect(RegExp.$7).toBe("");
  24. expect(RegExp.$8).toBe("");
  25. expect(RegExp.$9).toBe("");
  26. });
  27. test("They should be read only", () => {
  28. RegExp["$1"] = "fisk";
  29. expect(RegExp.$1).toBe("123.456");
  30. RegExp.input = Number();
  31. expect(typeof RegExp.input).toBe(typeof String());
  32. });
  33. test("They should be read only (strict mode)", () => {
  34. "use strict";
  35. try {
  36. RegExp["$1"] = "fisk";
  37. expect(true).toBeFalse(); // SHOULD NOT REACH HERE
  38. } catch (e) {
  39. expect(String(e)).toBe("TypeError: Cannot set property '$1' of [object RegExpConstructor]");
  40. expect(RegExp.$1).toBe("123.456");
  41. }
  42. RegExp.input = Number();
  43. expect(typeof RegExp.input).toBe(typeof String());
  44. });
  45. test("the original accessor vs the alias accessor", () => {
  46. expect(Object.getOwnPropertyDescriptor(RegExp, "input").get).not.toBe(
  47. Object.getOwnPropertyDescriptor(RegExp, "$_").get
  48. );
  49. expect(Object.getOwnPropertyDescriptor(RegExp, "input").set).not.toBe(
  50. Object.getOwnPropertyDescriptor(RegExp, "$_").set
  51. );
  52. expect(Object.getOwnPropertyDescriptor(RegExp, "lastMatch").get).not.toBe(
  53. Object.getOwnPropertyDescriptor(RegExp, "$&").get
  54. );
  55. expect(Object.getOwnPropertyDescriptor(RegExp, "lastParen").get).not.toBe(
  56. Object.getOwnPropertyDescriptor(RegExp, "$+").get
  57. );
  58. expect(Object.getOwnPropertyDescriptor(RegExp, "leftContext").get).not.toBe(
  59. Object.getOwnPropertyDescriptor(RegExp, "$`").get
  60. );
  61. expect(Object.getOwnPropertyDescriptor(RegExp, "rightContext").get).not.toBe(
  62. Object.getOwnPropertyDescriptor(RegExp, "$'").get
  63. );
  64. });
  65. test("match should all behave as if exec were called.", () => {
  66. var re = /((\d+)\.(\d+))/;
  67. var s = "ghi789.012jkl";
  68. s.match(re);
  69. expect(RegExp.input).toBe(s);
  70. expect(RegExp["$_"]).toBe(s);
  71. expect(RegExp.lastMatch).toBe("789.012");
  72. expect(RegExp["$&"]).toBe("789.012");
  73. expect(RegExp.lastParen).toBe("012");
  74. expect(RegExp["$+"]).toBe("012");
  75. expect(RegExp.leftContext).toBe("ghi");
  76. expect(RegExp["$`"]).toBe("ghi");
  77. expect(RegExp.rightContext).toBe("jkl");
  78. expect(RegExp["$'"]).toBe("jkl");
  79. expect(RegExp.$1).toBe("789.012");
  80. expect(RegExp.$2).toBe("789");
  81. expect(RegExp.$3).toBe("012");
  82. expect(RegExp.$4).toBe("");
  83. expect(RegExp.$5).toBe("");
  84. expect(RegExp.$6).toBe("");
  85. expect(RegExp.$7).toBe("");
  86. expect(RegExp.$8).toBe("");
  87. expect(RegExp.$9).toBe("");
  88. });
  89. test("replace should all behave as if exec were called.", () => {
  90. var re = /((\d+)\.(\d+))/;
  91. var s = "abc123.456def";
  92. s.replace(re, "whocares");
  93. expect(RegExp.input).toBe(s);
  94. expect(RegExp["$_"]).toBe(s);
  95. expect(RegExp.lastMatch).toBe("123.456");
  96. expect(RegExp["$&"]).toBe("123.456");
  97. expect(RegExp.lastParen).toBe("456");
  98. expect(RegExp["$+"]).toBe("456");
  99. expect(RegExp.leftContext).toBe("abc");
  100. expect(RegExp["$`"]).toBe("abc");
  101. expect(RegExp.rightContext).toBe("def");
  102. expect(RegExp["$'"]).toBe("def");
  103. expect(RegExp.$1).toBe("123.456");
  104. expect(RegExp.$2).toBe("123");
  105. expect(RegExp.$3).toBe("456");
  106. expect(RegExp.$4).toBe("");
  107. expect(RegExp.$5).toBe("");
  108. expect(RegExp.$6).toBe("");
  109. expect(RegExp.$7).toBe("");
  110. expect(RegExp.$8).toBe("");
  111. expect(RegExp.$9).toBe("");
  112. });
  113. test("test should all behave as if exec were called.", () => {
  114. var re = /((\d+)\.(\d+))/;
  115. var s = "ghi789.012jkl";
  116. re.test(s);
  117. expect(RegExp.input).toBe(s);
  118. expect(RegExp["$_"]).toBe(s);
  119. expect(RegExp.lastMatch).toBe("789.012");
  120. expect(RegExp["$&"]).toBe("789.012");
  121. expect(RegExp.lastParen).toBe("012");
  122. expect(RegExp["$+"]).toBe("012");
  123. expect(RegExp.leftContext).toBe("ghi");
  124. expect(RegExp["$`"]).toBe("ghi");
  125. expect(RegExp.rightContext).toBe("jkl");
  126. expect(RegExp["$'"]).toBe("jkl");
  127. expect(RegExp.$1).toBe("789.012");
  128. expect(RegExp.$2).toBe("789");
  129. expect(RegExp.$3).toBe("012");
  130. expect(RegExp.$4).toBe("");
  131. expect(RegExp.$5).toBe("");
  132. expect(RegExp.$6).toBe("");
  133. expect(RegExp.$7).toBe("");
  134. expect(RegExp.$8).toBe("");
  135. expect(RegExp.$9).toBe("");
  136. });
  137. test("replace must interleave matching and replacing when a global regexp is matched and replaced with the result of a function", () => {
  138. var re = /(.)/g;
  139. function f() {
  140. return RegExp.$1;
  141. }
  142. expect("abcd".replace(re, f)).toBe("dddd");
  143. });
  144. test("the last parenthesis didn't match.", () => {
  145. expect(/foo(?:a(x))?/.exec("foobx")).toEqual(["foo", undefined]);
  146. expect(RegExp.lastParen).toBe("");
  147. });
  148. test("$1 to $9", () => {
  149. for (var i = 1; i <= 9; i++) {
  150. var haystack = "foo";
  151. var re_text = "^foo";
  152. for (var j = 0; j < i - 1; j++) {
  153. haystack += "x";
  154. re_text += "(x)";
  155. }
  156. re_text += "(?:a(x))?";
  157. haystack += "bx";
  158. var re = new RegExp(re_text);
  159. expect(re.test(haystack)).toBeTrue();
  160. for (var j = 1; j < i - 1; j++) {
  161. expect(RegExp["$" + j]).toBe("x");
  162. }
  163. expect(RegExp["$" + i]).toBe("");
  164. }
  165. });
  166. test("save the correct string as the last subject", () => {
  167. var foo =
  168. "lsdfj sldkfj sdklfj læsdfjl sdkfjlsdk fjsdl fjsdljskdj flsj flsdkj flskd regexp: /foobar/\nldkfj sdlkfj sdkl";
  169. expect(/^([a-z]+): (.*)/.test(foo.substring(foo.indexOf("regexp:")))).toBeTrue();
  170. expect(RegExp.$1).toBe("regexp");
  171. });
  172. test("calling with no argument is the same as calling with undefined.", () => {
  173. expect(/^undefined$/.test()).toBeTrue();
  174. expect(/^undefined$/.exec()).toEqual(["undefined"]);
  175. });