onepass_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package regexp
  5. import (
  6. "reflect"
  7. "regexp/syntax"
  8. "testing"
  9. )
  10. var runeMergeTests = []struct {
  11. left, right, merged []rune
  12. next []uint32
  13. leftPC, rightPC uint32
  14. }{
  15. {
  16. // empty rhs
  17. []rune{69, 69},
  18. []rune{},
  19. []rune{69, 69},
  20. []uint32{1},
  21. 1, 2,
  22. },
  23. {
  24. // identical runes, identical targets
  25. []rune{69, 69},
  26. []rune{69, 69},
  27. []rune{},
  28. []uint32{mergeFailed},
  29. 1, 1,
  30. },
  31. {
  32. // identical runes, different targets
  33. []rune{69, 69},
  34. []rune{69, 69},
  35. []rune{},
  36. []uint32{mergeFailed},
  37. 1, 2,
  38. },
  39. {
  40. // append right-first
  41. []rune{69, 69},
  42. []rune{71, 71},
  43. []rune{69, 69, 71, 71},
  44. []uint32{1, 2},
  45. 1, 2,
  46. },
  47. {
  48. // append, left-first
  49. []rune{71, 71},
  50. []rune{69, 69},
  51. []rune{69, 69, 71, 71},
  52. []uint32{2, 1},
  53. 1, 2,
  54. },
  55. {
  56. // successful interleave
  57. []rune{60, 60, 71, 71, 101, 101},
  58. []rune{69, 69, 88, 88},
  59. []rune{60, 60, 69, 69, 71, 71, 88, 88, 101, 101},
  60. []uint32{1, 2, 1, 2, 1},
  61. 1, 2,
  62. },
  63. {
  64. // left surrounds right
  65. []rune{69, 74},
  66. []rune{71, 71},
  67. []rune{},
  68. []uint32{mergeFailed},
  69. 1, 2,
  70. },
  71. {
  72. // right surrounds left
  73. []rune{69, 74},
  74. []rune{68, 75},
  75. []rune{},
  76. []uint32{mergeFailed},
  77. 1, 2,
  78. },
  79. {
  80. // overlap at interval begin
  81. []rune{69, 74},
  82. []rune{74, 75},
  83. []rune{},
  84. []uint32{mergeFailed},
  85. 1, 2,
  86. },
  87. {
  88. // overlap ar interval end
  89. []rune{69, 74},
  90. []rune{65, 69},
  91. []rune{},
  92. []uint32{mergeFailed},
  93. 1, 2,
  94. },
  95. {
  96. // overlap from above
  97. []rune{69, 74},
  98. []rune{71, 74},
  99. []rune{},
  100. []uint32{mergeFailed},
  101. 1, 2,
  102. },
  103. {
  104. // overlap from below
  105. []rune{69, 74},
  106. []rune{65, 71},
  107. []rune{},
  108. []uint32{mergeFailed},
  109. 1, 2,
  110. },
  111. {
  112. // out of order []rune
  113. []rune{69, 74, 60, 65},
  114. []rune{66, 67},
  115. []rune{},
  116. []uint32{mergeFailed},
  117. 1, 2,
  118. },
  119. }
  120. func TestMergeRuneSet(t *testing.T) {
  121. for ix, test := range runeMergeTests {
  122. merged, next := mergeRuneSets(&test.left, &test.right, test.leftPC, test.rightPC)
  123. if !reflect.DeepEqual(merged, test.merged) {
  124. t.Errorf("mergeRuneSet :%d (%v, %v) merged\n have\n%v\nwant\n%v", ix, test.left, test.right, merged, test.merged)
  125. }
  126. if !reflect.DeepEqual(next, test.next) {
  127. t.Errorf("mergeRuneSet :%d(%v, %v) next\n have\n%v\nwant\n%v", ix, test.left, test.right, next, test.next)
  128. }
  129. }
  130. }
  131. const noStr = `!`
  132. var onePass = &onePassProg{}
  133. var onePassTests = []struct {
  134. re string
  135. onePass *onePassProg
  136. prog string
  137. }{
  138. {`^(?:a|(?:a*))$`, notOnePass, noStr},
  139. {`^(?:(a)|(?:a*))$`, notOnePass, noStr},
  140. {`^(?:(?:(?:.(?:$))?))$`, onePass, `a`},
  141. {`^abcd$`, onePass, `abcd`},
  142. {`^abcd$`, onePass, `abcde`},
  143. {`^(?:(?:a{0,})*?)$`, onePass, `a`},
  144. {`^(?:(?:a+)*)$`, onePass, ``},
  145. {`^(?:(?:a|(?:aa)))$`, onePass, ``},
  146. {`^(?:[^\s\S])$`, onePass, ``},
  147. {`^(?:(?:a{3,4}){0,})$`, notOnePass, `aaaaaa`},
  148. {`^(?:(?:a+)*)$`, onePass, `a`},
  149. {`^(?:(?:(?:a*)+))$`, onePass, noStr},
  150. {`^(?:(?:a+)*)$`, onePass, ``},
  151. {`^[a-c]+$`, onePass, `abc`},
  152. {`^[a-c]*$`, onePass, `abcdabc`},
  153. {`^(?:a*)$`, onePass, `aaaaaaa`},
  154. {`^(?:(?:aa)|a)$`, onePass, `a`},
  155. {`^[a-c]*`, notOnePass, `abcdabc`},
  156. {`^[a-c]*$`, onePass, `abc`},
  157. {`^...$`, onePass, ``},
  158. {`^(?:a|(?:aa))$`, onePass, `a`},
  159. {`^[a-c]*`, notOnePass, `abcabc`},
  160. {`^a((b))c$`, onePass, noStr},
  161. {`^a.[l-nA-Cg-j]?e$`, onePass, noStr},
  162. {`^a((b))$`, onePass, noStr},
  163. {`^a(?:(b)|(c))c$`, onePass, noStr},
  164. {`^a(?:(b*)|(c))c$`, notOnePass, noStr},
  165. {`^a(?:b|c)$`, onePass, noStr},
  166. {`^a(?:b?|c)$`, onePass, noStr},
  167. {`^a(?:b?|c?)$`, notOnePass, noStr},
  168. {`^a(?:b?|c+)$`, onePass, noStr},
  169. {`^a(?:b+|(bc))d$`, notOnePass, noStr},
  170. {`^a(?:bc)+$`, onePass, noStr},
  171. {`^a(?:[bcd])+$`, onePass, noStr},
  172. {`^a((?:[bcd])+)$`, onePass, noStr},
  173. {`^a(:?b|c)*d$`, onePass, `abbbccbbcbbd"`},
  174. {`^.bc(d|e)*$`, onePass, `abcddddddeeeededd`},
  175. {`^(?:(?:aa)|.)$`, notOnePass, `a`},
  176. {`^(?:(?:a{1,2}){1,2})$`, notOnePass, `aaaa`},
  177. }
  178. func TestCompileOnePass(t *testing.T) {
  179. var (
  180. p *syntax.Prog
  181. re *syntax.Regexp
  182. err error
  183. )
  184. for _, test := range onePassTests {
  185. if re, err = syntax.Parse(test.re, syntax.Perl); err != nil {
  186. t.Errorf("Parse(%q) got err:%s, want success", test.re, err)
  187. continue
  188. }
  189. // needs to be done before compile...
  190. re = re.Simplify()
  191. if p, err = syntax.Compile(re); err != nil {
  192. t.Errorf("Compile(%q) got err:%s, want success", test.re, err)
  193. continue
  194. }
  195. onePass = compileOnePass(p)
  196. if (onePass == notOnePass) != (test.onePass == notOnePass) {
  197. t.Errorf("CompileOnePass(%q) got %v, expected %v", test.re, onePass, test.onePass)
  198. }
  199. }
  200. }