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