1" Tests for the List and Dict types 2 3source vim9.vim 4 5func TearDown() 6 " Run garbage collection after every test 7 call test_garbagecollect_now() 8endfunc 9 10" Tests for List type 11 12" List creation 13func Test_list_create() 14 " Creating List directly with different types 15 let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},] 16 call assert_equal("[1, 'as''d', [1, 2, function('strlen')], {'a': 1}]", string(l)) 17 call assert_equal({'a' : 1}, l[-1]) 18 call assert_equal(1, l[-4]) 19 let x = 10 20 try 21 let x = l[-5] 22 catch 23 call assert_match('E684:', v:exception) 24 endtry 25 call assert_equal(10, x) 26endfunc 27 28" This was allowed in legacy Vim script 29let s:list_with_spaces = [1 , 2 , 3] 30 31" List slices 32func Test_list_slice() 33 let l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},] 34 call assert_equal([1, 'as''d', [1, 2, function('strlen')], {'a': 1}], l[:]) 35 call assert_equal(['as''d', [1, 2, function('strlen')], {'a': 1}], l[1:]) 36 call assert_equal([1, 'as''d', [1, 2, function('strlen')]], l[:-2]) 37 call assert_equal([1, 'as''d', [1, 2, function('strlen')], {'a': 1}], l[0:8]) 38 call assert_equal([], l[8:-1]) 39 call assert_equal([], l[0:-10]) 40 " perform an operation on a list slice 41 let l = [1, 2, 3] 42 let l[:1] += [1, 2] 43 let l[2:] -= [1] 44 call assert_equal([2, 4, 2], l) 45endfunc 46 47" List identity 48func Test_list_identity() 49 let lines =<< trim END 50 VAR l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},] 51 VAR ll = l 52 VAR lx = copy(l) 53 call assert_true(l == ll) 54 call assert_false(l isnot ll) 55 call assert_true(l is ll) 56 call assert_true(l == lx) 57 call assert_false(l is lx) 58 call assert_true(l isnot lx) 59 END 60 call CheckLegacyAndVim9Success(lines) 61endfunc 62 63" removing items with :unlet 64func Test_list_unlet() 65 let lines =<< trim END 66 VAR l = [1, 'as''d', [1, 2, function("strlen")], {'a': 1},] 67 unlet l[2] 68 call assert_equal([1, 'as''d', {'a': 1}], l) 69 LET l = range(8) 70 unlet l[: 3] 71 unlet l[1 :] 72 call assert_equal([4], l) 73 74 #" removing items out of range: silently skip items that don't exist 75 LET l = [0, 1, 2, 3] 76 unlet l[2 : 2] 77 call assert_equal([0, 1, 3], l) 78 LET l = [0, 1, 2, 3] 79 unlet l[2 : 3] 80 call assert_equal([0, 1], l) 81 LET l = [0, 1, 2, 3] 82 unlet l[2 : 4] 83 call assert_equal([0, 1], l) 84 LET l = [0, 1, 2, 3] 85 unlet l[2 : 5] 86 call assert_equal([0, 1], l) 87 LET l = [0, 1, 2, 3] 88 unlet l[-2 : 2] 89 call assert_equal([0, 1, 3], l) 90 LET l = [0, 1, 2, 3] 91 unlet l[-3 : 2] 92 call assert_equal([0, 3], l) 93 LET l = [0, 1, 2, 3] 94 unlet l[-4 : 2] 95 call assert_equal([3], l) 96 LET l = [0, 1, 2, 3] 97 unlet l[-5 : 2] 98 call assert_equal([3], l) 99 LET l = [0, 1, 2, 3] 100 unlet l[-6 : 2] 101 call assert_equal([3], l) 102 END 103 call CheckLegacyAndVim9Success(lines) 104 105 let l = [0, 1, 2, 3] 106 unlet l[2:2] 107 call assert_equal([0, 1, 3], l) 108 let l = [0, 1, 2, 3] 109 unlet l[2:3] 110 call assert_equal([0, 1], l) 111 112 let lines =<< trim END 113 VAR l = [0, 1, 2, 3] 114 unlet l[2 : 1] 115 END 116 call CheckLegacyAndVim9Failure(lines, 'E684:') 117 118 let lines =<< trim END 119 VAR l = [0, 1, 2, 3] 120 unlet l[-1 : 2] 121 END 122 call CheckLegacyAndVim9Failure(lines, 'E684:') 123endfunc 124 125" assignment to a list 126func Test_list_assign() 127 let lines =<< trim END 128 VAR l = [0, 1, 2, 3] 129 VAR va = 0 130 VAR vb = 0 131 LET [va, vb] = l[2 : 3] 132 call assert_equal([2, 3], [va, vb]) 133 END 134 call CheckLegacyAndVim9Success(lines) 135 136 let lines =<< trim END 137 let l = [0, 1, 2, 3] 138 let [va, vb] = l 139 END 140 call CheckScriptFailure(lines, 'E687:') 141 let lines =<< trim END 142 var l = [0, 1, 2, 3] 143 var va = 0 144 var vb = 0 145 [va, vb] = l 146 END 147 call CheckScriptFailure(['vim9script'] + lines, 'E687:') 148 call CheckDefExecFailure(lines, 'E1093: Expected 2 items but got 4') 149 150 let lines =<< trim END 151 let l = [0, 1, 2, 3] 152 let [va, vb] = l[1:1] 153 END 154 call CheckScriptFailure(lines, 'E688:') 155 let lines =<< trim END 156 var l = [0, 1, 2, 3] 157 var va = 0 158 var vb = 0 159 [va, vb] = l[1 : 1] 160 END 161 call CheckScriptFailure(['vim9script'] + lines, 'E688:') 162 call CheckDefExecFailure(lines, 'E1093: Expected 2 items but got 1') 163endfunc 164 165" test for range assign 166func Test_list_range_assign() 167 let l = [0] 168 let l[:] = [1, 2] 169 call assert_equal([1, 2], l) 170 let l[-4:-1] = [5, 6] 171 call assert_equal([5, 6], l) 172endfunc 173 174" Test removing items in list 175func Test_list_func_remove() 176 let lines =<< trim END 177 #" Test removing 1 element 178 VAR l = [1, 2, 3, 4] 179 call assert_equal(1, remove(l, 0)) 180 call assert_equal([2, 3, 4], l) 181 182 LET l = [1, 2, 3, 4] 183 call assert_equal(2, remove(l, 1)) 184 call assert_equal([1, 3, 4], l) 185 186 LET l = [1, 2, 3, 4] 187 call assert_equal(4, remove(l, -1)) 188 call assert_equal([1, 2, 3], l) 189 190 #" Test removing range of element(s) 191 LET l = [1, 2, 3, 4] 192 call assert_equal([3], remove(l, 2, 2)) 193 call assert_equal([1, 2, 4], l) 194 195 LET l = [1, 2, 3, 4] 196 call assert_equal([2, 3], remove(l, 1, 2)) 197 call assert_equal([1, 4], l) 198 199 LET l = [1, 2, 3, 4] 200 call assert_equal([2, 3], remove(l, -3, -2)) 201 call assert_equal([1, 4], l) 202 END 203 call CheckLegacyAndVim9Success(lines) 204 205 " Test invalid cases 206 let l = [1, 2, 3, 4] 207 call assert_fails("call remove(l, 5)", 'E684:') 208 call assert_fails("call remove(l, 1, 5)", 'E684:') 209 call assert_fails("call remove(l, 3, 2)", 'E16:') 210 call assert_fails("call remove(1, 0)", 'E896:') 211 call assert_fails("call remove(l, l)", 'E745:') 212endfunc 213 214" List add() function 215func Test_list_add() 216 let lines =<< trim END 217 VAR l = [] 218 call add(l, 1) 219 call add(l, [2, 3]) 220 call add(l, []) 221 call add(l, test_null_list()) 222 call add(l, {'k': 3}) 223 call add(l, {}) 224 call add(l, test_null_dict()) 225 call assert_equal([1, [2, 3], [], [], {'k': 3}, {}, {}], l) 226 END 227 call CheckLegacyAndVim9Success(lines) 228 229 " weird legacy behavior 230 call assert_equal(1, add(test_null_list(), 4)) 231endfunc 232 233" Tests for Dictionary type 234 235func Test_dict() 236 " Creating Dictionary directly with different types 237 let lines =<< trim END 238 VAR d = {'1': 'asd', 'b': [1, 2, function('strlen')], '-1': {'a': 1}, } 239 call assert_equal("{'1': 'asd', 'b': [1, 2, function('strlen')], '-1': {'a': 1}}", string(d)) 240 call assert_equal('asd', d.1) 241 call assert_equal(['-1', '1', 'b'], sort(keys(d))) 242 call assert_equal(['asd', [1, 2, function('strlen')], {'a': 1}], values(d)) 243 call extend(d, {3: 33, 1: 99}) 244 call extend(d, {'b': 'bbb', 'c': 'ccc'}, "keep") 245 call assert_equal({'c': 'ccc', '1': 99, 'b': [1, 2, function('strlen')], '3': 33, '-1': {'a': 1}}, d) 246 END 247 call CheckLegacyAndVim9Success(lines) 248 249 let d = {001: 'asd', 'b': [1, 2, function('strlen')], -1: {'a': 1},} 250 call assert_equal("{'1': 'asd', 'b': [1, 2, function('strlen')], '-1': {'a': 1}}", string(d)) 251 252 let v = [] 253 for [key, val] in items(d) 254 call extend(v, [key, val]) 255 unlet key val 256 endfor 257 call assert_equal(['1','asd','b',[1, 2, function('strlen')],'-1',{'a': 1}], v) 258 259 call extend(d, {3: 33, 1: 99}) 260 call assert_fails("call extend(d, {3:333,4:444}, 'error')", 'E737:') 261 262 " duplicate key 263 call assert_fails("let d = {'k' : 10, 'k' : 20}", 'E721:') 264 " missing comma 265 call assert_fails("let d = {'k' : 10 'k' : 20}", 'E722:') 266 " missing curly brace 267 call assert_fails("let d = {'k' : 10,", 'E723:') 268 " invalid key 269 call assert_fails('let d = #{++ : 10}', 'E15:') 270 " wrong type for key 271 call assert_fails('let d={[] : 10}', 'E730:') 272 " undefined variable as value 273 call assert_fails("let d={'k' : i}", 'E121:') 274endfunc 275 276" This was allowed in legacy Vim script 277let s:dict_with_spaces = {'one' : 1 , 'two' : 2 , 'three' : 3} 278let s:dict_with_spaces_lit = #{one : 1 , two : 2 , three : 3} 279 280" Dictionary identity 281func Test_dict_identity() 282 let lines =<< trim END 283 VAR d = {'1': 'asd', 'b': [1, 2, function('strlen')], -1: {'a': 1}, } 284 VAR dd = d 285 VAR dx = copy(d) 286 call assert_true(d == dd) 287 call assert_false(d isnot dd) 288 call assert_true(d is dd) 289 call assert_true(d == dx) 290 call assert_false(d is dx) 291 call assert_true(d isnot dx) 292 END 293 call CheckLegacyAndVim9Success(lines) 294endfunc 295 296" removing items with :unlet 297func Test_dict_unlet() 298 let lines =<< trim END 299 VAR d = {'b': 'bbb', '1': 99, '3': 33, '-1': {'a': 1}} 300 unlet d.b 301 unlet d[-1] 302 call assert_equal({'1': 99, '3': 33}, d) 303 END 304 call CheckLegacyAndVim9Success(lines) 305endfunc 306 307" manipulating a big Dictionary (hashtable.c has a border of 1000 entries) 308func Test_dict_big() 309 let d = {} 310 for i in range(1500) 311 let d[i] = 3000 - i 312 endfor 313 call assert_equal([3000, 2900, 2001, 1600, 1501], [d[0], d[100], d[999], d[1400], d[1499]]) 314 let str = '' 315 try 316 let n = d[1500] 317 catch 318 let str = substitute(v:exception, '\v(.{14}).*( "\d{4}").*', '\1\2', '') 319 endtry 320 call assert_equal('Vim(let):E716: "1500"', str) 321 322 " lookup each items 323 for i in range(1500) 324 call assert_equal(3000 - i, d[i]) 325 endfor 326 let i += 1 327 328 " delete even items 329 while i >= 2 330 let i -= 2 331 unlet d[i] 332 endwhile 333 call assert_equal('NONE', get(d, 1500 - 100, 'NONE')) 334 call assert_equal(2999, d[1]) 335 336 " delete odd items, checking value, one intentionally wrong 337 let d[33] = 999 338 let i = 1 339 while i < 1500 340 if i != 33 341 call assert_equal(3000 - i, d[i]) 342 else 343 call assert_equal(999, d[i]) 344 endif 345 unlet d[i] 346 let i += 2 347 endwhile 348 call assert_equal({}, d) 349 unlet d 350endfunc 351 352" Dictionary function 353func Test_dict_func() 354 let d = {} 355 func d.func(a) dict 356 return a:a . len(self.data) 357 endfunc 358 let d.data = [1,2,3] 359 call assert_equal('len: 3', d.func('len: ')) 360 let x = d.func('again: ') 361 call assert_equal('again: 3', x) 362 let Fn = d.func 363 call assert_equal('xxx3', Fn('xxx')) 364endfunc 365 366func Test_dict_assign() 367 let d = {} 368 let d.1 = 1 369 let d._ = 2 370 call assert_equal({'1': 1, '_': 2}, d) 371 372 let lines =<< trim END 373 VAR d = {} 374 LET d.a = 1 375 LET d._ = 2 376 call assert_equal({'a': 1, '_': 2}, d) 377 END 378 call CheckLegacyAndVim9Success(lines) 379 380 let lines =<< trim END 381 let n = 0 382 let n.key = 3 383 END 384 call CheckScriptFailure(lines, 'E1203: Dot can only be used on a dictionary: n.key = 3') 385 let lines =<< trim END 386 vim9script 387 var n = 0 388 n.key = 3 389 END 390 call CheckScriptFailure(lines, 'E1203: Dot can only be used on a dictionary: n.key = 3') 391 let lines =<< trim END 392 var n = 0 393 n.key = 3 394 END 395 call CheckDefFailure(lines, 'E1141:') 396endfunc 397 398" Function in script-local List or Dict 399func Test_script_local_dict_func() 400 let g:dict = {} 401 function g:dict.func() dict 402 return 'g:dict.func' . self.foo[1] . self.foo[0]('asdf') 403 endfunc 404 let g:dict.foo = ['-', 2, 3] 405 call insert(g:dict.foo, function('strlen')) 406 call assert_equal('g:dict.func-4', g:dict.func()) 407 unlet g:dict 408endfunc 409 410" Test removing items in a dictionary 411func Test_dict_func_remove() 412 let lines =<< trim END 413 VAR d = {1: 'a', 2: 'b', 3: 'c'} 414 call assert_equal('b', remove(d, 2)) 415 call assert_equal({1: 'a', 3: 'c'}, d) 416 END 417 call CheckLegacyAndVim9Success(lines) 418 419 let lines =<< trim END 420 VAR d = {1: 'a', 3: 'c'} 421 call remove(d, 1, 2) 422 END 423 call CheckLegacyAndVim9Failure(lines, 'E118:') 424 425 let lines =<< trim END 426 VAR d = {1: 'a', 3: 'c'} 427 call remove(d, 'a') 428 END 429 call CheckLegacyAndVim9Failure(lines, 'E716:') 430 431 let lines =<< trim END 432 let d = {1: 'a', 3: 'c'} 433 call remove(d, []) 434 END 435 call CheckScriptFailure(lines, 'E730:') 436 let lines =<< trim END 437 vim9script 438 var d = {1: 'a', 3: 'c'} 439 call remove(d, []) 440 END 441 call CheckScriptFailure(lines, 'E1220: String or Number required for argument 2') 442 let lines =<< trim END 443 var d = {1: 'a', 3: 'c'} 444 call remove(d, []) 445 END 446 call CheckDefExecFailure(lines, 'E1013: Argument 2: type mismatch, expected string but got list<unknown>') 447endfunc 448 449" Nasty: remove func from Dict that's being called (works) 450func Test_dict_func_remove_in_use() 451 let d = {1:1} 452 func d.func(a) 453 return "a:" . a:a 454 endfunc 455 let expected = 'a:' . string(get(d, 'func')) 456 call assert_equal(expected, d.func(string(remove(d, 'func')))) 457endfunc 458 459func Test_dict_literal_keys() 460 call assert_equal({'one': 1, 'two2': 2, '3three': 3, '44': 4}, #{one: 1, two2: 2, 3three: 3, 44: 4},) 461 462 " why *{} cannot be used for a literal dictionary 463 let blue = 'blue' 464 call assert_equal('6', trim(execute('echo 2 *{blue: 3}.blue'))) 465endfunc 466 467" Nasty: deepcopy() dict that refers to itself (fails when noref used) 468func Test_dict_deepcopy() 469 let d = {1:1, 2:2} 470 let l = [4, d, 6] 471 let d[3] = l 472 let dc = deepcopy(d) 473 call assert_fails('call deepcopy(d, 1)', 'E698:') 474 let l2 = [0, l, l, 3] 475 let l[1] = l2 476 let l3 = deepcopy(l2) 477 call assert_true(l3[1] is l3[2]) 478 call assert_fails("call deepcopy([1, 2], 2)", 'E1023:') 479endfunc 480 481" Locked variables 482func Test_list_locked_var() 483 let expected = [ 484 \ [['1000-000', 'ppppppF'], 485 \ ['0000-000', 'ppppppp'], 486 \ ['0000-000', 'ppppppp']], 487 \ [['1000-000', 'ppppppF'], 488 \ ['0000-000', 'ppppppp'], 489 \ ['0000-000', 'ppppppp']], 490 \ [['1100-100', 'ppFppFF'], 491 \ ['0000-000', 'ppppppp'], 492 \ ['0000-000', 'ppppppp']], 493 \ [['1110-110', 'pFFpFFF'], 494 \ ['0010-010', 'pFppFpp'], 495 \ ['0000-000', 'ppppppp']], 496 \ [['1111-111', 'FFFFFFF'], 497 \ ['0011-011', 'FFpFFpp'], 498 \ ['0000-000', 'ppppppp']] 499 \ ] 500 for depth in range(5) 501 for u in range(3) 502 unlet! l 503 let l = [0, [1, [2, 3]], {4: 5, 6: {7: 8}}] 504 exe "lockvar " . depth . " l" 505 if u == 1 506 exe "unlockvar l" 507 elseif u == 2 508 exe "unlockvar " . depth . " l" 509 endif 510 let ps = islocked("l").islocked("l[1]").islocked("l[1][1]").islocked("l[1][1][0]").'-'.islocked("l[2]").islocked("l[2]['6']").islocked("l[2]['6'][7]") 511 call assert_equal(expected[depth][u][0], ps, 'depth: ' .. depth) 512 let ps = '' 513 try 514 let l[1][1][0] = 99 515 let ps .= 'p' 516 catch 517 let ps .= 'F' 518 endtry 519 try 520 let l[1][1] = [99] 521 let ps .= 'p' 522 catch 523 let ps .= 'F' 524 endtry 525 try 526 let l[1] = [99] 527 let ps .= 'p' 528 catch 529 let ps .= 'F' 530 endtry 531 try 532 let l[2]['6'][7] = 99 533 let ps .= 'p' 534 catch 535 let ps .= 'F' 536 endtry 537 try 538 let l[2][6] = {99: 99} 539 let ps .= 'p' 540 catch 541 let ps .= 'F' 542 endtry 543 try 544 let l[2] = {99: 99} 545 let ps .= 'p' 546 catch 547 let ps .= 'F' 548 endtry 549 try 550 let l = [99] 551 let ps .= 'p' 552 catch 553 let ps .= 'F' 554 endtry 555 call assert_equal(expected[depth][u][1], ps, 'depth: ' .. depth) 556 endfor 557 endfor 558 call assert_fails("let x=islocked('a b')", 'E488:') 559 let mylist = [1, 2, 3] 560 call assert_fails("let x = islocked('mylist[1:2]')", 'E786:') 561 let mydict = {'k' : 'v'} 562 call assert_fails("let x = islocked('mydict.a')", 'E716:') 563endfunc 564 565" Unletting locked variables 566func Test_list_locked_var_unlet() 567 let expected = [ 568 \ [['1000-000', 'ppppppp'], 569 \ ['0000-000', 'ppppppp'], 570 \ ['0000-000', 'ppppppp']], 571 \ [['1000-000', 'ppFppFp'], 572 \ ['0000-000', 'ppppppp'], 573 \ ['0000-000', 'ppppppp']], 574 \ [['1100-100', 'pFFpFFp'], 575 \ ['0000-000', 'ppppppp'], 576 \ ['0000-000', 'ppppppp']], 577 \ [['1110-110', 'FFFFFFp'], 578 \ ['0010-010', 'FppFppp'], 579 \ ['0000-000', 'ppppppp']], 580 \ [['1111-111', 'FFFFFFp'], 581 \ ['0011-011', 'FppFppp'], 582 \ ['0000-000', 'ppppppp']] 583 \ ] 584 585 for depth in range(5) 586 for u in range(3) 587 unlet! l 588 let l = [0, [1, [2, 3]], {4: 5, 6: {7: 8}}] 589 exe "lockvar " . depth . " l" 590 if u == 1 591 exe "unlockvar l" 592 elseif u == 2 593 exe "unlockvar " . depth . " l" 594 endif 595 let ps = islocked("l").islocked("l[1]").islocked("l[1][1]").islocked("l[1][1][0]").'-'.islocked("l[2]").islocked("l[2]['6']").islocked("l[2]['6'][7]") 596 call assert_equal(expected[depth][u][0], ps, 'depth: ' .. depth) 597 let ps = '' 598 try 599 unlet l[2]['6'][7] 600 let ps .= 'p' 601 catch 602 let ps .= 'F' 603 endtry 604 try 605 unlet l[2][6] 606 let ps .= 'p' 607 catch 608 let ps .= 'F' 609 endtry 610 try 611 unlet l[2] 612 let ps .= 'p' 613 catch 614 let ps .= 'F' 615 endtry 616 try 617 unlet l[1][1][0] 618 let ps .= 'p' 619 catch 620 let ps .= 'F' 621 endtry 622 try 623 unlet l[1][1] 624 let ps .= 'p' 625 catch 626 let ps .= 'F' 627 endtry 628 try 629 unlet l[1] 630 let ps .= 'p' 631 catch 632 let ps .= 'F' 633 endtry 634 try 635 unlet l 636 let ps .= 'p' 637 catch 638 let ps .= 'F' 639 endtry 640 call assert_equal(expected[depth][u][1], ps) 641 endfor 642 endfor 643 " Deleting a list range should fail if the range is locked 644 let l = [1, 2, 3, 4] 645 lockvar l[1:2] 646 call assert_fails('unlet l[1:2]', 'E741:') 647 unlet l 648endfunc 649 650" Locked variables and :unlet or list / dict functions 651 652" No :unlet after lock on dict: 653func Test_dict_lock_unlet() 654 let d = {'a': 99, 'b': 100} 655 lockvar 1 d 656 call assert_fails('unlet d.a', 'E741:') 657endfunc 658 659" unlet after lock on dict item 660func Test_dict_item_lock_unlet() 661 let d = {'a': 99, 'b': 100} 662 lockvar d.a 663 unlet d.a 664 call assert_equal({'b' : 100}, d) 665endfunc 666 667" filter() after lock on dict item 668func Test_dict_lock_filter() 669 let d = {'a': 99, 'b': 100} 670 lockvar d.a 671 call filter(d, 'v:key != "a"') 672 call assert_equal({'b' : 100}, d) 673endfunc 674 675" map() after lock on dict 676func Test_dict_lock_map() 677 let d = {'a': 99, 'b': 100} 678 lockvar 1 d 679 call map(d, 'v:val + 200') 680 call assert_equal({'a' : 299, 'b' : 300}, d) 681endfunc 682 683" No extend() after lock on dict item 684func Test_dict_lock_extend() 685 let d = {'a': 99, 'b': 100} 686 lockvar d.a 687 call assert_fails("call extend(d, {'a' : 123})", 'E741:') 688 call assert_equal({'a': 99, 'b': 100}, d) 689endfunc 690 691" Cannot use += with a locked dict 692func Test_dict_lock_operator() 693 let d = {} 694 lockvar d 695 call assert_fails("let d += {'k' : 10}", 'E741:') 696 unlockvar d 697endfunc 698 699" No remove() of write-protected scope-level variable 700func Tfunc1(this_is_a_long_parameter_name) 701 call assert_fails("call remove(a:, 'this_is_a_long_parameter_name')", 'E742:') 702endfunc 703func Test_dict_scope_var_remove() 704 call Tfunc1('testval') 705endfunc 706 707" No extend() of write-protected scope-level variable 708func Test_dict_scope_var_extend() 709 call assert_fails("call extend(a:, {'this_is_a_long_parameter_name': 1234})", 'E742:') 710endfunc 711 712func Tfunc2(this_is_a_long_parameter_name) 713 call assert_fails("call extend(a:, {'this_is_a_long_parameter_name': 1234})", 'E742:') 714endfunc 715func Test_dict_scope_var_extend_overwrite() 716 call Tfunc2('testval') 717endfunc 718 719" No :unlet of variable in locked scope 720func Test_lock_var_unlet() 721 let b:testvar = 123 722 lockvar 1 b: 723 call assert_fails('unlet b:testvar', 'E741:') 724 unlockvar 1 b: 725 unlet! b:testvar 726endfunc 727 728" No :let += of locked list variable 729func Test_let_lock_list() 730 let l = ['a', 'b', 3] 731 lockvar 1 l 732 call assert_fails("let l += ['x']", 'E741:') 733 call assert_equal(['a', 'b', 3], l) 734 735 unlet l 736 let l = [1, 2, 3, 4] 737 lockvar! l 738 call assert_equal([1, 2, 3, 4], l) 739 unlockvar l[1] 740 call assert_fails('unlet l[0:1]', 'E741:') 741 call assert_equal([1, 2, 3, 4], l) 742 call assert_fails('unlet l[1:2]', 'E741:') 743 call assert_equal([1, 2, 3, 4], l) 744 unlockvar l[1] 745 call assert_fails('let l[0:1] = [0, 1]', 'E741:') 746 call assert_equal([1, 2, 3, 4], l) 747 call assert_fails('let l[1:2] = [0, 1]', 'E741:') 748 call assert_equal([1, 2, 3, 4], l) 749 unlet l 750endfunc 751 752" Locking part of the list 753func Test_let_lock_list_items() 754 let l = [1, 2, 3, 4] 755 lockvar l[2:] 756 call assert_equal(0, islocked('l[0]')) 757 call assert_equal(1, islocked('l[2]')) 758 call assert_equal(1, islocked('l[3]')) 759 call assert_fails('let l[2] = 10', 'E741:') 760 call assert_fails('let l[3] = 20', 'E741:') 761 unlet l 762endfunc 763 764" lockvar/islocked() triggering script autoloading 765func Test_lockvar_script_autoload() 766 let old_rtp = &rtp 767 set rtp+=./sautest 768 lockvar g:footest#x 769 unlockvar g:footest#x 770 call assert_equal(-1, 'g:footest#x'->islocked()) 771 call assert_equal(0, exists('g:footest#x')) 772 call assert_equal(1, g:footest#x) 773 let &rtp = old_rtp 774endfunc 775 776" a:000 function argument test 777func s:arg_list_test(...) 778 call assert_fails('let a:000 = [1, 2]', 'E46:') 779 call assert_fails('let a:000[0] = 9', 'E742:') 780 call assert_fails('let a:000[2] = [9, 10]', 'E742:') 781 call assert_fails('let a:000[3] = {9 : 10}', 'E742:') 782 783 " now the tests that should pass 784 let a:000[2][1] = 9 785 call extend(a:000[2], [5, 6]) 786 let a:000[3][5] = 8 787 let a:000[3]['a'] = 12 788 call assert_equal([1, 2, [3, 9, 5, 6], {'a': 12, '5': 8}], a:000) 789endfunc 790 791func Test_func_arg_list() 792 call s:arg_list_test(1, 2, [3, 4], {5: 6}) 793endfunc 794 795" Tests for reverse(), sort(), uniq() 796func Test_reverse_sort_uniq() 797 let l = ['-0', 'A11', 2, 2, 'xaaa', 4, 'foo', 'foo6', 'foo', [0, 1, 2], 'x8', [0, 1, 2], 1.5] 798 call assert_equal(['-0', 'A11', 2, 'xaaa', 4, 'foo', 'foo6', 'foo', [0, 1, 2], 'x8', [0, 1, 2], 1.5], uniq(copy(l))) 799 call assert_equal([1.5, [0, 1, 2], 'x8', [0, 1, 2], 'foo', 'foo6', 'foo', 4, 'xaaa', 2, 2, 'A11', '-0'], reverse(l)) 800 call assert_equal([1.5, [0, 1, 2], 'x8', [0, 1, 2], 'foo', 'foo6', 'foo', 4, 'xaaa', 2, 2, 'A11', '-0'], reverse(reverse(l))) 801 if has('float') 802 call assert_equal(['-0', 'A11', 'foo', 'foo', 'foo6', 'x8', 'xaaa', 1.5, 2, 2, 4, [0, 1, 2], [0, 1, 2]], sort(l)) 803 call assert_equal([[0, 1, 2], [0, 1, 2], 4, 2, 2, 1.5, 'xaaa', 'x8', 'foo6', 'foo', 'foo', 'A11', '-0'], reverse(sort(l))) 804 call assert_equal(['-0', 'A11', 'foo', 'foo', 'foo6', 'x8', 'xaaa', 1.5, 2, 2, 4, [0, 1, 2], [0, 1, 2]], sort(reverse(sort(l)))) 805 call assert_equal(['-0', 'A11', 'foo', 'foo6', 'x8', 'xaaa', 1.5, 2, 4, [0, 1, 2]], uniq(sort(l))) 806 807 let l = [7, 9, 'one', 18, 12, 22, 'two', 10.0e-16, -1, 'three', 0xff, 0.22, 'four'] 808 call assert_equal([-1, 'one', 'two', 'three', 'four', 1.0e-15, 0.22, 7, 9, 12, 18, 22, 255], sort(copy(l), 'n')) 809 810 let l = [7, 9, 18, 12, 22, 10.0e-16, -1, 0xff, 0, -0, 0.22, 'bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', {}, []] 811 call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 1)) 812 call assert_equal(['bar', 'BAR', 'Bar', 'Foo', 'FOO', 'foo', 'FOOBAR', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l), 'i')) 813 call assert_equal(['BAR', 'Bar', 'FOO', 'FOOBAR', 'Foo', 'bar', 'foo', -1, 0, 0, 0.22, 1.0e-15, 12, 18, 22, 255, 7, 9, [], {}], sort(copy(l))) 814 endif 815 816 call assert_fails('call reverse("")', 'E899:') 817 call assert_fails('call uniq([1, 2], {x, y -> []})', 'E745:') 818 call assert_fails("call sort([1, 2], function('min'), 1)", "E715:") 819 call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:") 820 call assert_fails("call sort([1, 2], function('min'))", "E118:") 821endfunc 822 823" reduce a list or a blob 824func Test_reduce() 825 call assert_equal(1, reduce([], { acc, val -> acc + val }, 1)) 826 call assert_equal(10, reduce([1, 3, 5], { acc, val -> acc + val }, 1)) 827 call assert_equal(2 * (2 * ((2 * 1) + 2) + 3) + 4, reduce([2, 3, 4], { acc, val -> 2 * acc + val }, 1)) 828 call assert_equal('a x y z', ['x', 'y', 'z']->reduce({ acc, val -> acc .. ' ' .. val}, 'a')) 829 call assert_equal(#{ x: 1, y: 1, z: 1 }, ['x', 'y', 'z']->reduce({ acc, val -> extend(acc, { val: 1 }) }, {})) 830 call assert_equal([0, 1, 2, 3], reduce([1, 2, 3], function('add'), [0])) 831 832 let l = ['x', 'y', 'z'] 833 call assert_equal(42, reduce(l, function('get'), #{ x: #{ y: #{ z: 42 } } })) 834 call assert_equal(['x', 'y', 'z'], l) 835 836 call assert_equal(1, reduce([1], { acc, val -> acc + val })) 837 call assert_equal('x y z', reduce(['x', 'y', 'z'], { acc, val -> acc .. ' ' .. val })) 838 call assert_equal(120, range(1, 5)->reduce({ acc, val -> acc * val })) 839 call assert_fails("call reduce([], { acc, val -> acc + val })", 'E998: Reduce of an empty List with no initial value') 840 841 call assert_equal(1, reduce(0z, { acc, val -> acc + val }, 1)) 842 call assert_equal(1 + 0xaf + 0xbf + 0xcf, reduce(0zAFBFCF, { acc, val -> acc + val }, 1)) 843 call assert_equal(2 * (2 * 1 + 0xaf) + 0xbf, 0zAFBF->reduce({ acc, val -> 2 * acc + val }, 1)) 844 845 call assert_equal(0xff, reduce(0zff, { acc, val -> acc + val })) 846 call assert_equal(2 * (2 * 0xaf + 0xbf) + 0xcf, reduce(0zAFBFCF, { acc, val -> 2 * acc + val })) 847 call assert_fails("call reduce(0z, { acc, val -> acc + val })", 'E998: Reduce of an empty Blob with no initial value') 848 849 call assert_fails("call reduce({}, { acc, val -> acc + val }, 1)", 'E897:') 850 call assert_fails("call reduce(0, { acc, val -> acc + val }, 1)", 'E897:') 851 call assert_fails("call reduce('', { acc, val -> acc + val }, 1)", 'E897:') 852 call assert_fails("call reduce([1, 2], 'Xdoes_not_exist')", 'E117:') 853 call assert_fails("echo reduce(0z01, { acc, val -> 2 * acc + val }, '')", 'E39:') 854 855 let g:lut = [1, 2, 3, 4] 856 func EvilRemove() 857 call remove(g:lut, 1) 858 return 1 859 endfunc 860 call assert_fails("call reduce(g:lut, { acc, val -> EvilRemove() }, 1)", 'E742:') 861 unlet g:lut 862 delfunc EvilRemove 863 864 call assert_equal(42, reduce(test_null_list(), function('add'), 42)) 865 call assert_equal(42, reduce(test_null_blob(), function('add'), 42)) 866 867 " should not crash 868 call assert_fails('echo reduce([1], test_null_function())', 'E1132:') 869 call assert_fails('echo reduce([1], test_null_partial())', 'E1132:') 870endfunc 871 872" splitting a string to a List using split() 873func Test_str_split() 874 call assert_equal(['aa', 'bb'], split(' aa bb ')) 875 call assert_equal(['aa', 'bb'], split(' aa bb ', '\W\+', 0)) 876 call assert_equal(['', 'aa', 'bb', ''], split(' aa bb ', '\W\+', 1)) 877 call assert_equal(['', '', 'aa', '', 'bb', '', ''], split(' aa bb ', '\W', 1)) 878 call assert_equal(['aa', '', 'bb'], split(':aa::bb:', ':', 0)) 879 call assert_equal(['', 'aa', '', 'bb', ''], split(':aa::bb:', ':', 1)) 880 call assert_equal(['aa', '', 'bb', 'cc', ''], split('aa,,bb, cc,', ',\s*', 1)) 881 call assert_equal(['a', 'b', 'c'], split('abc', '\zs')) 882 call assert_equal(['', 'a', '', 'b', '', 'c', ''], split('abc', '\zs', 1)) 883 call assert_fails("call split('abc', [])", 'E730:') 884 call assert_fails("call split('abc', 'b', [])", 'E745:') 885 call assert_equal(['abc'], split('abc', '\\%(')) 886endfunc 887 888" compare recursively linked list and dict 889func Test_listdict_compare() 890 let l = [1, 2, 3, 4] 891 let d = {'1': 1, '2': l, '3': 3} 892 let l[1] = d 893 call assert_true(l == l) 894 call assert_true(d == d) 895 call assert_false(l != deepcopy(l)) 896 call assert_false(d != deepcopy(d)) 897 898 " comparison errors 899 call assert_fails('echo [1, 2] =~ {}', 'E691:') 900 call assert_fails('echo [1, 2] =~ [1, 2]', 'E692:') 901 call assert_fails('echo {} =~ 5', 'E735:') 902 call assert_fails('echo {} =~ {}', 'E736:') 903endfunc 904 905 " compare complex recursively linked list and dict 906func Test_listdict_compare_complex() 907 let l = [] 908 call add(l, l) 909 let dict4 = {"l": l} 910 call add(dict4.l, dict4) 911 let lcopy = deepcopy(l) 912 let dict4copy = deepcopy(dict4) 913 call assert_true(l == lcopy) 914 call assert_true(dict4 == dict4copy) 915endfunc 916 917" Test for extending lists and dictionaries 918func Test_listdict_extend() 919 " Test extend() with lists 920 921 " Pass the same List to extend() 922 let l = [1, 2, 3] 923 call assert_equal([1, 2, 3, 1, 2, 3], extend(l, l)) 924 call assert_equal([1, 2, 3, 1, 2, 3], l) 925 926 let l = [1, 2, 3] 927 call assert_equal([1, 2, 3, 4, 5, 6], extend(l, [4, 5, 6])) 928 call assert_equal([1, 2, 3, 4, 5, 6], l) 929 930 let l = [1, 2, 3] 931 call extend(l, [4, 5, 6], 0) 932 call assert_equal([4, 5, 6, 1, 2, 3], l) 933 934 let l = [1, 2, 3] 935 call extend(l, [4, 5, 6], 1) 936 call assert_equal([1, 4, 5, 6, 2, 3], l) 937 938 let l = [1, 2, 3] 939 call extend(l, [4, 5, 6], 3) 940 call assert_equal([1, 2, 3, 4, 5, 6], l) 941 942 let l = [1, 2, 3] 943 call extend(l, [4, 5, 6], -1) 944 call assert_equal([1, 2, 4, 5, 6, 3], l) 945 946 let l = [1, 2, 3] 947 call extend(l, [4, 5, 6], -3) 948 call assert_equal([4, 5, 6, 1, 2, 3], l) 949 950 let l = [1, 2, 3] 951 call assert_fails("call extend(l, [4, 5, 6], 4)", 'E684:') 952 call assert_fails("call extend(l, [4, 5, 6], -4)", 'E684:') 953 if has('float') 954 call assert_fails("call extend(l, [4, 5, 6], 1.2)", 'E805:') 955 endif 956 957 " Test extend() with dictionaries. 958 959 " Pass the same Dict to extend() 960 let d = { 'a': {'b': 'B'}} 961 call extend(d, d) 962 call assert_equal({'a': {'b': 'B'}}, d) 963 964 let d = {'a': 'A', 'b': 'B'} 965 call assert_equal({'a': 'A', 'b': 0, 'c': 'C'}, extend(d, {'b': 0, 'c':'C'})) 966 call assert_equal({'a': 'A', 'b': 0, 'c': 'C'}, d) 967 968 let d = {'a': 'A', 'b': 'B'} 969 call extend(d, {'a': 'A', 'b': 0, 'c': 'C'}, "force") 970 call assert_equal({'a': 'A', 'b': 0, 'c': 'C'}, d) 971 972 let d = {'a': 'A', 'b': 'B'} 973 call extend(d, {'b': 0, 'c':'C'}, "keep") 974 call assert_equal({'a': 'A', 'b': 'B', 'c': 'C'}, d) 975 976 let d = {'a': 'A', 'b': 'B'} 977 call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 'error')", 'E737:') 978 call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 'xxx')", 'E475:') 979 if has('float') 980 call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 1.2)", 'E475:') 981 endif 982 call assert_equal({'a': 'A', 'b': 'B'}, d) 983 984 call assert_fails("call extend([1, 2], 1)", 'E712:') 985 call assert_fails("call extend([1, 2], {})", 'E712:') 986 987 " Extend g: dictionary with an invalid variable name 988 call assert_fails("call extend(g:, {'-!' : 10})", 'E461:') 989 990 " Extend a list with itself. 991 let l = [1, 5, 7] 992 call extend(l, l, 0) 993 call assert_equal([1, 5, 7, 1, 5, 7], l) 994 let l = [1, 5, 7] 995 call extend(l, l, 1) 996 call assert_equal([1, 1, 5, 7, 5, 7], l) 997 let l = [1, 5, 7] 998 call extend(l, l, 2) 999 call assert_equal([1, 5, 1, 5, 7, 7], l) 1000 let l = [1, 5, 7] 1001 call extend(l, l, 3) 1002 call assert_equal([1, 5, 7, 1, 5, 7], l) 1003endfunc 1004 1005func Test_listdict_extendnew() 1006 " Test extendnew() with lists 1007 let l = [1, 2, 3] 1008 call assert_equal([1, 2, 3, 4, 5], extendnew(l, [4, 5])) 1009 call assert_equal([1, 2, 3], l) 1010 1011 " Test extend() with dictionaries. 1012 let d = {'a': {'b': 'B'}} 1013 call assert_equal({'a': {'b': 'B'}, 'c': 'cc'}, extendnew(d, {'c': 'cc'})) 1014 call assert_equal({'a': {'b': 'B'}}, d) 1015endfunc 1016 1017func s:check_scope_dict(x, fixed) 1018 func s:gen_cmd(cmd, x) 1019 return substitute(a:cmd, '\<x\ze:', a:x, 'g') 1020 endfunc 1021 1022 let cmd = s:gen_cmd('let x:foo = 1', a:x) 1023 if a:fixed 1024 call assert_fails(cmd, 'E461:') 1025 else 1026 exe cmd 1027 exe s:gen_cmd('call assert_equal(1, x:foo)', a:x) 1028 endif 1029 1030 let cmd = s:gen_cmd('let x:["bar"] = 2', a:x) 1031 if a:fixed 1032 call assert_fails(cmd, 'E461:') 1033 else 1034 exe cmd 1035 exe s:gen_cmd('call assert_equal(2, x:bar)', a:x) 1036 endif 1037 1038 let cmd = s:gen_cmd('call extend(x:, {"baz": 3})', a:x) 1039 if a:fixed 1040 call assert_fails(cmd, 'E742:') 1041 else 1042 exe cmd 1043 exe s:gen_cmd('call assert_equal(3, x:baz)', a:x) 1044 endif 1045 1046 if a:fixed 1047 if a:x ==# 'a' 1048 call assert_fails('unlet a:x', 'E795:') 1049 call assert_fails('call remove(a:, "x")', 'E742:') 1050 elseif a:x ==# 'v' 1051 call assert_fails('unlet v:count', 'E795:') 1052 call assert_fails('call remove(v:, "count")', 'E742:') 1053 endif 1054 else 1055 exe s:gen_cmd('unlet x:foo', a:x) 1056 exe s:gen_cmd('unlet x:bar', a:x) 1057 exe s:gen_cmd('call remove(x:, "baz")', a:x) 1058 endif 1059 1060 delfunc s:gen_cmd 1061endfunc 1062 1063func Test_scope_dict() 1064 " Test for g: 1065 call s:check_scope_dict('g', v:false) 1066 1067 " Test for s: 1068 call s:check_scope_dict('s', v:false) 1069 1070 " Test for l: 1071 call s:check_scope_dict('l', v:false) 1072 1073 " Test for a: 1074 call s:check_scope_dict('a', v:true) 1075 1076 " Test for b: 1077 call s:check_scope_dict('b', v:false) 1078 1079 " Test for w: 1080 call s:check_scope_dict('w', v:false) 1081 1082 " Test for t: 1083 call s:check_scope_dict('t', v:false) 1084 1085 " Test for v: 1086 call s:check_scope_dict('v', v:true) 1087endfunc 1088 1089" Test for deep nesting of lists (> 100) 1090func Test_deep_nested_list() 1091 let deep_list = [] 1092 let l = deep_list 1093 for i in range(102) 1094 let newlist = [] 1095 call add(l, newlist) 1096 let l = newlist 1097 endfor 1098 call add(l, 102) 1099 1100 call assert_fails('let m = deepcopy(deep_list)', 'E698:') 1101 call assert_fails('lockvar 110 deep_list', 'E743:') 1102 call assert_fails('unlockvar 110 deep_list', 'E743:') 1103 call assert_fails('let x = execute("echo deep_list")', 'E724:') 1104 call test_garbagecollect_now() 1105 unlet deep_list 1106endfunc 1107 1108" Test for deep nesting of dicts (> 100) 1109func Test_deep_nested_dict() 1110 let deep_dict = {} 1111 let d = deep_dict 1112 for i in range(102) 1113 let newdict = {} 1114 let d.k = newdict 1115 let d = newdict 1116 endfor 1117 let d.k = 'v' 1118 1119 call assert_fails('let m = deepcopy(deep_dict)', 'E698:') 1120 call assert_fails('lockvar 110 deep_dict', 'E743:') 1121 call assert_fails('unlockvar 110 deep_dict', 'E743:') 1122 call assert_fails('let x = execute("echo deep_dict")', 'E724:') 1123 call test_garbagecollect_now() 1124 unlet deep_dict 1125endfunc 1126 1127" List and dict indexing tests 1128func Test_listdict_index() 1129 call assert_fails('echo function("min")[0]', 'E695:') 1130 call assert_fails('echo v:true[0]', 'E909:') 1131 let d = {'k' : 10} 1132 call assert_fails('echo d.', 'E15:') 1133 call assert_fails('echo d[1:2]', 'E719:') 1134 call assert_fails("let v = [4, 6][{-> 1}]", 'E729:') 1135 call assert_fails("let v = range(5)[2:[]]", 'E730:') 1136 call assert_fails("let v = range(5)[2:{-> 2}(]", ['E15:', 'E116:']) 1137 call assert_fails("let v = range(5)[2:3", 'E111:') 1138 call assert_fails("let l = insert([1,2,3], 4, 10)", 'E684:') 1139 call assert_fails("let l = insert([1,2,3], 4, -10)", 'E684:') 1140 call assert_fails("let l = insert([1,2,3], 4, [])", 'E745:') 1141 let l = [1, 2, 3] 1142 call assert_fails("let l[i] = 3", 'E121:') 1143 call assert_fails("let l[1.1] = 4", 'E805:') 1144 call assert_fails("let l[:i] = [4, 5]", 'E121:') 1145 call assert_fails("let l[:3.2] = [4, 5]", 'E805:') 1146 let t = test_unknown() 1147 call assert_fails("echo t[0]", 'E685:') 1148endfunc 1149 1150" Test for a null list 1151func Test_null_list() 1152 let l = test_null_list() 1153 call assert_equal(0, join(test_null_list())) 1154 call assert_equal('', join(l)) 1155 call assert_equal(0, len(l)) 1156 call assert_equal(1, empty(l)) 1157 call assert_fails('let s = join([1, 2], [])', 'E730:') 1158 call assert_equal([], split(test_null_string())) 1159 call assert_equal([], l[:2]) 1160 call assert_true([] == l) 1161 call assert_equal('[]', string(l)) 1162 call assert_equal(0, sort(test_null_list())) 1163 call assert_equal([], sort(l)) 1164 call assert_equal(0, uniq(test_null_list())) 1165 call assert_equal([], uniq(l)) 1166 let k = [] + l 1167 call assert_equal([], k) 1168 let k = l + [] 1169 call assert_equal([], k) 1170 call assert_equal(0, len(copy(l))) 1171 call assert_equal(0, count(l, 5)) 1172 call assert_equal([], deepcopy(l)) 1173 call assert_equal(5, get(l, 2, 5)) 1174 call assert_equal(-1, index(l, 2, 5)) 1175 call assert_equal(0, insert(test_null_list(), 2, -1)) 1176 call assert_fails('call insert(l, 2, -1)', 'E684:') 1177 call assert_equal(0, min(l)) 1178 call assert_equal(0, max(l)) 1179 call assert_equal(0, remove(test_null_list(), 0, 2)) 1180 call assert_fails('call remove(l, 0, 2)', 'E684:') 1181 call assert_equal([], repeat(l, 2)) 1182 call assert_equal(0, reverse(test_null_list())) 1183 call assert_equal([], reverse(l)) 1184 call assert_equal(0, sort(test_null_list())) 1185 call assert_equal([], sort(l)) 1186 call assert_equal('[]', string(l)) 1187 call assert_fails('call extend(test_null_list(), test_null_list())', 'E1134:') 1188 call assert_equal([], extend(l, l, 0)) 1189 lockvar l 1190 call assert_equal(1, islocked('l')) 1191 unlockvar l 1192endfunc 1193 1194" Test for a null dict 1195func Test_null_dict() 1196 call assert_equal(test_null_dict(), test_null_dict()) 1197 let d = test_null_dict() 1198 call assert_equal({}, d) 1199 call assert_equal(0, len(d)) 1200 call assert_equal(1, empty(d)) 1201 call assert_equal(0, items(test_null_dict())) 1202 call assert_equal([], items(d)) 1203 call assert_equal(0, keys(test_null_dict())) 1204 call assert_equal([], keys(d)) 1205 call assert_equal(0, values(test_null_dict())) 1206 call assert_equal([], values(d)) 1207 call assert_false(has_key(d, 'k')) 1208 call assert_equal('{}', string(d)) 1209 call assert_fails('let x = d[10]', 'E716:') 1210 call assert_equal({}, {}) 1211 call assert_equal(0, len(copy(d))) 1212 call assert_equal(0, count(d, 'k')) 1213 call assert_equal({}, deepcopy(d)) 1214 call assert_equal(20, get(d, 'k', 20)) 1215 call assert_equal(0, min(d)) 1216 call assert_equal(0, max(d)) 1217 call assert_equal(0, remove(test_null_dict(), 'k')) 1218 call assert_fails("call remove(d, 'k')", 'E716:') 1219 call assert_equal('{}', string(d)) 1220 call assert_fails('call extend(test_null_dict(), test_null_dict())', 'E1133:') 1221 call assert_equal({}, extend(d, d, 'keep')) 1222 lockvar d 1223 call assert_equal(1, islocked('d')) 1224 unlockvar d 1225endfunc 1226 1227" vim: shiftwidth=2 sts=2 expandtab 1228