18a7d6542SBram Moolenaar" Tests for Vim9 script expressions 28a7d6542SBram Moolenaar 38a7d6542SBram Moolenaarsource check.vim 4cfe435d7SBram Moolenaarsource vim9.vim 58a7d6542SBram Moolenaar 6c7db5778SBram Moolenaar 7c7db5778SBram Moolenaarlet g:cond = v:false 8c7db5778SBram Moolenaardef FuncOne(arg: number): string 9c7db5778SBram Moolenaar return 'yes' 10c7db5778SBram Moolenaarenddef 11c7db5778SBram Moolenaardef FuncTwo(arg: number): number 12c7db5778SBram Moolenaar return 123 13c7db5778SBram Moolenaarenddef 14c7db5778SBram Moolenaar 158a7d6542SBram Moolenaar" test cond ? expr : expr 168a7d6542SBram Moolenaardef Test_expr1() 178a7d6542SBram Moolenaar assert_equal('one', true ? 'one' : 'two') 189c7e6dd6SBram Moolenaar assert_equal('one', 1 ? 199c7e6dd6SBram Moolenaar 'one' : 209c7e6dd6SBram Moolenaar 'two') 215feabe00SBram Moolenaar if has('float') 228a7d6542SBram Moolenaar assert_equal('one', 0.1 ? 'one' : 'two') 235feabe00SBram Moolenaar endif 248a7d6542SBram Moolenaar assert_equal('one', 'x' ? 'one' : 'two') 2567fbdfefSBram Moolenaar assert_equal('one', 'x' 2667fbdfefSBram Moolenaar ? 'one' 2767fbdfefSBram Moolenaar : 'two') 285381c7a1SBram Moolenaar assert_equal('one', 0z1234 ? 'one' : 'two') 298a7d6542SBram Moolenaar assert_equal('one', [0] ? 'one' : 'two') 305381c7a1SBram Moolenaar assert_equal('one', #{x: 0} ? 'one' : 'two') 318a7d6542SBram Moolenaar let var = 1 328a7d6542SBram Moolenaar assert_equal('one', var ? 'one' : 'two') 338a7d6542SBram Moolenaar 348a7d6542SBram Moolenaar assert_equal('two', false ? 'one' : 'two') 358a7d6542SBram Moolenaar assert_equal('two', 0 ? 'one' : 'two') 367f829cabSBram Moolenaar if has('float') 378a7d6542SBram Moolenaar assert_equal('two', 0.0 ? 'one' : 'two') 387f829cabSBram Moolenaar endif 398a7d6542SBram Moolenaar assert_equal('two', '' ? 'one' : 'two') 405381c7a1SBram Moolenaar assert_equal('two', 0z ? 'one' : 'two') 418a7d6542SBram Moolenaar assert_equal('two', [] ? 'one' : 'two') 425381c7a1SBram Moolenaar assert_equal('two', {} ? 'one' : 'two') 438a7d6542SBram Moolenaar var = 0 448a7d6542SBram Moolenaar assert_equal('two', var ? 'one' : 'two') 45939b5db4SBram Moolenaar 46939b5db4SBram Moolenaar let Some: func = function('len') 47939b5db4SBram Moolenaar let Other: func = function('winnr') 48939b5db4SBram Moolenaar let Res: func = g:atrue ? Some : Other 49939b5db4SBram Moolenaar assert_equal(function('len'), Res) 50939b5db4SBram Moolenaar 51939b5db4SBram Moolenaar let RetOne: func(string): number = function('len') 52939b5db4SBram Moolenaar let RetTwo: func(string): number = function('winnr') 53939b5db4SBram Moolenaar let RetThat: func = g:atrue ? RetOne : RetTwo 54939b5db4SBram Moolenaar assert_equal(function('len'), RetThat) 55c7db5778SBram Moolenaar 5698b4f145SBram Moolenaar let X = FuncOne 5798b4f145SBram Moolenaar let Y = FuncTwo 58c7db5778SBram Moolenaar let Z = g:cond ? FuncOne : FuncTwo 59c7db5778SBram Moolenaar assert_equal(123, Z(3)) 608a7d6542SBram Moolenaarenddef 618a7d6542SBram Moolenaar 62793648fbSBram Moolenaardef Test_expr1_vimscript() 63fdac71c5SBram Moolenaar # check line continuation 64793648fbSBram Moolenaar let lines =<< trim END 65793648fbSBram Moolenaar vim9script 66793648fbSBram Moolenaar let var = 1 67793648fbSBram Moolenaar ? 'yes' 68793648fbSBram Moolenaar : 'no' 69793648fbSBram Moolenaar assert_equal('yes', var) 70793648fbSBram Moolenaar END 71793648fbSBram Moolenaar CheckScriptSuccess(lines) 72793648fbSBram Moolenaar 73793648fbSBram Moolenaar lines =<< trim END 74793648fbSBram Moolenaar vim9script 75793648fbSBram Moolenaar let var = v:false 76793648fbSBram Moolenaar ? 'yes' 77793648fbSBram Moolenaar : 'no' 78793648fbSBram Moolenaar assert_equal('no', var) 79793648fbSBram Moolenaar END 80793648fbSBram Moolenaar CheckScriptSuccess(lines) 819215f012SBram Moolenaar 829215f012SBram Moolenaar lines =<< trim END 839215f012SBram Moolenaar vim9script 849215f012SBram Moolenaar let var = v:false ? 859215f012SBram Moolenaar 'yes' : 869215f012SBram Moolenaar 'no' 879215f012SBram Moolenaar assert_equal('no', var) 889215f012SBram Moolenaar END 899215f012SBram Moolenaar CheckScriptSuccess(lines) 90fdac71c5SBram Moolenaar 91fdac71c5SBram Moolenaar # check white space 92fdac71c5SBram Moolenaar lines =<< trim END 93fdac71c5SBram Moolenaar vim9script 94fdac71c5SBram Moolenaar let var = v:true?1:2 95fdac71c5SBram Moolenaar END 963affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 97fdac71c5SBram Moolenaar lines =<< trim END 98fdac71c5SBram Moolenaar vim9script 99fdac71c5SBram Moolenaar let var = v:true? 1 : 2 100fdac71c5SBram Moolenaar END 1013affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 102fdac71c5SBram Moolenaar lines =<< trim END 103fdac71c5SBram Moolenaar vim9script 104fdac71c5SBram Moolenaar let var = v:true ?1 : 2 105fdac71c5SBram Moolenaar END 1063affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 107fdac71c5SBram Moolenaar lines =<< trim END 108fdac71c5SBram Moolenaar vim9script 109fdac71c5SBram Moolenaar let var = v:true ? 1: 2 110fdac71c5SBram Moolenaar END 1113affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 112fdac71c5SBram Moolenaar lines =<< trim END 113fdac71c5SBram Moolenaar vim9script 114fdac71c5SBram Moolenaar let var = v:true ? 1 :2 115fdac71c5SBram Moolenaar END 1163affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 11769e44552SBram Moolenaar 11869e44552SBram Moolenaar # check after failure eval_flags is reset 11969e44552SBram Moolenaar lines =<< trim END 12069e44552SBram Moolenaar vim9script 12169e44552SBram Moolenaar try 12269e44552SBram Moolenaar call eval('0 ? 1: 2') 12369e44552SBram Moolenaar catch 12469e44552SBram Moolenaar endtry 12569e44552SBram Moolenaar assert_equal(v:true, eval(string(v:true))) 12669e44552SBram Moolenaar END 12769e44552SBram Moolenaar CheckScriptSuccess(lines) 12869e44552SBram Moolenaar 12969e44552SBram Moolenaar lines =<< trim END 13069e44552SBram Moolenaar vim9script 13169e44552SBram Moolenaar try 13269e44552SBram Moolenaar call eval('0 ? 1 :2') 13369e44552SBram Moolenaar catch 13469e44552SBram Moolenaar endtry 13569e44552SBram Moolenaar assert_equal(v:true, eval(string(v:true))) 13669e44552SBram Moolenaar END 13769e44552SBram Moolenaar CheckScriptSuccess(lines) 138793648fbSBram Moolenaarenddef 139793648fbSBram Moolenaar 1408a7d6542SBram Moolenaarfunc Test_expr1_fails() 1413affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one'"], "Missing ':' after '?'", 1) 1423affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one' : xxx"], "E1001:", 1) 1438a7d6542SBram Moolenaar 1448a7d6542SBram Moolenaar let msg = "white space required before and after '?'" 1453affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1? 'one' : 'two'"], msg, 1) 1463affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ?'one' : 'two'"], msg, 1) 1473affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1?'one' : 'two'"], msg, 1) 1488a7d6542SBram Moolenaar 1498a7d6542SBram Moolenaar let msg = "white space required before and after ':'" 1503affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one': 'two'"], msg, 1) 1513affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one' :'two'"], msg, 1) 1523affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one':'two'"], msg, 1) 153c7db5778SBram Moolenaar 154c7db5778SBram Moolenaar " missing argument detected even when common type is used 155c7db5778SBram Moolenaar call CheckDefFailure([ 15698b4f145SBram Moolenaar \ 'let X = FuncOne', 15798b4f145SBram Moolenaar \ 'let Y = FuncTwo', 158c7db5778SBram Moolenaar \ 'let Z = g:cond ? FuncOne : FuncTwo', 1593affe7a6SBram Moolenaar \ 'Z()'], 'E119:', 4) 1608a7d6542SBram Moolenaarendfunc 1618a7d6542SBram Moolenaar 1628a7d6542SBram Moolenaar" TODO: define inside test function 1638a7d6542SBram Moolenaardef Record(val: any): any 1648a7d6542SBram Moolenaar g:vals->add(val) 1658a7d6542SBram Moolenaar return val 1668a7d6542SBram Moolenaarenddef 1678a7d6542SBram Moolenaar 1688a7d6542SBram Moolenaar" test || 1698a7d6542SBram Moolenaardef Test_expr2() 1708a7d6542SBram Moolenaar assert_equal(2, 2 || 0) 1719c7e6dd6SBram Moolenaar assert_equal(7, 0 || 1729c7e6dd6SBram Moolenaar 0 || 1739c7e6dd6SBram Moolenaar 7) 1748a7d6542SBram Moolenaar assert_equal(0, 0 || 0) 17567fbdfefSBram Moolenaar assert_equal(0, 0 17667fbdfefSBram Moolenaar || 0) 1778a7d6542SBram Moolenaar assert_equal('', 0 || '') 1788a7d6542SBram Moolenaar 1798a7d6542SBram Moolenaar g:vals = [] 1808a7d6542SBram Moolenaar assert_equal(3, Record(3) || Record(1)) 1818a7d6542SBram Moolenaar assert_equal([3], g:vals) 1828a7d6542SBram Moolenaar 1838a7d6542SBram Moolenaar g:vals = [] 1848a7d6542SBram Moolenaar assert_equal(5, Record(0) || Record(5)) 1858a7d6542SBram Moolenaar assert_equal([0, 5], g:vals) 1868a7d6542SBram Moolenaar 1878a7d6542SBram Moolenaar g:vals = [] 18867fbdfefSBram Moolenaar assert_equal(4, Record(0) 18967fbdfefSBram Moolenaar || Record(4) 19067fbdfefSBram Moolenaar || Record(0)) 1918a7d6542SBram Moolenaar assert_equal([0, 4], g:vals) 1928a7d6542SBram Moolenaar 1938a7d6542SBram Moolenaar g:vals = [] 1948a7d6542SBram Moolenaar assert_equal(0, Record([]) || Record('') || Record(0)) 1958a7d6542SBram Moolenaar assert_equal([[], '', 0], g:vals) 1968a7d6542SBram Moolenaarenddef 1978a7d6542SBram Moolenaar 198be7ee488SBram Moolenaardef Test_expr2_vimscript() 199f5be8cdbSBram Moolenaar # check line continuation 200be7ee488SBram Moolenaar let lines =<< trim END 201be7ee488SBram Moolenaar vim9script 202be7ee488SBram Moolenaar let var = 0 203be7ee488SBram Moolenaar || 1 204be7ee488SBram Moolenaar assert_equal(1, var) 205be7ee488SBram Moolenaar END 206be7ee488SBram Moolenaar CheckScriptSuccess(lines) 207be7ee488SBram Moolenaar 208be7ee488SBram Moolenaar lines =<< trim END 209be7ee488SBram Moolenaar vim9script 210be7ee488SBram Moolenaar let var = v:false 211be7ee488SBram Moolenaar || v:true 212be7ee488SBram Moolenaar || v:false 2138c34ea54SBram Moolenaar assert_equal(v:true, var) 214be7ee488SBram Moolenaar END 215be7ee488SBram Moolenaar CheckScriptSuccess(lines) 2169215f012SBram Moolenaar 2179215f012SBram Moolenaar lines =<< trim END 2189215f012SBram Moolenaar vim9script 2199215f012SBram Moolenaar let var = v:false || 2209215f012SBram Moolenaar v:true || 2219215f012SBram Moolenaar v:false 2228c34ea54SBram Moolenaar assert_equal(v:true, var) 2238c34ea54SBram Moolenaar END 2248c34ea54SBram Moolenaar CheckScriptSuccess(lines) 2258c34ea54SBram Moolenaar 2263c1c9fd9SBram Moolenaar # check white space 2273c1c9fd9SBram Moolenaar lines =<< trim END 2283c1c9fd9SBram Moolenaar vim9script 2293c1c9fd9SBram Moolenaar let var = v:true||v:true 2303c1c9fd9SBram Moolenaar END 2313affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 2323c1c9fd9SBram Moolenaar lines =<< trim END 2333c1c9fd9SBram Moolenaar vim9script 2343c1c9fd9SBram Moolenaar let var = v:true ||v:true 2353c1c9fd9SBram Moolenaar END 2363affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 2373c1c9fd9SBram Moolenaar lines =<< trim END 2383c1c9fd9SBram Moolenaar vim9script 2393c1c9fd9SBram Moolenaar let var = v:true|| v:true 2403c1c9fd9SBram Moolenaar END 2413affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 2423c1c9fd9SBram Moolenaar 243f5be8cdbSBram Moolenaar # check keeping the value 2448c34ea54SBram Moolenaar lines =<< trim END 2458c34ea54SBram Moolenaar vim9script 2468c34ea54SBram Moolenaar assert_equal(2, 2 || 0) 2478c34ea54SBram Moolenaar assert_equal(7, 0 || 2488c34ea54SBram Moolenaar 0 || 2498c34ea54SBram Moolenaar 7) 2508c34ea54SBram Moolenaar assert_equal(0, 0 || 0) 2518c34ea54SBram Moolenaar assert_equal(0, 0 2528c34ea54SBram Moolenaar || 0) 2538c34ea54SBram Moolenaar assert_equal('', 0 || '') 2548c34ea54SBram Moolenaar 2558c34ea54SBram Moolenaar g:vals = [] 2568c34ea54SBram Moolenaar assert_equal(3, Record(3) || Record(1)) 2578c34ea54SBram Moolenaar assert_equal([3], g:vals) 2588c34ea54SBram Moolenaar 2598c34ea54SBram Moolenaar g:vals = [] 2608c34ea54SBram Moolenaar assert_equal(5, Record(0) || Record(5)) 2618c34ea54SBram Moolenaar assert_equal([0, 5], g:vals) 2628c34ea54SBram Moolenaar 2638c34ea54SBram Moolenaar g:vals = [] 2648c34ea54SBram Moolenaar assert_equal(4, Record(0) 2658c34ea54SBram Moolenaar || Record(4) 2668c34ea54SBram Moolenaar || Record(0)) 2678c34ea54SBram Moolenaar assert_equal([0, 4], g:vals) 2688c34ea54SBram Moolenaar 2698c34ea54SBram Moolenaar g:vals = [] 2708c34ea54SBram Moolenaar assert_equal(0, Record([]) || Record('') || Record(0)) 2718c34ea54SBram Moolenaar assert_equal([[], '', 0], g:vals) 2729215f012SBram Moolenaar END 2739215f012SBram Moolenaar CheckScriptSuccess(lines) 274be7ee488SBram Moolenaarenddef 275be7ee488SBram Moolenaar 2768a7d6542SBram Moolenaarfunc Test_expr2_fails() 2778a7d6542SBram Moolenaar let msg = "white space required before and after '||'" 2783affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1||2"], msg, 1) 2793affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ||2"], msg, 1) 2803affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1|| 2"], msg, 1) 281a8c17704SBram Moolenaar 2823affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 || xxx"], 'E1001:', 1) 2838a7d6542SBram Moolenaarendfunc 2848a7d6542SBram Moolenaar 2858a7d6542SBram Moolenaar" test && 2868a7d6542SBram Moolenaardef Test_expr3() 2878a7d6542SBram Moolenaar assert_equal(0, 2 && 0) 2889c7e6dd6SBram Moolenaar assert_equal(0, 0 && 2899c7e6dd6SBram Moolenaar 0 && 2909c7e6dd6SBram Moolenaar 7) 29167fbdfefSBram Moolenaar assert_equal(7, 2 29267fbdfefSBram Moolenaar && 3 29367fbdfefSBram Moolenaar && 7) 2948a7d6542SBram Moolenaar assert_equal(0, 0 && 0) 2958a7d6542SBram Moolenaar assert_equal(0, 0 && '') 2968a7d6542SBram Moolenaar assert_equal('', 8 && '') 2978a7d6542SBram Moolenaar 2988a7d6542SBram Moolenaar g:vals = [] 2998a7d6542SBram Moolenaar assert_equal(1, Record(3) && Record(1)) 3008a7d6542SBram Moolenaar assert_equal([3, 1], g:vals) 3018a7d6542SBram Moolenaar 3028a7d6542SBram Moolenaar g:vals = [] 3038a7d6542SBram Moolenaar assert_equal(0, Record(0) && Record(5)) 3048a7d6542SBram Moolenaar assert_equal([0], g:vals) 3058a7d6542SBram Moolenaar 3068a7d6542SBram Moolenaar g:vals = [] 3078a7d6542SBram Moolenaar assert_equal(0, Record(0) && Record(4) && Record(0)) 3088a7d6542SBram Moolenaar assert_equal([0], g:vals) 3098a7d6542SBram Moolenaar 3108a7d6542SBram Moolenaar g:vals = [] 3118a7d6542SBram Moolenaar assert_equal(0, Record(8) && Record(4) && Record(0)) 3128a7d6542SBram Moolenaar assert_equal([8, 4, 0], g:vals) 3138a7d6542SBram Moolenaar 3148a7d6542SBram Moolenaar g:vals = [] 3158a7d6542SBram Moolenaar assert_equal(0, Record([1]) && Record('z') && Record(0)) 3168a7d6542SBram Moolenaar assert_equal([[1], 'z', 0], g:vals) 3178a7d6542SBram Moolenaarenddef 3188a7d6542SBram Moolenaar 319be7ee488SBram Moolenaardef Test_expr3_vimscript() 320f5be8cdbSBram Moolenaar # check line continuation 321be7ee488SBram Moolenaar let lines =<< trim END 322be7ee488SBram Moolenaar vim9script 323be7ee488SBram Moolenaar let var = 0 324be7ee488SBram Moolenaar && 1 325be7ee488SBram Moolenaar assert_equal(0, var) 326be7ee488SBram Moolenaar END 327be7ee488SBram Moolenaar CheckScriptSuccess(lines) 328be7ee488SBram Moolenaar 329be7ee488SBram Moolenaar lines =<< trim END 330be7ee488SBram Moolenaar vim9script 331be7ee488SBram Moolenaar let var = v:true 332be7ee488SBram Moolenaar && v:true 333be7ee488SBram Moolenaar && v:true 3348c34ea54SBram Moolenaar assert_equal(v:true, var) 335be7ee488SBram Moolenaar END 336be7ee488SBram Moolenaar CheckScriptSuccess(lines) 3379215f012SBram Moolenaar 3389215f012SBram Moolenaar lines =<< trim END 3399215f012SBram Moolenaar vim9script 3409215f012SBram Moolenaar let var = v:true && 3419215f012SBram Moolenaar v:true && 3429215f012SBram Moolenaar v:true 3438c34ea54SBram Moolenaar assert_equal(v:true, var) 3448c34ea54SBram Moolenaar END 3458c34ea54SBram Moolenaar CheckScriptSuccess(lines) 3468c34ea54SBram Moolenaar 3473c1c9fd9SBram Moolenaar # check white space 3483c1c9fd9SBram Moolenaar lines =<< trim END 3493c1c9fd9SBram Moolenaar vim9script 3503c1c9fd9SBram Moolenaar let var = v:true&&v:true 3513c1c9fd9SBram Moolenaar END 3523affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 3533c1c9fd9SBram Moolenaar lines =<< trim END 3543c1c9fd9SBram Moolenaar vim9script 3553c1c9fd9SBram Moolenaar let var = v:true &&v:true 3563c1c9fd9SBram Moolenaar END 3573affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 3583c1c9fd9SBram Moolenaar lines =<< trim END 3593c1c9fd9SBram Moolenaar vim9script 3603c1c9fd9SBram Moolenaar let var = v:true&& v:true 3613c1c9fd9SBram Moolenaar END 3623affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 3633c1c9fd9SBram Moolenaar 364f5be8cdbSBram Moolenaar # check keeping the value 3658c34ea54SBram Moolenaar lines =<< trim END 3668c34ea54SBram Moolenaar vim9script 3678c34ea54SBram Moolenaar assert_equal(0, 2 && 0) 3688c34ea54SBram Moolenaar assert_equal(0, 0 && 3698c34ea54SBram Moolenaar 0 && 3708c34ea54SBram Moolenaar 7) 3718c34ea54SBram Moolenaar assert_equal(7, 2 3728c34ea54SBram Moolenaar && 3 3738c34ea54SBram Moolenaar && 7) 3748c34ea54SBram Moolenaar assert_equal(0, 0 && 0) 3758c34ea54SBram Moolenaar assert_equal(0, 0 && '') 3768c34ea54SBram Moolenaar assert_equal('', 8 && '') 3778c34ea54SBram Moolenaar 3788c34ea54SBram Moolenaar g:vals = [] 3798c34ea54SBram Moolenaar assert_equal(1, Record(3) && Record(1)) 3808c34ea54SBram Moolenaar assert_equal([3, 1], g:vals) 3818c34ea54SBram Moolenaar 3828c34ea54SBram Moolenaar g:vals = [] 3838c34ea54SBram Moolenaar assert_equal(0, Record(0) && Record(5)) 3848c34ea54SBram Moolenaar assert_equal([0], g:vals) 3858c34ea54SBram Moolenaar 3868c34ea54SBram Moolenaar g:vals = [] 3878c34ea54SBram Moolenaar assert_equal(0, Record(0) && Record(4) && Record(0)) 3888c34ea54SBram Moolenaar assert_equal([0], g:vals) 3898c34ea54SBram Moolenaar 3908c34ea54SBram Moolenaar g:vals = [] 3918c34ea54SBram Moolenaar assert_equal(0, Record(8) && Record(4) && Record(0)) 3928c34ea54SBram Moolenaar assert_equal([8, 4, 0], g:vals) 3938c34ea54SBram Moolenaar 3948c34ea54SBram Moolenaar g:vals = [] 3958c34ea54SBram Moolenaar assert_equal(0, Record([1]) && Record('z') && Record(0)) 3968c34ea54SBram Moolenaar assert_equal([[1], 'z', 0], g:vals) 3979215f012SBram Moolenaar END 3989215f012SBram Moolenaar CheckScriptSuccess(lines) 399be7ee488SBram Moolenaarenddef 400be7ee488SBram Moolenaar 4018a7d6542SBram Moolenaarfunc Test_expr3_fails() 4028a7d6542SBram Moolenaar let msg = "white space required before and after '&&'" 4033affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1&&2"], msg, 1) 4043affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 &&2"], msg, 1) 4053affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1&& 2"], msg, 1) 4068a7d6542SBram Moolenaarendfunc 4078a7d6542SBram Moolenaar 40856acb094SBram Moolenaar" global variables to use for tests with the "any" type 4098a7d6542SBram Moolenaarlet atrue = v:true 4108a7d6542SBram Moolenaarlet afalse = v:false 4118a7d6542SBram Moolenaarlet anone = v:none 4128a7d6542SBram Moolenaarlet anull = v:null 4138a7d6542SBram Moolenaarlet anint = 10 41456acb094SBram Moolenaarlet theone = 1 41556acb094SBram Moolenaarlet thefour = 4 4168a7d6542SBram Moolenaarif has('float') 4178a7d6542SBram Moolenaar let afloat = 0.1 4188a7d6542SBram Moolenaarendif 4198a7d6542SBram Moolenaarlet astring = 'asdf' 4208a7d6542SBram Moolenaarlet ablob = 0z01ab 4218a7d6542SBram Moolenaarlet alist = [2, 3, 4] 4228a7d6542SBram Moolenaarlet adict = #{aaa: 2, bbb: 8} 4238a7d6542SBram Moolenaar 4248a7d6542SBram Moolenaar" test == comperator 4258a7d6542SBram Moolenaardef Test_expr4_equal() 42666b31016SBram Moolenaar let trueVar = true 42766b31016SBram Moolenaar let falseVar = false 4288a7d6542SBram Moolenaar assert_equal(true, true == true) 4299c7e6dd6SBram Moolenaar assert_equal(false, true == 4309c7e6dd6SBram Moolenaar false) 43167fbdfefSBram Moolenaar assert_equal(true, true 43267fbdfefSBram Moolenaar == trueVar) 43366b31016SBram Moolenaar assert_equal(false, true == falseVar) 4348a7d6542SBram Moolenaar assert_equal(true, true == g:atrue) 4358a7d6542SBram Moolenaar assert_equal(false, g:atrue == false) 4368a7d6542SBram Moolenaar 4378a7d6542SBram Moolenaar assert_equal(true, v:none == v:none) 4388a7d6542SBram Moolenaar assert_equal(false, v:none == v:null) 4398a7d6542SBram Moolenaar assert_equal(true, g:anone == v:none) 4408a7d6542SBram Moolenaar assert_equal(false, v:none == g:anull) 4418a7d6542SBram Moolenaar 44266b31016SBram Moolenaar let nr0 = 0 44366b31016SBram Moolenaar let nr61 = 61 4448a7d6542SBram Moolenaar assert_equal(false, 2 == 0) 44566b31016SBram Moolenaar assert_equal(false, 2 == nr0) 4468a7d6542SBram Moolenaar assert_equal(true, 61 == 61) 44766b31016SBram Moolenaar assert_equal(true, 61 == nr61) 4488a7d6542SBram Moolenaar assert_equal(true, g:anint == 10) 4498a7d6542SBram Moolenaar assert_equal(false, 61 == g:anint) 4508a7d6542SBram Moolenaar 4518a7d6542SBram Moolenaar if has('float') 4524aeeb639SBram Moolenaar let ff = 0.3 4534aeeb639SBram Moolenaar assert_equal(true, ff == 0.3) 4544aeeb639SBram Moolenaar assert_equal(false, 0.4 == ff) 4558a7d6542SBram Moolenaar assert_equal(true, 0.1 == g:afloat) 4568a7d6542SBram Moolenaar assert_equal(false, g:afloat == 0.3) 4578a7d6542SBram Moolenaar 4584aeeb639SBram Moolenaar ff = 3.0 4594aeeb639SBram Moolenaar assert_equal(true, ff == 3) 4604aeeb639SBram Moolenaar assert_equal(true, 3 == ff) 4614aeeb639SBram Moolenaar ff = 3.1 4624aeeb639SBram Moolenaar assert_equal(false, ff == 3) 4634aeeb639SBram Moolenaar assert_equal(false, 3 == ff) 4648a7d6542SBram Moolenaar endif 4658a7d6542SBram Moolenaar 4668a7d6542SBram Moolenaar assert_equal(true, 'abc' == 'abc') 4678a7d6542SBram Moolenaar assert_equal(false, 'xyz' == 'abc') 4688a7d6542SBram Moolenaar assert_equal(true, g:astring == 'asdf') 4698a7d6542SBram Moolenaar assert_equal(false, 'xyz' == g:astring) 4708a7d6542SBram Moolenaar 4719be61bbbSBram Moolenaar assert_equal(false, 'abc' == 'aBc') 4729be61bbbSBram Moolenaar assert_equal(false, 'abc' ==# 'aBc') 4739be61bbbSBram Moolenaar assert_equal(true, 'abc' ==? 'aBc') 4749be61bbbSBram Moolenaar 4758a7d6542SBram Moolenaar assert_equal(false, 'abc' == 'ABC') 4768a7d6542SBram Moolenaar set ignorecase 4778a7d6542SBram Moolenaar assert_equal(false, 'abc' == 'ABC') 4789be61bbbSBram Moolenaar assert_equal(false, 'abc' ==# 'ABC') 4798a7d6542SBram Moolenaar set noignorecase 4808a7d6542SBram Moolenaar 4813affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' == xxx"], 'E1001:', 1) 4829be61bbbSBram Moolenaar 4834aeeb639SBram Moolenaar let bb = 0z3f 4844aeeb639SBram Moolenaar assert_equal(true, 0z3f == bb) 4854aeeb639SBram Moolenaar assert_equal(false, bb == 0z4f) 4868a7d6542SBram Moolenaar assert_equal(true, g:ablob == 0z01ab) 4878a7d6542SBram Moolenaar assert_equal(false, 0z3f == g:ablob) 4888a7d6542SBram Moolenaar 4898a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] == [1, 2, 3]) 4908a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] == [2, 3, 1]) 4918a7d6542SBram Moolenaar assert_equal(true, [2, 3, 4] == g:alist) 4928a7d6542SBram Moolenaar assert_equal(false, g:alist == [2, 3, 1]) 4938a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] == []) 4948a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] == ['1', '2', '3']) 4958a7d6542SBram Moolenaar 4968a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} == #{one: 1, two: 2}) 4978a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} == #{one: 2, two: 2}) 4988a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} == #{two: 2}) 4998a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} == #{}) 5008a7d6542SBram Moolenaar assert_equal(true, g:adict == #{bbb: 8, aaa: 2}) 5018a7d6542SBram Moolenaar assert_equal(false, #{ccc: 9, aaa: 2} == g:adict) 5028a7d6542SBram Moolenaar 5034c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal') == function('g:Test_expr4_equal')) 5044c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal') == function('g:Test_expr4_is')) 5058a7d6542SBram Moolenaar 5064c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [123])) 5074c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_is', [123])) 5084c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [999])) 509a0a9f43aSBram Moolenaar 510a0a9f43aSBram Moolenaar let OneFunc: func 511a0a9f43aSBram Moolenaar let TwoFunc: func 512a0a9f43aSBram Moolenaar OneFunc = function('len') 513a0a9f43aSBram Moolenaar TwoFunc = function('len') 514a0a9f43aSBram Moolenaar assert_equal(true, OneFunc('abc') == TwoFunc('123')) 5158a7d6542SBram Moolenaarenddef 5168a7d6542SBram Moolenaar 5178a7d6542SBram Moolenaar" test != comperator 5188a7d6542SBram Moolenaardef Test_expr4_notequal() 51966b31016SBram Moolenaar let trueVar = true 52066b31016SBram Moolenaar let falseVar = false 5218a7d6542SBram Moolenaar assert_equal(false, true != true) 5229c7e6dd6SBram Moolenaar assert_equal(true, true != 5239c7e6dd6SBram Moolenaar false) 52467fbdfefSBram Moolenaar assert_equal(false, true 52567fbdfefSBram Moolenaar != trueVar) 52666b31016SBram Moolenaar assert_equal(true, true != falseVar) 5278a7d6542SBram Moolenaar assert_equal(false, true != g:atrue) 5288a7d6542SBram Moolenaar assert_equal(true, g:atrue != false) 5298a7d6542SBram Moolenaar 5308a7d6542SBram Moolenaar assert_equal(false, v:none != v:none) 5318a7d6542SBram Moolenaar assert_equal(true, v:none != v:null) 5328a7d6542SBram Moolenaar assert_equal(false, g:anone != v:none) 5338a7d6542SBram Moolenaar assert_equal(true, v:none != g:anull) 5348a7d6542SBram Moolenaar 53566b31016SBram Moolenaar let nr55 = 55 53666b31016SBram Moolenaar let nr0 = 55 5378a7d6542SBram Moolenaar assert_equal(true, 2 != 0) 53866b31016SBram Moolenaar assert_equal(true, 2 != nr0) 5398a7d6542SBram Moolenaar assert_equal(false, 55 != 55) 54066b31016SBram Moolenaar assert_equal(false, 55 != nr55) 5418a7d6542SBram Moolenaar assert_equal(false, g:anint != 10) 5428a7d6542SBram Moolenaar assert_equal(true, 61 != g:anint) 5438a7d6542SBram Moolenaar 5448a7d6542SBram Moolenaar if has('float') 5454aeeb639SBram Moolenaar let ff = 0.3 5464aeeb639SBram Moolenaar assert_equal(false, 0.3 != ff) 5474aeeb639SBram Moolenaar assert_equal(true, 0.4 != ff) 5488a7d6542SBram Moolenaar assert_equal(false, 0.1 != g:afloat) 5498a7d6542SBram Moolenaar assert_equal(true, g:afloat != 0.3) 5508a7d6542SBram Moolenaar 5514aeeb639SBram Moolenaar ff = 3.0 5524aeeb639SBram Moolenaar assert_equal(false, ff != 3) 5534aeeb639SBram Moolenaar assert_equal(false, 3 != ff) 5544aeeb639SBram Moolenaar ff = 3.1 5554aeeb639SBram Moolenaar assert_equal(true, ff != 3) 5564aeeb639SBram Moolenaar assert_equal(true, 3 != ff) 5578a7d6542SBram Moolenaar endif 5588a7d6542SBram Moolenaar 5598a7d6542SBram Moolenaar assert_equal(false, 'abc' != 'abc') 5608a7d6542SBram Moolenaar assert_equal(true, 'xyz' != 'abc') 5618a7d6542SBram Moolenaar assert_equal(false, g:astring != 'asdf') 5628a7d6542SBram Moolenaar assert_equal(true, 'xyz' != g:astring) 5638a7d6542SBram Moolenaar 5648a7d6542SBram Moolenaar assert_equal(true, 'abc' != 'ABC') 5658a7d6542SBram Moolenaar set ignorecase 5668a7d6542SBram Moolenaar assert_equal(true, 'abc' != 'ABC') 5678a7d6542SBram Moolenaar set noignorecase 5688a7d6542SBram Moolenaar 5694aeeb639SBram Moolenaar let bb = 0z3f 5704aeeb639SBram Moolenaar assert_equal(false, 0z3f != bb) 5714aeeb639SBram Moolenaar assert_equal(true, bb != 0z4f) 5728a7d6542SBram Moolenaar assert_equal(false, g:ablob != 0z01ab) 5738a7d6542SBram Moolenaar assert_equal(true, 0z3f != g:ablob) 5748a7d6542SBram Moolenaar 5758a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] != [1, 2, 3]) 5768a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] != [2, 3, 1]) 5778a7d6542SBram Moolenaar assert_equal(false, [2, 3, 4] != g:alist) 5788a7d6542SBram Moolenaar assert_equal(true, g:alist != [2, 3, 1]) 5798a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] != []) 5808a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] != ['1', '2', '3']) 5818a7d6542SBram Moolenaar 5828a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} != #{one: 1, two: 2}) 5838a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} != #{one: 2, two: 2}) 5848a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} != #{two: 2}) 5858a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} != #{}) 5868a7d6542SBram Moolenaar assert_equal(false, g:adict != #{bbb: 8, aaa: 2}) 5878a7d6542SBram Moolenaar assert_equal(true, #{ccc: 9, aaa: 2} != g:adict) 5888a7d6542SBram Moolenaar 5894c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal') != function('g:Test_expr4_equal')) 5904c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal') != function('g:Test_expr4_is')) 5918a7d6542SBram Moolenaar 5924c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123])) 5934c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123])) 5944c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999])) 5958a7d6542SBram Moolenaarenddef 5968a7d6542SBram Moolenaar 5978a7d6542SBram Moolenaar" test > comperator 5988a7d6542SBram Moolenaardef Test_expr4_greater() 5990062c2d4SBram Moolenaar assert_true(2 > 0) 6009c7e6dd6SBram Moolenaar assert_true(2 > 6019c7e6dd6SBram Moolenaar 1) 6020062c2d4SBram Moolenaar assert_false(2 > 2) 6030062c2d4SBram Moolenaar assert_false(2 > 3) 60466b31016SBram Moolenaar let nr2 = 2 60566b31016SBram Moolenaar assert_true(nr2 > 0) 60666b31016SBram Moolenaar assert_true(nr2 > 60766b31016SBram Moolenaar 1) 60866b31016SBram Moolenaar assert_false(nr2 > 2) 60967fbdfefSBram Moolenaar assert_false(nr2 61067fbdfefSBram Moolenaar > 3) 6110062c2d4SBram Moolenaar if has('float') 6124aeeb639SBram Moolenaar let ff = 2.0 6134aeeb639SBram Moolenaar assert_true(ff > 0.0) 6144aeeb639SBram Moolenaar assert_true(ff > 1.0) 6154aeeb639SBram Moolenaar assert_false(ff > 2.0) 6164aeeb639SBram Moolenaar assert_false(ff > 3.0) 6170062c2d4SBram Moolenaar endif 6188a7d6542SBram Moolenaarenddef 6198a7d6542SBram Moolenaar 6208a7d6542SBram Moolenaar" test >= comperator 6218a7d6542SBram Moolenaardef Test_expr4_greaterequal() 6220062c2d4SBram Moolenaar assert_true(2 >= 0) 6239c7e6dd6SBram Moolenaar assert_true(2 >= 6249c7e6dd6SBram Moolenaar 2) 6250062c2d4SBram Moolenaar assert_false(2 >= 3) 62666b31016SBram Moolenaar let nr2 = 2 62766b31016SBram Moolenaar assert_true(nr2 >= 0) 62866b31016SBram Moolenaar assert_true(nr2 >= 2) 62966b31016SBram Moolenaar assert_false(nr2 >= 3) 6300062c2d4SBram Moolenaar if has('float') 6314aeeb639SBram Moolenaar let ff = 2.0 6324aeeb639SBram Moolenaar assert_true(ff >= 0.0) 6334aeeb639SBram Moolenaar assert_true(ff >= 2.0) 6344aeeb639SBram Moolenaar assert_false(ff >= 3.0) 6350062c2d4SBram Moolenaar endif 6368a7d6542SBram Moolenaarenddef 6378a7d6542SBram Moolenaar 6388a7d6542SBram Moolenaar" test < comperator 6398a7d6542SBram Moolenaardef Test_expr4_smaller() 6400062c2d4SBram Moolenaar assert_false(2 < 0) 6419c7e6dd6SBram Moolenaar assert_false(2 < 6429c7e6dd6SBram Moolenaar 2) 64367fbdfefSBram Moolenaar assert_true(2 64467fbdfefSBram Moolenaar < 3) 64566b31016SBram Moolenaar let nr2 = 2 64666b31016SBram Moolenaar assert_false(nr2 < 0) 64766b31016SBram Moolenaar assert_false(nr2 < 2) 64866b31016SBram Moolenaar assert_true(nr2 < 3) 6490062c2d4SBram Moolenaar if has('float') 6504aeeb639SBram Moolenaar let ff = 2.0 6514aeeb639SBram Moolenaar assert_false(ff < 0.0) 6524aeeb639SBram Moolenaar assert_false(ff < 2.0) 6534aeeb639SBram Moolenaar assert_true(ff < 3.0) 6540062c2d4SBram Moolenaar endif 6558a7d6542SBram Moolenaarenddef 6568a7d6542SBram Moolenaar 6578a7d6542SBram Moolenaar" test <= comperator 6588a7d6542SBram Moolenaardef Test_expr4_smallerequal() 6590062c2d4SBram Moolenaar assert_false(2 <= 0) 6609c7e6dd6SBram Moolenaar assert_false(2 <= 6619c7e6dd6SBram Moolenaar 1) 66267fbdfefSBram Moolenaar assert_true(2 66367fbdfefSBram Moolenaar <= 2) 6640062c2d4SBram Moolenaar assert_true(2 <= 3) 66566b31016SBram Moolenaar let nr2 = 2 66666b31016SBram Moolenaar assert_false(nr2 <= 0) 66766b31016SBram Moolenaar assert_false(nr2 <= 1) 66866b31016SBram Moolenaar assert_true(nr2 <= 2) 66966b31016SBram Moolenaar assert_true(nr2 <= 3) 6700062c2d4SBram Moolenaar if has('float') 6714aeeb639SBram Moolenaar let ff = 2.0 6724aeeb639SBram Moolenaar assert_false(ff <= 0.0) 6734aeeb639SBram Moolenaar assert_false(ff <= 1.0) 6744aeeb639SBram Moolenaar assert_true(ff <= 2.0) 6754aeeb639SBram Moolenaar assert_true(ff <= 3.0) 6760062c2d4SBram Moolenaar endif 6778a7d6542SBram Moolenaarenddef 6788a7d6542SBram Moolenaar 6798a7d6542SBram Moolenaar" test =~ comperator 6808a7d6542SBram Moolenaardef Test_expr4_match() 6818a7d6542SBram Moolenaar assert_equal(false, '2' =~ '0') 68267fbdfefSBram Moolenaar assert_equal(false, '' 68367fbdfefSBram Moolenaar =~ '0') 6849c7e6dd6SBram Moolenaar assert_equal(true, '2' =~ 6859c7e6dd6SBram Moolenaar '[0-9]') 6868a7d6542SBram Moolenaarenddef 6878a7d6542SBram Moolenaar 6888a7d6542SBram Moolenaar" test !~ comperator 6898a7d6542SBram Moolenaardef Test_expr4_nomatch() 6908a7d6542SBram Moolenaar assert_equal(true, '2' !~ '0') 69167fbdfefSBram Moolenaar assert_equal(true, '' 69267fbdfefSBram Moolenaar !~ '0') 6939c7e6dd6SBram Moolenaar assert_equal(false, '2' !~ 6949c7e6dd6SBram Moolenaar '[0-9]') 6958a7d6542SBram Moolenaarenddef 6968a7d6542SBram Moolenaar 6978a7d6542SBram Moolenaar" test is comperator 6988a7d6542SBram Moolenaardef Test_expr4_is() 6998a7d6542SBram Moolenaar let mylist = [2] 7000062c2d4SBram Moolenaar assert_false(mylist is [2]) 7018a7d6542SBram Moolenaar let other = mylist 7029c7e6dd6SBram Moolenaar assert_true(mylist is 7039c7e6dd6SBram Moolenaar other) 7040062c2d4SBram Moolenaar 7050062c2d4SBram Moolenaar let myblob = 0z1234 70667fbdfefSBram Moolenaar assert_false(myblob 70767fbdfefSBram Moolenaar is 0z1234) 7080062c2d4SBram Moolenaar let otherblob = myblob 7090062c2d4SBram Moolenaar assert_true(myblob is otherblob) 7108a7d6542SBram Moolenaarenddef 7118a7d6542SBram Moolenaar 7128a7d6542SBram Moolenaar" test isnot comperator 7138a7d6542SBram Moolenaardef Test_expr4_isnot() 7148a7d6542SBram Moolenaar let mylist = [2] 7150062c2d4SBram Moolenaar assert_true('2' isnot '0') 7160062c2d4SBram Moolenaar assert_true(mylist isnot [2]) 7178a7d6542SBram Moolenaar let other = mylist 7189c7e6dd6SBram Moolenaar assert_false(mylist isnot 7199c7e6dd6SBram Moolenaar other) 7200062c2d4SBram Moolenaar 7210062c2d4SBram Moolenaar let myblob = 0z1234 72267fbdfefSBram Moolenaar assert_true(myblob 72367fbdfefSBram Moolenaar isnot 0z1234) 7240062c2d4SBram Moolenaar let otherblob = myblob 7250062c2d4SBram Moolenaar assert_false(myblob isnot otherblob) 7268a7d6542SBram Moolenaarenddef 7278a7d6542SBram Moolenaar 7288a7d6542SBram Moolenaardef RetVoid() 7298a7d6542SBram Moolenaar let x = 1 7308a7d6542SBram Moolenaarenddef 7318a7d6542SBram Moolenaar 7328294d499SBram Moolenaardef Test_expr4_vim9script() 733f5be8cdbSBram Moolenaar # check line continuation 734e6536aa7SBram Moolenaar let lines =<< trim END 735e6536aa7SBram Moolenaar vim9script 736e6536aa7SBram Moolenaar let var = 0 737e6536aa7SBram Moolenaar < 1 738c71f36a8SBram Moolenaar assert_equal(true, var) 739e6536aa7SBram Moolenaar END 740e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 741e6536aa7SBram Moolenaar 742e6536aa7SBram Moolenaar lines =<< trim END 743e6536aa7SBram Moolenaar vim9script 744e6536aa7SBram Moolenaar let var = 123 745e6536aa7SBram Moolenaar != 123 746c71f36a8SBram Moolenaar assert_equal(false, var) 747e6536aa7SBram Moolenaar END 748e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 749e6536aa7SBram Moolenaar 750e6536aa7SBram Moolenaar lines =<< trim END 751e6536aa7SBram Moolenaar vim9script 7529215f012SBram Moolenaar let var = 123 == 7539215f012SBram Moolenaar 123 754c71f36a8SBram Moolenaar assert_equal(true, var) 7559215f012SBram Moolenaar END 7569215f012SBram Moolenaar CheckScriptSuccess(lines) 7579215f012SBram Moolenaar 7589215f012SBram Moolenaar lines =<< trim END 7599215f012SBram Moolenaar vim9script 760e6536aa7SBram Moolenaar let list = [1, 2, 3] 761e6536aa7SBram Moolenaar let var = list 762e6536aa7SBram Moolenaar is list 763c71f36a8SBram Moolenaar assert_equal(true, var) 764e6536aa7SBram Moolenaar END 765e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 766e6536aa7SBram Moolenaar 767e6536aa7SBram Moolenaar lines =<< trim END 768e6536aa7SBram Moolenaar vim9script 769e6536aa7SBram Moolenaar let myblob = 0z1234 770e6536aa7SBram Moolenaar let var = myblob 771e6536aa7SBram Moolenaar isnot 0z11 772c71f36a8SBram Moolenaar assert_equal(true, var) 773e6536aa7SBram Moolenaar END 774e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 775543e6f34SBram Moolenaar 776f5be8cdbSBram Moolenaar # spot check mismatching types 777543e6f34SBram Moolenaar lines =<< trim END 778543e6f34SBram Moolenaar vim9script 779543e6f34SBram Moolenaar echo '' == 0 780543e6f34SBram Moolenaar END 7813affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1072:', 2) 782543e6f34SBram Moolenaar 783543e6f34SBram Moolenaar lines =<< trim END 784543e6f34SBram Moolenaar vim9script 785543e6f34SBram Moolenaar echo v:true > v:false 786543e6f34SBram Moolenaar END 7873affe7a6SBram Moolenaar CheckScriptFailure(lines, 'Cannot compare bool with bool', 2) 788543e6f34SBram Moolenaar 789543e6f34SBram Moolenaar lines =<< trim END 790543e6f34SBram Moolenaar vim9script 791543e6f34SBram Moolenaar echo 123 is 123 792543e6f34SBram Moolenaar END 7933affe7a6SBram Moolenaar CheckScriptFailure(lines, 'Cannot use "is" with number', 2) 794c71f36a8SBram Moolenaar 795c71f36a8SBram Moolenaar # check 'ignorecase' not being used 796c71f36a8SBram Moolenaar lines =<< trim END 797c71f36a8SBram Moolenaar vim9script 798c71f36a8SBram Moolenaar set ignorecase 799c71f36a8SBram Moolenaar assert_equal(false, 'abc' == 'ABC') 800c71f36a8SBram Moolenaar assert_equal(false, 'abc' ==# 'ABC') 801c71f36a8SBram Moolenaar assert_equal(true, 'abc' ==? 'ABC') 802c71f36a8SBram Moolenaar 803c71f36a8SBram Moolenaar assert_equal(true, 'abc' != 'ABC') 804c71f36a8SBram Moolenaar assert_equal(true, 'abc' !=# 'ABC') 805c71f36a8SBram Moolenaar assert_equal(false, 'abc' !=? 'ABC') 806c71f36a8SBram Moolenaar 807c71f36a8SBram Moolenaar assert_equal(false, 'abc' =~ 'ABC') 808c71f36a8SBram Moolenaar assert_equal(false, 'abc' =~# 'ABC') 809c71f36a8SBram Moolenaar assert_equal(true, 'abc' =~? 'ABC') 810c71f36a8SBram Moolenaar set noignorecase 811c71f36a8SBram Moolenaar END 812c71f36a8SBram Moolenaar CheckScriptSuccess(lines) 813ff1cd39cSBram Moolenaar 814ff1cd39cSBram Moolenaar # check missing white space 815ff1cd39cSBram Moolenaar lines =<< trim END 816ff1cd39cSBram Moolenaar vim9script 817ff1cd39cSBram Moolenaar echo 2>3 818ff1cd39cSBram Moolenaar END 8193affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 820ff1cd39cSBram Moolenaar lines =<< trim END 821ff1cd39cSBram Moolenaar vim9script 822ff1cd39cSBram Moolenaar echo 2 >3 823ff1cd39cSBram Moolenaar END 8243affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 825ff1cd39cSBram Moolenaar lines =<< trim END 826ff1cd39cSBram Moolenaar vim9script 827ff1cd39cSBram Moolenaar echo 2> 3 828ff1cd39cSBram Moolenaar END 8293affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 830ff1cd39cSBram Moolenaar lines =<< trim END 831ff1cd39cSBram Moolenaar vim9script 832ff1cd39cSBram Moolenaar echo 2!=3 833ff1cd39cSBram Moolenaar END 8343affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 835ff1cd39cSBram Moolenaar lines =<< trim END 836ff1cd39cSBram Moolenaar vim9script 837ff1cd39cSBram Moolenaar echo 2 !=3 838ff1cd39cSBram Moolenaar END 8393affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 840ff1cd39cSBram Moolenaar lines =<< trim END 841ff1cd39cSBram Moolenaar vim9script 842ff1cd39cSBram Moolenaar echo 2!= 3 843ff1cd39cSBram Moolenaar END 8443affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 8458294d499SBram Moolenaar 8468294d499SBram Moolenaar lines =<< trim END 8478294d499SBram Moolenaar vim9script 8488294d499SBram Moolenaar echo len('xxx') == 3 8498294d499SBram Moolenaar END 8508294d499SBram Moolenaar CheckScriptSuccess(lines) 851f923571eSBram Moolenaar 852f923571eSBram Moolenaar lines =<< trim END 853f923571eSBram Moolenaar vim9script 854f923571eSBram Moolenaar let line = 'abc' 855f923571eSBram Moolenaar echo line[1] =~ '\w' 856f923571eSBram Moolenaar END 857f923571eSBram Moolenaar CheckScriptSuccess(lines) 858e6536aa7SBram Moolenaarenddef 859e6536aa7SBram Moolenaar 8608a7d6542SBram Moolenaarfunc Test_expr4_fails() 8618a7d6542SBram Moolenaar let msg = "white space required before and after '>'" 8623affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1>2"], msg, 1) 8633affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 >2"], msg, 1) 8643affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1> 2"], msg, 1) 8658a7d6542SBram Moolenaar 8668a7d6542SBram Moolenaar let msg = "white space required before and after '=='" 8673affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1==2"], msg, 1) 8683affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 ==2"], msg, 1) 8693affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1== 2"], msg, 1) 8708a7d6542SBram Moolenaar 8718a7d6542SBram Moolenaar let msg = "white space required before and after 'is'" 8723affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'is'2'"], msg, 1) 8733affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' is'2'"], msg, 1) 8743affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'is '2'"], msg, 1) 8758a7d6542SBram Moolenaar 8768a7d6542SBram Moolenaar let msg = "white space required before and after 'isnot'" 8773affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'isnot'2'"], msg, 1) 8783affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' isnot'2'"], msg, 1) 8793affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'isnot '2'"], msg, 1) 8808a7d6542SBram Moolenaar 8813affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 is# 2"], 'E15:', 1) 8823affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 is? 2"], 'E15:', 1) 8833affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 isnot# 2"], 'E15:', 1) 8843affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 isnot? 2"], 'E15:', 1) 8858a7d6542SBram Moolenaar 8863affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 == '2'"], 'Cannot compare number with string', 1) 8873affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' == 2"], 'Cannot compare string with number', 1) 8883affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 == RetVoid()"], 'Cannot compare number with void', 1) 8893affe7a6SBram Moolenaar call CheckDefFailure(["let x = RetVoid() == 1"], 'Cannot compare void with number', 1) 8908a7d6542SBram Moolenaar 8913affe7a6SBram Moolenaar call CheckDefFailure(["let x = true > false"], 'Cannot compare bool with bool', 1) 8923affe7a6SBram Moolenaar call CheckDefFailure(["let x = true >= false"], 'Cannot compare bool with bool', 1) 8933affe7a6SBram Moolenaar call CheckDefFailure(["let x = true < false"], 'Cannot compare bool with bool', 1) 8943affe7a6SBram Moolenaar call CheckDefFailure(["let x = true <= false"], 'Cannot compare bool with bool', 1) 8953affe7a6SBram Moolenaar call CheckDefFailure(["let x = true =~ false"], 'Cannot compare bool with bool', 1) 8963affe7a6SBram Moolenaar call CheckDefFailure(["let x = true !~ false"], 'Cannot compare bool with bool', 1) 8973affe7a6SBram Moolenaar call CheckDefFailure(["let x = true is false"], 'Cannot use "is" with bool', 1) 8983affe7a6SBram Moolenaar call CheckDefFailure(["let x = true isnot false"], 'Cannot use "isnot" with bool', 1) 8998a7d6542SBram Moolenaar 9003affe7a6SBram Moolenaar call CheckDefFailure(["let x = v:none is v:null"], 'Cannot use "is" with special', 1) 9013affe7a6SBram Moolenaar call CheckDefFailure(["let x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1) 9023affe7a6SBram Moolenaar call CheckDefFailure(["let x = 123 is 123"], 'Cannot use "is" with number', 1) 9033affe7a6SBram Moolenaar call CheckDefFailure(["let x = 123 isnot 123"], 'Cannot use "isnot" with number', 1) 9048a7d6542SBram Moolenaar if has('float') 9053affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1.3 is 1.3"], 'Cannot use "is" with float', 1) 9063affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1) 9078a7d6542SBram Moolenaar endif 9088a7d6542SBram Moolenaar 9093affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1) 9103affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1) 9113affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1) 9123affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1) 9133affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1) 9143affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1) 9158a7d6542SBram Moolenaar 9163affe7a6SBram Moolenaar call CheckDefFailure(["let x = [13] > [88]"], 'Cannot compare list with list', 1) 9173affe7a6SBram Moolenaar call CheckDefFailure(["let x = [13] >= [88]"], 'Cannot compare list with list', 1) 9183affe7a6SBram Moolenaar call CheckDefFailure(["let x = [13] < [88]"], 'Cannot compare list with list', 1) 9193affe7a6SBram Moolenaar call CheckDefFailure(["let x = [13] <= [88]"], 'Cannot compare list with list', 1) 9203affe7a6SBram Moolenaar call CheckDefFailure(["let x = [13] =~ [88]"], 'Cannot compare list with list', 1) 9213affe7a6SBram Moolenaar call CheckDefFailure(["let x = [13] !~ [88]"], 'Cannot compare list with list', 1) 9225381c7a1SBram Moolenaar 9233affe7a6SBram Moolenaar call CheckDefFailure(['let j: job', 'let chan: channel', 'let r = j == chan'], 'Cannot compare job with channel', 3) 9243affe7a6SBram Moolenaar call CheckDefFailure(['let j: job', 'let x: list<any>', 'let r = j == x'], 'Cannot compare job with list', 3) 9253affe7a6SBram Moolenaar call CheckDefFailure(['let j: job', 'let Xx: func', 'let r = j == Xx'], 'Cannot compare job with func', 3) 9263affe7a6SBram Moolenaar call CheckDefFailure(['let j: job', 'let Xx: func', 'let r = j == Xx'], 'Cannot compare job with func', 3) 9278a7d6542SBram Moolenaarendfunc 9288a7d6542SBram Moolenaar 9298a7d6542SBram Moolenaar" test addition, subtraction, concatenation 9308a7d6542SBram Moolenaardef Test_expr5() 9318a7d6542SBram Moolenaar assert_equal(66, 60 + 6) 9329c7e6dd6SBram Moolenaar assert_equal(70, 60 + 9339c7e6dd6SBram Moolenaar g:anint) 93456acb094SBram Moolenaar assert_equal(9, g:thefour 93567fbdfefSBram Moolenaar + 5) 93656acb094SBram Moolenaar assert_equal(14, g:thefour + g:anint) 937c785b9a7SBram Moolenaar assert_equal([1, 2, 3, 4], [1] + g:alist) 9388a7d6542SBram Moolenaar 9398a7d6542SBram Moolenaar assert_equal(54, 60 - 6) 9409c7e6dd6SBram Moolenaar assert_equal(50, 60 - 9419c7e6dd6SBram Moolenaar g:anint) 94256acb094SBram Moolenaar assert_equal(-1, g:thefour 94367fbdfefSBram Moolenaar - 5) 94456acb094SBram Moolenaar assert_equal(-6, g:thefour - g:anint) 9458a7d6542SBram Moolenaar 9468a7d6542SBram Moolenaar assert_equal('hello', 'hel' .. 'lo') 947f0eefce9SBram Moolenaar assert_equal('hello 123', 'hello ' .. 948f0eefce9SBram Moolenaar 123) 94967fbdfefSBram Moolenaar assert_equal('hello 123', 'hello ' 95067fbdfefSBram Moolenaar .. 123) 9518a7d6542SBram Moolenaar assert_equal('123 hello', 123 .. ' hello') 9528a7d6542SBram Moolenaar assert_equal('123456', 123 .. 456) 9530062c2d4SBram Moolenaar 954418f1df5SBram Moolenaar assert_equal('av:true', 'a' .. true) 955418f1df5SBram Moolenaar assert_equal('av:false', 'a' .. false) 956418f1df5SBram Moolenaar assert_equal('av:null', 'a' .. v:null) 957418f1df5SBram Moolenaar assert_equal('av:none', 'a' .. v:none) 958418f1df5SBram Moolenaar if has('float') 959418f1df5SBram Moolenaar assert_equal('a0.123', 'a' .. 0.123) 960418f1df5SBram Moolenaar endif 961418f1df5SBram Moolenaar 9620062c2d4SBram Moolenaar assert_equal([1, 2, 3, 4], [1, 2] + [3, 4]) 9630062c2d4SBram Moolenaar assert_equal(0z11223344, 0z1122 + 0z3344) 96467fbdfefSBram Moolenaar assert_equal(0z112201ab, 0z1122 96567fbdfefSBram Moolenaar + g:ablob) 9660062c2d4SBram Moolenaar assert_equal(0z01ab3344, g:ablob + 0z3344) 9670062c2d4SBram Moolenaar assert_equal(0z01ab01ab, g:ablob + g:ablob) 9683fc71285SBram Moolenaar 9693fc71285SBram Moolenaar # concatenate non-constant to constant 9703fc71285SBram Moolenaar let save_path = &path 9713fc71285SBram Moolenaar &path = 'b' 9723fc71285SBram Moolenaar assert_equal('ab', 'a' .. &path) 9733fc71285SBram Moolenaar &path = save_path 9743fc71285SBram Moolenaar 9753fc71285SBram Moolenaar @b = 'b' 9763fc71285SBram Moolenaar assert_equal('ab', 'a' .. @b) 9773fc71285SBram Moolenaar 9783fc71285SBram Moolenaar $ENVVAR = 'env' 9793fc71285SBram Moolenaar assert_equal('aenv', 'a' .. $ENVVAR) 9808a7d6542SBram Moolenaarenddef 9818a7d6542SBram Moolenaar 9825409f5d8SBram Moolenaardef Test_expr5_vim9script() 983696ba231SBram Moolenaar # check line continuation 9845409f5d8SBram Moolenaar let lines =<< trim END 9855409f5d8SBram Moolenaar vim9script 9865409f5d8SBram Moolenaar let var = 11 9875409f5d8SBram Moolenaar + 77 9885409f5d8SBram Moolenaar - 22 9895409f5d8SBram Moolenaar assert_equal(66, var) 9905409f5d8SBram Moolenaar END 9915409f5d8SBram Moolenaar CheckScriptSuccess(lines) 9925409f5d8SBram Moolenaar 9935409f5d8SBram Moolenaar lines =<< trim END 9945409f5d8SBram Moolenaar vim9script 995b4caa163SBram Moolenaar let var = 11 + 996b4caa163SBram Moolenaar 77 - 997b4caa163SBram Moolenaar 22 998b4caa163SBram Moolenaar assert_equal(66, var) 999b4caa163SBram Moolenaar END 1000b4caa163SBram Moolenaar CheckScriptSuccess(lines) 1001b4caa163SBram Moolenaar 1002b4caa163SBram Moolenaar lines =<< trim END 1003b4caa163SBram Moolenaar vim9script 10045409f5d8SBram Moolenaar let var = 'one' 10055409f5d8SBram Moolenaar .. 'two' 10065409f5d8SBram Moolenaar assert_equal('onetwo', var) 10075409f5d8SBram Moolenaar END 10085409f5d8SBram Moolenaar CheckScriptSuccess(lines) 1009696ba231SBram Moolenaar 1010696ba231SBram Moolenaar lines =<< trim END 1011696ba231SBram Moolenaar vim9script 1012696ba231SBram Moolenaar echo 'abc' is# 'abc' 1013696ba231SBram Moolenaar END 10143affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E15:', 2) 1015696ba231SBram Moolenaar 1016696ba231SBram Moolenaar lines =<< trim END 1017696ba231SBram Moolenaar vim9script 1018696ba231SBram Moolenaar echo 'abc' is? 'abc' 1019696ba231SBram Moolenaar END 10203affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E15:', 2) 1021696ba231SBram Moolenaar 1022696ba231SBram Moolenaar lines =<< trim END 1023696ba231SBram Moolenaar vim9script 1024696ba231SBram Moolenaar echo 'abc' isnot# 'abc' 1025696ba231SBram Moolenaar END 10263affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E15:', 2) 1027696ba231SBram Moolenaar 1028696ba231SBram Moolenaar lines =<< trim END 1029696ba231SBram Moolenaar vim9script 1030696ba231SBram Moolenaar echo 'abc' isnot? 'abc' 1031696ba231SBram Moolenaar END 10323affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E15:', 2) 1033bb1b5e24SBram Moolenaar 1034bb1b5e24SBram Moolenaar # check white space 1035bb1b5e24SBram Moolenaar lines =<< trim END 1036bb1b5e24SBram Moolenaar vim9script 1037bb1b5e24SBram Moolenaar echo 5+6 1038bb1b5e24SBram Moolenaar END 10393affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1040bb1b5e24SBram Moolenaar lines =<< trim END 1041bb1b5e24SBram Moolenaar vim9script 1042bb1b5e24SBram Moolenaar echo 5 +6 1043bb1b5e24SBram Moolenaar END 10443affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1045bb1b5e24SBram Moolenaar lines =<< trim END 1046bb1b5e24SBram Moolenaar vim9script 1047bb1b5e24SBram Moolenaar echo 5+ 6 1048bb1b5e24SBram Moolenaar END 10493affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1050bb1b5e24SBram Moolenaar 1051bb1b5e24SBram Moolenaar lines =<< trim END 1052bb1b5e24SBram Moolenaar vim9script 1053bb1b5e24SBram Moolenaar echo 'a'..'b' 1054bb1b5e24SBram Moolenaar END 10553affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1056bb1b5e24SBram Moolenaar lines =<< trim END 1057bb1b5e24SBram Moolenaar vim9script 1058bb1b5e24SBram Moolenaar echo 'a' ..'b' 1059bb1b5e24SBram Moolenaar END 10603affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1061bb1b5e24SBram Moolenaar lines =<< trim END 1062bb1b5e24SBram Moolenaar vim9script 1063bb1b5e24SBram Moolenaar echo 'a'.. 'b' 1064bb1b5e24SBram Moolenaar END 10653affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1066418f1df5SBram Moolenaar 1067418f1df5SBram Moolenaar # check valid string concatenation 1068418f1df5SBram Moolenaar lines =<< trim END 1069418f1df5SBram Moolenaar vim9script 1070418f1df5SBram Moolenaar assert_equal('one123', 'one' .. 123) 1071418f1df5SBram Moolenaar assert_equal('onev:true', 'one' .. true) 1072418f1df5SBram Moolenaar assert_equal('onev:null', 'one' .. v:null) 1073418f1df5SBram Moolenaar assert_equal('onev:none', 'one' .. v:none) 1074418f1df5SBram Moolenaar if has('float') 1075418f1df5SBram Moolenaar assert_equal('a0.123', 'a' .. 0.123) 1076418f1df5SBram Moolenaar endif 1077418f1df5SBram Moolenaar END 1078418f1df5SBram Moolenaar CheckScriptSuccess(lines) 1079418f1df5SBram Moolenaar 1080418f1df5SBram Moolenaar # check invalid string concatenation 1081418f1df5SBram Moolenaar lines =<< trim END 1082418f1df5SBram Moolenaar vim9script 1083418f1df5SBram Moolenaar echo 'a' .. [1] 1084418f1df5SBram Moolenaar END 10853affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E730:', 2) 1086418f1df5SBram Moolenaar lines =<< trim END 1087418f1df5SBram Moolenaar vim9script 1088418f1df5SBram Moolenaar echo 'a' .. #{a: 1} 1089418f1df5SBram Moolenaar END 10903affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E731:', 2) 1091418f1df5SBram Moolenaar lines =<< trim END 1092418f1df5SBram Moolenaar vim9script 1093418f1df5SBram Moolenaar echo 'a' .. test_void() 1094418f1df5SBram Moolenaar END 10953affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E908:', 2) 1096418f1df5SBram Moolenaar lines =<< trim END 1097418f1df5SBram Moolenaar vim9script 1098418f1df5SBram Moolenaar echo 'a' .. 0z33 1099418f1df5SBram Moolenaar END 11003affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E976:', 2) 1101418f1df5SBram Moolenaar lines =<< trim END 1102418f1df5SBram Moolenaar vim9script 1103418f1df5SBram Moolenaar echo 'a' .. function('len') 1104418f1df5SBram Moolenaar END 11053affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E729:', 2) 1106418f1df5SBram Moolenaar lines =<< trim END 1107418f1df5SBram Moolenaar vim9script 1108418f1df5SBram Moolenaar echo 'a' .. test_null_job() 1109418f1df5SBram Moolenaar END 11103affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E908:', 2) 1111418f1df5SBram Moolenaar lines =<< trim END 1112418f1df5SBram Moolenaar vim9script 1113418f1df5SBram Moolenaar echo 'a' .. test_null_channel() 1114418f1df5SBram Moolenaar END 11153affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E908:', 2) 11165409f5d8SBram Moolenaarenddef 11175409f5d8SBram Moolenaar 11188a7d6542SBram Moolenaardef Test_expr5_float() 11197f829cabSBram Moolenaar if !has('float') 11207f829cabSBram Moolenaar MissingFeature 'float' 11217f829cabSBram Moolenaar else 11228a7d6542SBram Moolenaar assert_equal(66.0, 60.0 + 6.0) 11238a7d6542SBram Moolenaar assert_equal(66.0, 60.0 + 6) 11249c7e6dd6SBram Moolenaar assert_equal(66.0, 60 + 11259c7e6dd6SBram Moolenaar 6.0) 112667fbdfefSBram Moolenaar assert_equal(5.1, g:afloat 112767fbdfefSBram Moolenaar + 5) 11288a7d6542SBram Moolenaar assert_equal(8.1, 8 + g:afloat) 11298a7d6542SBram Moolenaar assert_equal(10.1, g:anint + g:afloat) 11308a7d6542SBram Moolenaar assert_equal(10.1, g:afloat + g:anint) 11318a7d6542SBram Moolenaar 11328a7d6542SBram Moolenaar assert_equal(54.0, 60.0 - 6.0) 113367fbdfefSBram Moolenaar assert_equal(54.0, 60.0 113467fbdfefSBram Moolenaar - 6) 11358a7d6542SBram Moolenaar assert_equal(54.0, 60 - 6.0) 11368a7d6542SBram Moolenaar assert_equal(-4.9, g:afloat - 5) 11378a7d6542SBram Moolenaar assert_equal(7.9, 8 - g:afloat) 11388a7d6542SBram Moolenaar assert_equal(9.9, g:anint - g:afloat) 11398a7d6542SBram Moolenaar assert_equal(-9.9, g:afloat - g:anint) 11407f829cabSBram Moolenaar endif 11418a7d6542SBram Moolenaarenddef 11428a7d6542SBram Moolenaar 11438a7d6542SBram Moolenaarfunc Test_expr5_fails() 11448a7d6542SBram Moolenaar let msg = "white space required before and after '+'" 11453affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1+2"], msg, 1) 11463affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 +2"], msg, 1) 11473affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1+ 2"], msg, 1) 11488a7d6542SBram Moolenaar 11498a7d6542SBram Moolenaar let msg = "white space required before and after '-'" 11503affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1-2"], msg, 1) 11513affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 -2"], msg, 1) 11523affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1- 2"], msg, 1) 11538a7d6542SBram Moolenaar 11548a7d6542SBram Moolenaar let msg = "white space required before and after '..'" 11553affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'..'2'"], msg, 1) 11563affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' ..'2'"], msg, 1) 11573affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'.. '2'"], msg, 1) 11580062c2d4SBram Moolenaar 11593affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z1122 + 33"], 'E1051', 1) 11603affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z1122 + [3]"], 'E1051', 1) 11613affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z1122 + 'asd'"], 'E1051', 1) 11623affe7a6SBram Moolenaar call CheckDefFailure(["let x = 33 + 0z1122"], 'E1051', 1) 11633affe7a6SBram Moolenaar call CheckDefFailure(["let x = [3] + 0z1122"], 'E1051', 1) 11643affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'asdf' + 0z1122"], 'E1051', 1) 11653affe7a6SBram Moolenaar call CheckDefFailure(["let x = 6 + xxx"], 'E1001', 1) 1166418f1df5SBram Moolenaar 11673affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. [1]"], 'E1105', 1) 11683affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. #{a: 1}"], 'E1105', 1) 11693affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. test_void()"], 'E1105', 1) 11703affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. 0z32"], 'E1105', 1) 11713affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. function('len')"], 'E1105', 1) 11723affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. function('len', ['a'])"], 'E1105', 1) 11733affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. test_null_job()"], 'E1105', 1) 11743affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'a' .. test_null_channel()"], 'E1105', 1) 11758a7d6542SBram Moolenaarendfunc 11768a7d6542SBram Moolenaar 11778a7d6542SBram Moolenaar" test multiply, divide, modulo 11788a7d6542SBram Moolenaardef Test_expr6() 11798a7d6542SBram Moolenaar assert_equal(36, 6 * 6) 11809c7e6dd6SBram Moolenaar assert_equal(24, 6 * 118156acb094SBram Moolenaar g:thefour) 118256acb094SBram Moolenaar assert_equal(24, g:thefour 118367fbdfefSBram Moolenaar * 6) 118456acb094SBram Moolenaar assert_equal(40, g:anint * g:thefour) 11858a7d6542SBram Moolenaar 11868a7d6542SBram Moolenaar assert_equal(10, 60 / 6) 11879c7e6dd6SBram Moolenaar assert_equal(6, 60 / 11889c7e6dd6SBram Moolenaar g:anint) 11898a7d6542SBram Moolenaar assert_equal(1, g:anint / 6) 119067fbdfefSBram Moolenaar assert_equal(2, g:anint 119156acb094SBram Moolenaar / g:thefour) 11928a7d6542SBram Moolenaar 11938a7d6542SBram Moolenaar assert_equal(5, 11 % 6) 11948a7d6542SBram Moolenaar assert_equal(4, g:anint % 6) 11959c7e6dd6SBram Moolenaar assert_equal(3, 13 % 11969c7e6dd6SBram Moolenaar g:anint) 119767fbdfefSBram Moolenaar assert_equal(2, g:anint 119856acb094SBram Moolenaar % g:thefour) 11998a7d6542SBram Moolenaar 12008a7d6542SBram Moolenaar assert_equal(4, 6 * 4 / 6) 1201b13af50fSBram Moolenaar 1202b13af50fSBram Moolenaar let x = [2] 1203b13af50fSBram Moolenaar let y = [3] 1204b13af50fSBram Moolenaar assert_equal(5, x[0] + y[0]) 1205b13af50fSBram Moolenaar assert_equal(6, x[0] * y[0]) 1206b13af50fSBram Moolenaar if has('float') 1207b13af50fSBram Moolenaar let xf = [2.0] 1208b13af50fSBram Moolenaar let yf = [3.0] 120967fbdfefSBram Moolenaar assert_equal(5.0, xf[0] 121067fbdfefSBram Moolenaar + yf[0]) 121167fbdfefSBram Moolenaar assert_equal(6.0, xf[0] 121267fbdfefSBram Moolenaar * yf[0]) 1213b13af50fSBram Moolenaar endif 121492dba36fSBram Moolenaar 12153affe7a6SBram Moolenaar call CheckDefFailure(["let x = 6 * xxx"], 'E1001', 1) 12168a7d6542SBram Moolenaarenddef 12178a7d6542SBram Moolenaar 12185409f5d8SBram Moolenaardef Test_expr6_vim9script() 1219b4caa163SBram Moolenaar # check line continuation 12205409f5d8SBram Moolenaar let lines =<< trim END 12215409f5d8SBram Moolenaar vim9script 12225409f5d8SBram Moolenaar let var = 11 12235409f5d8SBram Moolenaar * 22 12245409f5d8SBram Moolenaar / 3 12255409f5d8SBram Moolenaar assert_equal(80, var) 12265409f5d8SBram Moolenaar END 12275409f5d8SBram Moolenaar CheckScriptSuccess(lines) 12285409f5d8SBram Moolenaar 12295409f5d8SBram Moolenaar lines =<< trim END 12305409f5d8SBram Moolenaar vim9script 12315409f5d8SBram Moolenaar let var = 25 12325409f5d8SBram Moolenaar % 10 12335409f5d8SBram Moolenaar assert_equal(5, var) 12345409f5d8SBram Moolenaar END 12355409f5d8SBram Moolenaar CheckScriptSuccess(lines) 1236b4caa163SBram Moolenaar 1237b4caa163SBram Moolenaar lines =<< trim END 1238b4caa163SBram Moolenaar vim9script 1239b4caa163SBram Moolenaar let var = 11 * 1240b4caa163SBram Moolenaar 22 / 1241b4caa163SBram Moolenaar 3 1242b4caa163SBram Moolenaar assert_equal(80, var) 1243b4caa163SBram Moolenaar END 1244b4caa163SBram Moolenaar CheckScriptSuccess(lines) 1245b4caa163SBram Moolenaar 1246b4caa163SBram Moolenaar # check white space 1247b4caa163SBram Moolenaar lines =<< trim END 1248b4caa163SBram Moolenaar vim9script 1249b4caa163SBram Moolenaar echo 5*6 1250b4caa163SBram Moolenaar END 12513affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1252b4caa163SBram Moolenaar lines =<< trim END 1253b4caa163SBram Moolenaar vim9script 1254b4caa163SBram Moolenaar echo 5 *6 1255b4caa163SBram Moolenaar END 12563affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 1257b4caa163SBram Moolenaar lines =<< trim END 1258b4caa163SBram Moolenaar vim9script 1259b4caa163SBram Moolenaar echo 5* 6 1260b4caa163SBram Moolenaar END 12613affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1004:', 2) 12625409f5d8SBram Moolenaarenddef 12635409f5d8SBram Moolenaar 12648a7d6542SBram Moolenaardef Test_expr6_float() 12657f829cabSBram Moolenaar if !has('float') 12667f829cabSBram Moolenaar MissingFeature 'float' 12677f829cabSBram Moolenaar else 12688a7d6542SBram Moolenaar assert_equal(36.0, 6.0 * 6) 12699c7e6dd6SBram Moolenaar assert_equal(36.0, 6 * 12709c7e6dd6SBram Moolenaar 6.0) 12718a7d6542SBram Moolenaar assert_equal(36.0, 6.0 * 6.0) 12728a7d6542SBram Moolenaar assert_equal(1.0, g:afloat * g:anint) 12738a7d6542SBram Moolenaar 12748a7d6542SBram Moolenaar assert_equal(10.0, 60 / 6.0) 12759c7e6dd6SBram Moolenaar assert_equal(10.0, 60.0 / 12769c7e6dd6SBram Moolenaar 6) 12778a7d6542SBram Moolenaar assert_equal(10.0, 60.0 / 6.0) 12788a7d6542SBram Moolenaar assert_equal(0.01, g:afloat / g:anint) 12798a7d6542SBram Moolenaar 12808a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4 / 6) 12819c7e6dd6SBram Moolenaar assert_equal(4.0, 6 * 12829c7e6dd6SBram Moolenaar 4.0 / 12839c7e6dd6SBram Moolenaar 6) 12848a7d6542SBram Moolenaar assert_equal(4.0, 6 * 4 / 6.0) 12858a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4.0 / 6) 12868a7d6542SBram Moolenaar assert_equal(4.0, 6 * 4.0 / 6.0) 12878a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4 / 6.0) 12888a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4.0 / 6.0) 12898a7d6542SBram Moolenaar 12908a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4.0 / 6.0) 12917f829cabSBram Moolenaar endif 12928a7d6542SBram Moolenaarenddef 12938a7d6542SBram Moolenaar 12948a7d6542SBram Moolenaarfunc Test_expr6_fails() 12958a7d6542SBram Moolenaar let msg = "white space required before and after '*'" 12963affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1*2"], msg, 1) 12973affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 *2"], msg, 1) 12983affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1* 2"], msg, 1) 12998a7d6542SBram Moolenaar 13008a7d6542SBram Moolenaar let msg = "white space required before and after '/'" 13013affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1/2"], msg, 1) 13023affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 /2"], msg, 1) 13033affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1/ 2"], msg, 1) 13048a7d6542SBram Moolenaar 13058a7d6542SBram Moolenaar let msg = "white space required before and after '%'" 13063affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1%2"], msg, 1) 13073affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1 %2"], msg, 1) 13083affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1% 2"], msg, 1) 13098a7d6542SBram Moolenaar 13103affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' * '2'"], 'E1036:', 1) 13113affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' / '2'"], 'E1036:', 1) 13123affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1' % '2'"], 'E1035:', 1) 13138a7d6542SBram Moolenaar 13143affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z01 * 0z12"], 'E1036:', 1) 13153affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z01 / 0z12"], 'E1036:', 1) 13163affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z01 % 0z12"], 'E1035:', 1) 13178a7d6542SBram Moolenaar 13183affe7a6SBram Moolenaar call CheckDefFailure(["let x = [1] * [2]"], 'E1036:', 1) 13193affe7a6SBram Moolenaar call CheckDefFailure(["let x = [1] / [2]"], 'E1036:', 1) 13203affe7a6SBram Moolenaar call CheckDefFailure(["let x = [1] % [2]"], 'E1035:', 1) 13218a7d6542SBram Moolenaar 13223affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{one: 1} * #{two: 2}"], 'E1036:', 1) 13233affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{one: 1} / #{two: 2}"], 'E1036:', 1) 13243affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{one: 1} % #{two: 2}"], 'E1035:', 1) 13258a7d6542SBram Moolenaar 13263affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0xff[1]"], 'E1107:', 1) 1327b13af50fSBram Moolenaar if has('float') 13283affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0.7[1]"], 'E1107:', 1) 1329b13af50fSBram Moolenaar endif 13308a7d6542SBram Moolenaarendfunc 13318a7d6542SBram Moolenaar 13328a7d6542SBram Moolenaarfunc Test_expr6_float_fails() 13338a7d6542SBram Moolenaar CheckFeature float 13343affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1.0 % 2"], 'E1035:', 1) 13358a7d6542SBram Moolenaarendfunc 13368a7d6542SBram Moolenaar 13378a7d6542SBram Moolenaar" define here to use old style parsing 13388a7d6542SBram Moolenaarif has('float') 13398a7d6542SBram Moolenaar let g:float_zero = 0.0 13408a7d6542SBram Moolenaar let g:float_neg = -9.8 13418a7d6542SBram Moolenaar let g:float_big = 9.9e99 13428a7d6542SBram Moolenaarendif 13438a7d6542SBram Moolenaarlet g:blob_empty = 0z 13448a7d6542SBram Moolenaarlet g:blob_one = 0z01 13458a7d6542SBram Moolenaarlet g:blob_long = 0z0102.0304 13468a7d6542SBram Moolenaar 13478a7d6542SBram Moolenaarlet g:string_empty = '' 13488a7d6542SBram Moolenaarlet g:string_short = 'x' 13498a7d6542SBram Moolenaarlet g:string_long = 'abcdefghijklm' 13508a7d6542SBram Moolenaarlet g:string_special = "ab\ncd\ref\ekk" 13518a7d6542SBram Moolenaar 13528a7d6542SBram Moolenaarlet g:special_true = v:true 13538a7d6542SBram Moolenaarlet g:special_false = v:false 13548a7d6542SBram Moolenaarlet g:special_null = v:null 13558a7d6542SBram Moolenaarlet g:special_none = v:none 13568a7d6542SBram Moolenaar 13578a7d6542SBram Moolenaarlet g:list_empty = [] 13588a7d6542SBram Moolenaarlet g:list_mixed = [1, 'b', v:false] 13598a7d6542SBram Moolenaar 13608a7d6542SBram Moolenaarlet g:dict_empty = {} 13618a7d6542SBram Moolenaarlet g:dict_one = #{one: 1} 13628a7d6542SBram Moolenaar 13638a7d6542SBram Moolenaarlet $TESTVAR = 'testvar' 13648a7d6542SBram Moolenaar 136564d662d5SBram Moolenaar" type casts 136664d662d5SBram Moolenaardef Test_expr7t() 136764d662d5SBram Moolenaar let ls: list<string> = ['a', <string>g:string_empty] 136856acb094SBram Moolenaar let ln: list<number> = [<number>g:anint, <number>g:thefour] 1369d1103587SBram Moolenaar let nr = <number>234 1370d1103587SBram Moolenaar assert_equal(234, nr) 1371d1103587SBram Moolenaar 13723affe7a6SBram Moolenaar call CheckDefFailure(["let x = <nr>123"], 'E1010:', 1) 13733affe7a6SBram Moolenaar call CheckDefFailure(["let x = <number >123"], 'E1068:', 1) 13743affe7a6SBram Moolenaar call CheckDefFailure(["let x = <number 123"], 'E1104:', 1) 137564d662d5SBram Moolenaarenddef 137664d662d5SBram Moolenaar 13778a7d6542SBram Moolenaar" test low level expression 13788a7d6542SBram Moolenaardef Test_expr7_number() 1379f5be8cdbSBram Moolenaar # number constant 13808a7d6542SBram Moolenaar assert_equal(0, 0) 13818a7d6542SBram Moolenaar assert_equal(654, 0654) 13828a7d6542SBram Moolenaar 13838a7d6542SBram Moolenaar assert_equal(6, 0x6) 13848a7d6542SBram Moolenaar assert_equal(15, 0xf) 13858a7d6542SBram Moolenaar assert_equal(255, 0xff) 13868a7d6542SBram Moolenaarenddef 13878a7d6542SBram Moolenaar 13888a7d6542SBram Moolenaardef Test_expr7_float() 1389f5be8cdbSBram Moolenaar # float constant 13907f829cabSBram Moolenaar if !has('float') 13917f829cabSBram Moolenaar MissingFeature 'float' 13927f829cabSBram Moolenaar else 13938a7d6542SBram Moolenaar assert_equal(g:float_zero, .0) 13948a7d6542SBram Moolenaar assert_equal(g:float_zero, 0.0) 13958a7d6542SBram Moolenaar assert_equal(g:float_neg, -9.8) 13968a7d6542SBram Moolenaar assert_equal(g:float_big, 9.9e99) 13978a7d6542SBram Moolenaar endif 13988a7d6542SBram Moolenaarenddef 13998a7d6542SBram Moolenaar 14008a7d6542SBram Moolenaardef Test_expr7_blob() 1401f5be8cdbSBram Moolenaar # blob constant 14028a7d6542SBram Moolenaar assert_equal(g:blob_empty, 0z) 14038a7d6542SBram Moolenaar assert_equal(g:blob_one, 0z01) 14048a7d6542SBram Moolenaar assert_equal(g:blob_long, 0z0102.0304) 140592dba36fSBram Moolenaar 14063affe7a6SBram Moolenaar call CheckDefFailure(["let x = 0z123"], 'E973:', 1) 14078a7d6542SBram Moolenaarenddef 14088a7d6542SBram Moolenaar 14098a7d6542SBram Moolenaardef Test_expr7_string() 1410f5be8cdbSBram Moolenaar # string constant 14118a7d6542SBram Moolenaar assert_equal(g:string_empty, '') 14128a7d6542SBram Moolenaar assert_equal(g:string_empty, "") 14138a7d6542SBram Moolenaar assert_equal(g:string_short, 'x') 14148a7d6542SBram Moolenaar assert_equal(g:string_short, "x") 14158a7d6542SBram Moolenaar assert_equal(g:string_long, 'abcdefghijklm') 14168a7d6542SBram Moolenaar assert_equal(g:string_long, "abcdefghijklm") 14178a7d6542SBram Moolenaar assert_equal(g:string_special, "ab\ncd\ref\ekk") 141892dba36fSBram Moolenaar 14193affe7a6SBram Moolenaar call CheckDefFailure(['let x = "abc'], 'E114:', 1) 14203affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'abc"], 'E115:', 1) 14218a7d6542SBram Moolenaarenddef 14228a7d6542SBram Moolenaar 14235da356e0SBram Moolenaardef Test_expr7_vimvar() 14245da356e0SBram Moolenaar let old: list<string> = v:oldfiles 14255da356e0SBram Moolenaar let compl: dict<any> = v:completed_item 14265da356e0SBram Moolenaar 14273affe7a6SBram Moolenaar call CheckDefFailure(["let old: list<number> = v:oldfiles"], 'E1012: type mismatch, expected list<number> but got list<string>', 1) 14283affe7a6SBram Moolenaar call CheckDefFailure(["let old: dict<number> = v:completed_item"], 'E1012: type mismatch, expected dict<number> but got dict<any>', 1) 14295da356e0SBram Moolenaarenddef 14305da356e0SBram Moolenaar 14318a7d6542SBram Moolenaardef Test_expr7_special() 1432f5be8cdbSBram Moolenaar # special constant 14338a7d6542SBram Moolenaar assert_equal(g:special_true, true) 14348a7d6542SBram Moolenaar assert_equal(g:special_false, false) 14355da356e0SBram Moolenaar assert_equal(g:special_true, v:true) 14365da356e0SBram Moolenaar assert_equal(g:special_false, v:false) 14376e4cfffeSBram Moolenaar 14386e4cfffeSBram Moolenaar assert_equal(true, !false) 14396e4cfffeSBram Moolenaar assert_equal(false, !true) 14406e4cfffeSBram Moolenaar assert_equal(true, !0) 14416e4cfffeSBram Moolenaar assert_equal(false, !1) 14426e4cfffeSBram Moolenaar assert_equal(false, !!false) 14436e4cfffeSBram Moolenaar assert_equal(true, !!true) 14446e4cfffeSBram Moolenaar assert_equal(false, !!0) 14456e4cfffeSBram Moolenaar assert_equal(true, !!1) 14466e4cfffeSBram Moolenaar 14478a7d6542SBram Moolenaar assert_equal(g:special_null, v:null) 14488a7d6542SBram Moolenaar assert_equal(g:special_none, v:none) 14495da356e0SBram Moolenaar 14503affe7a6SBram Moolenaar call CheckDefFailure(['v:true = true'], 'E46:', 1) 14513affe7a6SBram Moolenaar call CheckDefFailure(['v:true = false'], 'E46:', 1) 14523affe7a6SBram Moolenaar call CheckDefFailure(['v:false = true'], 'E46:', 1) 14533affe7a6SBram Moolenaar call CheckDefFailure(['v:null = 11'], 'E46:', 1) 14543affe7a6SBram Moolenaar call CheckDefFailure(['v:none = 22'], 'E46:', 1) 14558a7d6542SBram Moolenaarenddef 14568a7d6542SBram Moolenaar 14575d2eb0ffSBram Moolenaardef Test_expr7_special_vim9script() 14585d2eb0ffSBram Moolenaar let lines =<< trim END 14595d2eb0ffSBram Moolenaar vim9script 14605d2eb0ffSBram Moolenaar let t = true 14615d2eb0ffSBram Moolenaar let f = false 14625d2eb0ffSBram Moolenaar assert_equal(v:true, true) 14635d2eb0ffSBram Moolenaar assert_equal(true, t) 14645d2eb0ffSBram Moolenaar assert_equal(v:false, false) 14655d2eb0ffSBram Moolenaar assert_equal(false, f) 14666e4cfffeSBram Moolenaar assert_equal(true, !false) 14676e4cfffeSBram Moolenaar assert_equal(false, !true) 14686e4cfffeSBram Moolenaar assert_equal(true, !0) 14696e4cfffeSBram Moolenaar assert_equal(false, !1) 14706e4cfffeSBram Moolenaar assert_equal(false, !!false) 14716e4cfffeSBram Moolenaar assert_equal(true, !!true) 14726e4cfffeSBram Moolenaar assert_equal(false, !!0) 14736e4cfffeSBram Moolenaar assert_equal(true, !!1) 14745d2eb0ffSBram Moolenaar END 14755d2eb0ffSBram Moolenaar CheckScriptSuccess(lines) 14765d2eb0ffSBram Moolenaarenddef 14775d2eb0ffSBram Moolenaar 14788a7d6542SBram Moolenaardef Test_expr7_list() 1479f5be8cdbSBram Moolenaar # list 14808a7d6542SBram Moolenaar assert_equal(g:list_empty, []) 14818a7d6542SBram Moolenaar assert_equal(g:list_empty, [ ]) 1482127542bcSBram Moolenaar 1483127542bcSBram Moolenaar let numbers: list<number> = [1, 2, 3] 1484127542bcSBram Moolenaar numbers = [1] 1485127542bcSBram Moolenaar numbers = [] 1486127542bcSBram Moolenaar 1487127542bcSBram Moolenaar let strings: list<string> = ['a', 'b', 'c'] 1488127542bcSBram Moolenaar strings = ['x'] 1489127542bcSBram Moolenaar strings = [] 1490127542bcSBram Moolenaar 1491127542bcSBram Moolenaar let mixed: list<any> = [1, 'b', false,] 1492127542bcSBram Moolenaar assert_equal(g:list_mixed, mixed) 149356acb094SBram Moolenaar assert_equal('b', mixed[1]) 14940062c2d4SBram Moolenaar 1495badd8486SBram Moolenaar echo [1, 1496badd8486SBram Moolenaar 2] [3, 1497badd8486SBram Moolenaar 4] 1498badd8486SBram Moolenaar 14993affe7a6SBram Moolenaar call CheckDefFailure(["let x = 1234[3]"], 'E1107:', 1) 15001d634542SBram Moolenaar call CheckDefExecFailure(["let x = g:anint[3]"], 'E1062:', 1) 150156acb094SBram Moolenaar 15023affe7a6SBram Moolenaar call CheckDefFailure(["let x = g:list_mixed[xxx]"], 'E1001:', 1) 1503db199216SBram Moolenaar 15043affe7a6SBram Moolenaar call CheckDefFailure(["let x = [1,2,3]"], 'E1069:', 1) 15053affe7a6SBram Moolenaar call CheckDefFailure(["let x = [1 ,2, 3]"], 'E1068:', 1) 1506db199216SBram Moolenaar 15071d634542SBram Moolenaar call CheckDefExecFailure(["echo 1", "let x = [][0]", "echo 3"], 'E684:', 2) 15081d634542SBram Moolenaar 15091d634542SBram Moolenaar call CheckDefExecFailure(["let x = g:list_mixed['xx']"], 'E1029:', 1) 15103affe7a6SBram Moolenaar call CheckDefFailure(["let x = g:list_mixed["], 'E1097:', 2) 15113affe7a6SBram Moolenaar call CheckDefFailure(["let x = g:list_mixed[0"], 'E1097:', 2) 15123affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = g:list_empty[3]"], 'E684:', 1) 15133affe7a6SBram Moolenaar call CheckDefFailure(["let l: list<number> = [234, 'x']"], 'E1012:', 1) 15143affe7a6SBram Moolenaar call CheckDefFailure(["let l: list<number> = ['x', 234]"], 'E1012:', 1) 15153affe7a6SBram Moolenaar call CheckDefFailure(["let l: list<string> = [234, 'x']"], 'E1012:', 1) 15163affe7a6SBram Moolenaar call CheckDefFailure(["let l: list<string> = ['x', 123]"], 'E1012:', 1) 15178a7d6542SBram Moolenaarenddef 15188a7d6542SBram Moolenaar 15197147820cSBram Moolenaardef Test_expr7_list_vim9script() 15207147820cSBram Moolenaar let lines =<< trim END 15217147820cSBram Moolenaar vim9script 15227147820cSBram Moolenaar let l = [ 15237147820cSBram Moolenaar 11, 15247147820cSBram Moolenaar 22, 15257147820cSBram Moolenaar ] 15267147820cSBram Moolenaar assert_equal([11, 22], l) 1527badd8486SBram Moolenaar 1528badd8486SBram Moolenaar echo [1, 1529badd8486SBram Moolenaar 2] [3, 1530badd8486SBram Moolenaar 4] 15317147820cSBram Moolenaar END 15327147820cSBram Moolenaar CheckScriptSuccess(lines) 15337147820cSBram Moolenaar 15347147820cSBram Moolenaar lines =<< trim END 15357147820cSBram Moolenaar vim9script 15367147820cSBram Moolenaar let l = [11, 15377147820cSBram Moolenaar 22] 15387147820cSBram Moolenaar assert_equal([11, 22], l) 15397147820cSBram Moolenaar END 15407147820cSBram Moolenaar CheckScriptSuccess(lines) 15418ea9390bSBram Moolenaar 15428ea9390bSBram Moolenaar lines =<< trim END 15438ea9390bSBram Moolenaar vim9script 15448ea9390bSBram Moolenaar let l = [11,22] 15458ea9390bSBram Moolenaar END 15463affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1069:', 2) 1547db199216SBram Moolenaar 1548db199216SBram Moolenaar lines =<< trim END 1549db199216SBram Moolenaar vim9script 1550db199216SBram Moolenaar let l = [11 , 22] 1551db199216SBram Moolenaar END 15523affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1068:', 2) 155341fab3eaSBram Moolenaar 155441fab3eaSBram Moolenaar lines =<< trim END 155541fab3eaSBram Moolenaar vim9script 155641fab3eaSBram Moolenaar let l: list<number> = [234, 'x'] 155741fab3eaSBram Moolenaar END 15583affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 155941fab3eaSBram Moolenaar lines =<< trim END 156041fab3eaSBram Moolenaar vim9script 156141fab3eaSBram Moolenaar let l: list<number> = ['x', 234] 156241fab3eaSBram Moolenaar END 15633affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 156441fab3eaSBram Moolenaar lines =<< trim END 156541fab3eaSBram Moolenaar vim9script 156641fab3eaSBram Moolenaar let l: list<string> = ['x', 234] 156741fab3eaSBram Moolenaar END 15683affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 156941fab3eaSBram Moolenaar lines =<< trim END 157041fab3eaSBram Moolenaar vim9script 157141fab3eaSBram Moolenaar let l: list<string> = [234, 'x'] 157241fab3eaSBram Moolenaar END 15733affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 15747147820cSBram Moolenaarenddef 15757147820cSBram Moolenaar 1576ba60cc45SBram Moolenaardef LambdaWithComments(): func 1577ba60cc45SBram Moolenaar return {x -> 1578ba60cc45SBram Moolenaar # some comment 1579ba60cc45SBram Moolenaar x == 1 1580ba60cc45SBram Moolenaar # some comment 1581ba60cc45SBram Moolenaar || 1582ba60cc45SBram Moolenaar x == 2 1583ba60cc45SBram Moolenaar } 1584ba60cc45SBram Moolenaarenddef 1585ba60cc45SBram Moolenaar 1586fd77748dSBram Moolenaardef LambdaUsingArg(x: number): func 1587fd77748dSBram Moolenaar return {-> 1588fd77748dSBram Moolenaar # some comment 1589fd77748dSBram Moolenaar x == 1 1590fd77748dSBram Moolenaar # some comment 1591fd77748dSBram Moolenaar || 1592fd77748dSBram Moolenaar x == 2 1593fd77748dSBram Moolenaar } 1594fd77748dSBram Moolenaarenddef 1595fd77748dSBram Moolenaar 15968a7d6542SBram Moolenaardef Test_expr7_lambda() 15978a7d6542SBram Moolenaar let La = { -> 'result'} 15988a7d6542SBram Moolenaar assert_equal('result', La()) 15998a7d6542SBram Moolenaar assert_equal([1, 3, 5], [1, 2, 3]->map({key, val -> key + val})) 1600914e7eaaSBram Moolenaar 1601f5be8cdbSBram Moolenaar # line continuation inside lambda with "cond ? expr : expr" works 16028af81d65SBram Moolenaar let ll = range(3) 16038af81d65SBram Moolenaar map(ll, {k, v -> v % 2 ? { 16048af81d65SBram Moolenaar '111': 111 } : {} 16058af81d65SBram Moolenaar }) 16068af81d65SBram Moolenaar assert_equal([{}, {'111': 111}, {}], ll) 16078af81d65SBram Moolenaar 16088af81d65SBram Moolenaar ll = range(3) 16098af81d65SBram Moolenaar map(ll, {k, v -> v == 8 || v 16108af81d65SBram Moolenaar == 9 16118af81d65SBram Moolenaar || v % 2 ? 111 : 222 16128af81d65SBram Moolenaar }) 16138af81d65SBram Moolenaar assert_equal([222, 111, 222], ll) 16148af81d65SBram Moolenaar 16158af81d65SBram Moolenaar ll = range(3) 16168af81d65SBram Moolenaar map(ll, {k, v -> v != 8 && v 16178af81d65SBram Moolenaar != 9 16188af81d65SBram Moolenaar && v % 2 == 0 ? 111 : 222 16198af81d65SBram Moolenaar }) 16208af81d65SBram Moolenaar assert_equal([111, 222, 111], ll) 16218af81d65SBram Moolenaar 16226802cce4SBram Moolenaar let dl = [{'key': 0}, {'key': 22}]->filter({ _, v -> v['key'] }) 16236802cce4SBram Moolenaar assert_equal([{'key': 22}], dl) 16246802cce4SBram Moolenaar 16257892b953SBram Moolenaar dl = [{'key': 12}, {'foo': 34}] 16267892b953SBram Moolenaar assert_equal([{'key': 12}], filter(dl, 16277892b953SBram Moolenaar {_, v -> has_key(v, 'key') ? v['key'] == 12 : 0})) 16287892b953SBram Moolenaar 1629ba60cc45SBram Moolenaar assert_equal(false, LambdaWithComments()(0)) 1630ba60cc45SBram Moolenaar assert_equal(true, LambdaWithComments()(1)) 1631ba60cc45SBram Moolenaar assert_equal(true, LambdaWithComments()(2)) 1632ba60cc45SBram Moolenaar assert_equal(false, LambdaWithComments()(3)) 1633ba60cc45SBram Moolenaar 1634fd77748dSBram Moolenaar assert_equal(false, LambdaUsingArg(0)()) 1635fd77748dSBram Moolenaar assert_equal(true, LambdaUsingArg(1)()) 1636fd77748dSBram Moolenaar 16373affe7a6SBram Moolenaar call CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:', 1) 16383affe7a6SBram Moolenaar # error is in first line of the lambda 16393affe7a6SBram Moolenaar call CheckDefFailure(["let L = {a -> a + b}"], 'E1001:', 0) 164079e8db9aSBram Moolenaar 164179e8db9aSBram Moolenaar assert_equal('xxxyyy', 'xxx'->{a, b -> a .. b}('yyy')) 164279e8db9aSBram Moolenaar 164379e8db9aSBram Moolenaar CheckDefExecFailure(["let s = 'asdf'->{a -> a}('x')"], 164479e8db9aSBram Moolenaar 'E1106: one argument too many') 164579e8db9aSBram Moolenaar CheckDefExecFailure(["let s = 'asdf'->{a -> a}('x', 'y')"], 164679e8db9aSBram Moolenaar 'E1106: 2 arguments too many') 16473affe7a6SBram Moolenaar CheckDefFailure(["echo 'asdf'->{a -> a}(x)"], 'E1001:', 1) 16488a7d6542SBram Moolenaarenddef 16498a7d6542SBram Moolenaar 1650e40fbc2cSBram Moolenaardef Test_expr7_lambda_vim9script() 1651e40fbc2cSBram Moolenaar let lines =<< trim END 1652e40fbc2cSBram Moolenaar vim9script 1653e40fbc2cSBram Moolenaar let v = 10->{a -> 1654e40fbc2cSBram Moolenaar a 1655e40fbc2cSBram Moolenaar + 2 1656e40fbc2cSBram Moolenaar }() 1657e40fbc2cSBram Moolenaar assert_equal(12, v) 1658e40fbc2cSBram Moolenaar END 1659e40fbc2cSBram Moolenaar CheckScriptSuccess(lines) 1660aeb2bdd0SBram Moolenaar 1661aeb2bdd0SBram Moolenaar # nested lambda with line breaks 1662aeb2bdd0SBram Moolenaar lines =<< trim END 1663aeb2bdd0SBram Moolenaar vim9script 1664aeb2bdd0SBram Moolenaar search('"', 'cW', 0, 0, {-> 1665aeb2bdd0SBram Moolenaar synstack('.', col('.')) 1666aeb2bdd0SBram Moolenaar ->map({_, v -> synIDattr(v, 'name')})->len()}) 1667aeb2bdd0SBram Moolenaar END 1668aeb2bdd0SBram Moolenaar CheckScriptSuccess(lines) 1669e40fbc2cSBram Moolenaarenddef 1670e40fbc2cSBram Moolenaar 1671*601e76acSBram Moolenaardef Test_epxr7_funcref() 1672*601e76acSBram Moolenaar let lines =<< trim END 1673*601e76acSBram Moolenaar def RetNumber(): number 1674*601e76acSBram Moolenaar return 123 1675*601e76acSBram Moolenaar enddef 1676*601e76acSBram Moolenaar let FuncRef = RetNumber 1677*601e76acSBram Moolenaar assert_equal(123, FuncRef()) 1678*601e76acSBram Moolenaar END 1679*601e76acSBram Moolenaar CheckDefAndScriptSuccess(lines) 1680*601e76acSBram Moolenaarenddef 1681*601e76acSBram Moolenaar 16828a7d6542SBram Moolenaardef Test_expr7_dict() 1683f5be8cdbSBram Moolenaar # dictionary 16848a7d6542SBram Moolenaar assert_equal(g:dict_empty, {}) 16858a7d6542SBram Moolenaar assert_equal(g:dict_empty, { }) 16868a7d6542SBram Moolenaar assert_equal(g:dict_one, {'one': 1}) 16878a7d6542SBram Moolenaar let key = 'one' 16888a7d6542SBram Moolenaar let val = 1 16898a7d6542SBram Moolenaar assert_equal(g:dict_one, {key: val}) 16900062c2d4SBram Moolenaar 1691127542bcSBram Moolenaar let numbers: dict<number> = #{a: 1, b: 2, c: 3} 1692127542bcSBram Moolenaar numbers = #{a: 1} 1693127542bcSBram Moolenaar numbers = #{} 1694127542bcSBram Moolenaar 1695127542bcSBram Moolenaar let strings: dict<string> = #{a: 'a', b: 'b', c: 'c'} 1696127542bcSBram Moolenaar strings = #{a: 'x'} 1697127542bcSBram Moolenaar strings = #{} 1698127542bcSBram Moolenaar 1699127542bcSBram Moolenaar let mixed: dict<any> = #{a: 'a', b: 42} 1700127542bcSBram Moolenaar mixed = #{a: 'x'} 1701127542bcSBram Moolenaar mixed = #{a: 234} 1702127542bcSBram Moolenaar mixed = #{} 1703127542bcSBram Moolenaar 17043affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{a:8}"], 'E1069:', 1) 17053affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{a : 8}"], 'E1068:', 1) 17063affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{a :8}"], 'E1068:', 1) 17073affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{a: 8 , b: 9}"], 'E1068:', 1) 170817a836cbSBram Moolenaar 17093affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{8: 8}"], 'E1014:', 1) 17103affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{xxx}"], 'E720:', 1) 17113affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{xxx: 1", "let y = 2"], 'E722:', 2) 17123affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{xxx: 1,"], 'E723:', 2) 17133affe7a6SBram Moolenaar call CheckDefFailure(["let x = {'a': xxx}"], 'E1001:', 1) 17143affe7a6SBram Moolenaar call CheckDefFailure(["let x = {xxx: 8}"], 'E1001:', 1) 17153affe7a6SBram Moolenaar call CheckDefFailure(["let x = #{a: 1, a: 2}"], 'E721:', 1) 17163affe7a6SBram Moolenaar call CheckDefFailure(["let x = #"], 'E1015:', 1) 17173affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = g:anint.member"], 'E715:', 1) 17183affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = g:dict_empty.member"], 'E716:', 1) 1719127542bcSBram Moolenaar 17203affe7a6SBram Moolenaar call CheckDefFailure(['let x: dict<number> = #{a: 234, b: "1"}'], 'E1012:', 1) 17213affe7a6SBram Moolenaar call CheckDefFailure(['let x: dict<number> = #{a: "x", b: 134}'], 'E1012:', 1) 17223affe7a6SBram Moolenaar call CheckDefFailure(['let x: dict<string> = #{a: 234, b: "1"}'], 'E1012:', 1) 17233affe7a6SBram Moolenaar call CheckDefFailure(['let x: dict<string> = #{a: "x", b: 134}'], 'E1012:', 1) 17248a7d6542SBram Moolenaarenddef 17258a7d6542SBram Moolenaar 17268ea9390bSBram Moolenaardef Test_expr7_dict_vim9script() 17278ea9390bSBram Moolenaar let lines =<< trim END 17288ea9390bSBram Moolenaar vim9script 17298ea9390bSBram Moolenaar let d = { 17308ea9390bSBram Moolenaar 'one': 17318ea9390bSBram Moolenaar 1, 17328ea9390bSBram Moolenaar 'two': 2, 17338ea9390bSBram Moolenaar } 17348ea9390bSBram Moolenaar assert_equal({'one': 1, 'two': 2}, d) 17358ea9390bSBram Moolenaar END 17368ea9390bSBram Moolenaar CheckScriptSuccess(lines) 17378ea9390bSBram Moolenaar 17388ea9390bSBram Moolenaar lines =<< trim END 17398ea9390bSBram Moolenaar vim9script 1740e6b5324eSBram Moolenaar let d = { "one": "one", "two": "two", } 1741e6b5324eSBram Moolenaar assert_equal({'one': 'one', 'two': 'two'}, d) 1742e6b5324eSBram Moolenaar END 1743e6b5324eSBram Moolenaar CheckScriptSuccess(lines) 1744e6b5324eSBram Moolenaar 1745e6b5324eSBram Moolenaar lines =<< trim END 1746e6b5324eSBram Moolenaar vim9script 17478ea9390bSBram Moolenaar let d = #{one: 1, 17488ea9390bSBram Moolenaar two: 2, 17498ea9390bSBram Moolenaar } 17508ea9390bSBram Moolenaar assert_equal({'one': 1, 'two': 2}, d) 17518ea9390bSBram Moolenaar END 17528ea9390bSBram Moolenaar CheckScriptSuccess(lines) 17538ea9390bSBram Moolenaar 17548ea9390bSBram Moolenaar lines =<< trim END 17558ea9390bSBram Moolenaar vim9script 17568ea9390bSBram Moolenaar let d = #{one:1, two: 2} 17578ea9390bSBram Moolenaar END 17583affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1069:', 2) 17598ea9390bSBram Moolenaar 17608ea9390bSBram Moolenaar lines =<< trim END 17618ea9390bSBram Moolenaar vim9script 17628ea9390bSBram Moolenaar let d = #{one: 1,two: 2} 17638ea9390bSBram Moolenaar END 17643affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1069:', 2) 1765db199216SBram Moolenaar 1766db199216SBram Moolenaar lines =<< trim END 1767db199216SBram Moolenaar vim9script 1768db199216SBram Moolenaar let d = #{one : 1} 1769db199216SBram Moolenaar END 17703affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1068:', 2) 1771db199216SBram Moolenaar 1772db199216SBram Moolenaar lines =<< trim END 1773db199216SBram Moolenaar vim9script 1774db199216SBram Moolenaar let d = #{one:1} 1775db199216SBram Moolenaar END 17763affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1069:', 2) 1777c3d6e8a4SBram Moolenaar 1778c3d6e8a4SBram Moolenaar lines =<< trim END 1779c3d6e8a4SBram Moolenaar vim9script 1780c3d6e8a4SBram Moolenaar let d = #{one: 1 , two: 2} 1781c3d6e8a4SBram Moolenaar END 17823affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1068:', 2) 178341fab3eaSBram Moolenaar 178441fab3eaSBram Moolenaar lines =<< trim END 178541fab3eaSBram Moolenaar vim9script 178641fab3eaSBram Moolenaar let l: dict<number> = #{a: 234, b: 'x'} 178741fab3eaSBram Moolenaar END 17883affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 178941fab3eaSBram Moolenaar lines =<< trim END 179041fab3eaSBram Moolenaar vim9script 179141fab3eaSBram Moolenaar let l: dict<number> = #{a: 'x', b: 234} 179241fab3eaSBram Moolenaar END 17933affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 179441fab3eaSBram Moolenaar lines =<< trim END 179541fab3eaSBram Moolenaar vim9script 179641fab3eaSBram Moolenaar let l: dict<string> = #{a: 'x', b: 234} 179741fab3eaSBram Moolenaar END 17983affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 179941fab3eaSBram Moolenaar lines =<< trim END 180041fab3eaSBram Moolenaar vim9script 180141fab3eaSBram Moolenaar let l: dict<string> = #{a: 234, b: 'x'} 180241fab3eaSBram Moolenaar END 18033affe7a6SBram Moolenaar CheckScriptFailure(lines, 'E1012:', 2) 18048ea9390bSBram Moolenaarenddef 18058ea9390bSBram Moolenaar 180650788ef3SBram Moolenaarlet g:oneString = 'one' 180750788ef3SBram Moolenaar 18080b37a2f3SBram Moolenaardef Test_expr_member() 18090b37a2f3SBram Moolenaar assert_equal(1, g:dict_one.one) 18104dac32caSBram Moolenaar let d: dict<number> = g:dict_one 18114dac32caSBram Moolenaar assert_equal(1, d['one']) 1812a7eedf31SBram Moolenaar assert_equal(1, d[ 1813a7eedf31SBram Moolenaar 'one' 1814a7eedf31SBram Moolenaar ]) 1815a7eedf31SBram Moolenaar assert_equal(1, d 1816a7eedf31SBram Moolenaar .one) 1817b13ab999SBram Moolenaar d = {'1': 1, '_': 2} 1818b13ab999SBram Moolenaar assert_equal(1, d 1819b13ab999SBram Moolenaar .1) 1820b13ab999SBram Moolenaar assert_equal(2, d 1821b13ab999SBram Moolenaar ._) 18220b37a2f3SBram Moolenaar 1823fb9d5c51SBram Moolenaar # getting the one member should clear the dict after getting the item 1824fb9d5c51SBram Moolenaar assert_equal('one', #{one: 'one'}.one) 182550788ef3SBram Moolenaar assert_equal('one', #{one: 'one'}[g:oneString]) 1826fb9d5c51SBram Moolenaar 18273affe7a6SBram Moolenaar call CheckDefFailure(["let x = g:dict_one.#$!"], 'E1002:', 1) 18283affe7a6SBram Moolenaar call CheckDefExecFailure(["let d: dict<any>", "echo d['a']"], 'E716:', 2) 18293affe7a6SBram Moolenaar call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list', 2) 18300b37a2f3SBram Moolenaarenddef 18310b37a2f3SBram Moolenaar 1832cc673e74SBram Moolenaardef Test_expr7_any_index_slice() 1833cc673e74SBram Moolenaar let lines =<< trim END 1834435d8978SBram Moolenaar # getting the one member should clear the list only after getting the item 1835435d8978SBram Moolenaar assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1]) 1836cc673e74SBram Moolenaar 1837cc673e74SBram Moolenaar # string is permissive, index out of range accepted 1838cc673e74SBram Moolenaar g:teststring = 'abcdef' 1839cc673e74SBram Moolenaar assert_equal('b', g:teststring[1]) 1840cc673e74SBram Moolenaar assert_equal('', g:teststring[-1]) 1841cc673e74SBram Moolenaar assert_equal('', g:teststring[99]) 1842cc673e74SBram Moolenaar 1843cc673e74SBram Moolenaar assert_equal('b', g:teststring[1:1]) 1844cc673e74SBram Moolenaar assert_equal('bcdef', g:teststring[1:]) 1845cc673e74SBram Moolenaar assert_equal('abcd', g:teststring[:3]) 1846cc673e74SBram Moolenaar assert_equal('cdef', g:teststring[-4:]) 1847cc673e74SBram Moolenaar assert_equal('abcdef', g:teststring[-9:]) 1848cc673e74SBram Moolenaar assert_equal('abcd', g:teststring[:-3]) 1849cc673e74SBram Moolenaar assert_equal('', g:teststring[:-9]) 1850cc673e74SBram Moolenaar 1851cc673e74SBram Moolenaar # blob index cannot be out of range 1852cc673e74SBram Moolenaar g:testblob = 0z01ab 1853cc673e74SBram Moolenaar assert_equal(0x01, g:testblob[0]) 1854cc673e74SBram Moolenaar assert_equal(0xab, g:testblob[1]) 1855cc673e74SBram Moolenaar assert_equal(0xab, g:testblob[-1]) 1856cc673e74SBram Moolenaar assert_equal(0x01, g:testblob[-2]) 1857cc673e74SBram Moolenaar 1858cc673e74SBram Moolenaar # blob slice accepts out of range 1859cc673e74SBram Moolenaar assert_equal(0z01ab, g:testblob[0:1]) 1860cc673e74SBram Moolenaar assert_equal(0z01, g:testblob[0:0]) 1861cc673e74SBram Moolenaar assert_equal(0z01, g:testblob[-2:-2]) 1862cc673e74SBram Moolenaar assert_equal(0zab, g:testblob[1:1]) 1863cc673e74SBram Moolenaar assert_equal(0zab, g:testblob[-1:-1]) 1864cc673e74SBram Moolenaar assert_equal(0z, g:testblob[2:2]) 1865cc673e74SBram Moolenaar assert_equal(0z, g:testblob[0:-3]) 1866cc673e74SBram Moolenaar 1867cc673e74SBram Moolenaar # list index cannot be out of range 1868cc673e74SBram Moolenaar g:testlist = [0, 1, 2, 3] 1869cc673e74SBram Moolenaar assert_equal(0, g:testlist[0]) 1870cc673e74SBram Moolenaar assert_equal(1, g:testlist[1]) 1871cc673e74SBram Moolenaar assert_equal(3, g:testlist[3]) 1872cc673e74SBram Moolenaar assert_equal(3, g:testlist[-1]) 1873cc673e74SBram Moolenaar assert_equal(0, g:testlist[-4]) 1874cc673e74SBram Moolenaar assert_equal(1, g:testlist[g:theone]) 1875cc673e74SBram Moolenaar 1876cc673e74SBram Moolenaar # list slice accepts out of range 1877cc673e74SBram Moolenaar assert_equal([0], g:testlist[0:0]) 1878cc673e74SBram Moolenaar assert_equal([3], g:testlist[3:3]) 1879cc673e74SBram Moolenaar assert_equal([0, 1], g:testlist[0:1]) 1880cc673e74SBram Moolenaar assert_equal([0, 1, 2, 3], g:testlist[0:3]) 1881cc673e74SBram Moolenaar assert_equal([0, 1, 2, 3], g:testlist[0:9]) 1882cc673e74SBram Moolenaar assert_equal([], g:testlist[-1:1]) 1883cc673e74SBram Moolenaar assert_equal([1], g:testlist[-3:1]) 1884cc673e74SBram Moolenaar assert_equal([0, 1], g:testlist[-4:1]) 1885cc673e74SBram Moolenaar assert_equal([0, 1], g:testlist[-9:1]) 1886cc673e74SBram Moolenaar assert_equal([1, 2, 3], g:testlist[1:-1]) 1887cc673e74SBram Moolenaar assert_equal([1], g:testlist[1:-3]) 1888cc673e74SBram Moolenaar assert_equal([], g:testlist[1:-4]) 1889cc673e74SBram Moolenaar assert_equal([], g:testlist[1:-9]) 1890cc673e74SBram Moolenaar 1891cc673e74SBram Moolenaar g:testdict = #{a: 1, b: 2} 1892cc673e74SBram Moolenaar assert_equal(1, g:testdict['a']) 1893cc673e74SBram Moolenaar assert_equal(2, g:testdict['b']) 1894cc673e74SBram Moolenaar END 1895cc673e74SBram Moolenaar 1896cc673e74SBram Moolenaar CheckDefSuccess(lines) 1897cc673e74SBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 1898cc673e74SBram Moolenaar 18993affe7a6SBram Moolenaar CheckDefExecFailure(['echo g:testblob[2]'], 'E979:', 1) 19003affe7a6SBram Moolenaar CheckScriptFailure(['vim9script', 'echo g:testblob[2]'], 'E979:', 2) 19013affe7a6SBram Moolenaar CheckDefExecFailure(['echo g:testblob[-3]'], 'E979:', 1) 19023affe7a6SBram Moolenaar CheckScriptFailure(['vim9script', 'echo g:testblob[-3]'], 'E979:', 2) 1903cc673e74SBram Moolenaar 19043affe7a6SBram Moolenaar CheckDefExecFailure(['echo g:testlist[4]'], 'E684:', 1) 19053affe7a6SBram Moolenaar CheckScriptFailure(['vim9script', 'echo g:testlist[4]'], 'E684:', 2) 19063affe7a6SBram Moolenaar CheckDefExecFailure(['echo g:testlist[-5]'], 'E684:', 1) 19073affe7a6SBram Moolenaar CheckScriptFailure(['vim9script', 'echo g:testlist[-5]'], 'E684:', 2) 1908cc673e74SBram Moolenaar 19093affe7a6SBram Moolenaar CheckDefExecFailure(['echo g:testdict["a":"b"]'], 'E719:', 1) 19103affe7a6SBram Moolenaar CheckScriptFailure(['vim9script', 'echo g:testdict["a":"b"]'], 'E719:', 2) 19113affe7a6SBram Moolenaar CheckDefExecFailure(['echo g:testdict[1]'], 'E716:', 1) 19123affe7a6SBram Moolenaar CheckScriptFailure(['vim9script', 'echo g:testdict[1]'], 'E716:', 2) 1913cc673e74SBram Moolenaar 1914cc673e74SBram Moolenaar unlet g:teststring 1915cc673e74SBram Moolenaar unlet g:testblob 1916cc673e74SBram Moolenaar unlet g:testlist 1917435d8978SBram Moolenaarenddef 1918435d8978SBram Moolenaar 1919442af2f8SBram Moolenaardef Test_expr_member_vim9script() 1920442af2f8SBram Moolenaar let lines =<< trim END 1921442af2f8SBram Moolenaar vim9script 1922442af2f8SBram Moolenaar let d = #{one: 1923442af2f8SBram Moolenaar 'one', 1924b13ab999SBram Moolenaar two: 'two', 1925b13ab999SBram Moolenaar 1: 1, 1926b13ab999SBram Moolenaar _: 2} 1927442af2f8SBram Moolenaar assert_equal('one', d.one) 1928442af2f8SBram Moolenaar assert_equal('one', d 1929442af2f8SBram Moolenaar .one) 1930b13ab999SBram Moolenaar assert_equal(1, d 1931b13ab999SBram Moolenaar .1) 1932b13ab999SBram Moolenaar assert_equal(2, d 1933b13ab999SBram Moolenaar ._) 1934442af2f8SBram Moolenaar assert_equal('one', d[ 1935442af2f8SBram Moolenaar 'one' 1936442af2f8SBram Moolenaar ]) 1937442af2f8SBram Moolenaar END 1938442af2f8SBram Moolenaar CheckScriptSuccess(lines) 1939442af2f8SBram Moolenaar 1940442af2f8SBram Moolenaar lines =<< trim END 1941442af2f8SBram Moolenaar vim9script 1942442af2f8SBram Moolenaar let l = [1, 1943442af2f8SBram Moolenaar 2, 1944442af2f8SBram Moolenaar 3, 4 1945442af2f8SBram Moolenaar ] 1946442af2f8SBram Moolenaar assert_equal(2, l[ 1947442af2f8SBram Moolenaar 1 1948442af2f8SBram Moolenaar ]) 1949442af2f8SBram Moolenaar assert_equal([2, 3], l[1 : 2]) 1950442af2f8SBram Moolenaar assert_equal([1, 2, 3], l[ 1951442af2f8SBram Moolenaar : 1952442af2f8SBram Moolenaar 2 1953442af2f8SBram Moolenaar ]) 1954442af2f8SBram Moolenaar assert_equal([3, 4], l[ 1955442af2f8SBram Moolenaar 2 1956442af2f8SBram Moolenaar : 1957442af2f8SBram Moolenaar ]) 1958442af2f8SBram Moolenaar END 1959442af2f8SBram Moolenaar CheckScriptSuccess(lines) 1960442af2f8SBram Moolenaarenddef 1961442af2f8SBram Moolenaar 19628a7d6542SBram Moolenaardef Test_expr7_option() 1963f5be8cdbSBram Moolenaar # option 19648a7d6542SBram Moolenaar set ts=11 19658a7d6542SBram Moolenaar assert_equal(11, &ts) 1966401d9ffbSBram Moolenaar &ts = 9 1967401d9ffbSBram Moolenaar assert_equal(9, &ts) 19688a7d6542SBram Moolenaar set ts=8 19698a7d6542SBram Moolenaar set grepprg=some\ text 19708a7d6542SBram Moolenaar assert_equal('some text', &grepprg) 197197a2af39SBram Moolenaar &grepprg = test_null_string() 197297a2af39SBram Moolenaar assert_equal('', &grepprg) 19738a7d6542SBram Moolenaar set grepprg& 19748a7d6542SBram Moolenaarenddef 19758a7d6542SBram Moolenaar 19768a7d6542SBram Moolenaardef Test_expr7_environment() 1977f5be8cdbSBram Moolenaar # environment variable 19788a7d6542SBram Moolenaar assert_equal('testvar', $TESTVAR) 19798a7d6542SBram Moolenaar assert_equal('', $ASDF_ASD_XXX) 1980c58164c5SBram Moolenaar 19813affe7a6SBram Moolenaar call CheckDefFailure(["let x = $$$"], 'E1002:', 1) 19828a7d6542SBram Moolenaarenddef 19838a7d6542SBram Moolenaar 19848a7d6542SBram Moolenaardef Test_expr7_register() 1985401d9ffbSBram Moolenaar @a = 'register a' 19868a7d6542SBram Moolenaar assert_equal('register a', @a) 19877226e5b1SBram Moolenaar 19887226e5b1SBram Moolenaar let fname = expand('%') 19897226e5b1SBram Moolenaar assert_equal(fname, @%) 19907226e5b1SBram Moolenaar 19917226e5b1SBram Moolenaar feedkeys(":echo 'some'\<CR>", "xt") 19927226e5b1SBram Moolenaar assert_equal("echo 'some'", @:) 19937226e5b1SBram Moolenaar 19947226e5b1SBram Moolenaar normal axyz 19957226e5b1SBram Moolenaar assert_equal("xyz", @.) 19963affe7a6SBram Moolenaar call CheckDefFailure(["@. = 'yes'"], 'E354:', 1) 199765821727SBram Moolenaar 199865821727SBram Moolenaar @/ = 'slash' 199965821727SBram Moolenaar assert_equal('slash', @/) 200065821727SBram Moolenaar 200165821727SBram Moolenaar @= = 'equal' 200265821727SBram Moolenaar assert_equal('equal', @=) 20038a7d6542SBram Moolenaarenddef 20048a7d6542SBram Moolenaar 20052f8ce0aeSBram Moolenaardef Test_expr7_namespace() 20062f8ce0aeSBram Moolenaar g:some_var = 'some' 20072f8ce0aeSBram Moolenaar assert_equal('some', get(g:, 'some_var')) 20082f8ce0aeSBram Moolenaar assert_equal('some', get(g:, 'some_var', 'xxx')) 20092f8ce0aeSBram Moolenaar assert_equal('xxx', get(g:, 'no_var', 'xxx')) 20102f8ce0aeSBram Moolenaar unlet g:some_var 20112f8ce0aeSBram Moolenaar 20122f8ce0aeSBram Moolenaar b:some_var = 'some' 20132f8ce0aeSBram Moolenaar assert_equal('some', get(b:, 'some_var')) 20142f8ce0aeSBram Moolenaar assert_equal('some', get(b:, 'some_var', 'xxx')) 20152f8ce0aeSBram Moolenaar assert_equal('xxx', get(b:, 'no_var', 'xxx')) 20162f8ce0aeSBram Moolenaar unlet b:some_var 20172f8ce0aeSBram Moolenaar 20182f8ce0aeSBram Moolenaar w:some_var = 'some' 20192f8ce0aeSBram Moolenaar assert_equal('some', get(w:, 'some_var')) 20202f8ce0aeSBram Moolenaar assert_equal('some', get(w:, 'some_var', 'xxx')) 20212f8ce0aeSBram Moolenaar assert_equal('xxx', get(w:, 'no_var', 'xxx')) 20222f8ce0aeSBram Moolenaar unlet w:some_var 20232f8ce0aeSBram Moolenaar 20242f8ce0aeSBram Moolenaar t:some_var = 'some' 20252f8ce0aeSBram Moolenaar assert_equal('some', get(t:, 'some_var')) 20262f8ce0aeSBram Moolenaar assert_equal('some', get(t:, 'some_var', 'xxx')) 20272f8ce0aeSBram Moolenaar assert_equal('xxx', get(t:, 'no_var', 'xxx')) 20282f8ce0aeSBram Moolenaar unlet t:some_var 20292f8ce0aeSBram Moolenaarenddef 20302f8ce0aeSBram Moolenaar 20318a7d6542SBram Moolenaardef Test_expr7_parens() 2032f5be8cdbSBram Moolenaar # (expr) 20338a7d6542SBram Moolenaar assert_equal(4, (6 * 4) / 6) 20348a7d6542SBram Moolenaar assert_equal(0, 6 * ( 4 / 6 )) 20358a7d6542SBram Moolenaar 20368a7d6542SBram Moolenaar assert_equal(6, +6) 20378a7d6542SBram Moolenaar assert_equal(-6, -6) 20388a7d6542SBram Moolenaar assert_equal(6, --6) 20398a7d6542SBram Moolenaar assert_equal(6, -+-6) 20408a7d6542SBram Moolenaar assert_equal(-6, ---6) 20410b1cd52fSBram Moolenaar assert_equal(false, !-3) 20420b1cd52fSBram Moolenaar assert_equal(true, !+-+0) 20438a7d6542SBram Moolenaarenddef 20448a7d6542SBram Moolenaar 20457a4981b9SBram Moolenaardef Test_expr7_parens_vim9script() 20467a4981b9SBram Moolenaar let lines =<< trim END 20477a4981b9SBram Moolenaar vim9script 20487a4981b9SBram Moolenaar let s = ( 20497a4981b9SBram Moolenaar 'one' 20507a4981b9SBram Moolenaar .. 20517a4981b9SBram Moolenaar 'two' 20527a4981b9SBram Moolenaar ) 20537a4981b9SBram Moolenaar assert_equal('onetwo', s) 20547a4981b9SBram Moolenaar END 20557a4981b9SBram Moolenaar CheckScriptSuccess(lines) 20567a4981b9SBram Moolenaarenddef 20577a4981b9SBram Moolenaar 20580b37a2f3SBram Moolenaardef Test_expr7_negate() 20590b37a2f3SBram Moolenaar assert_equal(-99, -99) 20600b37a2f3SBram Moolenaar assert_equal(99, --99) 20610b37a2f3SBram Moolenaar let nr = 88 20620b37a2f3SBram Moolenaar assert_equal(-88, -nr) 20630b37a2f3SBram Moolenaar assert_equal(88, --nr) 20640b37a2f3SBram Moolenaarenddef 20650b37a2f3SBram Moolenaar 20666e949784SBram Moolenaardef Echo(arg: any): string 20670b37a2f3SBram Moolenaar return arg 20680b37a2f3SBram Moolenaarenddef 20690b37a2f3SBram Moolenaar 2070c5da1fb7SBram Moolenaardef s:Echo4Arg(arg: any): string 20710b37a2f3SBram Moolenaar return arg 20720b37a2f3SBram Moolenaarenddef 20730b37a2f3SBram Moolenaar 20740b37a2f3SBram Moolenaardef Test_expr7_call() 20750b37a2f3SBram Moolenaar assert_equal('yes', 'yes'->Echo()) 2076dd1a9af0SBram Moolenaar assert_equal('yes', 'yes' 2077c5da1fb7SBram Moolenaar ->s:Echo4Arg()) 207859eccb92SBram Moolenaar assert_equal(true, !range(5)->empty()) 20790b1cd52fSBram Moolenaar assert_equal([0, 1, 2], --3->range()) 20800b37a2f3SBram Moolenaar 20813affe7a6SBram Moolenaar call CheckDefFailure(["let x = 'yes'->Echo"], 'E107:', 1) 2082bbd3e3c3SBram Moolenaar call CheckScriptFailure([ 2083bbd3e3c3SBram Moolenaar "vim9script", 2084bbd3e3c3SBram Moolenaar "let x = substitute ('x', 'x', 'x', 'x')" 20853affe7a6SBram Moolenaar ], 'E121:', 2) 2086a177344dSBram Moolenaar 2087a177344dSBram Moolenaar let auto_lines =<< trim END 2088a177344dSBram Moolenaar def g:some#func(): string 2089a177344dSBram Moolenaar return 'found' 2090a177344dSBram Moolenaar enddef 2091a177344dSBram Moolenaar END 2092a177344dSBram Moolenaar mkdir('Xruntime/autoload', 'p') 2093a177344dSBram Moolenaar writefile(auto_lines, 'Xruntime/autoload/some.vim') 2094a177344dSBram Moolenaar let save_rtp = &rtp 2095a177344dSBram Moolenaar &rtp = getcwd() .. '/Xruntime,' .. &rtp 2096a177344dSBram Moolenaar assert_equal('found', g:some#func()) 2097a177344dSBram Moolenaar assert_equal('found', some#func()) 2098a177344dSBram Moolenaar 2099a177344dSBram Moolenaar &rtp = save_rtp 2100a177344dSBram Moolenaar delete('Xruntime', 'rf') 21010b37a2f3SBram Moolenaarenddef 21020b37a2f3SBram Moolenaar 21030b37a2f3SBram Moolenaar 21048a7d6542SBram Moolenaardef Test_expr7_not() 21053e06a1e2SBram Moolenaar let lines =<< trim END 21068a7d6542SBram Moolenaar assert_equal(true, !'') 21078a7d6542SBram Moolenaar assert_equal(true, ![]) 21088a7d6542SBram Moolenaar assert_equal(false, !'asdf') 21098a7d6542SBram Moolenaar assert_equal(false, ![2]) 21108a7d6542SBram Moolenaar assert_equal(true, !!'asdf') 21118a7d6542SBram Moolenaar assert_equal(true, !![2]) 21128ed04587SBram Moolenaar 21138ed04587SBram Moolenaar assert_equal(true, !test_null_partial()) 21148ed04587SBram Moolenaar assert_equal(false, !{-> 'yes'}) 21158ed04587SBram Moolenaar 21168ed04587SBram Moolenaar assert_equal(true, !test_null_dict()) 21178ed04587SBram Moolenaar assert_equal(true, !{}) 21188ed04587SBram Moolenaar assert_equal(false, !{'yes': 'no'}) 21198ed04587SBram Moolenaar 2120b4d2cb10SBram Moolenaar if has('channel') 21218ed04587SBram Moolenaar assert_equal(true, !test_null_job()) 21228ed04587SBram Moolenaar assert_equal(true, !test_null_channel()) 2123b4d2cb10SBram Moolenaar endif 21248ed04587SBram Moolenaar 21258ed04587SBram Moolenaar assert_equal(true, !test_null_blob()) 21268ed04587SBram Moolenaar assert_equal(true, !0z) 21278ed04587SBram Moolenaar assert_equal(false, !0z01) 21288ed04587SBram Moolenaar 21298ed04587SBram Moolenaar assert_equal(true, !test_void()) 21308ed04587SBram Moolenaar assert_equal(true, !test_unknown()) 213159eccb92SBram Moolenaar 213259eccb92SBram Moolenaar assert_equal(false, ![1, 2, 3]->reverse()) 213359eccb92SBram Moolenaar assert_equal(true, ![]->reverse()) 21343e06a1e2SBram Moolenaar END 21353e06a1e2SBram Moolenaar CheckDefSuccess(lines) 21363e06a1e2SBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 21378a7d6542SBram Moolenaarenddef 21388a7d6542SBram Moolenaar 21398a7d6542SBram Moolenaarfunc Test_expr7_fails() 21403affe7a6SBram Moolenaar call CheckDefFailure(["let x = (12"], "E110:", 1) 21418a7d6542SBram Moolenaar 21423affe7a6SBram Moolenaar call CheckDefFailure(["let x = -'xx'"], "E1030:", 1) 21433affe7a6SBram Moolenaar call CheckDefFailure(["let x = +'xx'"], "E1030:", 1) 21443affe7a6SBram Moolenaar call CheckDefFailure(["let x = -0z12"], "E974:", 1) 21453affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = -[8]"], "E39:", 1) 21463affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = -{'a': 1}"], "E39:", 1) 21478a7d6542SBram Moolenaar 21483affe7a6SBram Moolenaar call CheckDefFailure(["let x = @"], "E1002:", 1) 21493affe7a6SBram Moolenaar call CheckDefFailure(["let x = @<"], "E354:", 1) 215058ceca5cSBram Moolenaar 21513affe7a6SBram Moolenaar call CheckDefFailure(["let x = [1, 2"], "E697:", 2) 21523affe7a6SBram Moolenaar call CheckDefFailure(["let x = [notfound]"], "E1001:", 1) 2153ee619e5bSBram Moolenaar 21543affe7a6SBram Moolenaar call CheckDefFailure(["let x = { -> 123) }"], "E451:", 1) 21553affe7a6SBram Moolenaar call CheckDefFailure(["let x = 123->{x -> x + 5) }"], "E451:", 1) 2156ee619e5bSBram Moolenaar 21573affe7a6SBram Moolenaar call CheckDefFailure(["let x = ¬exist"], 'E113:', 1) 21583affe7a6SBram Moolenaar call CheckDefFailure(["&grepprg = [343]"], 'E1012:', 1) 2159fd1823e0SBram Moolenaar 21603affe7a6SBram Moolenaar call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:', 1) 21613affe7a6SBram Moolenaar call CheckDefExecFailure(["echo g:doesnt_exist"], 'E121:', 1) 216209f28f49SBram Moolenaar 21633affe7a6SBram Moolenaar call CheckDefFailure(["echo a:somevar"], 'E1075:', 1) 21643affe7a6SBram Moolenaar call CheckDefFailure(["echo l:somevar"], 'E1075:', 1) 21653affe7a6SBram Moolenaar call CheckDefFailure(["echo x:somevar"], 'E1075:', 1) 216633fa29cfSBram Moolenaar 21673affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = +g:astring"], 'E1030:', 1) 21683affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = +g:ablob"], 'E974:', 1) 21693affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = +g:alist"], 'E745:', 1) 21703affe7a6SBram Moolenaar call CheckDefExecFailure(["let x = +g:adict"], 'E728:', 1) 217142a480bfSBram Moolenaar 21723affe7a6SBram Moolenaar call CheckDefFailure(["let x = ''", "let y = x.memb"], 'E715:', 2) 217333fa29cfSBram Moolenaar 21743affe7a6SBram Moolenaar call CheckDefFailure(["'yes'->", "Echo()"], 'E488: Trailing characters: ->', 1) 2175dd1a9af0SBram Moolenaar 21763affe7a6SBram Moolenaar call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2) 21773affe7a6SBram Moolenaar call CheckDefExecFailure(["#{a: 1->len()"], 'E488:', 1) 21783affe7a6SBram Moolenaar call CheckDefExecFailure(["{'a': 1->len()"], 'E723:', 2) 21798a7d6542SBram Moolenaarendfunc 21808a7d6542SBram Moolenaar 21818a7d6542SBram Moolenaarlet g:Funcrefs = [function('add')] 21828a7d6542SBram Moolenaar 21838a7d6542SBram Moolenaarfunc CallMe(arg) 21848a7d6542SBram Moolenaar return a:arg 21858a7d6542SBram Moolenaarendfunc 21868a7d6542SBram Moolenaar 218738a5f517SBram Moolenaarfunc CallMe2(one, two) 218838a5f517SBram Moolenaar return a:one .. a:two 218938a5f517SBram Moolenaarendfunc 219038a5f517SBram Moolenaar 21918a7d6542SBram Moolenaardef Test_expr7_trailing() 2192f5be8cdbSBram Moolenaar # user function call 21934c17ad94SBram Moolenaar assert_equal(123, g:CallMe(123)) 21944c17ad94SBram Moolenaar assert_equal(123, g:CallMe( 123)) 21954c17ad94SBram Moolenaar assert_equal(123, g:CallMe(123 )) 21964c17ad94SBram Moolenaar assert_equal('yesno', g:CallMe2('yes', 'no')) 21974c17ad94SBram Moolenaar assert_equal('yesno', g:CallMe2( 'yes', 'no' )) 21984c17ad94SBram Moolenaar assert_equal('nothing', g:CallMe('nothing')) 21998a7d6542SBram Moolenaar 2200f5be8cdbSBram Moolenaar # partial call 22014c17ad94SBram Moolenaar let Part = function('g:CallMe') 22028a7d6542SBram Moolenaar assert_equal('yes', Part('yes')) 22038a7d6542SBram Moolenaar 2204f5be8cdbSBram Moolenaar # funcref call, using list index 22058a7d6542SBram Moolenaar let l = [] 22068a7d6542SBram Moolenaar g:Funcrefs[0](l, 2) 22078a7d6542SBram Moolenaar assert_equal([2], l) 22088a7d6542SBram Moolenaar 2209f5be8cdbSBram Moolenaar # method call 22108a7d6542SBram Moolenaar l = [2, 5, 6] 22118a7d6542SBram Moolenaar l->map({k, v -> k + v}) 22128a7d6542SBram Moolenaar assert_equal([2, 6, 8], l) 22138a7d6542SBram Moolenaar 2214f5be8cdbSBram Moolenaar # lambda method call 22158a7d6542SBram Moolenaar l = [2, 5] 22168a7d6542SBram Moolenaar l->{l -> add(l, 8)}() 22178a7d6542SBram Moolenaar assert_equal([2, 5, 8], l) 22188a7d6542SBram Moolenaar 2219f5be8cdbSBram Moolenaar # dict member 22208a7d6542SBram Moolenaar let d = #{key: 123} 22218a7d6542SBram Moolenaar assert_equal(123, d.key) 22228a7d6542SBram Moolenaarenddef 22238a7d6542SBram Moolenaar 222411107babSBram Moolenaardef Test_expr7_string_subscript() 2225e3c37d8eSBram Moolenaar let lines =<< trim END 2226bf9d8c37SBram Moolenaar let text = 'abcdef' 2227bf9d8c37SBram Moolenaar assert_equal('', text[-1]) 2228bf9d8c37SBram Moolenaar assert_equal('a', text[0]) 2229bf9d8c37SBram Moolenaar assert_equal('e', text[4]) 2230bf9d8c37SBram Moolenaar assert_equal('f', text[5]) 2231bf9d8c37SBram Moolenaar assert_equal('', text[6]) 2232e3c37d8eSBram Moolenaar 2233e3c37d8eSBram Moolenaar text = 'ábçdëf' 2234e3c37d8eSBram Moolenaar assert_equal('', text[-999]) 2235e3c37d8eSBram Moolenaar assert_equal('', text[-1]) 2236e3c37d8eSBram Moolenaar assert_equal('á', text[0]) 2237e3c37d8eSBram Moolenaar assert_equal('b', text[1]) 2238e3c37d8eSBram Moolenaar assert_equal('ç', text[2]) 2239e3c37d8eSBram Moolenaar assert_equal('d', text[3]) 2240e3c37d8eSBram Moolenaar assert_equal('ë', text[4]) 2241e3c37d8eSBram Moolenaar assert_equal('f', text[5]) 2242e3c37d8eSBram Moolenaar assert_equal('', text[6]) 2243e3c37d8eSBram Moolenaar assert_equal('', text[999]) 224411107babSBram Moolenaar 224511107babSBram Moolenaar assert_equal('ábçdëf', text[0:-1]) 224611107babSBram Moolenaar assert_equal('ábçdëf', text[0 :-1]) 224711107babSBram Moolenaar assert_equal('ábçdëf', text[0: -1]) 224811107babSBram Moolenaar assert_equal('ábçdëf', text[0 : -1]) 224911107babSBram Moolenaar assert_equal('ábçdëf', text[0 225011107babSBram Moolenaar :-1]) 225111107babSBram Moolenaar assert_equal('ábçdëf', text[0: 225211107babSBram Moolenaar -1]) 225311107babSBram Moolenaar assert_equal('ábçdëf', text[0 : -1 225411107babSBram Moolenaar ]) 225511107babSBram Moolenaar assert_equal('bçdëf', text[1:-1]) 225611107babSBram Moolenaar assert_equal('çdëf', text[2:-1]) 225711107babSBram Moolenaar assert_equal('dëf', text[3:-1]) 225811107babSBram Moolenaar assert_equal('ëf', text[4:-1]) 225911107babSBram Moolenaar assert_equal('f', text[5:-1]) 226011107babSBram Moolenaar assert_equal('', text[6:-1]) 226111107babSBram Moolenaar assert_equal('', text[999:-1]) 226211107babSBram Moolenaar 226311107babSBram Moolenaar assert_equal('ábçd', text[:3]) 226411107babSBram Moolenaar assert_equal('bçdëf', text[1:]) 226511107babSBram Moolenaar assert_equal('ábçdëf', text[:]) 2266e3c37d8eSBram Moolenaar END 2267e3c37d8eSBram Moolenaar CheckDefSuccess(lines) 2268e3c37d8eSBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 2269bf9d8c37SBram Moolenaarenddef 2270bf9d8c37SBram Moolenaar 2271ed591877SBram Moolenaardef Test_expr7_list_subscript() 2272ed591877SBram Moolenaar let lines =<< trim END 2273ed591877SBram Moolenaar let list = [0, 1, 2, 3, 4] 2274ed591877SBram Moolenaar assert_equal(0, list[0]) 2275ed591877SBram Moolenaar assert_equal(4, list[4]) 2276ed591877SBram Moolenaar assert_equal(4, list[-1]) 2277ed591877SBram Moolenaar assert_equal(0, list[-5]) 2278ed591877SBram Moolenaar 2279ed591877SBram Moolenaar assert_equal([0, 1, 2, 3, 4], list[0:4]) 2280ed591877SBram Moolenaar assert_equal([0, 1, 2, 3, 4], list[:]) 2281ed591877SBram Moolenaar assert_equal([1, 2, 3, 4], list[1:]) 2282ed591877SBram Moolenaar assert_equal([2, 3, 4], list[2:-1]) 2283ed591877SBram Moolenaar assert_equal([4], list[4:-1]) 2284ed591877SBram Moolenaar assert_equal([], list[5:-1]) 2285ed591877SBram Moolenaar assert_equal([], list[999:-1]) 228656acb094SBram Moolenaar assert_equal([1, 2, 3, 4], list[g:theone:g:thefour]) 2287ed591877SBram Moolenaar 2288ed591877SBram Moolenaar assert_equal([0, 1, 2, 3], list[0:3]) 2289ed591877SBram Moolenaar assert_equal([0], list[0:0]) 2290ed591877SBram Moolenaar assert_equal([0, 1, 2, 3, 4], list[0:-1]) 2291ed591877SBram Moolenaar assert_equal([0, 1, 2], list[0:-3]) 2292ed591877SBram Moolenaar assert_equal([0], list[0:-5]) 2293ed591877SBram Moolenaar assert_equal([], list[0:-6]) 2294ed591877SBram Moolenaar assert_equal([], list[0:-99]) 2295ed591877SBram Moolenaar END 2296ed591877SBram Moolenaar CheckDefSuccess(lines) 2297ed591877SBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 229856acb094SBram Moolenaar 229956acb094SBram Moolenaar lines = ['let l = [0, 1, 2]', 'echo l[g:astring : g:theone]'] 230056acb094SBram Moolenaar CheckDefExecFailure(lines, 'E1029:') 23013affe7a6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1030:', 3) 2302ed591877SBram Moolenaarenddef 2303ed591877SBram Moolenaar 2304a3b7fdc1SBram Moolenaardef Test_expr7_subscript_linebreak() 2305a3b7fdc1SBram Moolenaar let range = range( 2306a3b7fdc1SBram Moolenaar 3) 2307dd1a9af0SBram Moolenaar let l = range 2308dd1a9af0SBram Moolenaar ->map('string(v:key)') 2309a3b7fdc1SBram Moolenaar assert_equal(['0', '1', '2'], l) 2310a3b7fdc1SBram Moolenaar 231123c55273SBram Moolenaar l = range 231223c55273SBram Moolenaar ->map('string(v:key)') 231323c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 231423c55273SBram Moolenaar 231523c55273SBram Moolenaar l = range # comment 231623c55273SBram Moolenaar ->map('string(v:key)') 231723c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 231823c55273SBram Moolenaar 231923c55273SBram Moolenaar l = range 232023c55273SBram Moolenaar 232123c55273SBram Moolenaar ->map('string(v:key)') 232223c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 232323c55273SBram Moolenaar 232423c55273SBram Moolenaar l = range 232523c55273SBram Moolenaar # comment 232623c55273SBram Moolenaar ->map('string(v:key)') 232723c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 232823c55273SBram Moolenaar 2329a3b7fdc1SBram Moolenaar assert_equal('1', l[ 2330a3b7fdc1SBram Moolenaar 1]) 2331a3b7fdc1SBram Moolenaar 2332a3b7fdc1SBram Moolenaar let d = #{one: 33} 2333a3b7fdc1SBram Moolenaar assert_equal(33, d. 2334a3b7fdc1SBram Moolenaar one) 2335a3b7fdc1SBram Moolenaarenddef 2336a3b7fdc1SBram Moolenaar 2337389df259SBram Moolenaardef Test_expr7_method_call() 2338389df259SBram Moolenaar new 2339389df259SBram Moolenaar setline(1, ['first', 'last']) 234010409562SBram Moolenaar 'second'->append(1) 234110409562SBram Moolenaar "third"->append(2) 234210409562SBram Moolenaar assert_equal(['first', 'second', 'third', 'last'], getline(1, '$')) 2343389df259SBram Moolenaar bwipe! 2344389df259SBram Moolenaar 2345389df259SBram Moolenaar let bufnr = bufnr() 2346389df259SBram Moolenaar let loclist = [#{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}] 2347389df259SBram Moolenaar loclist->setloclist(0) 2348389df259SBram Moolenaar assert_equal([#{bufnr: bufnr, 2349389df259SBram Moolenaar lnum: 42, 2350389df259SBram Moolenaar col: 17, 2351389df259SBram Moolenaar text: 'wrong', 2352389df259SBram Moolenaar pattern: '', 2353389df259SBram Moolenaar valid: 1, 2354389df259SBram Moolenaar vcol: 0, 2355389df259SBram Moolenaar nr: 0, 2356389df259SBram Moolenaar type: '', 2357389df259SBram Moolenaar module: ''} 2358389df259SBram Moolenaar ], getloclist(0)) 2359389df259SBram Moolenaarenddef 23606e949784SBram Moolenaar 23618a7d6542SBram Moolenaarfunc Test_expr7_trailing_fails() 23623affe7a6SBram Moolenaar call CheckDefFailure(['let l = [2]', 'l->{l -> add(l, 8)}'], 'E107:', 2) 23633affe7a6SBram Moolenaar call CheckDefFailure(['let l = [2]', 'l->{l -> add(l, 8)} ()'], 'E274:', 2) 23648a7d6542SBram Moolenaarendfunc 23658a7d6542SBram Moolenaar 23668a7d6542SBram Moolenaarfunc Test_expr_fails() 23673affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'is2"], 'E488:', 1) 23683affe7a6SBram Moolenaar call CheckDefFailure(["let x = '1'isnot2"], 'E488:', 1) 236938a5f517SBram Moolenaar 23703affe7a6SBram Moolenaar call CheckDefFailure(["CallMe ('yes')"], 'E476:', 1) 23717cb6fc29SBram Moolenaar call CheckScriptFailure(["CallMe ('yes')"], 'E492:', 1) 23727cb6fc29SBram Moolenaar call CheckScriptAndDefFailure(["CallMe2('yes','no')"], 'E1069:', 1) 23733affe7a6SBram Moolenaar call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:', 1) 23740c2ca58eSBram Moolenaar 23753affe7a6SBram Moolenaar call CheckDefFailure(["v:nosuch += 3"], 'E1001:', 1) 23763affe7a6SBram Moolenaar call CheckDefFailure(["let v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1) 23773affe7a6SBram Moolenaar call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:', 1) 237833fa29cfSBram Moolenaar 23793affe7a6SBram Moolenaar call CheckDefFailure(["echo len('asdf'"], 'E110:', 2) 23803affe7a6SBram Moolenaar call CheckDefFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:', 1) 23813affe7a6SBram Moolenaar call CheckDefFailure(["echo doesnotexist()"], 'E117:', 1) 23828a7d6542SBram Moolenaarendfunc 23836d91bcb4SBram Moolenaar 23846d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 2385