18a7d6542SBram Moolenaar" Tests for Vim9 script expressions 28a7d6542SBram Moolenaar 38a7d6542SBram Moolenaarsource check.vim 4cfe435d7SBram Moolenaarsource vim9.vim 58a7d6542SBram Moolenaar 68a7d6542SBram Moolenaar" test cond ? expr : expr 78a7d6542SBram Moolenaardef Test_expr1() 88a7d6542SBram Moolenaar assert_equal('one', true ? 'one' : 'two') 99c7e6dd6SBram Moolenaar assert_equal('one', 1 ? 109c7e6dd6SBram Moolenaar 'one' : 119c7e6dd6SBram Moolenaar 'two') 125feabe00SBram Moolenaar if has('float') 138a7d6542SBram Moolenaar assert_equal('one', 0.1 ? 'one' : 'two') 145feabe00SBram Moolenaar endif 158a7d6542SBram Moolenaar assert_equal('one', 'x' ? 'one' : 'two') 1667fbdfefSBram Moolenaar assert_equal('one', 'x' 1767fbdfefSBram Moolenaar ? 'one' 1867fbdfefSBram Moolenaar : 'two') 195381c7a1SBram Moolenaar assert_equal('one', 0z1234 ? 'one' : 'two') 208a7d6542SBram Moolenaar assert_equal('one', [0] ? 'one' : 'two') 215381c7a1SBram Moolenaar assert_equal('one', #{x: 0} ? 'one' : 'two') 228a7d6542SBram Moolenaar let var = 1 238a7d6542SBram Moolenaar assert_equal('one', var ? 'one' : 'two') 248a7d6542SBram Moolenaar 258a7d6542SBram Moolenaar assert_equal('two', false ? 'one' : 'two') 268a7d6542SBram Moolenaar assert_equal('two', 0 ? 'one' : 'two') 277f829cabSBram Moolenaar if has('float') 288a7d6542SBram Moolenaar assert_equal('two', 0.0 ? 'one' : 'two') 297f829cabSBram Moolenaar endif 308a7d6542SBram Moolenaar assert_equal('two', '' ? 'one' : 'two') 315381c7a1SBram Moolenaar assert_equal('two', 0z ? 'one' : 'two') 328a7d6542SBram Moolenaar assert_equal('two', [] ? 'one' : 'two') 335381c7a1SBram Moolenaar assert_equal('two', {} ? 'one' : 'two') 348a7d6542SBram Moolenaar var = 0 358a7d6542SBram Moolenaar assert_equal('two', var ? 'one' : 'two') 36939b5db4SBram Moolenaar 37939b5db4SBram Moolenaar let Some: func = function('len') 38939b5db4SBram Moolenaar let Other: func = function('winnr') 39939b5db4SBram Moolenaar let Res: func = g:atrue ? Some : Other 40939b5db4SBram Moolenaar assert_equal(function('len'), Res) 41939b5db4SBram Moolenaar 42939b5db4SBram Moolenaar let RetOne: func(string): number = function('len') 43939b5db4SBram Moolenaar let RetTwo: func(string): number = function('winnr') 44939b5db4SBram Moolenaar let RetThat: func = g:atrue ? RetOne : RetTwo 45939b5db4SBram Moolenaar assert_equal(function('len'), RetThat) 468a7d6542SBram Moolenaarenddef 478a7d6542SBram Moolenaar 48793648fbSBram Moolenaardef Test_expr1_vimscript() 49f5be8cdbSBram Moolenaar # only checks line continuation 50793648fbSBram Moolenaar let lines =<< trim END 51793648fbSBram Moolenaar vim9script 52793648fbSBram Moolenaar let var = 1 53793648fbSBram Moolenaar ? 'yes' 54793648fbSBram Moolenaar : 'no' 55793648fbSBram Moolenaar assert_equal('yes', var) 56793648fbSBram Moolenaar END 57793648fbSBram Moolenaar CheckScriptSuccess(lines) 58793648fbSBram Moolenaar 59793648fbSBram Moolenaar lines =<< trim END 60793648fbSBram Moolenaar vim9script 61793648fbSBram Moolenaar let var = v:false 62793648fbSBram Moolenaar ? 'yes' 63793648fbSBram Moolenaar : 'no' 64793648fbSBram Moolenaar assert_equal('no', var) 65793648fbSBram Moolenaar END 66793648fbSBram Moolenaar CheckScriptSuccess(lines) 679215f012SBram Moolenaar 689215f012SBram Moolenaar lines =<< trim END 699215f012SBram Moolenaar vim9script 709215f012SBram Moolenaar let var = v:false ? 719215f012SBram Moolenaar 'yes' : 729215f012SBram Moolenaar 'no' 739215f012SBram Moolenaar assert_equal('no', var) 749215f012SBram Moolenaar END 759215f012SBram Moolenaar CheckScriptSuccess(lines) 76793648fbSBram Moolenaarenddef 77793648fbSBram Moolenaar 788a7d6542SBram Moolenaarfunc Test_expr1_fails() 79cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one'"], "Missing ':' after '?'") 80cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one' : xxx"], "E1001:") 818a7d6542SBram Moolenaar 828a7d6542SBram Moolenaar let msg = "white space required before and after '?'" 83cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1? 'one' : 'two'"], msg) 84cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ?'one' : 'two'"], msg) 85cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1?'one' : 'two'"], msg) 868a7d6542SBram Moolenaar 878a7d6542SBram Moolenaar let msg = "white space required before and after ':'" 88cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one': 'two'"], msg) 89cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one' :'two'"], msg) 90cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ? 'one':'two'"], msg) 918a7d6542SBram Moolenaarendfunc 928a7d6542SBram Moolenaar 938a7d6542SBram Moolenaar" TODO: define inside test function 948a7d6542SBram Moolenaardef Record(val: any): any 958a7d6542SBram Moolenaar g:vals->add(val) 968a7d6542SBram Moolenaar return val 978a7d6542SBram Moolenaarenddef 988a7d6542SBram Moolenaar 998a7d6542SBram Moolenaar" test || 1008a7d6542SBram Moolenaardef Test_expr2() 1018a7d6542SBram Moolenaar assert_equal(2, 2 || 0) 1029c7e6dd6SBram Moolenaar assert_equal(7, 0 || 1039c7e6dd6SBram Moolenaar 0 || 1049c7e6dd6SBram Moolenaar 7) 1058a7d6542SBram Moolenaar assert_equal(0, 0 || 0) 10667fbdfefSBram Moolenaar assert_equal(0, 0 10767fbdfefSBram Moolenaar || 0) 1088a7d6542SBram Moolenaar assert_equal('', 0 || '') 1098a7d6542SBram Moolenaar 1108a7d6542SBram Moolenaar g:vals = [] 1118a7d6542SBram Moolenaar assert_equal(3, Record(3) || Record(1)) 1128a7d6542SBram Moolenaar assert_equal([3], g:vals) 1138a7d6542SBram Moolenaar 1148a7d6542SBram Moolenaar g:vals = [] 1158a7d6542SBram Moolenaar assert_equal(5, Record(0) || Record(5)) 1168a7d6542SBram Moolenaar assert_equal([0, 5], g:vals) 1178a7d6542SBram Moolenaar 1188a7d6542SBram Moolenaar g:vals = [] 11967fbdfefSBram Moolenaar assert_equal(4, Record(0) 12067fbdfefSBram Moolenaar || Record(4) 12167fbdfefSBram Moolenaar || Record(0)) 1228a7d6542SBram Moolenaar assert_equal([0, 4], g:vals) 1238a7d6542SBram Moolenaar 1248a7d6542SBram Moolenaar g:vals = [] 1258a7d6542SBram Moolenaar assert_equal(0, Record([]) || Record('') || Record(0)) 1268a7d6542SBram Moolenaar assert_equal([[], '', 0], g:vals) 1278a7d6542SBram Moolenaarenddef 1288a7d6542SBram Moolenaar 129be7ee488SBram Moolenaardef Test_expr2_vimscript() 130f5be8cdbSBram Moolenaar # check line continuation 131be7ee488SBram Moolenaar let lines =<< trim END 132be7ee488SBram Moolenaar vim9script 133be7ee488SBram Moolenaar let var = 0 134be7ee488SBram Moolenaar || 1 135be7ee488SBram Moolenaar assert_equal(1, var) 136be7ee488SBram Moolenaar END 137be7ee488SBram Moolenaar CheckScriptSuccess(lines) 138be7ee488SBram Moolenaar 139be7ee488SBram Moolenaar lines =<< trim END 140be7ee488SBram Moolenaar vim9script 141be7ee488SBram Moolenaar let var = v:false 142be7ee488SBram Moolenaar || v:true 143be7ee488SBram Moolenaar || v:false 1448c34ea54SBram Moolenaar assert_equal(v:true, var) 145be7ee488SBram Moolenaar END 146be7ee488SBram Moolenaar CheckScriptSuccess(lines) 1479215f012SBram Moolenaar 1489215f012SBram Moolenaar lines =<< trim END 1499215f012SBram Moolenaar vim9script 1509215f012SBram Moolenaar let var = v:false || 1519215f012SBram Moolenaar v:true || 1529215f012SBram Moolenaar v:false 1538c34ea54SBram Moolenaar assert_equal(v:true, var) 1548c34ea54SBram Moolenaar END 1558c34ea54SBram Moolenaar CheckScriptSuccess(lines) 1568c34ea54SBram Moolenaar 157f5be8cdbSBram Moolenaar # check keeping the value 1588c34ea54SBram Moolenaar lines =<< trim END 1598c34ea54SBram Moolenaar vim9script 1608c34ea54SBram Moolenaar assert_equal(2, 2 || 0) 1618c34ea54SBram Moolenaar assert_equal(7, 0 || 1628c34ea54SBram Moolenaar 0 || 1638c34ea54SBram Moolenaar 7) 1648c34ea54SBram Moolenaar assert_equal(0, 0 || 0) 1658c34ea54SBram Moolenaar assert_equal(0, 0 1668c34ea54SBram Moolenaar || 0) 1678c34ea54SBram Moolenaar assert_equal('', 0 || '') 1688c34ea54SBram Moolenaar 1698c34ea54SBram Moolenaar g:vals = [] 1708c34ea54SBram Moolenaar assert_equal(3, Record(3) || Record(1)) 1718c34ea54SBram Moolenaar assert_equal([3], g:vals) 1728c34ea54SBram Moolenaar 1738c34ea54SBram Moolenaar g:vals = [] 1748c34ea54SBram Moolenaar assert_equal(5, Record(0) || Record(5)) 1758c34ea54SBram Moolenaar assert_equal([0, 5], g:vals) 1768c34ea54SBram Moolenaar 1778c34ea54SBram Moolenaar g:vals = [] 1788c34ea54SBram Moolenaar assert_equal(4, Record(0) 1798c34ea54SBram Moolenaar || Record(4) 1808c34ea54SBram Moolenaar || Record(0)) 1818c34ea54SBram Moolenaar assert_equal([0, 4], g:vals) 1828c34ea54SBram Moolenaar 1838c34ea54SBram Moolenaar g:vals = [] 1848c34ea54SBram Moolenaar assert_equal(0, Record([]) || Record('') || Record(0)) 1858c34ea54SBram Moolenaar assert_equal([[], '', 0], g:vals) 1869215f012SBram Moolenaar END 1879215f012SBram Moolenaar CheckScriptSuccess(lines) 188be7ee488SBram Moolenaarenddef 189be7ee488SBram Moolenaar 1908a7d6542SBram Moolenaarfunc Test_expr2_fails() 1918a7d6542SBram Moolenaar let msg = "white space required before and after '||'" 192cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1||2"], msg) 193cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ||2"], msg) 194cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1|| 2"], msg) 195a8c17704SBram Moolenaar 196cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 || xxx"], 'E1001:') 1978a7d6542SBram Moolenaarendfunc 1988a7d6542SBram Moolenaar 1998a7d6542SBram Moolenaar" test && 2008a7d6542SBram Moolenaardef Test_expr3() 2018a7d6542SBram Moolenaar assert_equal(0, 2 && 0) 2029c7e6dd6SBram Moolenaar assert_equal(0, 0 && 2039c7e6dd6SBram Moolenaar 0 && 2049c7e6dd6SBram Moolenaar 7) 20567fbdfefSBram Moolenaar assert_equal(7, 2 20667fbdfefSBram Moolenaar && 3 20767fbdfefSBram Moolenaar && 7) 2088a7d6542SBram Moolenaar assert_equal(0, 0 && 0) 2098a7d6542SBram Moolenaar assert_equal(0, 0 && '') 2108a7d6542SBram Moolenaar assert_equal('', 8 && '') 2118a7d6542SBram Moolenaar 2128a7d6542SBram Moolenaar g:vals = [] 2138a7d6542SBram Moolenaar assert_equal(1, Record(3) && Record(1)) 2148a7d6542SBram Moolenaar assert_equal([3, 1], g:vals) 2158a7d6542SBram Moolenaar 2168a7d6542SBram Moolenaar g:vals = [] 2178a7d6542SBram Moolenaar assert_equal(0, Record(0) && Record(5)) 2188a7d6542SBram Moolenaar assert_equal([0], g:vals) 2198a7d6542SBram Moolenaar 2208a7d6542SBram Moolenaar g:vals = [] 2218a7d6542SBram Moolenaar assert_equal(0, Record(0) && Record(4) && Record(0)) 2228a7d6542SBram Moolenaar assert_equal([0], g:vals) 2238a7d6542SBram Moolenaar 2248a7d6542SBram Moolenaar g:vals = [] 2258a7d6542SBram Moolenaar assert_equal(0, Record(8) && Record(4) && Record(0)) 2268a7d6542SBram Moolenaar assert_equal([8, 4, 0], g:vals) 2278a7d6542SBram Moolenaar 2288a7d6542SBram Moolenaar g:vals = [] 2298a7d6542SBram Moolenaar assert_equal(0, Record([1]) && Record('z') && Record(0)) 2308a7d6542SBram Moolenaar assert_equal([[1], 'z', 0], g:vals) 2318a7d6542SBram Moolenaarenddef 2328a7d6542SBram Moolenaar 233be7ee488SBram Moolenaardef Test_expr3_vimscript() 234f5be8cdbSBram Moolenaar # check line continuation 235be7ee488SBram Moolenaar let lines =<< trim END 236be7ee488SBram Moolenaar vim9script 237be7ee488SBram Moolenaar let var = 0 238be7ee488SBram Moolenaar && 1 239be7ee488SBram Moolenaar assert_equal(0, var) 240be7ee488SBram Moolenaar END 241be7ee488SBram Moolenaar CheckScriptSuccess(lines) 242be7ee488SBram Moolenaar 243be7ee488SBram Moolenaar lines =<< trim END 244be7ee488SBram Moolenaar vim9script 245be7ee488SBram Moolenaar let var = v:true 246be7ee488SBram Moolenaar && v:true 247be7ee488SBram Moolenaar && v:true 2488c34ea54SBram Moolenaar assert_equal(v:true, var) 249be7ee488SBram Moolenaar END 250be7ee488SBram Moolenaar CheckScriptSuccess(lines) 2519215f012SBram Moolenaar 2529215f012SBram Moolenaar lines =<< trim END 2539215f012SBram Moolenaar vim9script 2549215f012SBram Moolenaar let var = v:true && 2559215f012SBram Moolenaar v:true && 2569215f012SBram Moolenaar v:true 2578c34ea54SBram Moolenaar assert_equal(v:true, var) 2588c34ea54SBram Moolenaar END 2598c34ea54SBram Moolenaar CheckScriptSuccess(lines) 2608c34ea54SBram Moolenaar 261f5be8cdbSBram Moolenaar # check keeping the value 2628c34ea54SBram Moolenaar lines =<< trim END 2638c34ea54SBram Moolenaar vim9script 2648c34ea54SBram Moolenaar assert_equal(0, 2 && 0) 2658c34ea54SBram Moolenaar assert_equal(0, 0 && 2668c34ea54SBram Moolenaar 0 && 2678c34ea54SBram Moolenaar 7) 2688c34ea54SBram Moolenaar assert_equal(7, 2 2698c34ea54SBram Moolenaar && 3 2708c34ea54SBram Moolenaar && 7) 2718c34ea54SBram Moolenaar assert_equal(0, 0 && 0) 2728c34ea54SBram Moolenaar assert_equal(0, 0 && '') 2738c34ea54SBram Moolenaar assert_equal('', 8 && '') 2748c34ea54SBram Moolenaar 2758c34ea54SBram Moolenaar g:vals = [] 2768c34ea54SBram Moolenaar assert_equal(1, Record(3) && Record(1)) 2778c34ea54SBram Moolenaar assert_equal([3, 1], g:vals) 2788c34ea54SBram Moolenaar 2798c34ea54SBram Moolenaar g:vals = [] 2808c34ea54SBram Moolenaar assert_equal(0, Record(0) && Record(5)) 2818c34ea54SBram Moolenaar assert_equal([0], g:vals) 2828c34ea54SBram Moolenaar 2838c34ea54SBram Moolenaar g:vals = [] 2848c34ea54SBram Moolenaar assert_equal(0, Record(0) && Record(4) && Record(0)) 2858c34ea54SBram Moolenaar assert_equal([0], g:vals) 2868c34ea54SBram Moolenaar 2878c34ea54SBram Moolenaar g:vals = [] 2888c34ea54SBram Moolenaar assert_equal(0, Record(8) && Record(4) && Record(0)) 2898c34ea54SBram Moolenaar assert_equal([8, 4, 0], g:vals) 2908c34ea54SBram Moolenaar 2918c34ea54SBram Moolenaar g:vals = [] 2928c34ea54SBram Moolenaar assert_equal(0, Record([1]) && Record('z') && Record(0)) 2938c34ea54SBram Moolenaar assert_equal([[1], 'z', 0], g:vals) 2949215f012SBram Moolenaar END 2959215f012SBram Moolenaar CheckScriptSuccess(lines) 296be7ee488SBram Moolenaarenddef 297be7ee488SBram Moolenaar 2988a7d6542SBram Moolenaarfunc Test_expr3_fails() 2998a7d6542SBram Moolenaar let msg = "white space required before and after '&&'" 300cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1&&2"], msg) 301cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 &&2"], msg) 302cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1&& 2"], msg) 3038a7d6542SBram Moolenaarendfunc 3048a7d6542SBram Moolenaar 3058a7d6542SBram Moolenaarlet atrue = v:true 3068a7d6542SBram Moolenaarlet afalse = v:false 3078a7d6542SBram Moolenaarlet anone = v:none 3088a7d6542SBram Moolenaarlet anull = v:null 3098a7d6542SBram Moolenaarlet anint = 10 3108a7d6542SBram Moolenaarlet alsoint = 4 3118a7d6542SBram Moolenaarif has('float') 3128a7d6542SBram Moolenaar let afloat = 0.1 3138a7d6542SBram Moolenaarendif 3148a7d6542SBram Moolenaarlet astring = 'asdf' 3158a7d6542SBram Moolenaarlet ablob = 0z01ab 3168a7d6542SBram Moolenaarlet alist = [2, 3, 4] 3178a7d6542SBram Moolenaarlet adict = #{aaa: 2, bbb: 8} 3188a7d6542SBram Moolenaar 3198a7d6542SBram Moolenaar" test == comperator 3208a7d6542SBram Moolenaardef Test_expr4_equal() 32166b31016SBram Moolenaar let trueVar = true 32266b31016SBram Moolenaar let falseVar = false 3238a7d6542SBram Moolenaar assert_equal(true, true == true) 3249c7e6dd6SBram Moolenaar assert_equal(false, true == 3259c7e6dd6SBram Moolenaar false) 32667fbdfefSBram Moolenaar assert_equal(true, true 32767fbdfefSBram Moolenaar == trueVar) 32866b31016SBram Moolenaar assert_equal(false, true == falseVar) 3298a7d6542SBram Moolenaar assert_equal(true, true == g:atrue) 3308a7d6542SBram Moolenaar assert_equal(false, g:atrue == false) 3318a7d6542SBram Moolenaar 3328a7d6542SBram Moolenaar assert_equal(true, v:none == v:none) 3338a7d6542SBram Moolenaar assert_equal(false, v:none == v:null) 3348a7d6542SBram Moolenaar assert_equal(true, g:anone == v:none) 3358a7d6542SBram Moolenaar assert_equal(false, v:none == g:anull) 3368a7d6542SBram Moolenaar 33766b31016SBram Moolenaar let nr0 = 0 33866b31016SBram Moolenaar let nr61 = 61 3398a7d6542SBram Moolenaar assert_equal(false, 2 == 0) 34066b31016SBram Moolenaar assert_equal(false, 2 == nr0) 3418a7d6542SBram Moolenaar assert_equal(true, 61 == 61) 34266b31016SBram Moolenaar assert_equal(true, 61 == nr61) 3438a7d6542SBram Moolenaar assert_equal(true, g:anint == 10) 3448a7d6542SBram Moolenaar assert_equal(false, 61 == g:anint) 3458a7d6542SBram Moolenaar 3468a7d6542SBram Moolenaar if has('float') 3474aeeb639SBram Moolenaar let ff = 0.3 3484aeeb639SBram Moolenaar assert_equal(true, ff == 0.3) 3494aeeb639SBram Moolenaar assert_equal(false, 0.4 == ff) 3508a7d6542SBram Moolenaar assert_equal(true, 0.1 == g:afloat) 3518a7d6542SBram Moolenaar assert_equal(false, g:afloat == 0.3) 3528a7d6542SBram Moolenaar 3534aeeb639SBram Moolenaar ff = 3.0 3544aeeb639SBram Moolenaar assert_equal(true, ff == 3) 3554aeeb639SBram Moolenaar assert_equal(true, 3 == ff) 3564aeeb639SBram Moolenaar ff = 3.1 3574aeeb639SBram Moolenaar assert_equal(false, ff == 3) 3584aeeb639SBram Moolenaar assert_equal(false, 3 == ff) 3598a7d6542SBram Moolenaar endif 3608a7d6542SBram Moolenaar 3618a7d6542SBram Moolenaar assert_equal(true, 'abc' == 'abc') 3628a7d6542SBram Moolenaar assert_equal(false, 'xyz' == 'abc') 3638a7d6542SBram Moolenaar assert_equal(true, g:astring == 'asdf') 3648a7d6542SBram Moolenaar assert_equal(false, 'xyz' == g:astring) 3658a7d6542SBram Moolenaar 3669be61bbbSBram Moolenaar assert_equal(false, 'abc' == 'aBc') 3679be61bbbSBram Moolenaar assert_equal(false, 'abc' ==# 'aBc') 3689be61bbbSBram Moolenaar assert_equal(true, 'abc' ==? 'aBc') 3699be61bbbSBram Moolenaar 3708a7d6542SBram Moolenaar assert_equal(false, 'abc' == 'ABC') 3718a7d6542SBram Moolenaar set ignorecase 3728a7d6542SBram Moolenaar assert_equal(false, 'abc' == 'ABC') 3739be61bbbSBram Moolenaar assert_equal(false, 'abc' ==# 'ABC') 3748a7d6542SBram Moolenaar set noignorecase 3758a7d6542SBram Moolenaar 376cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 'a' == xxx"], 'E1001:') 3779be61bbbSBram Moolenaar 3784aeeb639SBram Moolenaar let bb = 0z3f 3794aeeb639SBram Moolenaar assert_equal(true, 0z3f == bb) 3804aeeb639SBram Moolenaar assert_equal(false, bb == 0z4f) 3818a7d6542SBram Moolenaar assert_equal(true, g:ablob == 0z01ab) 3828a7d6542SBram Moolenaar assert_equal(false, 0z3f == g:ablob) 3838a7d6542SBram Moolenaar 3848a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] == [1, 2, 3]) 3858a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] == [2, 3, 1]) 3868a7d6542SBram Moolenaar assert_equal(true, [2, 3, 4] == g:alist) 3878a7d6542SBram Moolenaar assert_equal(false, g:alist == [2, 3, 1]) 3888a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] == []) 3898a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] == ['1', '2', '3']) 3908a7d6542SBram Moolenaar 3918a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} == #{one: 1, two: 2}) 3928a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} == #{one: 2, two: 2}) 3938a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} == #{two: 2}) 3948a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} == #{}) 3958a7d6542SBram Moolenaar assert_equal(true, g:adict == #{bbb: 8, aaa: 2}) 3968a7d6542SBram Moolenaar assert_equal(false, #{ccc: 9, aaa: 2} == g:adict) 3978a7d6542SBram Moolenaar 3984c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal') == function('g:Test_expr4_equal')) 3994c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal') == function('g:Test_expr4_is')) 4008a7d6542SBram Moolenaar 4014c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [123])) 4024c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_is', [123])) 4034c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [999])) 404a0a9f43aSBram Moolenaar 405a0a9f43aSBram Moolenaar let OneFunc: func 406a0a9f43aSBram Moolenaar let TwoFunc: func 407a0a9f43aSBram Moolenaar OneFunc = function('len') 408a0a9f43aSBram Moolenaar TwoFunc = function('len') 409a0a9f43aSBram Moolenaar assert_equal(true, OneFunc('abc') == TwoFunc('123')) 4108a7d6542SBram Moolenaarenddef 4118a7d6542SBram Moolenaar 4128a7d6542SBram Moolenaar" test != comperator 4138a7d6542SBram Moolenaardef Test_expr4_notequal() 41466b31016SBram Moolenaar let trueVar = true 41566b31016SBram Moolenaar let falseVar = false 4168a7d6542SBram Moolenaar assert_equal(false, true != true) 4179c7e6dd6SBram Moolenaar assert_equal(true, true != 4189c7e6dd6SBram Moolenaar false) 41967fbdfefSBram Moolenaar assert_equal(false, true 42067fbdfefSBram Moolenaar != trueVar) 42166b31016SBram Moolenaar assert_equal(true, true != falseVar) 4228a7d6542SBram Moolenaar assert_equal(false, true != g:atrue) 4238a7d6542SBram Moolenaar assert_equal(true, g:atrue != false) 4248a7d6542SBram Moolenaar 4258a7d6542SBram Moolenaar assert_equal(false, v:none != v:none) 4268a7d6542SBram Moolenaar assert_equal(true, v:none != v:null) 4278a7d6542SBram Moolenaar assert_equal(false, g:anone != v:none) 4288a7d6542SBram Moolenaar assert_equal(true, v:none != g:anull) 4298a7d6542SBram Moolenaar 43066b31016SBram Moolenaar let nr55 = 55 43166b31016SBram Moolenaar let nr0 = 55 4328a7d6542SBram Moolenaar assert_equal(true, 2 != 0) 43366b31016SBram Moolenaar assert_equal(true, 2 != nr0) 4348a7d6542SBram Moolenaar assert_equal(false, 55 != 55) 43566b31016SBram Moolenaar assert_equal(false, 55 != nr55) 4368a7d6542SBram Moolenaar assert_equal(false, g:anint != 10) 4378a7d6542SBram Moolenaar assert_equal(true, 61 != g:anint) 4388a7d6542SBram Moolenaar 4398a7d6542SBram Moolenaar if has('float') 4404aeeb639SBram Moolenaar let ff = 0.3 4414aeeb639SBram Moolenaar assert_equal(false, 0.3 != ff) 4424aeeb639SBram Moolenaar assert_equal(true, 0.4 != ff) 4438a7d6542SBram Moolenaar assert_equal(false, 0.1 != g:afloat) 4448a7d6542SBram Moolenaar assert_equal(true, g:afloat != 0.3) 4458a7d6542SBram Moolenaar 4464aeeb639SBram Moolenaar ff = 3.0 4474aeeb639SBram Moolenaar assert_equal(false, ff != 3) 4484aeeb639SBram Moolenaar assert_equal(false, 3 != ff) 4494aeeb639SBram Moolenaar ff = 3.1 4504aeeb639SBram Moolenaar assert_equal(true, ff != 3) 4514aeeb639SBram Moolenaar assert_equal(true, 3 != ff) 4528a7d6542SBram Moolenaar endif 4538a7d6542SBram Moolenaar 4548a7d6542SBram Moolenaar assert_equal(false, 'abc' != 'abc') 4558a7d6542SBram Moolenaar assert_equal(true, 'xyz' != 'abc') 4568a7d6542SBram Moolenaar assert_equal(false, g:astring != 'asdf') 4578a7d6542SBram Moolenaar assert_equal(true, 'xyz' != g:astring) 4588a7d6542SBram Moolenaar 4598a7d6542SBram Moolenaar assert_equal(true, 'abc' != 'ABC') 4608a7d6542SBram Moolenaar set ignorecase 4618a7d6542SBram Moolenaar assert_equal(true, 'abc' != 'ABC') 4628a7d6542SBram Moolenaar set noignorecase 4638a7d6542SBram Moolenaar 4644aeeb639SBram Moolenaar let bb = 0z3f 4654aeeb639SBram Moolenaar assert_equal(false, 0z3f != bb) 4664aeeb639SBram Moolenaar assert_equal(true, bb != 0z4f) 4678a7d6542SBram Moolenaar assert_equal(false, g:ablob != 0z01ab) 4688a7d6542SBram Moolenaar assert_equal(true, 0z3f != g:ablob) 4698a7d6542SBram Moolenaar 4708a7d6542SBram Moolenaar assert_equal(false, [1, 2, 3] != [1, 2, 3]) 4718a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] != [2, 3, 1]) 4728a7d6542SBram Moolenaar assert_equal(false, [2, 3, 4] != g:alist) 4738a7d6542SBram Moolenaar assert_equal(true, g:alist != [2, 3, 1]) 4748a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] != []) 4758a7d6542SBram Moolenaar assert_equal(true, [1, 2, 3] != ['1', '2', '3']) 4768a7d6542SBram Moolenaar 4778a7d6542SBram Moolenaar assert_equal(false, #{one: 1, two: 2} != #{one: 1, two: 2}) 4788a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} != #{one: 2, two: 2}) 4798a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} != #{two: 2}) 4808a7d6542SBram Moolenaar assert_equal(true, #{one: 1, two: 2} != #{}) 4818a7d6542SBram Moolenaar assert_equal(false, g:adict != #{bbb: 8, aaa: 2}) 4828a7d6542SBram Moolenaar assert_equal(true, #{ccc: 9, aaa: 2} != g:adict) 4838a7d6542SBram Moolenaar 4844c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal') != function('g:Test_expr4_equal')) 4854c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal') != function('g:Test_expr4_is')) 4868a7d6542SBram Moolenaar 4874c17ad94SBram Moolenaar assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123])) 4884c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123])) 4894c17ad94SBram Moolenaar assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999])) 4908a7d6542SBram Moolenaarenddef 4918a7d6542SBram Moolenaar 4928a7d6542SBram Moolenaar" test > comperator 4938a7d6542SBram Moolenaardef Test_expr4_greater() 4940062c2d4SBram Moolenaar assert_true(2 > 0) 4959c7e6dd6SBram Moolenaar assert_true(2 > 4969c7e6dd6SBram Moolenaar 1) 4970062c2d4SBram Moolenaar assert_false(2 > 2) 4980062c2d4SBram Moolenaar assert_false(2 > 3) 49966b31016SBram Moolenaar let nr2 = 2 50066b31016SBram Moolenaar assert_true(nr2 > 0) 50166b31016SBram Moolenaar assert_true(nr2 > 50266b31016SBram Moolenaar 1) 50366b31016SBram Moolenaar assert_false(nr2 > 2) 50467fbdfefSBram Moolenaar assert_false(nr2 50567fbdfefSBram Moolenaar > 3) 5060062c2d4SBram Moolenaar if has('float') 5074aeeb639SBram Moolenaar let ff = 2.0 5084aeeb639SBram Moolenaar assert_true(ff > 0.0) 5094aeeb639SBram Moolenaar assert_true(ff > 1.0) 5104aeeb639SBram Moolenaar assert_false(ff > 2.0) 5114aeeb639SBram Moolenaar assert_false(ff > 3.0) 5120062c2d4SBram Moolenaar endif 5138a7d6542SBram Moolenaarenddef 5148a7d6542SBram Moolenaar 5158a7d6542SBram Moolenaar" test >= comperator 5168a7d6542SBram Moolenaardef Test_expr4_greaterequal() 5170062c2d4SBram Moolenaar assert_true(2 >= 0) 5189c7e6dd6SBram Moolenaar assert_true(2 >= 5199c7e6dd6SBram Moolenaar 2) 5200062c2d4SBram Moolenaar assert_false(2 >= 3) 52166b31016SBram Moolenaar let nr2 = 2 52266b31016SBram Moolenaar assert_true(nr2 >= 0) 52366b31016SBram Moolenaar assert_true(nr2 >= 2) 52466b31016SBram Moolenaar assert_false(nr2 >= 3) 5250062c2d4SBram Moolenaar if has('float') 5264aeeb639SBram Moolenaar let ff = 2.0 5274aeeb639SBram Moolenaar assert_true(ff >= 0.0) 5284aeeb639SBram Moolenaar assert_true(ff >= 2.0) 5294aeeb639SBram Moolenaar assert_false(ff >= 3.0) 5300062c2d4SBram Moolenaar endif 5318a7d6542SBram Moolenaarenddef 5328a7d6542SBram Moolenaar 5338a7d6542SBram Moolenaar" test < comperator 5348a7d6542SBram Moolenaardef Test_expr4_smaller() 5350062c2d4SBram Moolenaar assert_false(2 < 0) 5369c7e6dd6SBram Moolenaar assert_false(2 < 5379c7e6dd6SBram Moolenaar 2) 53867fbdfefSBram Moolenaar assert_true(2 53967fbdfefSBram Moolenaar < 3) 54066b31016SBram Moolenaar let nr2 = 2 54166b31016SBram Moolenaar assert_false(nr2 < 0) 54266b31016SBram Moolenaar assert_false(nr2 < 2) 54366b31016SBram Moolenaar assert_true(nr2 < 3) 5440062c2d4SBram Moolenaar if has('float') 5454aeeb639SBram Moolenaar let ff = 2.0 5464aeeb639SBram Moolenaar assert_false(ff < 0.0) 5474aeeb639SBram Moolenaar assert_false(ff < 2.0) 5484aeeb639SBram Moolenaar assert_true(ff < 3.0) 5490062c2d4SBram Moolenaar endif 5508a7d6542SBram Moolenaarenddef 5518a7d6542SBram Moolenaar 5528a7d6542SBram Moolenaar" test <= comperator 5538a7d6542SBram Moolenaardef Test_expr4_smallerequal() 5540062c2d4SBram Moolenaar assert_false(2 <= 0) 5559c7e6dd6SBram Moolenaar assert_false(2 <= 5569c7e6dd6SBram Moolenaar 1) 55767fbdfefSBram Moolenaar assert_true(2 55867fbdfefSBram Moolenaar <= 2) 5590062c2d4SBram Moolenaar assert_true(2 <= 3) 56066b31016SBram Moolenaar let nr2 = 2 56166b31016SBram Moolenaar assert_false(nr2 <= 0) 56266b31016SBram Moolenaar assert_false(nr2 <= 1) 56366b31016SBram Moolenaar assert_true(nr2 <= 2) 56466b31016SBram Moolenaar assert_true(nr2 <= 3) 5650062c2d4SBram Moolenaar if has('float') 5664aeeb639SBram Moolenaar let ff = 2.0 5674aeeb639SBram Moolenaar assert_false(ff <= 0.0) 5684aeeb639SBram Moolenaar assert_false(ff <= 1.0) 5694aeeb639SBram Moolenaar assert_true(ff <= 2.0) 5704aeeb639SBram Moolenaar assert_true(ff <= 3.0) 5710062c2d4SBram Moolenaar endif 5728a7d6542SBram Moolenaarenddef 5738a7d6542SBram Moolenaar 5748a7d6542SBram Moolenaar" test =~ comperator 5758a7d6542SBram Moolenaardef Test_expr4_match() 5768a7d6542SBram Moolenaar assert_equal(false, '2' =~ '0') 57767fbdfefSBram Moolenaar assert_equal(false, '' 57867fbdfefSBram Moolenaar =~ '0') 5799c7e6dd6SBram Moolenaar assert_equal(true, '2' =~ 5809c7e6dd6SBram Moolenaar '[0-9]') 5818a7d6542SBram Moolenaarenddef 5828a7d6542SBram Moolenaar 5838a7d6542SBram Moolenaar" test !~ comperator 5848a7d6542SBram Moolenaardef Test_expr4_nomatch() 5858a7d6542SBram Moolenaar assert_equal(true, '2' !~ '0') 58667fbdfefSBram Moolenaar assert_equal(true, '' 58767fbdfefSBram Moolenaar !~ '0') 5889c7e6dd6SBram Moolenaar assert_equal(false, '2' !~ 5899c7e6dd6SBram Moolenaar '[0-9]') 5908a7d6542SBram Moolenaarenddef 5918a7d6542SBram Moolenaar 5928a7d6542SBram Moolenaar" test is comperator 5938a7d6542SBram Moolenaardef Test_expr4_is() 5948a7d6542SBram Moolenaar let mylist = [2] 5950062c2d4SBram Moolenaar assert_false(mylist is [2]) 5968a7d6542SBram Moolenaar let other = mylist 5979c7e6dd6SBram Moolenaar assert_true(mylist is 5989c7e6dd6SBram Moolenaar other) 5990062c2d4SBram Moolenaar 6000062c2d4SBram Moolenaar let myblob = 0z1234 60167fbdfefSBram Moolenaar assert_false(myblob 60267fbdfefSBram Moolenaar is 0z1234) 6030062c2d4SBram Moolenaar let otherblob = myblob 6040062c2d4SBram Moolenaar assert_true(myblob is otherblob) 6058a7d6542SBram Moolenaarenddef 6068a7d6542SBram Moolenaar 6078a7d6542SBram Moolenaar" test isnot comperator 6088a7d6542SBram Moolenaardef Test_expr4_isnot() 6098a7d6542SBram Moolenaar let mylist = [2] 6100062c2d4SBram Moolenaar assert_true('2' isnot '0') 6110062c2d4SBram Moolenaar assert_true(mylist isnot [2]) 6128a7d6542SBram Moolenaar let other = mylist 6139c7e6dd6SBram Moolenaar assert_false(mylist isnot 6149c7e6dd6SBram Moolenaar other) 6150062c2d4SBram Moolenaar 6160062c2d4SBram Moolenaar let myblob = 0z1234 61767fbdfefSBram Moolenaar assert_true(myblob 61867fbdfefSBram Moolenaar isnot 0z1234) 6190062c2d4SBram Moolenaar let otherblob = myblob 6200062c2d4SBram Moolenaar assert_false(myblob isnot otherblob) 6218a7d6542SBram Moolenaarenddef 6228a7d6542SBram Moolenaar 6238a7d6542SBram Moolenaardef RetVoid() 6248a7d6542SBram Moolenaar let x = 1 6258a7d6542SBram Moolenaarenddef 6268a7d6542SBram Moolenaar 627e6536aa7SBram Moolenaardef Test_expr4_vimscript() 628f5be8cdbSBram Moolenaar # check line continuation 629e6536aa7SBram Moolenaar let lines =<< trim END 630e6536aa7SBram Moolenaar vim9script 631e6536aa7SBram Moolenaar let var = 0 632e6536aa7SBram Moolenaar < 1 633e6536aa7SBram Moolenaar assert_equal(1, var) 634e6536aa7SBram Moolenaar END 635e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 636e6536aa7SBram Moolenaar 637e6536aa7SBram Moolenaar lines =<< trim END 638e6536aa7SBram Moolenaar vim9script 639e6536aa7SBram Moolenaar let var = 123 640e6536aa7SBram Moolenaar != 123 641e6536aa7SBram Moolenaar assert_equal(0, var) 642e6536aa7SBram Moolenaar END 643e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 644e6536aa7SBram Moolenaar 645e6536aa7SBram Moolenaar lines =<< trim END 646e6536aa7SBram Moolenaar vim9script 6479215f012SBram Moolenaar let var = 123 == 6489215f012SBram Moolenaar 123 6499215f012SBram Moolenaar assert_equal(1, var) 6509215f012SBram Moolenaar END 6519215f012SBram Moolenaar CheckScriptSuccess(lines) 6529215f012SBram Moolenaar 6539215f012SBram Moolenaar lines =<< trim END 6549215f012SBram Moolenaar vim9script 655e6536aa7SBram Moolenaar let list = [1, 2, 3] 656e6536aa7SBram Moolenaar let var = list 657e6536aa7SBram Moolenaar is list 658e6536aa7SBram Moolenaar assert_equal(1, var) 659e6536aa7SBram Moolenaar END 660e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 661e6536aa7SBram Moolenaar 662e6536aa7SBram Moolenaar lines =<< trim END 663e6536aa7SBram Moolenaar vim9script 664e6536aa7SBram Moolenaar let myblob = 0z1234 665e6536aa7SBram Moolenaar let var = myblob 666e6536aa7SBram Moolenaar isnot 0z11 667e6536aa7SBram Moolenaar assert_equal(1, var) 668e6536aa7SBram Moolenaar END 669e6536aa7SBram Moolenaar CheckScriptSuccess(lines) 670543e6f34SBram Moolenaar 671f5be8cdbSBram Moolenaar # spot check mismatching types 672543e6f34SBram Moolenaar lines =<< trim END 673543e6f34SBram Moolenaar vim9script 674543e6f34SBram Moolenaar echo '' == 0 675543e6f34SBram Moolenaar END 676543e6f34SBram Moolenaar CheckScriptFailure(lines, 'E1072:') 677543e6f34SBram Moolenaar 678543e6f34SBram Moolenaar lines =<< trim END 679543e6f34SBram Moolenaar vim9script 680543e6f34SBram Moolenaar echo v:true > v:false 681543e6f34SBram Moolenaar END 682543e6f34SBram Moolenaar CheckScriptFailure(lines, 'Cannot compare bool with bool') 683543e6f34SBram Moolenaar 684543e6f34SBram Moolenaar lines =<< trim END 685543e6f34SBram Moolenaar vim9script 686543e6f34SBram Moolenaar echo 123 is 123 687543e6f34SBram Moolenaar END 688543e6f34SBram Moolenaar CheckScriptFailure(lines, 'Cannot use "is" with number') 689e6536aa7SBram Moolenaarenddef 690e6536aa7SBram Moolenaar 6918a7d6542SBram Moolenaarfunc Test_expr4_fails() 6928a7d6542SBram Moolenaar let msg = "white space required before and after '>'" 693cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1>2"], msg) 694cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 >2"], msg) 695cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1> 2"], msg) 6968a7d6542SBram Moolenaar 6978a7d6542SBram Moolenaar let msg = "white space required before and after '=='" 698cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1==2"], msg) 699cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 ==2"], msg) 700cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1== 2"], msg) 7018a7d6542SBram Moolenaar 7028a7d6542SBram Moolenaar let msg = "white space required before and after 'is'" 703cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'is'2'"], msg) 704cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' is'2'"], msg) 705cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'is '2'"], msg) 7068a7d6542SBram Moolenaar 7078a7d6542SBram Moolenaar let msg = "white space required before and after 'isnot'" 708cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'isnot'2'"], msg) 709cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' isnot'2'"], msg) 710cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'isnot '2'"], msg) 7118a7d6542SBram Moolenaar 712cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 is# 2"], 'E15:') 713cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 is? 2"], 'E15:') 714cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 isnot# 2"], 'E15:') 715cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 isnot? 2"], 'E15:') 7168a7d6542SBram Moolenaar 717cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 == '2'"], 'Cannot compare number with string') 718cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' == 2"], 'Cannot compare string with number') 719a5565e41SBram Moolenaar call CheckDefFailure(["let x = 1 == RetVoid()"], 'Cannot compare number with void') 720cfe435d7SBram Moolenaar call CheckDefFailure(["let x = RetVoid() == 1"], 'Cannot compare void with number') 7218a7d6542SBram Moolenaar 722cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true > false"], 'Cannot compare bool with bool') 723cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true >= false"], 'Cannot compare bool with bool') 724cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true < false"], 'Cannot compare bool with bool') 725cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true <= false"], 'Cannot compare bool with bool') 726cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true =~ false"], 'Cannot compare bool with bool') 727cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true !~ false"], 'Cannot compare bool with bool') 728cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true is false"], 'Cannot use "is" with bool') 729cfe435d7SBram Moolenaar call CheckDefFailure(["let x = true isnot false"], 'Cannot use "isnot" with bool') 7308a7d6542SBram Moolenaar 731cfe435d7SBram Moolenaar call CheckDefFailure(["let x = v:none is v:null"], 'Cannot use "is" with special') 732cfe435d7SBram Moolenaar call CheckDefFailure(["let x = v:none isnot v:null"], 'Cannot use "isnot" with special') 733cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 123 is 123"], 'Cannot use "is" with number') 734cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 123 isnot 123"], 'Cannot use "isnot" with number') 7358a7d6542SBram Moolenaar if has('float') 736cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1.3 is 1.3"], 'Cannot use "is" with float') 737cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float') 7388a7d6542SBram Moolenaar endif 7398a7d6542SBram Moolenaar 740cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0za1 > 0z34"], 'Cannot compare blob with blob') 741cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0za1 >= 0z34"], 'Cannot compare blob with blob') 742cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0za1 < 0z34"], 'Cannot compare blob with blob') 743cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0za1 <= 0z34"], 'Cannot compare blob with blob') 744cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0za1 =~ 0z34"], 'Cannot compare blob with blob') 745cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0za1 !~ 0z34"], 'Cannot compare blob with blob') 7468a7d6542SBram Moolenaar 747cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [13] > [88]"], 'Cannot compare list with list') 748cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [13] >= [88]"], 'Cannot compare list with list') 749cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [13] < [88]"], 'Cannot compare list with list') 750cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [13] <= [88]"], 'Cannot compare list with list') 751cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [13] =~ [88]"], 'Cannot compare list with list') 752cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [13] !~ [88]"], 'Cannot compare list with list') 7535381c7a1SBram Moolenaar 754cfe435d7SBram Moolenaar call CheckDefFailure(['let j: job', 'let chan: channel', 'let r = j == chan'], 'Cannot compare job with channel') 755cfe435d7SBram Moolenaar call CheckDefFailure(['let j: job', 'let x: list<any>', 'let r = j == x'], 'Cannot compare job with list') 756cfe435d7SBram Moolenaar call CheckDefFailure(['let j: job', 'let Xx: func', 'let r = j == Xx'], 'Cannot compare job with func') 757cfe435d7SBram Moolenaar call CheckDefFailure(['let j: job', 'let Xx: func', 'let r = j == Xx'], 'Cannot compare job with func') 7588a7d6542SBram Moolenaarendfunc 7598a7d6542SBram Moolenaar 7608a7d6542SBram Moolenaar" test addition, subtraction, concatenation 7618a7d6542SBram Moolenaardef Test_expr5() 7628a7d6542SBram Moolenaar assert_equal(66, 60 + 6) 7639c7e6dd6SBram Moolenaar assert_equal(70, 60 + 7649c7e6dd6SBram Moolenaar g:anint) 76567fbdfefSBram Moolenaar assert_equal(9, g:alsoint 76667fbdfefSBram Moolenaar + 5) 7678a7d6542SBram Moolenaar assert_equal(14, g:alsoint + g:anint) 768c785b9a7SBram Moolenaar assert_equal([1, 2, 3, 4], [1] + g:alist) 7698a7d6542SBram Moolenaar 7708a7d6542SBram Moolenaar assert_equal(54, 60 - 6) 7719c7e6dd6SBram Moolenaar assert_equal(50, 60 - 7729c7e6dd6SBram Moolenaar g:anint) 77367fbdfefSBram Moolenaar assert_equal(-1, g:alsoint 77467fbdfefSBram Moolenaar - 5) 7758a7d6542SBram Moolenaar assert_equal(-6, g:alsoint - g:anint) 7768a7d6542SBram Moolenaar 7778a7d6542SBram Moolenaar assert_equal('hello', 'hel' .. 'lo') 778f0eefce9SBram Moolenaar assert_equal('hello 123', 'hello ' .. 779f0eefce9SBram Moolenaar 123) 78067fbdfefSBram Moolenaar assert_equal('hello 123', 'hello ' 78167fbdfefSBram Moolenaar .. 123) 7828a7d6542SBram Moolenaar assert_equal('123 hello', 123 .. ' hello') 7838a7d6542SBram Moolenaar assert_equal('123456', 123 .. 456) 7840062c2d4SBram Moolenaar 7850062c2d4SBram Moolenaar assert_equal([1, 2, 3, 4], [1, 2] + [3, 4]) 7860062c2d4SBram Moolenaar assert_equal(0z11223344, 0z1122 + 0z3344) 78767fbdfefSBram Moolenaar assert_equal(0z112201ab, 0z1122 78867fbdfefSBram Moolenaar + g:ablob) 7890062c2d4SBram Moolenaar assert_equal(0z01ab3344, g:ablob + 0z3344) 7900062c2d4SBram Moolenaar assert_equal(0z01ab01ab, g:ablob + g:ablob) 7918a7d6542SBram Moolenaarenddef 7928a7d6542SBram Moolenaar 7935409f5d8SBram Moolenaardef Test_expr5_vim9script() 794f5be8cdbSBram Moolenaar # only checks line continuation 7955409f5d8SBram Moolenaar let lines =<< trim END 7965409f5d8SBram Moolenaar vim9script 7975409f5d8SBram Moolenaar let var = 11 7985409f5d8SBram Moolenaar + 77 7995409f5d8SBram Moolenaar - 22 8005409f5d8SBram Moolenaar assert_equal(66, var) 8015409f5d8SBram Moolenaar END 8025409f5d8SBram Moolenaar CheckScriptSuccess(lines) 8035409f5d8SBram Moolenaar 8045409f5d8SBram Moolenaar lines =<< trim END 8055409f5d8SBram Moolenaar vim9script 8065409f5d8SBram Moolenaar let var = 'one' 8075409f5d8SBram Moolenaar .. 'two' 8085409f5d8SBram Moolenaar assert_equal('onetwo', var) 8095409f5d8SBram Moolenaar END 8105409f5d8SBram Moolenaar CheckScriptSuccess(lines) 8115409f5d8SBram Moolenaarenddef 8125409f5d8SBram Moolenaar 8138a7d6542SBram Moolenaardef Test_expr5_float() 8147f829cabSBram Moolenaar if !has('float') 8157f829cabSBram Moolenaar MissingFeature 'float' 8167f829cabSBram Moolenaar else 8178a7d6542SBram Moolenaar assert_equal(66.0, 60.0 + 6.0) 8188a7d6542SBram Moolenaar assert_equal(66.0, 60.0 + 6) 8199c7e6dd6SBram Moolenaar assert_equal(66.0, 60 + 8209c7e6dd6SBram Moolenaar 6.0) 82167fbdfefSBram Moolenaar assert_equal(5.1, g:afloat 82267fbdfefSBram Moolenaar + 5) 8238a7d6542SBram Moolenaar assert_equal(8.1, 8 + g:afloat) 8248a7d6542SBram Moolenaar assert_equal(10.1, g:anint + g:afloat) 8258a7d6542SBram Moolenaar assert_equal(10.1, g:afloat + g:anint) 8268a7d6542SBram Moolenaar 8278a7d6542SBram Moolenaar assert_equal(54.0, 60.0 - 6.0) 82867fbdfefSBram Moolenaar assert_equal(54.0, 60.0 82967fbdfefSBram Moolenaar - 6) 8308a7d6542SBram Moolenaar assert_equal(54.0, 60 - 6.0) 8318a7d6542SBram Moolenaar assert_equal(-4.9, g:afloat - 5) 8328a7d6542SBram Moolenaar assert_equal(7.9, 8 - g:afloat) 8338a7d6542SBram Moolenaar assert_equal(9.9, g:anint - g:afloat) 8348a7d6542SBram Moolenaar assert_equal(-9.9, g:afloat - g:anint) 8357f829cabSBram Moolenaar endif 8368a7d6542SBram Moolenaarenddef 8378a7d6542SBram Moolenaar 8388a7d6542SBram Moolenaarfunc Test_expr5_fails() 8398a7d6542SBram Moolenaar let msg = "white space required before and after '+'" 840cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1+2"], msg) 841cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 +2"], msg) 842cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1+ 2"], msg) 8438a7d6542SBram Moolenaar 8448a7d6542SBram Moolenaar let msg = "white space required before and after '-'" 845cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1-2"], msg) 846cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 -2"], msg) 847cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1- 2"], msg) 8488a7d6542SBram Moolenaar 8498a7d6542SBram Moolenaar let msg = "white space required before and after '..'" 850cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'..'2'"], msg) 851cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' ..'2'"], msg) 852cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'.. '2'"], msg) 8530062c2d4SBram Moolenaar 854df069eecSBram Moolenaar call CheckDefFailure(["let x = 0z1122 + 33"], 'E1051') 855df069eecSBram Moolenaar call CheckDefFailure(["let x = 0z1122 + [3]"], 'E1051') 856df069eecSBram Moolenaar call CheckDefFailure(["let x = 0z1122 + 'asd'"], 'E1051') 857df069eecSBram Moolenaar call CheckDefFailure(["let x = 33 + 0z1122"], 'E1051') 858df069eecSBram Moolenaar call CheckDefFailure(["let x = [3] + 0z1122"], 'E1051') 859df069eecSBram Moolenaar call CheckDefFailure(["let x = 'asdf' + 0z1122"], 'E1051') 860cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 6 + xxx"], 'E1001') 8618a7d6542SBram Moolenaarendfunc 8628a7d6542SBram Moolenaar 8638a7d6542SBram Moolenaar" test multiply, divide, modulo 8648a7d6542SBram Moolenaardef Test_expr6() 8658a7d6542SBram Moolenaar assert_equal(36, 6 * 6) 8669c7e6dd6SBram Moolenaar assert_equal(24, 6 * 8679c7e6dd6SBram Moolenaar g:alsoint) 86867fbdfefSBram Moolenaar assert_equal(24, g:alsoint 86967fbdfefSBram Moolenaar * 6) 8708a7d6542SBram Moolenaar assert_equal(40, g:anint * g:alsoint) 8718a7d6542SBram Moolenaar 8728a7d6542SBram Moolenaar assert_equal(10, 60 / 6) 8739c7e6dd6SBram Moolenaar assert_equal(6, 60 / 8749c7e6dd6SBram Moolenaar g:anint) 8758a7d6542SBram Moolenaar assert_equal(1, g:anint / 6) 87667fbdfefSBram Moolenaar assert_equal(2, g:anint 87767fbdfefSBram Moolenaar / g:alsoint) 8788a7d6542SBram Moolenaar 8798a7d6542SBram Moolenaar assert_equal(5, 11 % 6) 8808a7d6542SBram Moolenaar assert_equal(4, g:anint % 6) 8819c7e6dd6SBram Moolenaar assert_equal(3, 13 % 8829c7e6dd6SBram Moolenaar g:anint) 88367fbdfefSBram Moolenaar assert_equal(2, g:anint 88467fbdfefSBram Moolenaar % g:alsoint) 8858a7d6542SBram Moolenaar 8868a7d6542SBram Moolenaar assert_equal(4, 6 * 4 / 6) 887b13af50fSBram Moolenaar 888b13af50fSBram Moolenaar let x = [2] 889b13af50fSBram Moolenaar let y = [3] 890b13af50fSBram Moolenaar assert_equal(5, x[0] + y[0]) 891b13af50fSBram Moolenaar assert_equal(6, x[0] * y[0]) 892b13af50fSBram Moolenaar if has('float') 893b13af50fSBram Moolenaar let xf = [2.0] 894b13af50fSBram Moolenaar let yf = [3.0] 89567fbdfefSBram Moolenaar assert_equal(5.0, xf[0] 89667fbdfefSBram Moolenaar + yf[0]) 89767fbdfefSBram Moolenaar assert_equal(6.0, xf[0] 89867fbdfefSBram Moolenaar * yf[0]) 899b13af50fSBram Moolenaar endif 90092dba36fSBram Moolenaar 901cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 6 * xxx"], 'E1001') 9028a7d6542SBram Moolenaarenddef 9038a7d6542SBram Moolenaar 9045409f5d8SBram Moolenaardef Test_expr6_vim9script() 905f5be8cdbSBram Moolenaar # only checks line continuation 9065409f5d8SBram Moolenaar let lines =<< trim END 9075409f5d8SBram Moolenaar vim9script 9085409f5d8SBram Moolenaar let var = 11 9095409f5d8SBram Moolenaar * 22 9105409f5d8SBram Moolenaar / 3 9115409f5d8SBram Moolenaar assert_equal(80, var) 9125409f5d8SBram Moolenaar END 9135409f5d8SBram Moolenaar CheckScriptSuccess(lines) 9145409f5d8SBram Moolenaar 9155409f5d8SBram Moolenaar lines =<< trim END 9165409f5d8SBram Moolenaar vim9script 9175409f5d8SBram Moolenaar let var = 25 9185409f5d8SBram Moolenaar % 10 9195409f5d8SBram Moolenaar assert_equal(5, var) 9205409f5d8SBram Moolenaar END 9215409f5d8SBram Moolenaar CheckScriptSuccess(lines) 9225409f5d8SBram Moolenaarenddef 9235409f5d8SBram Moolenaar 9248a7d6542SBram Moolenaardef Test_expr6_float() 9257f829cabSBram Moolenaar if !has('float') 9267f829cabSBram Moolenaar MissingFeature 'float' 9277f829cabSBram Moolenaar else 9288a7d6542SBram Moolenaar assert_equal(36.0, 6.0 * 6) 9299c7e6dd6SBram Moolenaar assert_equal(36.0, 6 * 9309c7e6dd6SBram Moolenaar 6.0) 9318a7d6542SBram Moolenaar assert_equal(36.0, 6.0 * 6.0) 9328a7d6542SBram Moolenaar assert_equal(1.0, g:afloat * g:anint) 9338a7d6542SBram Moolenaar 9348a7d6542SBram Moolenaar assert_equal(10.0, 60 / 6.0) 9359c7e6dd6SBram Moolenaar assert_equal(10.0, 60.0 / 9369c7e6dd6SBram Moolenaar 6) 9378a7d6542SBram Moolenaar assert_equal(10.0, 60.0 / 6.0) 9388a7d6542SBram Moolenaar assert_equal(0.01, g:afloat / g:anint) 9398a7d6542SBram Moolenaar 9408a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4 / 6) 9419c7e6dd6SBram Moolenaar assert_equal(4.0, 6 * 9429c7e6dd6SBram Moolenaar 4.0 / 9439c7e6dd6SBram Moolenaar 6) 9448a7d6542SBram Moolenaar assert_equal(4.0, 6 * 4 / 6.0) 9458a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4.0 / 6) 9468a7d6542SBram Moolenaar assert_equal(4.0, 6 * 4.0 / 6.0) 9478a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4 / 6.0) 9488a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4.0 / 6.0) 9498a7d6542SBram Moolenaar 9508a7d6542SBram Moolenaar assert_equal(4.0, 6.0 * 4.0 / 6.0) 9517f829cabSBram Moolenaar endif 9528a7d6542SBram Moolenaarenddef 9538a7d6542SBram Moolenaar 9548a7d6542SBram Moolenaarfunc Test_expr6_fails() 9558a7d6542SBram Moolenaar let msg = "white space required before and after '*'" 956cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1*2"], msg) 957cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 *2"], msg) 958cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1* 2"], msg) 9598a7d6542SBram Moolenaar 9608a7d6542SBram Moolenaar let msg = "white space required before and after '/'" 961cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1/2"], msg) 962cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 /2"], msg) 963cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1/ 2"], msg) 9648a7d6542SBram Moolenaar 9658a7d6542SBram Moolenaar let msg = "white space required before and after '%'" 966cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1%2"], msg) 967cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1 %2"], msg) 968cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1% 2"], msg) 9698a7d6542SBram Moolenaar 970cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' * '2'"], 'E1036:') 971cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' / '2'"], 'E1036:') 972cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1' % '2'"], 'E1035:') 9738a7d6542SBram Moolenaar 974cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0z01 * 0z12"], 'E1036:') 975cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0z01 / 0z12"], 'E1036:') 976cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0z01 % 0z12"], 'E1035:') 9778a7d6542SBram Moolenaar 978cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [1] * [2]"], 'E1036:') 979cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [1] / [2]"], 'E1036:') 980cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [1] % [2]"], 'E1035:') 9818a7d6542SBram Moolenaar 982cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{one: 1} * #{two: 2}"], 'E1036:') 983cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{one: 1} / #{two: 2}"], 'E1036:') 984cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{one: 1} % #{two: 2}"], 'E1035:') 9858a7d6542SBram Moolenaar 9861cc2a94fSBram Moolenaar call CheckDefFailure(["let x = 0xff[1]"], 'E1090:') 987b13af50fSBram Moolenaar if has('float') 9881cc2a94fSBram Moolenaar call CheckDefFailure(["let x = 0.7[1]"], 'E1090:') 989b13af50fSBram Moolenaar endif 9908a7d6542SBram Moolenaarendfunc 9918a7d6542SBram Moolenaar 9928a7d6542SBram Moolenaarfunc Test_expr6_float_fails() 9938a7d6542SBram Moolenaar CheckFeature float 994cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 1.0 % 2"], 'E1035:') 9958a7d6542SBram Moolenaarendfunc 9968a7d6542SBram Moolenaar 9978a7d6542SBram Moolenaar" define here to use old style parsing 9988a7d6542SBram Moolenaarif has('float') 9998a7d6542SBram Moolenaar let g:float_zero = 0.0 10008a7d6542SBram Moolenaar let g:float_neg = -9.8 10018a7d6542SBram Moolenaar let g:float_big = 9.9e99 10028a7d6542SBram Moolenaarendif 10038a7d6542SBram Moolenaarlet g:blob_empty = 0z 10048a7d6542SBram Moolenaarlet g:blob_one = 0z01 10058a7d6542SBram Moolenaarlet g:blob_long = 0z0102.0304 10068a7d6542SBram Moolenaar 10078a7d6542SBram Moolenaarlet g:string_empty = '' 10088a7d6542SBram Moolenaarlet g:string_short = 'x' 10098a7d6542SBram Moolenaarlet g:string_long = 'abcdefghijklm' 10108a7d6542SBram Moolenaarlet g:string_special = "ab\ncd\ref\ekk" 10118a7d6542SBram Moolenaar 10128a7d6542SBram Moolenaarlet g:special_true = v:true 10138a7d6542SBram Moolenaarlet g:special_false = v:false 10148a7d6542SBram Moolenaarlet g:special_null = v:null 10158a7d6542SBram Moolenaarlet g:special_none = v:none 10168a7d6542SBram Moolenaar 10178a7d6542SBram Moolenaarlet g:list_empty = [] 10188a7d6542SBram Moolenaarlet g:list_mixed = [1, 'b', v:false] 10198a7d6542SBram Moolenaar 10208a7d6542SBram Moolenaarlet g:dict_empty = {} 10218a7d6542SBram Moolenaarlet g:dict_one = #{one: 1} 10228a7d6542SBram Moolenaar 10238a7d6542SBram Moolenaarlet $TESTVAR = 'testvar' 10248a7d6542SBram Moolenaar 10258a7d6542SBram Moolenaar" test low level expression 10268a7d6542SBram Moolenaardef Test_expr7_number() 1027f5be8cdbSBram Moolenaar # number constant 10288a7d6542SBram Moolenaar assert_equal(0, 0) 10298a7d6542SBram Moolenaar assert_equal(654, 0654) 10308a7d6542SBram Moolenaar 10318a7d6542SBram Moolenaar assert_equal(6, 0x6) 10328a7d6542SBram Moolenaar assert_equal(15, 0xf) 10338a7d6542SBram Moolenaar assert_equal(255, 0xff) 10348a7d6542SBram Moolenaarenddef 10358a7d6542SBram Moolenaar 10368a7d6542SBram Moolenaardef Test_expr7_float() 1037f5be8cdbSBram Moolenaar # float constant 10387f829cabSBram Moolenaar if !has('float') 10397f829cabSBram Moolenaar MissingFeature 'float' 10407f829cabSBram Moolenaar else 10418a7d6542SBram Moolenaar assert_equal(g:float_zero, .0) 10428a7d6542SBram Moolenaar assert_equal(g:float_zero, 0.0) 10438a7d6542SBram Moolenaar assert_equal(g:float_neg, -9.8) 10448a7d6542SBram Moolenaar assert_equal(g:float_big, 9.9e99) 10458a7d6542SBram Moolenaar endif 10468a7d6542SBram Moolenaarenddef 10478a7d6542SBram Moolenaar 10488a7d6542SBram Moolenaardef Test_expr7_blob() 1049f5be8cdbSBram Moolenaar # blob constant 10508a7d6542SBram Moolenaar assert_equal(g:blob_empty, 0z) 10518a7d6542SBram Moolenaar assert_equal(g:blob_one, 0z01) 10528a7d6542SBram Moolenaar assert_equal(g:blob_long, 0z0102.0304) 105392dba36fSBram Moolenaar 1054cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 0z123"], 'E973:') 10558a7d6542SBram Moolenaarenddef 10568a7d6542SBram Moolenaar 10578a7d6542SBram Moolenaardef Test_expr7_string() 1058f5be8cdbSBram Moolenaar # string constant 10598a7d6542SBram Moolenaar assert_equal(g:string_empty, '') 10608a7d6542SBram Moolenaar assert_equal(g:string_empty, "") 10618a7d6542SBram Moolenaar assert_equal(g:string_short, 'x') 10628a7d6542SBram Moolenaar assert_equal(g:string_short, "x") 10638a7d6542SBram Moolenaar assert_equal(g:string_long, 'abcdefghijklm') 10648a7d6542SBram Moolenaar assert_equal(g:string_long, "abcdefghijklm") 10658a7d6542SBram Moolenaar assert_equal(g:string_special, "ab\ncd\ref\ekk") 106692dba36fSBram Moolenaar 1067cfe435d7SBram Moolenaar call CheckDefFailure(['let x = "abc'], 'E114:') 1068cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 'abc"], 'E115:') 10698a7d6542SBram Moolenaarenddef 10708a7d6542SBram Moolenaar 10715da356e0SBram Moolenaardef Test_expr7_vimvar() 10725da356e0SBram Moolenaar let old: list<string> = v:oldfiles 10735da356e0SBram Moolenaar let compl: dict<any> = v:completed_item 10745da356e0SBram Moolenaar 1075cfe435d7SBram Moolenaar call CheckDefFailure(["let old: list<number> = v:oldfiles"], 'E1013: type mismatch, expected list<number> but got list<string>') 1076cfe435d7SBram Moolenaar call CheckDefFailure(["let old: dict<number> = v:completed_item"], 'E1013: type mismatch, expected dict<number> but got dict<any>') 10775da356e0SBram Moolenaarenddef 10785da356e0SBram Moolenaar 10798a7d6542SBram Moolenaardef Test_expr7_special() 1080f5be8cdbSBram Moolenaar # special constant 10818a7d6542SBram Moolenaar assert_equal(g:special_true, true) 10828a7d6542SBram Moolenaar assert_equal(g:special_false, false) 10835da356e0SBram Moolenaar assert_equal(g:special_true, v:true) 10845da356e0SBram Moolenaar assert_equal(g:special_false, v:false) 10858a7d6542SBram Moolenaar assert_equal(g:special_null, v:null) 10868a7d6542SBram Moolenaar assert_equal(g:special_none, v:none) 10875da356e0SBram Moolenaar 1088cfe435d7SBram Moolenaar call CheckDefFailure(['v:true = true'], 'E46:') 1089cfe435d7SBram Moolenaar call CheckDefFailure(['v:true = false'], 'E46:') 1090cfe435d7SBram Moolenaar call CheckDefFailure(['v:false = true'], 'E46:') 1091cfe435d7SBram Moolenaar call CheckDefFailure(['v:null = 11'], 'E46:') 1092cfe435d7SBram Moolenaar call CheckDefFailure(['v:none = 22'], 'E46:') 10938a7d6542SBram Moolenaarenddef 10948a7d6542SBram Moolenaar 10955d2eb0ffSBram Moolenaardef Test_expr7_special_vim9script() 10965d2eb0ffSBram Moolenaar let lines =<< trim END 10975d2eb0ffSBram Moolenaar vim9script 10985d2eb0ffSBram Moolenaar let t = true 10995d2eb0ffSBram Moolenaar let f = false 11005d2eb0ffSBram Moolenaar assert_equal(v:true, true) 11015d2eb0ffSBram Moolenaar assert_equal(true, t) 11025d2eb0ffSBram Moolenaar assert_equal(v:false, false) 11035d2eb0ffSBram Moolenaar assert_equal(false, f) 11045d2eb0ffSBram Moolenaar END 11055d2eb0ffSBram Moolenaar CheckScriptSuccess(lines) 11065d2eb0ffSBram Moolenaarenddef 11075d2eb0ffSBram Moolenaar 11088a7d6542SBram Moolenaardef Test_expr7_list() 1109f5be8cdbSBram Moolenaar # list 11108a7d6542SBram Moolenaar assert_equal(g:list_empty, []) 11118a7d6542SBram Moolenaar assert_equal(g:list_empty, [ ]) 11127147820cSBram Moolenaar assert_equal(g:list_mixed, [1, 'b', false,]) 11130b37a2f3SBram Moolenaar assert_equal('b', g:list_mixed[1]) 11140062c2d4SBram Moolenaar 1115015f4267SBram Moolenaar call CheckDefExecFailure(["let x = g:anint[3]"], 'E714:') 1116cfe435d7SBram Moolenaar call CheckDefFailure(["let x = g:list_mixed[xxx]"], 'E1001:') 11176b7a0a8cSBram Moolenaar call CheckDefFailure(["let x = [1,2,3]"], 'E1069:') 11186802cce4SBram Moolenaar call CheckDefExecFailure(["let x = g:list_mixed['xx']"], 'E1029:') 1119a7eedf31SBram Moolenaar call CheckDefFailure(["let x = g:list_mixed["], 'E1097:') 1120a7eedf31SBram Moolenaar call CheckDefFailure(["let x = g:list_mixed[0"], 'E1097:') 1121015f4267SBram Moolenaar call CheckDefExecFailure(["let x = g:list_empty[3]"], 'E684:') 11228a7d6542SBram Moolenaarenddef 11238a7d6542SBram Moolenaar 11247147820cSBram Moolenaardef Test_expr7_list_vim9script() 11257147820cSBram Moolenaar let lines =<< trim END 11267147820cSBram Moolenaar vim9script 11277147820cSBram Moolenaar let l = [ 11287147820cSBram Moolenaar 11, 11297147820cSBram Moolenaar 22, 11307147820cSBram Moolenaar ] 11317147820cSBram Moolenaar assert_equal([11, 22], l) 11327147820cSBram Moolenaar END 11337147820cSBram Moolenaar CheckScriptSuccess(lines) 11347147820cSBram Moolenaar 11357147820cSBram Moolenaar lines =<< trim END 11367147820cSBram Moolenaar vim9script 11377147820cSBram Moolenaar let l = [11, 11387147820cSBram Moolenaar 22] 11397147820cSBram Moolenaar assert_equal([11, 22], l) 11407147820cSBram Moolenaar END 11417147820cSBram Moolenaar CheckScriptSuccess(lines) 11428ea9390bSBram Moolenaar 11438ea9390bSBram Moolenaar lines =<< trim END 11448ea9390bSBram Moolenaar vim9script 11458ea9390bSBram Moolenaar let l = [11,22] 11468ea9390bSBram Moolenaar END 11478ea9390bSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 11487147820cSBram Moolenaarenddef 11497147820cSBram Moolenaar 11508a7d6542SBram Moolenaardef Test_expr7_lambda() 11518a7d6542SBram Moolenaar let La = { -> 'result'} 11528a7d6542SBram Moolenaar assert_equal('result', La()) 11538a7d6542SBram Moolenaar assert_equal([1, 3, 5], [1, 2, 3]->map({key, val -> key + val})) 1154914e7eaaSBram Moolenaar 1155f5be8cdbSBram Moolenaar # line continuation inside lambda with "cond ? expr : expr" works 11568af81d65SBram Moolenaar let ll = range(3) 11578af81d65SBram Moolenaar map(ll, {k, v -> v % 2 ? { 11588af81d65SBram Moolenaar '111': 111 } : {} 11598af81d65SBram Moolenaar }) 11608af81d65SBram Moolenaar assert_equal([{}, {'111': 111}, {}], ll) 11618af81d65SBram Moolenaar 11628af81d65SBram Moolenaar ll = range(3) 11638af81d65SBram Moolenaar map(ll, {k, v -> v == 8 || v 11648af81d65SBram Moolenaar == 9 11658af81d65SBram Moolenaar || v % 2 ? 111 : 222 11668af81d65SBram Moolenaar }) 11678af81d65SBram Moolenaar assert_equal([222, 111, 222], ll) 11688af81d65SBram Moolenaar 11698af81d65SBram Moolenaar ll = range(3) 11708af81d65SBram Moolenaar map(ll, {k, v -> v != 8 && v 11718af81d65SBram Moolenaar != 9 11728af81d65SBram Moolenaar && v % 2 == 0 ? 111 : 222 11738af81d65SBram Moolenaar }) 11748af81d65SBram Moolenaar assert_equal([111, 222, 111], ll) 11758af81d65SBram Moolenaar 11766802cce4SBram Moolenaar let dl = [{'key': 0}, {'key': 22}]->filter({ _, v -> v['key'] }) 11776802cce4SBram Moolenaar assert_equal([{'key': 22}], dl) 11786802cce4SBram Moolenaar 1179914e7eaaSBram Moolenaar call CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:') 11808a7d6542SBram Moolenaarenddef 11818a7d6542SBram Moolenaar 1182e40fbc2cSBram Moolenaardef Test_expr7_lambda_vim9script() 1183e40fbc2cSBram Moolenaar let lines =<< trim END 1184e40fbc2cSBram Moolenaar vim9script 1185e40fbc2cSBram Moolenaar let v = 10->{a -> 1186e40fbc2cSBram Moolenaar a 1187e40fbc2cSBram Moolenaar + 2 1188e40fbc2cSBram Moolenaar }() 1189e40fbc2cSBram Moolenaar assert_equal(12, v) 1190e40fbc2cSBram Moolenaar END 1191e40fbc2cSBram Moolenaar CheckScriptSuccess(lines) 1192e40fbc2cSBram Moolenaarenddef 1193e40fbc2cSBram Moolenaar 11948a7d6542SBram Moolenaardef Test_expr7_dict() 1195f5be8cdbSBram Moolenaar # dictionary 11968a7d6542SBram Moolenaar assert_equal(g:dict_empty, {}) 11978a7d6542SBram Moolenaar assert_equal(g:dict_empty, { }) 11988a7d6542SBram Moolenaar assert_equal(g:dict_one, {'one': 1}) 11998a7d6542SBram Moolenaar let key = 'one' 12008a7d6542SBram Moolenaar let val = 1 12018a7d6542SBram Moolenaar assert_equal(g:dict_one, {key: val}) 12020062c2d4SBram Moolenaar 1203cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{8: 8}"], 'E1014:') 1204cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{xxx}"], 'E720:') 1205cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{xxx: 1", "let y = 2"], 'E722:') 1206cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{xxx: 1,"], 'E723:') 1207cfe435d7SBram Moolenaar call CheckDefFailure(["let x = {'a': xxx}"], 'E1001:') 1208cfe435d7SBram Moolenaar call CheckDefFailure(["let x = {xxx: 8}"], 'E1001:') 1209cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #{a: 1, a: 2}"], 'E721:') 1210cfe435d7SBram Moolenaar call CheckDefFailure(["let x = #"], 'E1015:') 1211cfe435d7SBram Moolenaar call CheckDefFailure(["let x += 1"], 'E1020:') 1212cfe435d7SBram Moolenaar call CheckDefFailure(["let x = x + 1"], 'E1001:') 1213015f4267SBram Moolenaar call CheckDefExecFailure(["let x = g:anint.member"], 'E715:') 1214015f4267SBram Moolenaar call CheckDefExecFailure(["let x = g:dict_empty.member"], 'E716:') 12158a7d6542SBram Moolenaarenddef 12168a7d6542SBram Moolenaar 12178ea9390bSBram Moolenaardef Test_expr7_dict_vim9script() 12188ea9390bSBram Moolenaar let lines =<< trim END 12198ea9390bSBram Moolenaar vim9script 12208ea9390bSBram Moolenaar let d = { 12218ea9390bSBram Moolenaar 'one': 12228ea9390bSBram Moolenaar 1, 12238ea9390bSBram Moolenaar 'two': 2, 12248ea9390bSBram Moolenaar } 12258ea9390bSBram Moolenaar assert_equal({'one': 1, 'two': 2}, d) 12268ea9390bSBram Moolenaar END 12278ea9390bSBram Moolenaar CheckScriptSuccess(lines) 12288ea9390bSBram Moolenaar 12298ea9390bSBram Moolenaar lines =<< trim END 12308ea9390bSBram Moolenaar vim9script 1231e6b5324eSBram Moolenaar let d = { "one": "one", "two": "two", } 1232e6b5324eSBram Moolenaar assert_equal({'one': 'one', 'two': 'two'}, d) 1233e6b5324eSBram Moolenaar END 1234e6b5324eSBram Moolenaar CheckScriptSuccess(lines) 1235e6b5324eSBram Moolenaar 1236e6b5324eSBram Moolenaar lines =<< trim END 1237e6b5324eSBram Moolenaar vim9script 12388ea9390bSBram Moolenaar let d = #{one: 1, 12398ea9390bSBram Moolenaar two: 2, 12408ea9390bSBram Moolenaar } 12418ea9390bSBram Moolenaar assert_equal({'one': 1, 'two': 2}, d) 12428ea9390bSBram Moolenaar END 12438ea9390bSBram Moolenaar CheckScriptSuccess(lines) 12448ea9390bSBram Moolenaar 12458ea9390bSBram Moolenaar lines =<< trim END 12468ea9390bSBram Moolenaar vim9script 12478ea9390bSBram Moolenaar let d = #{one:1, two: 2} 12488ea9390bSBram Moolenaar END 12498ea9390bSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 12508ea9390bSBram Moolenaar 12518ea9390bSBram Moolenaar lines =<< trim END 12528ea9390bSBram Moolenaar vim9script 12538ea9390bSBram Moolenaar let d = #{one: 1,two: 2} 12548ea9390bSBram Moolenaar END 12558ea9390bSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 12568ea9390bSBram Moolenaarenddef 12578ea9390bSBram Moolenaar 125850788ef3SBram Moolenaarlet g:oneString = 'one' 125950788ef3SBram Moolenaar 12600b37a2f3SBram Moolenaardef Test_expr_member() 12610b37a2f3SBram Moolenaar assert_equal(1, g:dict_one.one) 12624dac32caSBram Moolenaar let d: dict<number> = g:dict_one 12634dac32caSBram Moolenaar assert_equal(1, d['one']) 1264a7eedf31SBram Moolenaar assert_equal(1, d[ 1265a7eedf31SBram Moolenaar 'one' 1266a7eedf31SBram Moolenaar ]) 1267a7eedf31SBram Moolenaar assert_equal(1, d 1268a7eedf31SBram Moolenaar .one) 12690b37a2f3SBram Moolenaar 1270fb9d5c51SBram Moolenaar # getting the one member should clear the dict after getting the item 1271fb9d5c51SBram Moolenaar assert_equal('one', #{one: 'one'}.one) 127250788ef3SBram Moolenaar assert_equal('one', #{one: 'one'}[g:oneString]) 1273fb9d5c51SBram Moolenaar 1274cfe435d7SBram Moolenaar call CheckDefFailure(["let x = g:dict_one.#$!"], 'E1002:') 12754dac32caSBram Moolenaar call CheckDefExecFailure(["let d: dict<any>", "echo d['a']"], 'E716:') 12764dac32caSBram Moolenaar call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list') 12770b37a2f3SBram Moolenaarenddef 12780b37a2f3SBram Moolenaar 1279435d8978SBram Moolenaardef Test_expr_index() 1280435d8978SBram Moolenaar # getting the one member should clear the list only after getting the item 1281435d8978SBram Moolenaar assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1]) 1282435d8978SBram Moolenaarenddef 1283435d8978SBram Moolenaar 1284442af2f8SBram Moolenaardef Test_expr_member_vim9script() 1285442af2f8SBram Moolenaar let lines =<< trim END 1286442af2f8SBram Moolenaar vim9script 1287442af2f8SBram Moolenaar let d = #{one: 1288442af2f8SBram Moolenaar 'one', 1289442af2f8SBram Moolenaar two: 'two'} 1290442af2f8SBram Moolenaar assert_equal('one', d.one) 1291442af2f8SBram Moolenaar assert_equal('one', d 1292442af2f8SBram Moolenaar .one) 1293442af2f8SBram Moolenaar assert_equal('one', d[ 1294442af2f8SBram Moolenaar 'one' 1295442af2f8SBram Moolenaar ]) 1296442af2f8SBram Moolenaar END 1297442af2f8SBram Moolenaar CheckScriptSuccess(lines) 1298442af2f8SBram Moolenaar 1299442af2f8SBram Moolenaar lines =<< trim END 1300442af2f8SBram Moolenaar vim9script 1301442af2f8SBram Moolenaar let l = [1, 1302442af2f8SBram Moolenaar 2, 1303442af2f8SBram Moolenaar 3, 4 1304442af2f8SBram Moolenaar ] 1305442af2f8SBram Moolenaar assert_equal(2, l[ 1306442af2f8SBram Moolenaar 1 1307442af2f8SBram Moolenaar ]) 1308442af2f8SBram Moolenaar assert_equal([2, 3], l[1 : 2]) 1309442af2f8SBram Moolenaar assert_equal([1, 2, 3], l[ 1310442af2f8SBram Moolenaar : 1311442af2f8SBram Moolenaar 2 1312442af2f8SBram Moolenaar ]) 1313442af2f8SBram Moolenaar assert_equal([3, 4], l[ 1314442af2f8SBram Moolenaar 2 1315442af2f8SBram Moolenaar : 1316442af2f8SBram Moolenaar ]) 1317442af2f8SBram Moolenaar END 1318442af2f8SBram Moolenaar CheckScriptSuccess(lines) 1319442af2f8SBram Moolenaarenddef 1320442af2f8SBram Moolenaar 13218a7d6542SBram Moolenaardef Test_expr7_option() 1322f5be8cdbSBram Moolenaar # option 13238a7d6542SBram Moolenaar set ts=11 13248a7d6542SBram Moolenaar assert_equal(11, &ts) 1325401d9ffbSBram Moolenaar &ts = 9 1326401d9ffbSBram Moolenaar assert_equal(9, &ts) 13278a7d6542SBram Moolenaar set ts=8 13288a7d6542SBram Moolenaar set grepprg=some\ text 13298a7d6542SBram Moolenaar assert_equal('some text', &grepprg) 133097a2af39SBram Moolenaar &grepprg = test_null_string() 133197a2af39SBram Moolenaar assert_equal('', &grepprg) 13328a7d6542SBram Moolenaar set grepprg& 13338a7d6542SBram Moolenaarenddef 13348a7d6542SBram Moolenaar 13358a7d6542SBram Moolenaardef Test_expr7_environment() 1336f5be8cdbSBram Moolenaar # environment variable 13378a7d6542SBram Moolenaar assert_equal('testvar', $TESTVAR) 13388a7d6542SBram Moolenaar assert_equal('', $ASDF_ASD_XXX) 1339c58164c5SBram Moolenaar 1340cfe435d7SBram Moolenaar call CheckDefFailure(["let x = $$$"], 'E1002:') 13418a7d6542SBram Moolenaarenddef 13428a7d6542SBram Moolenaar 13438a7d6542SBram Moolenaardef Test_expr7_register() 1344401d9ffbSBram Moolenaar @a = 'register a' 13458a7d6542SBram Moolenaar assert_equal('register a', @a) 13468a7d6542SBram Moolenaarenddef 13478a7d6542SBram Moolenaar 1348*2f8ce0aeSBram Moolenaardef Test_expr7_namespace() 1349*2f8ce0aeSBram Moolenaar g:some_var = 'some' 1350*2f8ce0aeSBram Moolenaar assert_equal('some', get(g:, 'some_var')) 1351*2f8ce0aeSBram Moolenaar assert_equal('some', get(g:, 'some_var', 'xxx')) 1352*2f8ce0aeSBram Moolenaar assert_equal('xxx', get(g:, 'no_var', 'xxx')) 1353*2f8ce0aeSBram Moolenaar unlet g:some_var 1354*2f8ce0aeSBram Moolenaar 1355*2f8ce0aeSBram Moolenaar b:some_var = 'some' 1356*2f8ce0aeSBram Moolenaar assert_equal('some', get(b:, 'some_var')) 1357*2f8ce0aeSBram Moolenaar assert_equal('some', get(b:, 'some_var', 'xxx')) 1358*2f8ce0aeSBram Moolenaar assert_equal('xxx', get(b:, 'no_var', 'xxx')) 1359*2f8ce0aeSBram Moolenaar unlet b:some_var 1360*2f8ce0aeSBram Moolenaar 1361*2f8ce0aeSBram Moolenaar w:some_var = 'some' 1362*2f8ce0aeSBram Moolenaar assert_equal('some', get(w:, 'some_var')) 1363*2f8ce0aeSBram Moolenaar assert_equal('some', get(w:, 'some_var', 'xxx')) 1364*2f8ce0aeSBram Moolenaar assert_equal('xxx', get(w:, 'no_var', 'xxx')) 1365*2f8ce0aeSBram Moolenaar unlet w:some_var 1366*2f8ce0aeSBram Moolenaar 1367*2f8ce0aeSBram Moolenaar t:some_var = 'some' 1368*2f8ce0aeSBram Moolenaar assert_equal('some', get(t:, 'some_var')) 1369*2f8ce0aeSBram Moolenaar assert_equal('some', get(t:, 'some_var', 'xxx')) 1370*2f8ce0aeSBram Moolenaar assert_equal('xxx', get(t:, 'no_var', 'xxx')) 1371*2f8ce0aeSBram Moolenaar unlet t:some_var 1372*2f8ce0aeSBram Moolenaarenddef 1373*2f8ce0aeSBram Moolenaar 13748a7d6542SBram Moolenaardef Test_expr7_parens() 1375f5be8cdbSBram Moolenaar # (expr) 13768a7d6542SBram Moolenaar assert_equal(4, (6 * 4) / 6) 13778a7d6542SBram Moolenaar assert_equal(0, 6 * ( 4 / 6 )) 13788a7d6542SBram Moolenaar 13798a7d6542SBram Moolenaar assert_equal(6, +6) 13808a7d6542SBram Moolenaar assert_equal(-6, -6) 13818a7d6542SBram Moolenaar assert_equal(6, --6) 13828a7d6542SBram Moolenaar assert_equal(6, -+-6) 13838a7d6542SBram Moolenaar assert_equal(-6, ---6) 13840b1cd52fSBram Moolenaar assert_equal(false, !-3) 13850b1cd52fSBram Moolenaar assert_equal(true, !+-+0) 13868a7d6542SBram Moolenaarenddef 13878a7d6542SBram Moolenaar 13887a4981b9SBram Moolenaardef Test_expr7_parens_vim9script() 13897a4981b9SBram Moolenaar let lines =<< trim END 13907a4981b9SBram Moolenaar vim9script 13917a4981b9SBram Moolenaar let s = ( 13927a4981b9SBram Moolenaar 'one' 13937a4981b9SBram Moolenaar .. 13947a4981b9SBram Moolenaar 'two' 13957a4981b9SBram Moolenaar ) 13967a4981b9SBram Moolenaar assert_equal('onetwo', s) 13977a4981b9SBram Moolenaar END 13987a4981b9SBram Moolenaar CheckScriptSuccess(lines) 13997a4981b9SBram Moolenaarenddef 14007a4981b9SBram Moolenaar 14010b37a2f3SBram Moolenaardef Test_expr7_negate() 14020b37a2f3SBram Moolenaar assert_equal(-99, -99) 14030b37a2f3SBram Moolenaar assert_equal(99, --99) 14040b37a2f3SBram Moolenaar let nr = 88 14050b37a2f3SBram Moolenaar assert_equal(-88, -nr) 14060b37a2f3SBram Moolenaar assert_equal(88, --nr) 14070b37a2f3SBram Moolenaarenddef 14080b37a2f3SBram Moolenaar 14096e949784SBram Moolenaardef Echo(arg: any): string 14100b37a2f3SBram Moolenaar return arg 14110b37a2f3SBram Moolenaarenddef 14120b37a2f3SBram Moolenaar 14136e949784SBram Moolenaardef s:EchoArg(arg: any): string 14140b37a2f3SBram Moolenaar return arg 14150b37a2f3SBram Moolenaarenddef 14160b37a2f3SBram Moolenaar 14170b37a2f3SBram Moolenaardef Test_expr7_call() 14180b37a2f3SBram Moolenaar assert_equal('yes', 'yes'->Echo()) 14190b37a2f3SBram Moolenaar assert_equal('yes', 'yes'->s:EchoArg()) 14200b1cd52fSBram Moolenaar assert_equal(1, !range(5)->empty()) 14210b1cd52fSBram Moolenaar assert_equal([0, 1, 2], --3->range()) 14220b37a2f3SBram Moolenaar 1423cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 'yes'->Echo"], 'E107:') 14240b37a2f3SBram Moolenaarenddef 14250b37a2f3SBram Moolenaar 14260b37a2f3SBram Moolenaar 14278a7d6542SBram Moolenaardef Test_expr7_not() 14288a7d6542SBram Moolenaar assert_equal(true, !'') 14298a7d6542SBram Moolenaar assert_equal(true, ![]) 14308a7d6542SBram Moolenaar assert_equal(false, !'asdf') 14318a7d6542SBram Moolenaar assert_equal(false, ![2]) 14328a7d6542SBram Moolenaar assert_equal(true, !!'asdf') 14338a7d6542SBram Moolenaar assert_equal(true, !![2]) 14348ed04587SBram Moolenaar 14358ed04587SBram Moolenaar assert_equal(true, !test_null_partial()) 14368ed04587SBram Moolenaar assert_equal(false, !{-> 'yes'}) 14378ed04587SBram Moolenaar 14388ed04587SBram Moolenaar assert_equal(true, !test_null_dict()) 14398ed04587SBram Moolenaar assert_equal(true, !{}) 14408ed04587SBram Moolenaar assert_equal(false, !{'yes': 'no'}) 14418ed04587SBram Moolenaar 1442b4d2cb10SBram Moolenaar if has('channel') 14438ed04587SBram Moolenaar assert_equal(true, !test_null_job()) 14448ed04587SBram Moolenaar assert_equal(true, !test_null_channel()) 1445b4d2cb10SBram Moolenaar endif 14468ed04587SBram Moolenaar 14478ed04587SBram Moolenaar assert_equal(true, !test_null_blob()) 14488ed04587SBram Moolenaar assert_equal(true, !0z) 14498ed04587SBram Moolenaar assert_equal(false, !0z01) 14508ed04587SBram Moolenaar 14518ed04587SBram Moolenaar assert_equal(true, !test_void()) 14528ed04587SBram Moolenaar assert_equal(true, !test_unknown()) 14538a7d6542SBram Moolenaarenddef 14548a7d6542SBram Moolenaar 14558a7d6542SBram Moolenaarfunc Test_expr7_fails() 1456cfe435d7SBram Moolenaar call CheckDefFailure(["let x = (12"], "E110:") 14578a7d6542SBram Moolenaar 1458cfe435d7SBram Moolenaar call CheckDefFailure(["let x = -'xx'"], "E1030:") 1459cfe435d7SBram Moolenaar call CheckDefFailure(["let x = +'xx'"], "E1030:") 1460cfe435d7SBram Moolenaar call CheckDefFailure(["let x = -0z12"], "E974:") 1461015f4267SBram Moolenaar call CheckDefExecFailure(["let x = -[8]"], "E39:") 1462015f4267SBram Moolenaar call CheckDefExecFailure(["let x = -{'a': 1}"], "E39:") 14638a7d6542SBram Moolenaar 1464cfe435d7SBram Moolenaar call CheckDefFailure(["let x = @"], "E1002:") 1465cfe435d7SBram Moolenaar call CheckDefFailure(["let x = @<"], "E354:") 146658ceca5cSBram Moolenaar 1467cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [1, 2"], "E697:") 1468cfe435d7SBram Moolenaar call CheckDefFailure(["let x = [notfound]"], "E1001:") 1469ee619e5bSBram Moolenaar 1470cfe435d7SBram Moolenaar call CheckDefFailure(["let x = { -> 123) }"], "E451:") 1471cfe435d7SBram Moolenaar call CheckDefFailure(["let x = 123->{x -> x + 5) }"], "E451:") 1472ee619e5bSBram Moolenaar 1473cfe435d7SBram Moolenaar call CheckDefFailure(["let x = ¬exist"], 'E113:') 1474cfe435d7SBram Moolenaar call CheckDefFailure(["&grepprg = [343]"], 'E1013:') 1475fd1823e0SBram Moolenaar 1476015f4267SBram Moolenaar call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:') 1477015f4267SBram Moolenaar call CheckDefExecFailure(["echo g:doesnt_exist"], 'E121:') 147809f28f49SBram Moolenaar 1479cfe435d7SBram Moolenaar call CheckDefFailure(["echo a:somevar"], 'E1075:') 1480cfe435d7SBram Moolenaar call CheckDefFailure(["echo l:somevar"], 'E1075:') 1481cfe435d7SBram Moolenaar call CheckDefFailure(["echo x:somevar"], 'E1075:') 148233fa29cfSBram Moolenaar 1483015f4267SBram Moolenaar call CheckDefExecFailure(["let x = +g:astring"], 'E1030:') 1484015f4267SBram Moolenaar call CheckDefExecFailure(["let x = +g:ablob"], 'E974:') 1485015f4267SBram Moolenaar call CheckDefExecFailure(["let x = +g:alist"], 'E745:') 1486015f4267SBram Moolenaar call CheckDefExecFailure(["let x = +g:adict"], 'E728:') 148742a480bfSBram Moolenaar 1488cfe435d7SBram Moolenaar call CheckDefFailure(["let x = ''", "let y = x.memb"], 'E715:') 148933fa29cfSBram Moolenaar 14905f195938SBram Moolenaar call CheckDefExecFailure(["[1, 2->len()"], 'E697:') 1491015f4267SBram Moolenaar call CheckDefExecFailure(["#{a: 1->len()"], 'E488:') 14925f195938SBram Moolenaar call CheckDefExecFailure(["{'a': 1->len()"], 'E723:') 14938a7d6542SBram Moolenaarendfunc 14948a7d6542SBram Moolenaar 14958a7d6542SBram Moolenaarlet g:Funcrefs = [function('add')] 14968a7d6542SBram Moolenaar 14978a7d6542SBram Moolenaarfunc CallMe(arg) 14988a7d6542SBram Moolenaar return a:arg 14998a7d6542SBram Moolenaarendfunc 15008a7d6542SBram Moolenaar 150138a5f517SBram Moolenaarfunc CallMe2(one, two) 150238a5f517SBram Moolenaar return a:one .. a:two 150338a5f517SBram Moolenaarendfunc 150438a5f517SBram Moolenaar 15058a7d6542SBram Moolenaardef Test_expr7_trailing() 1506f5be8cdbSBram Moolenaar # user function call 15074c17ad94SBram Moolenaar assert_equal(123, g:CallMe(123)) 15084c17ad94SBram Moolenaar assert_equal(123, g:CallMe( 123)) 15094c17ad94SBram Moolenaar assert_equal(123, g:CallMe(123 )) 15104c17ad94SBram Moolenaar assert_equal('yesno', g:CallMe2('yes', 'no')) 15114c17ad94SBram Moolenaar assert_equal('yesno', g:CallMe2( 'yes', 'no' )) 15124c17ad94SBram Moolenaar assert_equal('nothing', g:CallMe('nothing')) 15138a7d6542SBram Moolenaar 1514f5be8cdbSBram Moolenaar # partial call 15154c17ad94SBram Moolenaar let Part = function('g:CallMe') 15168a7d6542SBram Moolenaar assert_equal('yes', Part('yes')) 15178a7d6542SBram Moolenaar 1518f5be8cdbSBram Moolenaar # funcref call, using list index 15198a7d6542SBram Moolenaar let l = [] 15208a7d6542SBram Moolenaar g:Funcrefs[0](l, 2) 15218a7d6542SBram Moolenaar assert_equal([2], l) 15228a7d6542SBram Moolenaar 1523f5be8cdbSBram Moolenaar # method call 15248a7d6542SBram Moolenaar l = [2, 5, 6] 15258a7d6542SBram Moolenaar l->map({k, v -> k + v}) 15268a7d6542SBram Moolenaar assert_equal([2, 6, 8], l) 15278a7d6542SBram Moolenaar 1528f5be8cdbSBram Moolenaar # lambda method call 15298a7d6542SBram Moolenaar l = [2, 5] 15308a7d6542SBram Moolenaar l->{l -> add(l, 8)}() 15318a7d6542SBram Moolenaar assert_equal([2, 5, 8], l) 15328a7d6542SBram Moolenaar 1533f5be8cdbSBram Moolenaar # dict member 15348a7d6542SBram Moolenaar let d = #{key: 123} 15358a7d6542SBram Moolenaar assert_equal(123, d.key) 15368a7d6542SBram Moolenaarenddef 15378a7d6542SBram Moolenaar 1538bf9d8c37SBram Moolenaardef Test_expr7_subscript() 1539bf9d8c37SBram Moolenaar let text = 'abcdef' 1540bf9d8c37SBram Moolenaar assert_equal('', text[-1]) 1541bf9d8c37SBram Moolenaar assert_equal('a', text[0]) 1542bf9d8c37SBram Moolenaar assert_equal('e', text[4]) 1543bf9d8c37SBram Moolenaar assert_equal('f', text[5]) 1544bf9d8c37SBram Moolenaar assert_equal('', text[6]) 1545bf9d8c37SBram Moolenaarenddef 1546bf9d8c37SBram Moolenaar 1547a3b7fdc1SBram Moolenaardef Test_expr7_subscript_linebreak() 1548a3b7fdc1SBram Moolenaar let range = range( 1549a3b7fdc1SBram Moolenaar 3) 1550a3b7fdc1SBram Moolenaar let l = range-> 1551a3b7fdc1SBram Moolenaar map('string(v:key)') 1552a3b7fdc1SBram Moolenaar assert_equal(['0', '1', '2'], l) 1553a3b7fdc1SBram Moolenaar 155423c55273SBram Moolenaar l = range 155523c55273SBram Moolenaar ->map('string(v:key)') 155623c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 155723c55273SBram Moolenaar 155823c55273SBram Moolenaar l = range # comment 155923c55273SBram Moolenaar ->map('string(v:key)') 156023c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 156123c55273SBram Moolenaar 156223c55273SBram Moolenaar l = range 156323c55273SBram Moolenaar 156423c55273SBram Moolenaar ->map('string(v:key)') 156523c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 156623c55273SBram Moolenaar 156723c55273SBram Moolenaar l = range 156823c55273SBram Moolenaar # comment 156923c55273SBram Moolenaar ->map('string(v:key)') 157023c55273SBram Moolenaar assert_equal(['0', '1', '2'], l) 157123c55273SBram Moolenaar 1572a3b7fdc1SBram Moolenaar assert_equal('1', l[ 1573a3b7fdc1SBram Moolenaar 1]) 1574a3b7fdc1SBram Moolenaar 1575a3b7fdc1SBram Moolenaar let d = #{one: 33} 1576a3b7fdc1SBram Moolenaar assert_equal(33, d. 1577a3b7fdc1SBram Moolenaar one) 1578a3b7fdc1SBram Moolenaarenddef 1579a3b7fdc1SBram Moolenaar 1580389df259SBram Moolenaardef Test_expr7_method_call() 1581389df259SBram Moolenaar new 1582389df259SBram Moolenaar setline(1, ['first', 'last']) 1583389df259SBram Moolenaar eval 'second'->append(1) 1584389df259SBram Moolenaar assert_equal(['first', 'second', 'last'], getline(1, '$')) 1585389df259SBram Moolenaar bwipe! 1586389df259SBram Moolenaar 1587389df259SBram Moolenaar let bufnr = bufnr() 1588389df259SBram Moolenaar let loclist = [#{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}] 1589389df259SBram Moolenaar loclist->setloclist(0) 1590389df259SBram Moolenaar assert_equal([#{bufnr: bufnr, 1591389df259SBram Moolenaar lnum: 42, 1592389df259SBram Moolenaar col: 17, 1593389df259SBram Moolenaar text: 'wrong', 1594389df259SBram Moolenaar pattern: '', 1595389df259SBram Moolenaar valid: 1, 1596389df259SBram Moolenaar vcol: 0, 1597389df259SBram Moolenaar nr: 0, 1598389df259SBram Moolenaar type: '', 1599389df259SBram Moolenaar module: ''} 1600389df259SBram Moolenaar ], getloclist(0)) 1601389df259SBram Moolenaarenddef 16026e949784SBram Moolenaar 16038a7d6542SBram Moolenaarfunc Test_expr7_trailing_fails() 16047ce85be6SBram Moolenaar call CheckDefFailure(['let l = [2]', 'l->{l -> add(l, 8)}'], 'E107') 16057ce85be6SBram Moolenaar call CheckDefFailure(['let l = [2]', 'l->{l -> add(l, 8)} ()'], 'E274') 16068a7d6542SBram Moolenaarendfunc 16078a7d6542SBram Moolenaar 16088a7d6542SBram Moolenaarfunc Test_expr_fails() 1609cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'is2"], 'E488:') 1610cfe435d7SBram Moolenaar call CheckDefFailure(["let x = '1'isnot2"], 'E488:') 161138a5f517SBram Moolenaar 1612002262f4SBram Moolenaar call CheckDefFailure(["CallMe ('yes')"], 'E476:') 1613cfe435d7SBram Moolenaar call CheckDefFailure(["CallMe2('yes','no')"], 'E1069:') 1614cfe435d7SBram Moolenaar call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:') 16150c2ca58eSBram Moolenaar 1616cfe435d7SBram Moolenaar call CheckDefFailure(["v:nosuch += 3"], 'E1001:') 1617e55b1c09SBram Moolenaar call CheckDefFailure(["let v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:') 1618cfe435d7SBram Moolenaar call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:') 161933fa29cfSBram Moolenaar 1620cfe435d7SBram Moolenaar call CheckDefFailure(["echo len('asdf'"], 'E110:') 1621cfe435d7SBram Moolenaar call CheckDefFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:') 1622cfe435d7SBram Moolenaar call CheckDefFailure(["echo doesnotexist()"], 'E117:') 16238a7d6542SBram Moolenaarendfunc 1624