036_regexp_character_classes_spec.lua 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. -- Test character classes in regexp using regexpengine 0, 1, 2.
  2. local helpers = require('test.functional.helpers')(after_each)
  3. local clear, command, expect = helpers.clear, helpers.command, helpers.expect
  4. local source, write_file = helpers.source, helpers.write_file
  5. local function sixlines(text)
  6. local result = ''
  7. for _ = 1, 6 do
  8. result = result .. text .. '\n'
  9. end
  10. return result
  11. end
  12. local function diff(text, nodedent)
  13. local fname = helpers.tmpname()
  14. command('w! '..fname)
  15. helpers.poke_eventloop()
  16. local data = io.open(fname):read('*all')
  17. if nodedent then
  18. helpers.eq(text, data)
  19. else
  20. helpers.eq(helpers.dedent(text), data)
  21. end
  22. os.remove(fname)
  23. end
  24. describe('character classes in regexp', function()
  25. local ctrl1 = '\t\012\r'
  26. local punct1 = " !\"#$%&'()#+'-./"
  27. local digits = '0123456789'
  28. local punct2 = ':;<=>?@'
  29. local upper = 'ABCDEFGHIXYZ'
  30. local punct3 = '[\\]^_`'
  31. local lower = 'abcdefghiwxyz'
  32. local punct4 = '{|}~'
  33. local ctrl2 = '\127\128\130\144\155'
  34. local iso_text = '\166\177\188\199\211\233' -- "¦±¼ÇÓé" in utf-8
  35. setup(function()
  36. -- The original test32.in file was not in utf-8 encoding and did also
  37. -- contain some control characters. We use lua escape sequences to write
  38. -- them to the test file.
  39. local line = ctrl1..punct1..digits..punct2..upper..punct3..lower..punct4..ctrl2..iso_text
  40. write_file('test36.in', sixlines(line))
  41. end)
  42. before_each(function()
  43. clear()
  44. command('e test36.in')
  45. end)
  46. teardown(function()
  47. os.remove('test36.in')
  48. end)
  49. it('is working', function()
  50. source([[
  51. 1 s/\%#=0\d//g
  52. 2 s/\%#=1\d//g
  53. 3 s/\%#=2\d//g
  54. 4 s/\%#=0[0-9]//g
  55. 5 s/\%#=1[0-9]//g
  56. 6 s/\%#=2[0-9]//g]])
  57. diff(sixlines(ctrl1..punct1..punct2..upper..punct3..lower..punct4..
  58. ctrl2..iso_text))
  59. end)
  60. it('is working', function()
  61. source([[
  62. 1 s/\%#=0\D//g
  63. 2 s/\%#=1\D//g
  64. 3 s/\%#=2\D//g
  65. 4 s/\%#=0[^0-9]//g
  66. 5 s/\%#=1[^0-9]//g
  67. 6 s/\%#=2[^0-9]//g]])
  68. expect([[
  69. 0123456789
  70. 0123456789
  71. 0123456789
  72. 0123456789
  73. 0123456789
  74. 0123456789]])
  75. end)
  76. it('is working', function()
  77. source([[
  78. 1 s/\%#=0\o//g
  79. 2 s/\%#=1\o//g
  80. 3 s/\%#=2\o//g
  81. 4 s/\%#=0[0-7]//g
  82. 5 s/\%#=1[0-7]//g
  83. 6 s/\%#=2[0-7]//g]])
  84. diff(sixlines(ctrl1..punct1..'89'..punct2..upper..punct3..lower..punct4..ctrl2..
  85. iso_text))
  86. end)
  87. it('is working', function()
  88. source([[
  89. 1 s/\%#=0\O//g
  90. 2 s/\%#=1\O//g
  91. 3 s/\%#=2\O//g
  92. 4 s/\%#=0[^0-7]//g
  93. 5 s/\%#=1[^0-7]//g
  94. 6 s/\%#=2[^0-7]//g]])
  95. expect([[
  96. 01234567
  97. 01234567
  98. 01234567
  99. 01234567
  100. 01234567
  101. 01234567]])
  102. end)
  103. it('is working', function()
  104. source([[
  105. 1 s/\%#=0\x//g
  106. 2 s/\%#=1\x//g
  107. 3 s/\%#=2\x//g
  108. 4 s/\%#=0[0-9A-Fa-f]//g
  109. 5 s/\%#=1[0-9A-Fa-f]//g
  110. 6 s/\%#=2[0-9A-Fa-f]//g]])
  111. diff(sixlines(ctrl1..punct1..punct2..'GHIXYZ'..punct3..'ghiwxyz'..punct4..ctrl2..iso_text))
  112. end)
  113. it('is working', function()
  114. source([[
  115. 1 s/\%#=0\X//g
  116. 2 s/\%#=1\X//g
  117. 3 s/\%#=2\X//g
  118. 4 s/\%#=0[^0-9A-Fa-f]//g
  119. 5 s/\%#=1[^0-9A-Fa-f]//g
  120. 6 s/\%#=2[^0-9A-Fa-f]//g]])
  121. expect([[
  122. 0123456789ABCDEFabcdef
  123. 0123456789ABCDEFabcdef
  124. 0123456789ABCDEFabcdef
  125. 0123456789ABCDEFabcdef
  126. 0123456789ABCDEFabcdef
  127. 0123456789ABCDEFabcdef]])
  128. end)
  129. it('is working', function()
  130. source([[
  131. 1 s/\%#=0\w//g
  132. 2 s/\%#=1\w//g
  133. 3 s/\%#=2\w//g
  134. 4 s/\%#=0[0-9A-Za-z_]//g
  135. 5 s/\%#=1[0-9A-Za-z_]//g
  136. 6 s/\%#=2[0-9A-Za-z_]//g]])
  137. diff(sixlines(ctrl1..punct1..punct2..'[\\]^`'..punct4..ctrl2..iso_text))
  138. end)
  139. it('is working', function()
  140. source([[
  141. 1 s/\%#=0\W//g
  142. 2 s/\%#=1\W//g
  143. 3 s/\%#=2\W//g
  144. 4 s/\%#=0[^0-9A-Za-z_]//g
  145. 5 s/\%#=1[^0-9A-Za-z_]//g
  146. 6 s/\%#=2[^0-9A-Za-z_]//g]])
  147. expect([[
  148. 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
  149. 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
  150. 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
  151. 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
  152. 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
  153. 0123456789ABCDEFGHIXYZ_abcdefghiwxyz]])
  154. end)
  155. it('is working', function()
  156. source([[
  157. 1 s/\%#=0\h//g
  158. 2 s/\%#=1\h//g
  159. 3 s/\%#=2\h//g
  160. 4 s/\%#=0[A-Za-z_]//g
  161. 5 s/\%#=1[A-Za-z_]//g
  162. 6 s/\%#=2[A-Za-z_]//g]])
  163. diff(sixlines(ctrl1..punct1..digits..punct2..'[\\]^`'..punct4..ctrl2..
  164. iso_text))
  165. end)
  166. it('is working', function()
  167. source([[
  168. 1 s/\%#=0\H//g
  169. 2 s/\%#=1\H//g
  170. 3 s/\%#=2\H//g
  171. 4 s/\%#=0[^A-Za-z_]//g
  172. 5 s/\%#=1[^A-Za-z_]//g
  173. 6 s/\%#=2[^A-Za-z_]//g]])
  174. expect([[
  175. ABCDEFGHIXYZ_abcdefghiwxyz
  176. ABCDEFGHIXYZ_abcdefghiwxyz
  177. ABCDEFGHIXYZ_abcdefghiwxyz
  178. ABCDEFGHIXYZ_abcdefghiwxyz
  179. ABCDEFGHIXYZ_abcdefghiwxyz
  180. ABCDEFGHIXYZ_abcdefghiwxyz]])
  181. end)
  182. it('is working', function()
  183. source([[
  184. 1 s/\%#=0\a//g
  185. 2 s/\%#=1\a//g
  186. 3 s/\%#=2\a//g
  187. 4 s/\%#=0[A-Za-z]//g
  188. 5 s/\%#=1[A-Za-z]//g
  189. 6 s/\%#=2[A-Za-z]//g]])
  190. diff(sixlines(ctrl1..punct1..digits..punct2..punct3..punct4..ctrl2..iso_text))
  191. end)
  192. it('is working', function()
  193. source([[
  194. 1 s/\%#=0\A//g
  195. 2 s/\%#=1\A//g
  196. 3 s/\%#=2\A//g
  197. 4 s/\%#=0[^A-Za-z]//g
  198. 5 s/\%#=1[^A-Za-z]//g
  199. 6 s/\%#=2[^A-Za-z]//g]])
  200. expect([[
  201. ABCDEFGHIXYZabcdefghiwxyz
  202. ABCDEFGHIXYZabcdefghiwxyz
  203. ABCDEFGHIXYZabcdefghiwxyz
  204. ABCDEFGHIXYZabcdefghiwxyz
  205. ABCDEFGHIXYZabcdefghiwxyz
  206. ABCDEFGHIXYZabcdefghiwxyz]])
  207. end)
  208. it('is working', function()
  209. source([[
  210. 1 s/\%#=0\l//g
  211. 2 s/\%#=1\l//g
  212. 3 s/\%#=2\l//g
  213. 4 s/\%#=0[a-z]//g
  214. 5 s/\%#=1[a-z]//g
  215. 6 s/\%#=2[a-z]//g]])
  216. diff(sixlines(ctrl1..punct1..digits..punct2..upper..punct3..punct4..
  217. ctrl2..iso_text))
  218. end)
  219. it('is working', function()
  220. source([[
  221. 1 s/\%#=0\L//g
  222. 2 s/\%#=1\L//g
  223. 3 s/\%#=2\L//g
  224. 4 s/\%#=0[^a-z]//g
  225. 5 s/\%#=1[^a-z]//g
  226. 6 s/\%#=2[^a-z]//g]])
  227. expect([[
  228. abcdefghiwxyz
  229. abcdefghiwxyz
  230. abcdefghiwxyz
  231. abcdefghiwxyz
  232. abcdefghiwxyz
  233. abcdefghiwxyz]])
  234. end)
  235. it('is working', function()
  236. source([[
  237. 1 s/\%#=0\u//g
  238. 2 s/\%#=1\u//g
  239. 3 s/\%#=2\u//g
  240. 4 s/\%#=0[A-Z]//g
  241. 5 s/\%#=1[A-Z]//g
  242. 6 s/\%#=2[A-Z]//g]])
  243. diff(sixlines(ctrl1..punct1..digits..punct2..punct3..lower..punct4..
  244. ctrl2..iso_text))
  245. end)
  246. it('is working', function()
  247. source([[
  248. 1 s/\%#=0\U//g
  249. 2 s/\%#=1\U//g
  250. 3 s/\%#=2\U//g
  251. 4 s/\%#=0[^A-Z]//g
  252. 5 s/\%#=1[^A-Z]//g
  253. 6 s/\%#=2[^A-Z]//g]])
  254. expect([[
  255. ABCDEFGHIXYZ
  256. ABCDEFGHIXYZ
  257. ABCDEFGHIXYZ
  258. ABCDEFGHIXYZ
  259. ABCDEFGHIXYZ
  260. ABCDEFGHIXYZ]])
  261. end)
  262. it([["\%1l^#.*" does not match on a line starting with "#". (vim-patch:7.4.1305)]], function()
  263. source([[
  264. 1 s/\%#=0\%1l^\t...//g
  265. 2 s/\%#=1\%2l^\t...//g
  266. 3 s/\%#=2\%3l^\t...//g
  267. 4 s/\%#=0\%4l^\t...//g
  268. 5 s/\%#=1\%5l^\t...//g
  269. 6 s/\%#=2\%6l^\t...//g]])
  270. diff(sixlines(string.sub(punct1, 1)..digits..punct2..upper..punct3..
  271. lower..punct4..ctrl2..iso_text))
  272. end)
  273. it('does not convert character class ranges to an incorrect class', function()
  274. source([[
  275. 1 s/\%#=0[0-z]//g
  276. 2 s/\%#=1[0-z]//g
  277. 3 s/\%#=2[0-z]//g
  278. 4 s/\%#=0[^0-z]//g
  279. 5 s/\%#=1[^0-z]//g
  280. 6 s/\%#=2[^0-z]//g
  281. ]])
  282. diff(string.rep(ctrl1..punct1..punct4..ctrl2..iso_text..'\n', 3)
  283. ..string.rep(digits..punct2..upper..punct3..lower..'\n', 3))
  284. end)
  285. end)