eval_spec.lua (28538B)
1 -- Test for various eval features. 2 3 local t = require('test.testutil') 4 local n = require('test.functional.testnvim')() 5 6 local assert_alive = n.assert_alive 7 local feed, insert, source = n.feed, n.insert, n.source 8 local clear, command, expect = n.clear, n.command, n.expect 9 local eq, eval, write_file = t.eq, n.eval, t.write_file 10 local poke_eventloop = n.poke_eventloop 11 local exc_exec = n.exc_exec 12 local dedent = t.dedent 13 14 describe('eval', function() 15 setup(function() 16 write_file( 17 'test_eval_setup.vim', 18 [[ 19 set noswapfile 20 lang C 21 22 fun AppendRegContents(reg) 23 call AppendRegParts(a:reg, getregtype(a:reg), getreg(a:reg), string(getreg(a:reg, 0, 1)), getreg(a:reg, 1), string(getreg(a:reg, 1, 1))) 24 endfun 25 26 fun AppendRegParts(reg, type, cont, strcont, cont1, strcont1) 27 call append('$', printf('%s: type %s; value: %s (%s), expr: %s (%s)', a:reg, a:type, a:cont, a:strcont, a:cont1, a:strcont1)) 28 endfun 29 30 command -nargs=? AR :call AppendRegContents(<q-args>) 31 32 fun SetReg(...) 33 call call('setreg', a:000) 34 call append('$', printf('{{{2 setreg(%s)', string(a:000)[1:-2])) 35 call AppendRegContents(a:1) 36 if a:1 isnot# '=' 37 execute "silent normal! Go==\n==\e\"".a:1."P" 38 endif 39 endfun 40 ]] 41 ) 42 end) 43 before_each(clear) 44 teardown(function() 45 os.remove('test_eval_setup.vim') 46 end) 47 48 it(':let', function() 49 command('so test_eval_setup.vim') 50 command([[let @" = 'abc']]) 51 command('AR "') 52 command([[let @" = "abc\n"]]) 53 source('AR "') 54 command([[let @" = "abc\<C-m>"]]) 55 command('AR "') 56 command([[let @= = '"abc"']]) 57 command('AR =') 58 expect([[ 59 60 ": type v; value: abc (['abc']), expr: abc (['abc']) 61 ": type V; value: abc]] .. "\000 (['abc']), expr: abc\000" .. [[ (['abc']) 62 ": type V; value: abc]] .. "\r\000 (['abc\r']), expr: abc\r\000 (['abc\r" .. [[']) 63 =: type v; value: abc (['abc']), expr: "abc" (['"abc"'])]]) 64 end) 65 66 it('basic setreg() tests', function() 67 command('so test_eval_setup.vim') 68 insert('{{{1 Basic setreg tests') 69 command([[call SetReg('a', 'abcA', 'c')]]) 70 command([[call SetReg('b', 'abcB', 'v')]]) 71 command([[call SetReg('c', 'abcC', 'l')]]) 72 command([[call SetReg('d', 'abcD', 'V')]]) 73 command([[call SetReg('e', 'abcE', 'b')]]) 74 command([[call SetReg('f', 'abcF', "\<C-v>")]]) 75 command([[call SetReg('g', 'abcG', 'b10')]]) 76 command([[call SetReg('h', 'abcH', "\<C-v>10")]]) 77 command([[call SetReg('I', 'abcI')]]) 78 79 feed('Go{{{1 Appending single lines with setreg()<esc>') 80 poke_eventloop() 81 command([[call SetReg('A', 'abcAc', 'c')]]) 82 command([[call SetReg('A', 'abcAl', 'l')]]) 83 command([[call SetReg('A', 'abcAc2','c')]]) 84 command([[call SetReg('b', 'abcBc', 'ca')]]) 85 command([[call SetReg('b', 'abcBb', 'ba')]]) 86 command([[call SetReg('b', 'abcBc2','ca')]]) 87 command([[call SetReg('b', 'abcBb2','b50a')]]) 88 command([[call SetReg('C', 'abcCl', 'l')]]) 89 command([[call SetReg('C', 'abcCc', 'c')]]) 90 command([[call SetReg('D', 'abcDb', 'b')]]) 91 command([[call SetReg('E', 'abcEb', 'b')]]) 92 command([[call SetReg('E', 'abcEl', 'l')]]) 93 command([[call SetReg('F', 'abcFc', 'c')]]) 94 expect([[ 95 {{{1 Basic setreg tests 96 {{{2 setreg('a', 'abcA', 'c') 97 a: type v; value: abcA (['abcA']), expr: abcA (['abcA']) 98 == 99 =abcA= 100 {{{2 setreg('b', 'abcB', 'v') 101 b: type v; value: abcB (['abcB']), expr: abcB (['abcB']) 102 == 103 =abcB= 104 {{{2 setreg('c', 'abcC', 'l') 105 c: type V; value: abcC]] .. "\000 (['abcC']), expr: abcC\000" .. [[ (['abcC']) 106 == 107 abcC 108 == 109 {{{2 setreg('d', 'abcD', 'V') 110 d: type V; value: abcD]] .. "\000 (['abcD']), expr: abcD\000" .. [[ (['abcD']) 111 == 112 abcD 113 == 114 {{{2 setreg('e', 'abcE', 'b') 115 e: type ]] .. '\022' .. [[4; value: abcE (['abcE']), expr: abcE (['abcE']) 116 == 117 =abcE= 118 {{{2 setreg('f', 'abcF', ']] .. '\022' .. [[') 119 f: type ]] .. '\022' .. [[4; value: abcF (['abcF']), expr: abcF (['abcF']) 120 == 121 =abcF= 122 {{{2 setreg('g', 'abcG', 'b10') 123 g: type ]] .. '\022' .. [[10; value: abcG (['abcG']), expr: abcG (['abcG']) 124 == 125 =abcG = 126 {{{2 setreg('h', 'abcH', ']] .. '\022' .. [[10') 127 h: type ]] .. '\022' .. [[10; value: abcH (['abcH']), expr: abcH (['abcH']) 128 == 129 =abcH = 130 {{{2 setreg('I', 'abcI') 131 I: type v; value: abcI (['abcI']), expr: abcI (['abcI']) 132 == 133 =abcI= 134 {{{1 Appending single lines with setreg() 135 {{{2 setreg('A', 'abcAc', 'c') 136 A: type v; value: abcAabcAc (['abcAabcAc']), expr: abcAabcAc (['abcAabcAc']) 137 == 138 =abcAabcAc= 139 {{{2 setreg('A', 'abcAl', 'l') 140 A: type V; value: abcAabcAcabcAl]] .. "\000 (['abcAabcAcabcAl']), expr: abcAabcAcabcAl\000" .. [[ (['abcAabcAcabcAl']) 141 == 142 abcAabcAcabcAl 143 == 144 {{{2 setreg('A', 'abcAc2', 'c') 145 A: type v; value: abcAabcAcabcAl]] .. "\000abcAc2 (['abcAabcAcabcAl', 'abcAc2']), expr: abcAabcAcabcAl\000" .. [[abcAc2 (['abcAabcAcabcAl', 'abcAc2']) 146 == 147 =abcAabcAcabcAl 148 abcAc2= 149 {{{2 setreg('b', 'abcBc', 'ca') 150 b: type v; value: abcBabcBc (['abcBabcBc']), expr: abcBabcBc (['abcBabcBc']) 151 == 152 =abcBabcBc= 153 {{{2 setreg('b', 'abcBb', 'ba') 154 b: type ]] .. '\022' .. [[5; value: abcBabcBcabcBb (['abcBabcBcabcBb']), expr: abcBabcBcabcBb (['abcBabcBcabcBb']) 155 == 156 =abcBabcBcabcBb= 157 {{{2 setreg('b', 'abcBc2', 'ca') 158 b: type v; value: abcBabcBcabcBb]] .. "\000abcBc2 (['abcBabcBcabcBb', 'abcBc2']), expr: abcBabcBcabcBb\000" .. [[abcBc2 (['abcBabcBcabcBb', 'abcBc2']) 159 == 160 =abcBabcBcabcBb 161 abcBc2= 162 {{{2 setreg('b', 'abcBb2', 'b50a') 163 b: type ]] .. "\02250; value: abcBabcBcabcBb\000abcBc2abcBb2 (['abcBabcBcabcBb', 'abcBc2abcBb2']), expr: abcBabcBcabcBb\000" .. [[abcBc2abcBb2 (['abcBabcBcabcBb', 'abcBc2abcBb2']) 164 == 165 =abcBabcBcabcBb = 166 abcBc2abcBb2 167 {{{2 setreg('C', 'abcCl', 'l') 168 C: type V; value: abcC]] .. "\000abcCl\000 (['abcC', 'abcCl']), expr: abcC\000abcCl\000" .. [[ (['abcC', 'abcCl']) 169 == 170 abcC 171 abcCl 172 == 173 {{{2 setreg('C', 'abcCc', 'c') 174 C: type v; value: abcC]] .. "\000abcCl\000abcCc (['abcC', 'abcCl', 'abcCc']), expr: abcC\000abcCl\000" .. [[abcCc (['abcC', 'abcCl', 'abcCc']) 175 == 176 =abcC 177 abcCl 178 abcCc= 179 {{{2 setreg('D', 'abcDb', 'b') 180 D: type ]] .. "\0225; value: abcD\000abcDb (['abcD', 'abcDb']), expr: abcD\000" .. [[abcDb (['abcD', 'abcDb']) 181 == 182 =abcD = 183 abcDb 184 {{{2 setreg('E', 'abcEb', 'b') 185 E: type ]] .. "\0225; value: abcE\000abcEb (['abcE', 'abcEb']), expr: abcE\000" .. [[abcEb (['abcE', 'abcEb']) 186 == 187 =abcE = 188 abcEb 189 {{{2 setreg('E', 'abcEl', 'l') 190 E: type V; value: abcE]] .. "\000abcEb\000abcEl\000 (['abcE', 'abcEb', 'abcEl']), expr: abcE\000abcEb\000abcEl\000" .. [[ (['abcE', 'abcEb', 'abcEl']) 191 == 192 abcE 193 abcEb 194 abcEl 195 == 196 {{{2 setreg('F', 'abcFc', 'c') 197 F: type v; value: abcF]] .. "\000abcFc (['abcF', 'abcFc']), expr: abcF\000" .. [[abcFc (['abcF', 'abcFc']) 198 == 199 =abcF 200 abcFc=]]) 201 end) 202 203 -- luacheck: ignore 611 (Line contains only whitespace) 204 it('appending NL with setreg()', function() 205 command('so test_eval_setup.vim') 206 207 command([[call setreg('a', 'abcA2', 'c')]]) 208 command([[call setreg('b', 'abcB2', 'v')]]) 209 command([[call setreg('c', 'abcC2', 'l')]]) 210 command([[call setreg('d', 'abcD2', 'V')]]) 211 command([[call setreg('e', 'abcE2', 'b')]]) 212 command([[call setreg('f', 'abcF2', "\<C-v>")]]) 213 -- These registers where set like this in the old test_eval.in but never 214 -- copied to the output buffer with SetReg(). They do not appear in 215 -- test_eval.ok. Therefore they are commented out. 216 --execute([[call setreg('g', 'abcG2', 'b10')]]) 217 --execute([[call setreg('h', 'abcH2', "\<C-v>10")]]) 218 --execute([[call setreg('I', 'abcI2')]]) 219 220 command([[call SetReg('A', "\n")]]) 221 command([[call SetReg('B', "\n", 'c')]]) 222 command([[call SetReg('C', "\n")]]) 223 command([[call SetReg('D', "\n", 'l')]]) 224 command([[call SetReg('E', "\n")]]) 225 command([[call SetReg('F', "\n", 'b')]]) 226 command("$put ='.'") 227 expect([[ 228 229 {{{2 setreg('A', ']] .. '\000' .. [[') 230 A: type V; value: abcA2]] .. "\000 (['abcA2']), expr: abcA2\000" .. [[ (['abcA2']) 231 == 232 abcA2 233 == 234 {{{2 setreg('B', ']] .. '\000' .. [[', 'c') 235 B: type v; value: abcB2]] .. "\000 (['abcB2', '']), expr: abcB2\000" .. [[ (['abcB2', '']) 236 == 237 =abcB2 238 = 239 {{{2 setreg('C', ']] .. '\000' .. [[') 240 C: type V; value: abcC2]] .. "\000\000 (['abcC2', '']), expr: abcC2\000\000" .. [[ (['abcC2', '']) 241 == 242 abcC2 243 244 == 245 {{{2 setreg('D', ']] .. '\000' .. [[', 'l') 246 D: type V; value: abcD2]] .. "\000\000 (['abcD2', '']), expr: abcD2\000\000" .. [[ (['abcD2', '']) 247 == 248 abcD2 249 250 == 251 {{{2 setreg('E', ']] .. '\000' .. [[') 252 E: type V; value: abcE2]] .. "\000\000 (['abcE2', '']), expr: abcE2\000\000" .. [[ (['abcE2', '']) 253 == 254 abcE2 255 256 == 257 {{{2 setreg('F', ']] .. '\000' .. [[', 'b') 258 F: type ]] .. "\0220; value: abcF2\000 (['abcF2', '']), expr: abcF2\000" .. [[ (['abcF2', '']) 259 == 260 =abcF2= 261 262 .]]) 263 end) 264 265 it('setting and appending list with setreg()', function() 266 command('so test_eval_setup.vim') 267 268 command([[$put ='{{{1 Setting lists with setreg()']]) 269 command([=[call SetReg('a', ['abcA3'], 'c')]=]) 270 command([=[call SetReg('b', ['abcB3'], 'l')]=]) 271 command([=[call SetReg('c', ['abcC3'], 'b')]=]) 272 command([=[call SetReg('d', ['abcD3'])]=]) 273 command([=[call SetReg('e', [1, 2, 'abc', 3])]=]) 274 command([=[call SetReg('f', [1, 2, 3])]=]) 275 276 command([[$put ='{{{1 Appending lists with setreg()']]) 277 command([=[call SetReg('A', ['abcA3c'], 'c')]=]) 278 command([=[call SetReg('b', ['abcB3l'], 'la')]=]) 279 command([=[call SetReg('C', ['abcC3b'], 'lb')]=]) 280 command([=[call SetReg('D', ['abcD32'])]=]) 281 command([=[call SetReg('A', ['abcA32'])]=]) 282 command([=[call SetReg('B', ['abcB3c'], 'c')]=]) 283 command([=[call SetReg('C', ['abcC3l'], 'l')]=]) 284 command([=[call SetReg('D', ['abcD3b'], 'b')]=]) 285 expect([[ 286 287 {{{1 Setting lists with setreg() 288 {{{2 setreg('a', ['abcA3'], 'c') 289 a: type v; value: abcA3 (['abcA3']), expr: abcA3 (['abcA3']) 290 == 291 =abcA3= 292 {{{2 setreg('b', ['abcB3'], 'l') 293 b: type V; value: abcB3]] .. "\000 (['abcB3']), expr: abcB3\000" .. [[ (['abcB3']) 294 == 295 abcB3 296 == 297 {{{2 setreg('c', ['abcC3'], 'b') 298 c: type ]] .. '\022' .. [[5; value: abcC3 (['abcC3']), expr: abcC3 (['abcC3']) 299 == 300 =abcC3= 301 {{{2 setreg('d', ['abcD3']) 302 d: type V; value: abcD3]] .. "\000 (['abcD3']), expr: abcD3\000" .. [[ (['abcD3']) 303 == 304 abcD3 305 == 306 {{{2 setreg('e', [1, 2, 'abc', 3]) 307 e: type V; value: 1]] .. "\0002\000abc\0003\000 (['1', '2', 'abc', '3']), expr: 1\0002\000abc\0003\000" .. [[ (['1', '2', 'abc', '3']) 308 == 309 1 310 2 311 abc 312 3 313 == 314 {{{2 setreg('f', [1, 2, 3]) 315 f: type V; value: 1]] .. "\0002\0003\000 (['1', '2', '3']), expr: 1\0002\0003\000" .. [[ (['1', '2', '3']) 316 == 317 1 318 2 319 3 320 == 321 {{{1 Appending lists with setreg() 322 {{{2 setreg('A', ['abcA3c'], 'c') 323 A: type v; value: abcA3]] .. "\000abcA3c (['abcA3', 'abcA3c']), expr: abcA3\000" .. [[abcA3c (['abcA3', 'abcA3c']) 324 == 325 =abcA3 326 abcA3c= 327 {{{2 setreg('b', ['abcB3l'], 'la') 328 b: type V; value: abcB3]] .. "\000abcB3l\000 (['abcB3', 'abcB3l']), expr: abcB3\000abcB3l\000" .. [[ (['abcB3', 'abcB3l']) 329 == 330 abcB3 331 abcB3l 332 == 333 {{{2 setreg('C', ['abcC3b'], 'lb') 334 C: type ]] .. "\0226; value: abcC3\000abcC3b (['abcC3', 'abcC3b']), expr: abcC3\000" .. [[abcC3b (['abcC3', 'abcC3b']) 335 == 336 =abcC3 = 337 abcC3b 338 {{{2 setreg('D', ['abcD32']) 339 D: type V; value: abcD3]] .. "\000abcD32\000 (['abcD3', 'abcD32']), expr: abcD3\000abcD32\000" .. [[ (['abcD3', 'abcD32']) 340 == 341 abcD3 342 abcD32 343 == 344 {{{2 setreg('A', ['abcA32']) 345 A: type V; value: abcA3]] .. "\000abcA3c\000abcA32\000 (['abcA3', 'abcA3c', 'abcA32']), expr: abcA3\000abcA3c\000abcA32\000" .. [[ (['abcA3', 'abcA3c', 'abcA32']) 346 == 347 abcA3 348 abcA3c 349 abcA32 350 == 351 {{{2 setreg('B', ['abcB3c'], 'c') 352 B: type v; value: abcB3]] .. "\000abcB3l\000abcB3c (['abcB3', 'abcB3l', 'abcB3c']), expr: abcB3\000abcB3l\000" .. [[abcB3c (['abcB3', 'abcB3l', 'abcB3c']) 353 == 354 =abcB3 355 abcB3l 356 abcB3c= 357 {{{2 setreg('C', ['abcC3l'], 'l') 358 C: type V; value: abcC3]] .. "\000abcC3b\000abcC3l\000 (['abcC3', 'abcC3b', 'abcC3l']), expr: abcC3\000abcC3b\000abcC3l\000" .. [[ (['abcC3', 'abcC3b', 'abcC3l']) 359 == 360 abcC3 361 abcC3b 362 abcC3l 363 == 364 {{{2 setreg('D', ['abcD3b'], 'b') 365 D: type ]] .. "\0226; value: abcD3\000abcD32\000abcD3b (['abcD3', 'abcD32', 'abcD3b']), expr: abcD3\000abcD32\000" .. [[abcD3b (['abcD3', 'abcD32', 'abcD3b']) 366 == 367 =abcD3 = 368 abcD32 369 abcD3b]]) 370 371 -- From now on we delete the buffer contents after each expect() to make 372 -- the next expect() easier to write. This is necessary because null 373 -- bytes on a line by itself don't play well together with the dedent 374 -- function used in expect(). 375 command('%delete') 376 command([[$put ='{{{1 Appending lists with NL with setreg()']]) 377 command([=[call SetReg('A', ["\n", 'abcA3l2'], 'l')]=]) 378 expect( 379 '\n' 380 .. '{{{1 Appending lists with NL with setreg()\n' 381 .. "{{{2 setreg('A', ['\000', 'abcA3l2'], 'l')\n" 382 .. "A: type V; value: abcA3\000abcA3c\000abcA32\000\000\000abcA3l2\000 (['abcA3', 'abcA3c', 'abcA32', '\000', 'abcA3l2']), expr: abcA3\000abcA3c\000abcA32\000\000\000abcA3l2\000 (['abcA3', 'abcA3c', 'abcA32', '\000', 'abcA3l2'])\n" 383 .. '==\n' 384 .. 'abcA3\n' 385 .. 'abcA3c\n' 386 .. 'abcA32\n' 387 .. '\000\n' 388 .. 'abcA3l2\n' 389 .. '==' 390 ) 391 command('%delete') 392 command([=[call SetReg('B', ["\n", 'abcB3c2'], 'c')]=]) 393 expect( 394 '\n' 395 .. "{{{2 setreg('B', ['\000', 'abcB3c2'], 'c')\n" 396 .. "B: type v; value: abcB3\000abcB3l\000abcB3c\000\000\000abcB3c2 (['abcB3', 'abcB3l', 'abcB3c', '\000', 'abcB3c2']), expr: abcB3\000abcB3l\000abcB3c\000\000\000abcB3c2 (['abcB3', 'abcB3l', 'abcB3c', '\000', 'abcB3c2'])\n" 397 .. '==\n' 398 .. '=abcB3\n' 399 .. 'abcB3l\n' 400 .. 'abcB3c\n' 401 .. '\000\n' 402 .. 'abcB3c2=' 403 ) 404 command('%delete') 405 command([=[call SetReg('C', ["\n", 'abcC3b2'], 'b')]=]) 406 expect( 407 '\n' 408 .. "{{{2 setreg('C', ['\000', 'abcC3b2'], 'b')\n" 409 .. "C: type \0227; value: abcC3\000abcC3b\000abcC3l\000\000\000abcC3b2 (['abcC3', 'abcC3b', 'abcC3l', '\000', 'abcC3b2']), expr: abcC3\000abcC3b\000abcC3l\000\000\000abcC3b2 (['abcC3', 'abcC3b', 'abcC3l', '\000', 'abcC3b2'])\n" 410 .. '==\n' 411 .. '=abcC3 =\n' 412 .. ' abcC3b\n' 413 .. ' abcC3l\n' 414 .. ' \000\n' 415 .. ' abcC3b2' 416 ) 417 command('%delete') 418 command([=[call SetReg('D', ["\n", 'abcD3b50'],'b50')]=]) 419 expect( 420 '\n' 421 .. "{{{2 setreg('D', ['\000', 'abcD3b50'], 'b50')\n" 422 .. "D: type \02250; value: abcD3\000abcD32\000abcD3b\000\000\000abcD3b50 (['abcD3', 'abcD32', 'abcD3b', '\000', 'abcD3b50']), expr: abcD3\000abcD32\000abcD3b\000\000\000abcD3b50 (['abcD3', 'abcD32', 'abcD3b', '\000', 'abcD3b50'])\n" 423 .. '==\n' 424 .. '=abcD3 =\n' 425 .. ' abcD32\n' 426 .. ' abcD3b\n' 427 .. ' \000\n' 428 .. ' abcD3b50' 429 ) 430 end) 431 432 -- The tests for setting lists with NLs are split into separate it() blocks 433 -- to make the expect() calls easier to write. Otherwise the null byte can 434 -- make trouble on a line on its own. 435 it('setting lists with NLs with setreg(), part 1', function() 436 command('so test_eval_setup.vim') 437 command( 438 [=[call SetReg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])]=] 439 ) 440 expect( 441 '\n' 442 .. "{{{2 setreg('a', ['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n" 443 .. "a: type V; value: abcA4-0\000\000\000abcA4-2\000\000\000abcA4-3\000abcA4-4\000abcA4-4-2\000 (['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2']), expr: abcA4-0\000\000\000abcA4-2\000\000\000abcA4-3\000abcA4-4\000abcA4-4-2\000 (['abcA4-0', '\000', 'abcA4-2\000', '\000abcA4-3', 'abcA4-4\000abcA4-4-2'])\n" 444 .. '==\n' 445 .. 'abcA4-0\n' 446 .. '\000\n' 447 .. 'abcA4-2\000\n' 448 .. '\000abcA4-3\n' 449 .. 'abcA4-4\000abcA4-4-2\n' 450 .. '==' 451 ) 452 end) 453 454 it('setting lists with NLs with setreg(), part 2', function() 455 command('so test_eval_setup.vim') 456 command( 457 [=[call SetReg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')]=] 458 ) 459 expect( 460 '\n' 461 .. "{{{2 setreg('b', ['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'], 'c')\n" 462 .. "b: type v; value: abcB4c-0\000\000\000abcB4c-2\000\000\000abcB4c-3\000abcB4c-4\000abcB4c-4-2 (['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2']), expr: abcB4c-0\000\000\000abcB4c-2\000\000\000abcB4c-3\000abcB4c-4\000abcB4c-4-2 (['abcB4c-0', '\000', 'abcB4c-2\000', '\000abcB4c-3', 'abcB4c-4\000abcB4c-4-2'])\n" 463 .. '==\n' 464 .. '=abcB4c-0\n' 465 .. '\000\n' 466 .. 'abcB4c-2\000\n' 467 .. '\000abcB4c-3\n' 468 .. 'abcB4c-4\000abcB4c-4-2=' 469 ) 470 end) 471 472 it('setting lists with NLs with setreg(), part 3', function() 473 command('so test_eval_setup.vim') 474 command( 475 [=[call SetReg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')]=] 476 ) 477 expect( 478 '\n' 479 .. "{{{2 setreg('c', ['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'], 'l')\n" 480 .. "c: type V; value: abcC4l-0\000\000\000abcC4l-2\000\000\000abcC4l-3\000abcC4l-4\000abcC4l-4-2\000 (['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2']), expr: abcC4l-0\000\000\000abcC4l-2\000\000\000abcC4l-3\000abcC4l-4\000abcC4l-4-2\000 (['abcC4l-0', '\000', 'abcC4l-2\000', '\000abcC4l-3', 'abcC4l-4\000abcC4l-4-2'])\n" 481 .. '==\n' 482 .. 'abcC4l-0\n' 483 .. '\000\n' 484 .. 'abcC4l-2\000\n' 485 .. '\000abcC4l-3\n' 486 .. 'abcC4l-4\000abcC4l-4-2\n' 487 .. '==' 488 ) 489 end) 490 it('setting lists with NLs with setreg(), part 4', function() 491 command('so test_eval_setup.vim') 492 command( 493 [=[call SetReg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')]=] 494 ) 495 expect( 496 '\n' 497 .. "{{{2 setreg('d', ['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'], 'b')\n" 498 .. "d: type \02219; value: abcD4b-0\000\000\000abcD4b-2\000\000\000abcD4b-3\000abcD4b-4\000abcD4b-4-2 (['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2']), expr: abcD4b-0\000\000\000abcD4b-2\000\000\000abcD4b-3\000abcD4b-4\000abcD4b-4-2 (['abcD4b-0', '\000', 'abcD4b-2\000', '\000abcD4b-3', 'abcD4b-4\000abcD4b-4-2'])\n" 499 .. '==\n' 500 .. '=abcD4b-0 =\n' 501 .. ' \000\n' 502 .. ' abcD4b-2\000\n' 503 .. ' \000abcD4b-3\n' 504 .. ' abcD4b-4\000abcD4b-4-2' 505 ) 506 end) 507 it('setting lists with NLs with setreg(), part 5', function() 508 command('so test_eval_setup.vim') 509 command( 510 [=[call SetReg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')]=] 511 ) 512 expect( 513 '\n' 514 .. "{{{2 setreg('e', ['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'], 'b10')\n" 515 .. "e: type \02210; value: abcE4b10-0\000\000\000abcE4b10-2\000\000\000abcE4b10-3\000abcE4b10-4\000abcE4b10-4-2 (['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2']), expr: abcE4b10-0\000\000\000abcE4b10-2\000\000\000abcE4b10-3\000abcE4b10-4\000abcE4b10-4-2 (['abcE4b10-0', '\000', 'abcE4b10-2\000', '\000abcE4b10-3', 'abcE4b10-4\000abcE4b10-4-2'])\n" 516 .. '==\n' 517 .. '=abcE4b10-0=\n' 518 .. ' \000\n' 519 .. ' abcE4b10-2\000\n' 520 .. ' \000abcE4b10-3\n' 521 .. ' abcE4b10-4\000abcE4b10-4-2' 522 ) 523 end) 524 525 it('getreg("a",1,1) returns a valid list when "a is unset', function() 526 -- Precondition: "a is actually unset and "0 is nonempty 527 eq('', eval("getregtype('a')")) 528 eq('', eval("getreg('a')")) 529 command("call setreg('0','text')") 530 531 -- This used to return a NULL list 532 -- which setreg didn't handle 533 command("let x = getreg('a',1,1)") 534 command("call setreg('0',x)") 535 536 -- nvim didn't crash and "0 was emptied 537 assert_alive() 538 eq({}, eval("getreg('0',1,1)")) 539 540 -- x is a mutable list 541 command('let y = x') 542 eq({}, eval('y')) 543 command("call add(x, 'item')") 544 eq({ 'item' }, eval('y')) 545 end) 546 547 it('sets the unnamed register when the "u" option is passed to setreg', function() 548 command("call setreg('a','a reg', 'cu')") 549 eq('a reg', eval('@"')) 550 command("call setreg('b','b reg', 'cu')") 551 eq('b reg', eval('@"')) 552 command("call setreg('c','c reg', 'c')") 553 eq('b reg', eval('@"')) 554 end) 555 556 it('search and expressions', function() 557 command('so test_eval_setup.vim') 558 command([=[call SetReg('/', ['abc/'])]=]) 559 command([=[call SetReg('/', ["abc/\n"])]=]) 560 command([=[call SetReg('=', ['"abc/"'])]=]) 561 command([=[call SetReg('=', ["\"abc/\n\""])]=]) 562 expect( 563 [[ 564 565 {{{2 setreg('/', ['abc/']) 566 /: type v; value: abc/ (['abc/']), expr: abc/ (['abc/']) 567 == 568 =abc/= 569 {{{2 setreg('/', ['abc/]] 570 .. '\000' 571 .. [[']) 572 /: type v; value: abc/]] 573 .. "\000 (['abc/\000']), expr: abc/\000 (['abc/\000" 574 .. [[']) 575 == 576 =abc/]] 577 .. '\000' 578 .. [[= 579 {{{2 setreg('=', ['"abc/"']) 580 =: type v; value: abc/ (['abc/']), expr: "abc/" (['"abc/"']) 581 {{{2 setreg('=', ['"abc/]] 582 .. '\000' 583 .. [["']) 584 =: type v; value: abc/]] 585 .. "\000 (['abc/\000" 586 .. [[']), expr: "abc/]] 587 .. '\000' 588 .. [[" (['"abc/]] 589 .. '\000' 590 .. [["'])]] 591 ) 592 end) 593 594 describe('system clipboard', function() 595 before_each(function() 596 command('let &runtimepath = "test/functional/fixtures,".&runtimepath') 597 command('call getreg("*")') -- force load of provider 598 end) 599 600 it('works', function() 601 insert([[ 602 Some first line (this text was at the top of the old test_eval.in). 603 604 Note: system clipboard is saved, changed and restored. 605 606 clipboard contents 607 something else]]) 608 command('so test_eval_setup.vim') 609 -- Save and restore system clipboard. 610 command("let _clipreg = ['*', getreg('*'), getregtype('*')]") 611 command('let _clipopt = &cb') 612 command("let &cb='unnamed'") 613 command('5y') 614 command('AR *') 615 command('tabdo :windo :echo "hi"') 616 command('6y') 617 command('AR *') 618 command('let &cb=_clipopt') 619 command("call call('setreg', _clipreg)") 620 expect( 621 [[ 622 Some first line (this text was at the top of the old test_eval.in). 623 624 Note: system clipboard is saved, changed and restored. 625 626 clipboard contents 627 something else 628 *: type V; value: clipboard contents]] 629 .. '\00' 630 .. [[ (['clipboard contents']), expr: clipboard contents]] 631 .. '\00' 632 .. [[ (['clipboard contents']) 633 *: type V; value: something else]] 634 .. '\00' 635 .. [[ (['something else']), expr: something else]] 636 .. '\00' 637 .. [[ (['something else'])]] 638 ) 639 end) 640 end) 641 642 it('errors', function() 643 source([[ 644 fun ErrExe(str) 645 call append('$', 'Executing '.a:str) 646 try 647 execute a:str 648 catch 649 $put =v:exception 650 endtry 651 endfun]]) 652 command([[call ErrExe('call setreg()')]]) 653 command([[call ErrExe('call setreg(1)')]]) 654 command([[call ErrExe('call setreg(1, 2, 3, 4)')]]) 655 command([=[call ErrExe('call setreg([], 2)')]=]) 656 command([=[call ErrExe('call setreg(1, 2, [])')]=]) 657 command([=[call ErrExe('call setreg("/", ["1", "2"])')]=]) 658 command([=[call ErrExe('call setreg("=", ["1", "2"])')]=]) 659 command([=[call ErrExe('call setreg(1, ["", "", [], ""])')]=]) 660 expect([[ 661 662 Executing call setreg() 663 Vim(call):E119: Not enough arguments for function: setreg 664 Executing call setreg(1) 665 Vim(call):E119: Not enough arguments for function: setreg 666 Executing call setreg(1, 2, 3, 4) 667 Vim(call):E118: Too many arguments for function: setreg 668 Executing call setreg([], 2) 669 Vim(call):E730: Using a List as a String 670 Executing call setreg(1, 2, []) 671 Vim(call):E730: Using a List as a String 672 Executing call setreg("/", ["1", "2"]) 673 Vim(call):E883: Search pattern and expression register may not contain two or more lines 674 Executing call setreg("=", ["1", "2"]) 675 Vim(call):E883: Search pattern and expression register may not contain two or more lines 676 Executing call setreg(1, ["", "", [], ""]) 677 Vim(call):E730: Using a List as a String]]) 678 end) 679 680 it('function name not starting with a capital', function() 681 eq( 682 'Vim(function):E128: Function name must start with a capital or "s:": g:test()\\nendfunction', 683 exc_exec(dedent([[ 684 function! g:test() 685 endfunction]])) 686 ) 687 end) 688 689 it('Function name followed by #', function() 690 eq( 691 'Vim(function):E128: Function name must start with a capital or "s:": test2() "#\\nendfunction', 692 exc_exec(dedent([[ 693 function! test2() "# 694 endfunction]])) 695 ) 696 end) 697 698 it('function name includes a colon', function() 699 eq( 700 'Vim(function):E884: Function name cannot contain a colon: b:test()\\nendfunction', 701 exc_exec(dedent([[ 702 function! b:test() 703 endfunction]])) 704 ) 705 end) 706 707 it('function name starting with/without "g:", buffer-local funcref', function() 708 command([[ 709 function! g:Foo(n) 710 $put ='called Foo(' . a:n . ')' 711 endfunction 712 ]]) 713 command("let b:my_func = function('Foo')") 714 command('call b:my_func(1)') 715 command('echo g:Foo(2)') 716 command('echo Foo(3)') 717 expect([[ 718 719 called Foo(1) 720 called Foo(2) 721 called Foo(3)]]) 722 end) 723 724 it('script-local function used in Funcref must exist', function() 725 source([[ 726 " Vim script used in test_eval.in. Needed for script-local function. 727 728 func s:Testje() 729 return "foo" 730 endfunc 731 732 let Bar = function('s:Testje') 733 734 $put ='s:Testje exists: ' . exists('s:Testje') 735 $put ='func s:Testje exists: ' . exists('*s:Testje') 736 $put ='Bar exists: ' . exists('Bar') 737 $put ='func Bar exists: ' . exists('*Bar') 738 ]]) 739 expect([[ 740 741 s:Testje exists: 0 742 func s:Testje exists: 1 743 Bar exists: 1 744 func Bar exists: 1]]) 745 end) 746 747 it("using $ instead of '$' must give an error", function() 748 eq( 749 'Vim(call):E116: Invalid arguments for function append', 750 exc_exec('call append($, "foobar")') 751 ) 752 end) 753 754 it('getcurpos/setpos', function() 755 insert([[ 756 012345678 757 012345678 758 759 start:]]) 760 command('/^012345678') 761 feed('6l') 762 poke_eventloop() 763 command('let sp = getcurpos()') 764 feed('0') 765 poke_eventloop() 766 command("call setpos('.', sp)") 767 feed('jyl') 768 poke_eventloop() 769 command('$put') 770 expect([[ 771 012345678 772 012345678 773 774 start: 775 6]]) 776 end) 777 778 it('substring and variable name', function() 779 command("let str = 'abcdef'") 780 command('let n = 3') 781 eq('def', eval('str[n:]')) 782 eq('abcd', eval('str[:n]')) 783 eq('d', eval('str[n:n]')) 784 command('unlet n') 785 command('let nn = 3') 786 eq('def', eval('str[nn:]')) 787 eq('abcd', eval('str[:nn]')) 788 eq('d', eval('str[nn:nn]')) 789 command('unlet nn') 790 command('let b:nn = 4') 791 eq('ef', eval('str[b:nn:]')) 792 eq('abcde', eval('str[:b:nn]')) 793 eq('e', eval('str[b:nn:b:nn]')) 794 end) 795 end)