regexp_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package goja
  2. import (
  3. "testing"
  4. )
  5. func TestRegexp1(t *testing.T) {
  6. const SCRIPT = `
  7. var r = new RegExp("(['\"])(.*?)\\1");
  8. var m = r.exec("'test'");
  9. m !== null && m.length == 3 && m[2] === "test";
  10. `
  11. testScript1(SCRIPT, valueTrue, t)
  12. }
  13. func TestRegexp2(t *testing.T) {
  14. const SCRIPT = `
  15. var r = new RegExp("(['\"])(.*?)['\"]");
  16. var m = r.exec("'test'");
  17. m !== null && m.length == 3 && m[2] === "test";
  18. `
  19. testScript1(SCRIPT, valueTrue, t)
  20. }
  21. func TestRegexpLiteral(t *testing.T) {
  22. const SCRIPT = `
  23. var r = /(['\"])(.*?)\1/;
  24. var m = r.exec("'test'");
  25. m !== null && m.length == 3 && m[2] === "test";
  26. `
  27. testScript1(SCRIPT, valueTrue, t)
  28. }
  29. func TestRegexpRe2Unicode(t *testing.T) {
  30. const SCRIPT = `
  31. var r = /(тест)/i;
  32. var m = r.exec("'Тест'");
  33. m !== null && m.length == 2 && m[1] === "Тест";
  34. `
  35. testScript1(SCRIPT, valueTrue, t)
  36. }
  37. func TestRegexpRe2UnicodeTarget(t *testing.T) {
  38. const SCRIPT = `
  39. var r = /(['\"])(.*?)['\"]/i;
  40. var m = r.exec("'Тест'");
  41. m !== null && m.length == 3 && m[2] === "Тест";
  42. `
  43. testScript1(SCRIPT, valueTrue, t)
  44. }
  45. func TestRegexpRegexp2Unicode(t *testing.T) {
  46. const SCRIPT = `
  47. var r = /(['\"])(тест)\1/i;
  48. var m = r.exec("'Тест'");
  49. m !== null && m.length == 3 && m[2] === "Тест";
  50. `
  51. testScript1(SCRIPT, valueTrue, t)
  52. }
  53. func TestRegexpRegexp2UnicodeTarget(t *testing.T) {
  54. const SCRIPT = `
  55. var r = /(['\"])(.*?)\1/;
  56. var m = r.exec("'Тест'");
  57. m !== null && m.length == 3 && m[2] === "Тест";
  58. `
  59. testScript1(SCRIPT, valueTrue, t)
  60. }
  61. func TestRegexpRe2Whitespace(t *testing.T) {
  62. const SCRIPT = `
  63. "\u2000\u2001\u2002\u200b".replace(/\s+/g, "") === "\u200b";
  64. `
  65. testScript1(SCRIPT, valueTrue, t)
  66. }
  67. func TestRegexpRegexp2Whitespace(t *testing.T) {
  68. const SCRIPT = `
  69. "A\u2000\u2001\u2002A\u200b".replace(/(A)\s+\1/g, "") === "\u200b"
  70. `
  71. testScript1(SCRIPT, valueTrue, t)
  72. }
  73. func TestEmptyCharClassRe2(t *testing.T) {
  74. const SCRIPT = `
  75. /[]/.test("\u0000");
  76. `
  77. testScript1(SCRIPT, valueFalse, t)
  78. }
  79. func TestNegatedEmptyCharClassRe2(t *testing.T) {
  80. const SCRIPT = `
  81. /[^]/.test("\u0000");
  82. `
  83. testScript1(SCRIPT, valueTrue, t)
  84. }
  85. func TestEmptyCharClassRegexp2(t *testing.T) {
  86. const SCRIPT = `
  87. /([])\1/.test("\u0000\u0000");
  88. `
  89. testScript1(SCRIPT, valueFalse, t)
  90. }
  91. func TestRegexp2Negate(t *testing.T) {
  92. const SCRIPT = `
  93. /([\D1])\1/.test("aa");
  94. `
  95. testScript1(SCRIPT, valueTrue, t)
  96. }
  97. func TestAlternativeRe2(t *testing.T) {
  98. const SCRIPT = `
  99. /()|/.exec("") !== null;
  100. `
  101. testScript1(SCRIPT, valueTrue, t)
  102. }
  103. func TestRegexpReplaceGlobal(t *testing.T) {
  104. const SCRIPT = `
  105. "QBZPbage\ny_cynprubyqre".replace(/^\s*|\s*$/g, '')
  106. `
  107. testScript1(SCRIPT, asciiString("QBZPbage\ny_cynprubyqre"), t)
  108. }
  109. func TestRegexpNumCaptures(t *testing.T) {
  110. const SCRIPT = `
  111. "Fubpxjnir Synfu 9.0 e115".replace(/([a-zA-Z]|\s)+/, '')
  112. `
  113. testScript1(SCRIPT, asciiString("9.0 e115"), t)
  114. }
  115. func TestRegexpNumCaptures1(t *testing.T) {
  116. const SCRIPT = `
  117. "Fubpxjnir Sy\tfu 9.0 e115".replace(/^.*\s+(\S+\s+\S+$)/, '')
  118. `
  119. testScript1(SCRIPT, asciiString(""), t)
  120. }
  121. func TestRegexpSInClass(t *testing.T) {
  122. const SCRIPT = `
  123. /[\S]/.test("\u2028");
  124. `
  125. testScript1(SCRIPT, valueFalse, t)
  126. }
  127. func TestRegexpDotMatchSlashR(t *testing.T) {
  128. const SCRIPT = `
  129. /./.test("\r");
  130. `
  131. testScript1(SCRIPT, valueFalse, t)
  132. }
  133. func TestRegexpDotMatchSlashRInGroup(t *testing.T) {
  134. const SCRIPT = `
  135. /(.)/.test("\r");
  136. `
  137. testScript1(SCRIPT, valueFalse, t)
  138. }
  139. func TestRegexpSplitWithBackRef(t *testing.T) {
  140. const SCRIPT = `
  141. "a++b+-c".split(/([+-])\1/).join(" $$ ")
  142. `
  143. testScript1(SCRIPT, asciiString("a $$ + $$ b+-c"), t)
  144. }
  145. func TestEscapeNonASCII(t *testing.T) {
  146. const SCRIPT = `
  147. /\⩓/.test("⩓")
  148. `
  149. testScript1(SCRIPT, valueTrue, t)
  150. }
  151. func BenchmarkRegexpSplitWithBackRef(b *testing.B) {
  152. const SCRIPT = `
  153. "aaaaaaaaaaaaaaaaaaaaaaaaa++bbbbbbbbbbbbbbbbbbbbbb+-ccccccccccccccccccccccc".split(/([+-])\1/)
  154. `
  155. b.StopTimer()
  156. prg, err := Compile("test.js", SCRIPT, false)
  157. if err != nil {
  158. b.Fatal(err)
  159. }
  160. vm := New()
  161. b.StartTimer()
  162. for i := 0; i < b.N; i++ {
  163. vm.RunProgram(prg)
  164. }
  165. }