regexp_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package parser
  2. import (
  3. "regexp"
  4. "testing"
  5. )
  6. func TestRegExp(t *testing.T) {
  7. tt(t, func() {
  8. {
  9. // err
  10. test := func(input string, expect interface{}) {
  11. _, err := TransformRegExp(input)
  12. is(err, expect)
  13. }
  14. test("[", "Unterminated character class")
  15. test("(", "Unterminated group")
  16. test("\\(?=)", "Unmatched ')'")
  17. test(")", "Unmatched ')'")
  18. }
  19. {
  20. // err
  21. test := func(input, expect string, expectErr interface{}) {
  22. output, err := TransformRegExp(input)
  23. is(output, expect)
  24. is(err, expectErr)
  25. }
  26. test(")", "", "Unmatched ')'")
  27. test("\\0", "\\0", nil)
  28. test("0:(?)", "", "Invalid group")
  29. test("(?)", "", "Invalid group")
  30. test("(?U)", "", "Invalid group")
  31. test("(?)|(?i)", "", "Invalid group")
  32. test("(?P<w>)(?P<w>)(?P<D>)", "", "Invalid group")
  33. test(`<%([\s\S]+?)%>`, `<%([`+WhitespaceChars+`S]+?)%>`, "S in class")
  34. test("(?<=y)x", "(?<=y)x", "re2: Invalid (?<) <lookbehind>")
  35. }
  36. {
  37. // err
  38. test := func(input string, expect string) {
  39. result, err := TransformRegExp(input)
  40. is(err, nil)
  41. is(result, expect)
  42. _, err = regexp.Compile(result)
  43. is(err, nil)
  44. }
  45. test("", "")
  46. test("abc", "abc")
  47. test(`\abc`, `abc`)
  48. test(`\a\b\c`, `a\bc`)
  49. test(`\x`, `x`)
  50. test(`\c`, `c`)
  51. test(`\cA`, `\x01`)
  52. test(`\cz`, `\x1a`)
  53. test(`\ca`, `\x01`)
  54. test(`\cj`, `\x0a`)
  55. test(`\ck`, `\x0b`)
  56. test(`\+`, `\+`)
  57. test(`[\b]`, `[\x08]`)
  58. test(`\u0z01\x\undefined`, `u0z01xundefined`)
  59. test(`\\|'|\r|\n|\t|\u2028|\u2029`, `\\|'|\r|\n|\t|\x{2028}|\x{2029}`)
  60. test("]", "]")
  61. test("}", "}")
  62. test("%", "%")
  63. test("(%)", "(%)")
  64. test("(?:[%\\s])", "(?:[%"+WhitespaceChars+"])")
  65. test("[[]", "[[]")
  66. test("\\101", "\\x41")
  67. test("\\51", "\\x29")
  68. test("\\051", "\\x29")
  69. test("\\175", "\\x7d")
  70. test("\\04", "\\x04")
  71. test(`(.)^`, "([^\\r\\n])^")
  72. test(`\$`, `\$`)
  73. test(`[G-b]`, `[G-b]`)
  74. test(`[G-b\0]`, `[G-b\0]`)
  75. }
  76. })
  77. }
  78. func TestTransformRegExp(t *testing.T) {
  79. tt(t, func() {
  80. pattern, err := TransformRegExp(`\s+abc\s+`)
  81. is(err, nil)
  82. is(pattern, `[`+WhitespaceChars+`]+abc[`+WhitespaceChars+`]+`)
  83. is(regexp.MustCompile(pattern).MatchString("\t abc def"), true)
  84. })
  85. }