1971caf53SBram Moolenaar" Test Vim9 assignments 2971caf53SBram Moolenaar 3971caf53SBram Moolenaarsource check.vim 4971caf53SBram Moolenaarsource vim9.vim 5971caf53SBram Moolenaar 6971caf53SBram Moolenaarlet s:appendToMe = 'xxx' 7971caf53SBram Moolenaarlet s:addToMe = 111 8971caf53SBram Moolenaarlet g:existing = 'yes' 9971caf53SBram Moolenaarlet g:inc_counter = 1 10971caf53SBram Moolenaarlet $SOME_ENV_VAR = 'some' 11971caf53SBram Moolenaarlet g:alist = [7] 125b5ae29bSBram Moolenaarlet g:adict = #{a: 1} 13971caf53SBram Moolenaarlet g:astring = 'text' 14971caf53SBram Moolenaar 15971caf53SBram Moolenaardef Test_assignment_bool() 1630fd8204SBram Moolenaar var bool1: bool = true 17971caf53SBram Moolenaar assert_equal(v:true, bool1) 1830fd8204SBram Moolenaar var bool2: bool = false 19971caf53SBram Moolenaar assert_equal(v:false, bool2) 20971caf53SBram Moolenaar 2130fd8204SBram Moolenaar var bool3: bool = 0 22971caf53SBram Moolenaar assert_equal(false, bool3) 2330fd8204SBram Moolenaar var bool4: bool = 1 24971caf53SBram Moolenaar assert_equal(true, bool4) 25971caf53SBram Moolenaar 262bb2658bSBram Moolenaar var bool5: bool = 1 && true 27971caf53SBram Moolenaar assert_equal(true, bool5) 282bb2658bSBram Moolenaar var bool6: bool = 0 && 1 29971caf53SBram Moolenaar assert_equal(false, bool6) 302bb2658bSBram Moolenaar var bool7: bool = 0 || 1 && true 31971caf53SBram Moolenaar assert_equal(true, bool7) 32971caf53SBram Moolenaar 3330fd8204SBram Moolenaar var lines =<< trim END 34971caf53SBram Moolenaar vim9script 35971caf53SBram Moolenaar def GetFlag(): bool 3630fd8204SBram Moolenaar var flag: bool = 1 37971caf53SBram Moolenaar return flag 38971caf53SBram Moolenaar enddef 3930fd8204SBram Moolenaar var flag: bool = GetFlag() 40971caf53SBram Moolenaar assert_equal(true, flag) 41971caf53SBram Moolenaar flag = 0 42971caf53SBram Moolenaar assert_equal(false, flag) 43971caf53SBram Moolenaar flag = 1 44971caf53SBram Moolenaar assert_equal(true, flag) 452bb2658bSBram Moolenaar flag = 1 || true 46971caf53SBram Moolenaar assert_equal(true, flag) 472bb2658bSBram Moolenaar flag = 1 && false 48971caf53SBram Moolenaar assert_equal(false, flag) 49dd1f426bSBram Moolenaar 50dd1f426bSBram Moolenaar var cp: bool = &cp 51dd1f426bSBram Moolenaar var fen: bool = &l:fen 52971caf53SBram Moolenaar END 53971caf53SBram Moolenaar CheckScriptSuccess(lines) 5430fd8204SBram Moolenaar CheckDefAndScriptFailure(['var x: bool = 2'], 'E1012:') 5530fd8204SBram Moolenaar CheckDefAndScriptFailure(['var x: bool = -1'], 'E1012:') 5630fd8204SBram Moolenaar CheckDefAndScriptFailure(['var x: bool = [1]'], 'E1012:') 5730fd8204SBram Moolenaar CheckDefAndScriptFailure(['var x: bool = {}'], 'E1012:') 5830fd8204SBram Moolenaar CheckDefAndScriptFailure(['var x: bool = "x"'], 'E1012:') 599a562c18SBram Moolenaar 609a562c18SBram Moolenaar CheckDefAndScriptFailure(['var x: bool = "x"', '', 'eval 0'], 'E1012:', 1) 61971caf53SBram Moolenaarenddef 62971caf53SBram Moolenaar 63971caf53SBram Moolenaardef Test_syntax() 649830938eSBram Moolenaar var name = 234 6530fd8204SBram Moolenaar var other: list<string> = ['asdf'] 66971caf53SBram Moolenaarenddef 67971caf53SBram Moolenaar 68971caf53SBram Moolenaardef Test_assignment() 6930fd8204SBram Moolenaar CheckDefFailure(['var x:string'], 'E1069:') 7030fd8204SBram Moolenaar CheckDefFailure(['var x:string = "x"'], 'E1069:') 7130fd8204SBram Moolenaar CheckDefFailure(['var a:string = "x"'], 'E1069:') 722949cfdbSBram Moolenaar CheckDefFailure(['var lambda = () => "lambda"'], 'E704:') 7330fd8204SBram Moolenaar CheckScriptFailure(['var x = "x"'], 'E1124:') 74971caf53SBram Moolenaar 753f327880SBram Moolenaar # lower case name is OK for a list 763f327880SBram Moolenaar var lambdaLines =<< trim END 773f327880SBram Moolenaar var lambdaList: list<func> = [Test_syntax] 783f327880SBram Moolenaar lambdaList[0] = () => "lambda" 793f327880SBram Moolenaar END 803f327880SBram Moolenaar CheckDefAndScriptSuccess(lambdaLines) 813f327880SBram Moolenaar 8230fd8204SBram Moolenaar var nr: number = 1234 8330fd8204SBram Moolenaar CheckDefFailure(['var nr: number = "asdf"'], 'E1012:') 84971caf53SBram Moolenaar 8530fd8204SBram Moolenaar var a: number = 6 #comment 86971caf53SBram Moolenaar assert_equal(6, a) 87971caf53SBram Moolenaar 88971caf53SBram Moolenaar if has('channel') 8930fd8204SBram Moolenaar var chan1: channel 90218450adSBram Moolenaar assert_equal('fail', ch_status(chan1)) 91218450adSBram Moolenaar 9230fd8204SBram Moolenaar var job1: job 93218450adSBram Moolenaar assert_equal('fail', job_status(job1)) 94218450adSBram Moolenaar 95fc8aa6d0SBram Moolenaar # calling job_start() is in test_vim9_fails.vim, it causes leak reports 96971caf53SBram Moolenaar endif 97971caf53SBram Moolenaar if has('float') 9830fd8204SBram Moolenaar var float1: float = 3.4 99971caf53SBram Moolenaar endif 10030fd8204SBram Moolenaar var Funky1: func 10130fd8204SBram Moolenaar var Funky2: func = function('len') 10230fd8204SBram Moolenaar var Party2: func = funcref('g:Test_syntax') 103971caf53SBram Moolenaar 104971caf53SBram Moolenaar g:newvar = 'new' #comment 105971caf53SBram Moolenaar assert_equal('new', g:newvar) 106971caf53SBram Moolenaar 107971caf53SBram Moolenaar assert_equal('yes', g:existing) 108971caf53SBram Moolenaar g:existing = 'no' 109971caf53SBram Moolenaar assert_equal('no', g:existing) 110971caf53SBram Moolenaar 111971caf53SBram Moolenaar v:char = 'abc' 112971caf53SBram Moolenaar assert_equal('abc', v:char) 113971caf53SBram Moolenaar 114971caf53SBram Moolenaar $ENVVAR = 'foobar' 115971caf53SBram Moolenaar assert_equal('foobar', $ENVVAR) 116971caf53SBram Moolenaar $ENVVAR = '' 117971caf53SBram Moolenaar 11830fd8204SBram Moolenaar var lines =<< trim END 119971caf53SBram Moolenaar vim9script 120971caf53SBram Moolenaar $ENVVAR = 'barfoo' 121971caf53SBram Moolenaar assert_equal('barfoo', $ENVVAR) 122971caf53SBram Moolenaar $ENVVAR = '' 123971caf53SBram Moolenaar END 124971caf53SBram Moolenaar CheckScriptSuccess(lines) 125971caf53SBram Moolenaar 126971caf53SBram Moolenaar s:appendToMe ..= 'yyy' 127971caf53SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 128971caf53SBram Moolenaar s:addToMe += 222 129971caf53SBram Moolenaar assert_equal(333, s:addToMe) 130971caf53SBram Moolenaar s:newVar = 'new' 131971caf53SBram Moolenaar assert_equal('new', s:newVar) 132971caf53SBram Moolenaar 133971caf53SBram Moolenaar set ts=7 134dd1f426bSBram Moolenaar var ts: number = &ts 135dd1f426bSBram Moolenaar assert_equal(7, ts) 136971caf53SBram Moolenaar &ts += 1 137971caf53SBram Moolenaar assert_equal(8, &ts) 138971caf53SBram Moolenaar &ts -= 3 139971caf53SBram Moolenaar assert_equal(5, &ts) 140971caf53SBram Moolenaar &ts *= 2 141971caf53SBram Moolenaar assert_equal(10, &ts) 142971caf53SBram Moolenaar &ts /= 3 143971caf53SBram Moolenaar assert_equal(3, &ts) 144971caf53SBram Moolenaar set ts=10 145971caf53SBram Moolenaar &ts %= 4 146971caf53SBram Moolenaar assert_equal(2, &ts) 147971caf53SBram Moolenaar 148971caf53SBram Moolenaar if has('float') 14930fd8204SBram Moolenaar var f100: float = 100.0 150971caf53SBram Moolenaar f100 /= 5 151971caf53SBram Moolenaar assert_equal(20.0, f100) 152971caf53SBram Moolenaar 15330fd8204SBram Moolenaar var f200: float = 200.0 154971caf53SBram Moolenaar f200 /= 5.0 155971caf53SBram Moolenaar assert_equal(40.0, f200) 156971caf53SBram Moolenaar 15730fd8204SBram Moolenaar CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:') 158971caf53SBram Moolenaar endif 159971caf53SBram Moolenaar 160971caf53SBram Moolenaar lines =<< trim END 161971caf53SBram Moolenaar &ts = 6 162971caf53SBram Moolenaar &ts += 3 163971caf53SBram Moolenaar assert_equal(9, &ts) 164971caf53SBram Moolenaar 165971caf53SBram Moolenaar &l:ts = 6 166971caf53SBram Moolenaar assert_equal(6, &ts) 167971caf53SBram Moolenaar &l:ts += 2 168971caf53SBram Moolenaar assert_equal(8, &ts) 169971caf53SBram Moolenaar 170971caf53SBram Moolenaar &g:ts = 6 171971caf53SBram Moolenaar assert_equal(6, &g:ts) 172971caf53SBram Moolenaar &g:ts += 2 173971caf53SBram Moolenaar assert_equal(8, &g:ts) 1740ea04408SBram Moolenaar 1750ea04408SBram Moolenaar &number = true 1760ea04408SBram Moolenaar assert_equal(true, &number) 1770ea04408SBram Moolenaar &number = 0 1780ea04408SBram Moolenaar assert_equal(false, &number) 1790ea04408SBram Moolenaar &number = 1 1800ea04408SBram Moolenaar assert_equal(true, &number) 1810ea04408SBram Moolenaar &number = false 1820ea04408SBram Moolenaar assert_equal(false, &number) 183971caf53SBram Moolenaar END 184971caf53SBram Moolenaar CheckDefAndScriptSuccess(lines) 185971caf53SBram Moolenaar 186971caf53SBram Moolenaar CheckDefFailure(['¬ex += 3'], 'E113:') 187971caf53SBram Moolenaar CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 188971caf53SBram Moolenaar CheckDefFailure(['&ts = [7]'], 'E1012:') 189971caf53SBram Moolenaar CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>') 190971caf53SBram Moolenaar CheckDefFailure(['&ts = "xx"'], 'E1012:') 191971caf53SBram Moolenaar CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string') 192971caf53SBram Moolenaar CheckDefFailure(['&path += 3'], 'E1012:') 193971caf53SBram Moolenaar CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 194971caf53SBram Moolenaar # test freeing ISN_STOREOPT 19530fd8204SBram Moolenaar CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:') 196971caf53SBram Moolenaar &ts = 8 197971caf53SBram Moolenaar 198971caf53SBram Moolenaar lines =<< trim END 19930fd8204SBram Moolenaar var save_TI = &t_TI 200971caf53SBram Moolenaar &t_TI = '' 201971caf53SBram Moolenaar assert_equal('', &t_TI) 202971caf53SBram Moolenaar &t_TI = 'xxx' 203971caf53SBram Moolenaar assert_equal('xxx', &t_TI) 204971caf53SBram Moolenaar &t_TI = save_TI 205971caf53SBram Moolenaar END 206971caf53SBram Moolenaar CheckDefAndScriptSuccess(lines) 207971caf53SBram Moolenaar 208971caf53SBram Moolenaar CheckDefFailure(['&t_TI = 123'], 'E1012:') 209971caf53SBram Moolenaar CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:') 210971caf53SBram Moolenaar 21130fd8204SBram Moolenaar CheckDefFailure(['var s:var = 123'], 'E1101:') 21230fd8204SBram Moolenaar CheckDefFailure(['var s:var: number'], 'E1101:') 213971caf53SBram Moolenaar 214971caf53SBram Moolenaar lines =<< trim END 215971caf53SBram Moolenaar vim9script 216971caf53SBram Moolenaar def SomeFunc() 217971caf53SBram Moolenaar s:var = 123 218971caf53SBram Moolenaar enddef 219971caf53SBram Moolenaar defcompile 220971caf53SBram Moolenaar END 221971caf53SBram Moolenaar CheckScriptFailure(lines, 'E1089:') 222971caf53SBram Moolenaar 223971caf53SBram Moolenaar g:inc_counter += 1 224971caf53SBram Moolenaar assert_equal(2, g:inc_counter) 225971caf53SBram Moolenaar 2267bf9a07bSBram Moolenaar if has('float') 2277bf9a07bSBram Moolenaar var f: float 2287bf9a07bSBram Moolenaar f += 1 2297bf9a07bSBram Moolenaar assert_equal(1.0, f) 2307bf9a07bSBram Moolenaar endif 2317bf9a07bSBram Moolenaar 232971caf53SBram Moolenaar $SOME_ENV_VAR ..= 'more' 233971caf53SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 234971caf53SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:') 235971caf53SBram Moolenaar CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:') 236971caf53SBram Moolenaar 237971caf53SBram Moolenaar v:errmsg = 'none' 238971caf53SBram Moolenaar v:errmsg ..= 'again' 239971caf53SBram Moolenaar assert_equal('noneagain', v:errmsg) 240971caf53SBram Moolenaar CheckDefFailure(['v:errmsg += "more"'], 'E1051:') 241971caf53SBram Moolenaar CheckDefFailure(['v:errmsg += 123'], 'E1012:') 242971caf53SBram Moolenaar 24330fd8204SBram Moolenaar var text =<< trim END 244971caf53SBram Moolenaar some text 245971caf53SBram Moolenaar END 246971caf53SBram Moolenaarenddef 247971caf53SBram Moolenaar 248af647e76SBram Moolenaardef Test_float_and_number() 249af647e76SBram Moolenaar if !has('float') 250af647e76SBram Moolenaar MissingFeature float 251af647e76SBram Moolenaar else 252af647e76SBram Moolenaar var lines =<< trim END 253af647e76SBram Moolenaar var f: float 254af647e76SBram Moolenaar f += 2 255af647e76SBram Moolenaar f -= 1 256af647e76SBram Moolenaar assert_equal(1.0, f) 257af647e76SBram Moolenaar ++f 258af647e76SBram Moolenaar --f 259af647e76SBram Moolenaar assert_equal(1.0, f) 260af647e76SBram Moolenaar END 261af647e76SBram Moolenaar CheckDefAndScriptSuccess(lines) 262af647e76SBram Moolenaar endif 263af647e76SBram Moolenaarenddef 264af647e76SBram Moolenaar 265f5d52c90SBram Moolenaarlet g:someNumber = 43 266f5d52c90SBram Moolenaar 267f5d52c90SBram Moolenaardef Test_assign_concat() 268f5d52c90SBram Moolenaar var lines =<< trim END 269f5d52c90SBram Moolenaar var s = '-' 270f5d52c90SBram Moolenaar s ..= 99 271f5d52c90SBram Moolenaar s ..= true 272f5d52c90SBram Moolenaar s ..= '-' 273f5d52c90SBram Moolenaar s ..= v:null 274f5d52c90SBram Moolenaar s ..= g:someNumber 275f5d52c90SBram Moolenaar assert_equal('-99true-null43', s) 276f5d52c90SBram Moolenaar END 277f5d52c90SBram Moolenaar CheckDefAndScriptSuccess(lines) 278f5d52c90SBram Moolenaar 279f5d52c90SBram Moolenaar lines =<< trim END 280f5d52c90SBram Moolenaar var s = '-' 281f5d52c90SBram Moolenaar s ..= [1, 2] 282f5d52c90SBram Moolenaar END 283f5d52c90SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1105: Cannot convert list to string', 'E734: Wrong variable type for .=', 2) 284f5d52c90SBram Moolenaar lines =<< trim END 285f5d52c90SBram Moolenaar var s = '-' 286f5d52c90SBram Moolenaar s ..= {a: 2} 287f5d52c90SBram Moolenaar END 288f5d52c90SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1105: Cannot convert dict to string', 'E734: Wrong variable type for .=', 2) 289f5d52c90SBram Moolenaarenddef 290f5d52c90SBram Moolenaar 29113e45d14SBram Moolenaardef Test_assign_register() 29213e45d14SBram Moolenaar var lines =<< trim END 29313e45d14SBram Moolenaar @c = 'areg' 29413e45d14SBram Moolenaar @c ..= 'add' 29513e45d14SBram Moolenaar assert_equal('aregadd', @c) 29613e45d14SBram Moolenaar 29713e45d14SBram Moolenaar @@ = 'some text' 29813e45d14SBram Moolenaar assert_equal('some text', getreg('"')) 29913e45d14SBram Moolenaar END 30013e45d14SBram Moolenaar CheckDefAndScriptSuccess(lines) 30113e45d14SBram Moolenaar 30213e45d14SBram Moolenaar CheckDefFailure(['@a += "more"'], 'E1051:') 30313e45d14SBram Moolenaar CheckDefFailure(['@a += 123'], 'E1012:') 30413e45d14SBram Moolenaarenddef 30513e45d14SBram Moolenaar 306d0edaf9dSBram Moolenaardef Test_reserved_name() 307d0edaf9dSBram Moolenaar for name in ['true', 'false', 'null'] 308d0edaf9dSBram Moolenaar CheckDefExecAndScriptFailure(['var ' .. name .. ' = 0'], 'E1034:') 309d0edaf9dSBram Moolenaar CheckDefExecAndScriptFailure(['var ' .. name .. ': bool'], 'E1034:') 310d0edaf9dSBram Moolenaar endfor 311d0edaf9dSBram Moolenaarenddef 312d0edaf9dSBram Moolenaar 313aa1959bdSBram Moolenaardef Test_skipped_assignment() 314aa1959bdSBram Moolenaar var lines =<< trim END 315aa1959bdSBram Moolenaar for x in [] 316aa1959bdSBram Moolenaar var i: number = 1 317aa1959bdSBram Moolenaar while false 318aa1959bdSBram Moolenaar i += 1 319aa1959bdSBram Moolenaar endwhile 320aa1959bdSBram Moolenaar endfor 321aa1959bdSBram Moolenaar END 322aa1959bdSBram Moolenaar CheckDefAndScriptSuccess(lines) 323aa1959bdSBram Moolenaarenddef 324aa1959bdSBram Moolenaar 3258ff16e01SBram Moolenaardef Test_assign_unpack() 3268ff16e01SBram Moolenaar var lines =<< trim END 3278ff16e01SBram Moolenaar var v1: number 3288ff16e01SBram Moolenaar var v2: number 3298ff16e01SBram Moolenaar [v1, v2] = [1, 2] 3308ff16e01SBram Moolenaar assert_equal(1, v1) 3318ff16e01SBram Moolenaar assert_equal(2, v2) 332f93bbd02SBram Moolenaar 333f93bbd02SBram Moolenaar [v1, _, v2, _] = [1, 99, 2, 77] 334f93bbd02SBram Moolenaar assert_equal(1, v1) 335f93bbd02SBram Moolenaar assert_equal(2, v2) 336f93bbd02SBram Moolenaar 337f93bbd02SBram Moolenaar [v1, v2; _] = [1, 2, 3, 4, 5] 338f93bbd02SBram Moolenaar assert_equal(1, v1) 339f93bbd02SBram Moolenaar assert_equal(2, v2) 340035bd1c9SBram Moolenaar 3414d5dfe20SBram Moolenaar var reslist = [] 3424d5dfe20SBram Moolenaar for text in ['aaa {bbb} ccc', 'ddd {eee} fff'] 3434d5dfe20SBram Moolenaar var before: string 3444d5dfe20SBram Moolenaar var middle: string 3454d5dfe20SBram Moolenaar var after: string 3464d5dfe20SBram Moolenaar [_, before, middle, after; _] = text->matchlist('\(.\{-\}\){\(.\{-\}\)}\(.*\)') 3474d5dfe20SBram Moolenaar reslist->add(before)->add(middle)->add(after) 3484d5dfe20SBram Moolenaar endfor 3494d5dfe20SBram Moolenaar assert_equal(['aaa ', 'bbb', ' ccc', 'ddd ', 'eee', ' fff'], reslist) 3504d5dfe20SBram Moolenaar 351035bd1c9SBram Moolenaar var a = 1 352035bd1c9SBram Moolenaar var b = 3 353035bd1c9SBram Moolenaar [a, b] += [2, 4] 354035bd1c9SBram Moolenaar assert_equal(3, a) 355035bd1c9SBram Moolenaar assert_equal(7, b) 356035bd1c9SBram Moolenaar 357035bd1c9SBram Moolenaar [a, b] -= [1, 2] 358035bd1c9SBram Moolenaar assert_equal(2, a) 359035bd1c9SBram Moolenaar assert_equal(5, b) 360035bd1c9SBram Moolenaar 361035bd1c9SBram Moolenaar [a, b] *= [3, 2] 362035bd1c9SBram Moolenaar assert_equal(6, a) 363035bd1c9SBram Moolenaar assert_equal(10, b) 364035bd1c9SBram Moolenaar 365035bd1c9SBram Moolenaar [a, b] /= [2, 4] 366035bd1c9SBram Moolenaar assert_equal(3, a) 367035bd1c9SBram Moolenaar assert_equal(2, b) 368035bd1c9SBram Moolenaar 369035bd1c9SBram Moolenaar [a, b] = [17, 15] 370035bd1c9SBram Moolenaar [a, b] %= [5, 3] 371035bd1c9SBram Moolenaar assert_equal(2, a) 372035bd1c9SBram Moolenaar assert_equal(0, b) 3738ff16e01SBram Moolenaar END 3748ff16e01SBram Moolenaar CheckDefAndScriptSuccess(lines) 3758ff16e01SBram Moolenaar 3768ff16e01SBram Moolenaar lines =<< trim END 3778ff16e01SBram Moolenaar var v1: number 3788ff16e01SBram Moolenaar var v2: number 3798ff16e01SBram Moolenaar [v1, v2] = 3808ff16e01SBram Moolenaar END 3818ff16e01SBram Moolenaar CheckDefFailure(lines, 'E1097:', 5) 3828ff16e01SBram Moolenaar 3838ff16e01SBram Moolenaar lines =<< trim END 3848ff16e01SBram Moolenaar var v1: number 3858ff16e01SBram Moolenaar var v2: number 3868ff16e01SBram Moolenaar [v1, v2] = xxx 3878ff16e01SBram Moolenaar END 3888ff16e01SBram Moolenaar CheckDefFailure(lines, 'E1001:', 3) 3898ff16e01SBram Moolenaar 3908ff16e01SBram Moolenaar lines =<< trim END 3918ff16e01SBram Moolenaar var v1: number 3928ff16e01SBram Moolenaar var v2: number 3938ff16e01SBram Moolenaar [v1, v2] = popup_clear() 3948ff16e01SBram Moolenaar END 3958ff16e01SBram Moolenaar CheckDefFailure(lines, 'E1031:', 3) 3968ff16e01SBram Moolenaar 3978ff16e01SBram Moolenaar lines =<< trim END 3983862ea3fSBram Moolenaar [v1, v2] = [1, 2] 3993862ea3fSBram Moolenaar END 4003862ea3fSBram Moolenaar CheckDefFailure(lines, 'E1089', 1) 4013862ea3fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1089', 2) 4023862ea3fSBram Moolenaar 4033862ea3fSBram Moolenaar lines =<< trim END 4048ff16e01SBram Moolenaar var v1: number 4058ff16e01SBram Moolenaar var v2: number 4068ff16e01SBram Moolenaar [v1, v2] = '' 4078ff16e01SBram Moolenaar END 4088ff16e01SBram Moolenaar CheckDefFailure(lines, 'E1012: Type mismatch; expected list<any> but got string', 3) 409f785aa13SBram Moolenaar 410f785aa13SBram Moolenaar lines =<< trim END 411f785aa13SBram Moolenaar g:values = [false, 0] 412f785aa13SBram Moolenaar var x: bool 413f785aa13SBram Moolenaar var y: string 414f785aa13SBram Moolenaar [x, y] = g:values 415f785aa13SBram Moolenaar END 416f785aa13SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1163: Variable 2: type mismatch, expected string but got number') 4174270d8b7SBram Moolenaar 4184270d8b7SBram Moolenaar lines =<< trim END 4194270d8b7SBram Moolenaar var x: number 4204270d8b7SBram Moolenaar var y: number 4214270d8b7SBram Moolenaar var z: string 4224270d8b7SBram Moolenaar [x, y, z] = [1, 2, 3] 4234270d8b7SBram Moolenaar END 4244270d8b7SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number') 4254270d8b7SBram Moolenaar 4264270d8b7SBram Moolenaar lines =<< trim END 4274270d8b7SBram Moolenaar var x: number 4284270d8b7SBram Moolenaar var y: string 4294270d8b7SBram Moolenaar var z: string 4304270d8b7SBram Moolenaar [x, y, z] = [1, '2', 3] 4314270d8b7SBram Moolenaar END 4324270d8b7SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number') 4338ff16e01SBram Moolenaarenddef 4348ff16e01SBram Moolenaar 4357f76494aSBram Moolenaardef Test_assign_linebreak() 4367f76494aSBram Moolenaar var nr: number 4377f76494aSBram Moolenaar nr = 4387f76494aSBram Moolenaar 123 4397f76494aSBram Moolenaar assert_equal(123, nr) 4407f76494aSBram Moolenaar 4417f76494aSBram Moolenaar var n2: number 4427f76494aSBram Moolenaar [nr, n2] = 4437f76494aSBram Moolenaar [12, 34] 4447f76494aSBram Moolenaar assert_equal(12, nr) 4457f76494aSBram Moolenaar assert_equal(34, n2) 4467f76494aSBram Moolenaar 4478ff16e01SBram Moolenaar CheckDefFailure(["var x = #"], 'E1097:', 3) 44877709b19SBram Moolenaar 44977709b19SBram Moolenaar var lines =<< trim END 45077709b19SBram Moolenaar var x: list<string> = ['a'] 45177709b19SBram Moolenaar var y: list<number> = x 45277709b19SBram Moolenaar ->copy() 45377709b19SBram Moolenaar ->copy() 45477709b19SBram Moolenaar END 45577709b19SBram Moolenaar CheckDefFailure(lines, 'E1012:', 2) 4566977dba0SBram Moolenaar 4576977dba0SBram Moolenaar lines =<< trim END 4586977dba0SBram Moolenaar var x: any 4596977dba0SBram Moolenaar x.key = 1 4606977dba0SBram Moolenaar + 2 4616977dba0SBram Moolenaar + 3 4626977dba0SBram Moolenaar + 4 4636977dba0SBram Moolenaar + 5 4646977dba0SBram Moolenaar END 4656977dba0SBram Moolenaar CheckDefExecAndScriptFailure2(lines, 'E1148:', 'E1203:', 2) 4667f76494aSBram Moolenaarenddef 4677f76494aSBram Moolenaar 468dc234cafSBram Moolenaardef Test_assign_index() 469dc234cafSBram Moolenaar # list of list 470dc234cafSBram Moolenaar var l1: list<number> 471dc234cafSBram Moolenaar l1[0] = 123 472dc234cafSBram Moolenaar assert_equal([123], l1) 473dc234cafSBram Moolenaar 474dc234cafSBram Moolenaar var l2: list<list<number>> 475dc234cafSBram Moolenaar l2[0] = [] 476dc234cafSBram Moolenaar l2[0][0] = 123 477dc234cafSBram Moolenaar assert_equal([[123]], l2) 478dc234cafSBram Moolenaar 479dc234cafSBram Moolenaar var l3: list<list<list<number>>> 480dc234cafSBram Moolenaar l3[0] = [] 481dc234cafSBram Moolenaar l3[0][0] = [] 482dc234cafSBram Moolenaar l3[0][0][0] = 123 483dc234cafSBram Moolenaar assert_equal([[[123]]], l3) 484dc234cafSBram Moolenaar 485dc234cafSBram Moolenaar var lines =<< trim END 486dc234cafSBram Moolenaar var l3: list<list<number>> 487dc234cafSBram Moolenaar l3[0] = [] 488dc234cafSBram Moolenaar l3[0][0] = [] 489dc234cafSBram Moolenaar END 490dc234cafSBram Moolenaar CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 3) 491dc234cafSBram Moolenaar 492dc234cafSBram Moolenaar # dict of dict 493dc234cafSBram Moolenaar var d1: dict<number> 494dc234cafSBram Moolenaar d1.one = 1 495dc234cafSBram Moolenaar assert_equal({one: 1}, d1) 496dc234cafSBram Moolenaar 497dc234cafSBram Moolenaar var d2: dict<dict<number>> 498dc234cafSBram Moolenaar d2.one = {} 499dc234cafSBram Moolenaar d2.one.two = 123 500dc234cafSBram Moolenaar assert_equal({one: {two: 123}}, d2) 501dc234cafSBram Moolenaar 502dc234cafSBram Moolenaar var d3: dict<dict<dict<number>>> 503dc234cafSBram Moolenaar d3.one = {} 504dc234cafSBram Moolenaar d3.one.two = {} 505dc234cafSBram Moolenaar d3.one.two.three = 123 506dc234cafSBram Moolenaar assert_equal({one: {two: {three: 123}}}, d3) 507dc234cafSBram Moolenaar 508e97976baSBram Moolenaar # should not read the next line when generating "a.b" 509e97976baSBram Moolenaar var a = {} 510e97976baSBram Moolenaar a.b = {} 511e97976baSBram Moolenaar a.b.c = {} 512e97976baSBram Moolenaar ->copy() 513e97976baSBram Moolenaar 514dc234cafSBram Moolenaar lines =<< trim END 515dc234cafSBram Moolenaar var d3: dict<dict<number>> 516dc234cafSBram Moolenaar d3.one = {} 517dc234cafSBram Moolenaar d3.one.two = {} 518dc234cafSBram Moolenaar END 519dc234cafSBram Moolenaar CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got dict<unknown>', 3) 520dc234cafSBram Moolenaar 521acbae18dSBram Moolenaar lines =<< trim END 522acbae18dSBram Moolenaar var lines: list<string> 523acbae18dSBram Moolenaar lines['a'] = 'asdf' 524acbae18dSBram Moolenaar END 525f30a14dbSBram Moolenaar CheckDefFailure(lines, 'E1012:', 2) 526acbae18dSBram Moolenaar 527acbae18dSBram Moolenaar lines =<< trim END 528acbae18dSBram Moolenaar var lines: string 529acbae18dSBram Moolenaar lines[9] = 'asdf' 530acbae18dSBram Moolenaar END 531acbae18dSBram Moolenaar CheckDefFailure(lines, 'E1141:', 2) 532acbae18dSBram Moolenaar 533dc234cafSBram Moolenaar # list of dict 534dc234cafSBram Moolenaar var ld: list<dict<number>> 535dc234cafSBram Moolenaar ld[0] = {} 536dc234cafSBram Moolenaar ld[0].one = 123 537dc234cafSBram Moolenaar assert_equal([{one: 123}], ld) 538dc234cafSBram Moolenaar 539dc234cafSBram Moolenaar lines =<< trim END 540dc234cafSBram Moolenaar var ld: list<dict<number>> 541dc234cafSBram Moolenaar ld[0] = [] 542dc234cafSBram Moolenaar END 543dc234cafSBram Moolenaar CheckDefFailure(lines, 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2) 544dc234cafSBram Moolenaar 545dc234cafSBram Moolenaar # dict of list 546dc234cafSBram Moolenaar var dl: dict<list<number>> 547dc234cafSBram Moolenaar dl.one = [] 548dc234cafSBram Moolenaar dl.one[0] = 123 549dc234cafSBram Moolenaar assert_equal({one: [123]}, dl) 550dc234cafSBram Moolenaar 551dc234cafSBram Moolenaar lines =<< trim END 552dc234cafSBram Moolenaar var dl: dict<list<number>> 553dc234cafSBram Moolenaar dl.one = {} 554dc234cafSBram Moolenaar END 555dc234cafSBram Moolenaar CheckDefFailure(lines, 'E1012: Type mismatch; expected list<number> but got dict<unknown>', 2) 556dc234cafSBram Moolenaarenddef 557dc234cafSBram Moolenaar 55881ed4960SBram Moolenaardef Test_extend_list() 55930fd8204SBram Moolenaar var lines =<< trim END 560*07802044SBram Moolenaar var l1: list<number> 561*07802044SBram Moolenaar var l2 = l1 562*07802044SBram Moolenaar assert_true(l1 is l2) 563*07802044SBram Moolenaar l1 += [123] 564*07802044SBram Moolenaar assert_equal([123], l1) 565*07802044SBram Moolenaar assert_true(l1 is l2) 566348be7edSBram Moolenaar END 567*07802044SBram Moolenaar CheckDefAndScriptSuccess(lines) 56881ed4960SBram Moolenaar 569348be7edSBram Moolenaar lines =<< trim END 570348be7edSBram Moolenaar var list: list<string> 571348be7edSBram Moolenaar extend(list, ['x']) 572348be7edSBram Moolenaar assert_equal(['x'], list) 57381ed4960SBram Moolenaar END 574*07802044SBram Moolenaar CheckDefAndScriptSuccess(lines) 5751a739237SBram Moolenaar 5761a739237SBram Moolenaar # appending to NULL list from a function 5771a739237SBram Moolenaar lines =<< trim END 5781a739237SBram Moolenaar vim9script 5791a739237SBram Moolenaar var list: list<string> 5801a739237SBram Moolenaar def Func() 5811a739237SBram Moolenaar list += ['a', 'b'] 5821a739237SBram Moolenaar enddef 5831a739237SBram Moolenaar Func() 5841a739237SBram Moolenaar assert_equal(['a', 'b'], list) 5851a739237SBram Moolenaar END 5861a739237SBram Moolenaar CheckScriptSuccess(lines) 5873beaf9cdSBram Moolenaar lines =<< trim END 5883beaf9cdSBram Moolenaar vim9script 5893beaf9cdSBram Moolenaar var list: list<string> 5903beaf9cdSBram Moolenaar def Func() 5913beaf9cdSBram Moolenaar extend(list, ['x', 'b']) 5923beaf9cdSBram Moolenaar enddef 5933beaf9cdSBram Moolenaar Func() 5943beaf9cdSBram Moolenaar assert_equal(['x', 'b'], list) 5953beaf9cdSBram Moolenaar END 5963beaf9cdSBram Moolenaar CheckScriptSuccess(lines) 597348be7edSBram Moolenaar 598348be7edSBram Moolenaar lines =<< trim END 599348be7edSBram Moolenaar vim9script 600348be7edSBram Moolenaar var l: list<string> = test_null_list() 601348be7edSBram Moolenaar extend(l, ['x']) 602348be7edSBram Moolenaar assert_equal(['x'], l) 603348be7edSBram Moolenaar END 604348be7edSBram Moolenaar CheckScriptSuccess(lines) 605348be7edSBram Moolenaar 606348be7edSBram Moolenaar lines =<< trim END 607348be7edSBram Moolenaar vim9script 608348be7edSBram Moolenaar extend(test_null_list(), ['x']) 609348be7edSBram Moolenaar END 610348be7edSBram Moolenaar CheckScriptFailure(lines, 'E1134:', 2) 611348be7edSBram Moolenaarenddef 612348be7edSBram Moolenaar 613348be7edSBram Moolenaardef Test_extend_dict() 614348be7edSBram Moolenaar var lines =<< trim END 615348be7edSBram Moolenaar vim9script 616348be7edSBram Moolenaar var d: dict<number> 617e0de171eSBram Moolenaar extend(d, {a: 1}) 618e0de171eSBram Moolenaar assert_equal({a: 1}, d) 619348be7edSBram Moolenaar 620348be7edSBram Moolenaar var d2: dict<number> 621348be7edSBram Moolenaar d2['one'] = 1 622e0de171eSBram Moolenaar assert_equal({one: 1}, d2) 623348be7edSBram Moolenaar END 624348be7edSBram Moolenaar CheckScriptSuccess(lines) 625348be7edSBram Moolenaar 626348be7edSBram Moolenaar lines =<< trim END 627348be7edSBram Moolenaar vim9script 628348be7edSBram Moolenaar var d: dict<string> = test_null_dict() 629e0de171eSBram Moolenaar extend(d, {a: 'x'}) 630e0de171eSBram Moolenaar assert_equal({a: 'x'}, d) 631348be7edSBram Moolenaar END 632348be7edSBram Moolenaar CheckScriptSuccess(lines) 633348be7edSBram Moolenaar 634348be7edSBram Moolenaar lines =<< trim END 635348be7edSBram Moolenaar vim9script 636e0de171eSBram Moolenaar extend(test_null_dict(), {a: 'x'}) 637348be7edSBram Moolenaar END 638348be7edSBram Moolenaar CheckScriptFailure(lines, 'E1133:', 2) 63981ed4960SBram Moolenaarenddef 64081ed4960SBram Moolenaar 641971caf53SBram Moolenaardef Test_single_letter_vars() 642971caf53SBram Moolenaar # single letter variables 64330fd8204SBram Moolenaar var a: number = 123 644971caf53SBram Moolenaar a = 123 645971caf53SBram Moolenaar assert_equal(123, a) 64630fd8204SBram Moolenaar var b: number 647971caf53SBram Moolenaar b = 123 648971caf53SBram Moolenaar assert_equal(123, b) 64930fd8204SBram Moolenaar var g: number 650971caf53SBram Moolenaar g = 123 651971caf53SBram Moolenaar assert_equal(123, g) 65230fd8204SBram Moolenaar var s: number 653971caf53SBram Moolenaar s = 123 654971caf53SBram Moolenaar assert_equal(123, s) 65530fd8204SBram Moolenaar var t: number 656971caf53SBram Moolenaar t = 123 657971caf53SBram Moolenaar assert_equal(123, t) 65830fd8204SBram Moolenaar var v: number 659971caf53SBram Moolenaar v = 123 660971caf53SBram Moolenaar assert_equal(123, v) 66130fd8204SBram Moolenaar var w: number 662971caf53SBram Moolenaar w = 123 663971caf53SBram Moolenaar assert_equal(123, w) 664971caf53SBram Moolenaarenddef 665971caf53SBram Moolenaar 666971caf53SBram Moolenaardef Test_vim9_single_char_vars() 66730fd8204SBram Moolenaar var lines =<< trim END 668971caf53SBram Moolenaar vim9script 669971caf53SBram Moolenaar 670971caf53SBram Moolenaar # single character variable declarations work 67130fd8204SBram Moolenaar var a: string 67230fd8204SBram Moolenaar var b: number 67330fd8204SBram Moolenaar var l: list<any> 67430fd8204SBram Moolenaar var s: string 67530fd8204SBram Moolenaar var t: number 67630fd8204SBram Moolenaar var v: number 67730fd8204SBram Moolenaar var w: number 678971caf53SBram Moolenaar 679971caf53SBram Moolenaar # script-local variables can be used without s: prefix 680971caf53SBram Moolenaar a = 'script-a' 681971caf53SBram Moolenaar b = 111 682971caf53SBram Moolenaar l = [1, 2, 3] 683971caf53SBram Moolenaar s = 'script-s' 684971caf53SBram Moolenaar t = 222 685971caf53SBram Moolenaar v = 333 686971caf53SBram Moolenaar w = 444 687971caf53SBram Moolenaar 688971caf53SBram Moolenaar assert_equal('script-a', a) 689971caf53SBram Moolenaar assert_equal(111, b) 690971caf53SBram Moolenaar assert_equal([1, 2, 3], l) 691971caf53SBram Moolenaar assert_equal('script-s', s) 692971caf53SBram Moolenaar assert_equal(222, t) 693971caf53SBram Moolenaar assert_equal(333, v) 694971caf53SBram Moolenaar assert_equal(444, w) 695971caf53SBram Moolenaar END 696971caf53SBram Moolenaar writefile(lines, 'Xsinglechar') 697971caf53SBram Moolenaar source Xsinglechar 698971caf53SBram Moolenaar delete('Xsinglechar') 699971caf53SBram Moolenaarenddef 700971caf53SBram Moolenaar 701971caf53SBram Moolenaardef Test_assignment_list() 70230fd8204SBram Moolenaar var list1: list<bool> = [false, true, false] 70330fd8204SBram Moolenaar var list2: list<number> = [1, 2, 3] 70430fd8204SBram Moolenaar var list3: list<string> = ['sdf', 'asdf'] 70530fd8204SBram Moolenaar var list4: list<any> = ['yes', true, 1234] 70630fd8204SBram Moolenaar var list5: list<blob> = [0z01, 0z02] 707971caf53SBram Moolenaar 70830fd8204SBram Moolenaar var listS: list<string> = [] 70930fd8204SBram Moolenaar var listN: list<number> = [] 710971caf53SBram Moolenaar 711971caf53SBram Moolenaar assert_equal([1, 2, 3], list2) 712971caf53SBram Moolenaar list2[-1] = 99 713971caf53SBram Moolenaar assert_equal([1, 2, 99], list2) 714971caf53SBram Moolenaar list2[-2] = 88 715971caf53SBram Moolenaar assert_equal([1, 88, 99], list2) 716971caf53SBram Moolenaar list2[-3] = 77 717971caf53SBram Moolenaar assert_equal([77, 88, 99], list2) 718971caf53SBram Moolenaar list2 += [100] 719971caf53SBram Moolenaar assert_equal([77, 88, 99, 100], list2) 720971caf53SBram Moolenaar 721971caf53SBram Moolenaar list3 += ['end'] 722971caf53SBram Moolenaar assert_equal(['sdf', 'asdf', 'end'], list3) 723971caf53SBram Moolenaar 72430fd8204SBram Moolenaar CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 72530fd8204SBram Moolenaar CheckDefExecFailure(['var [v1, v2] = [1, 2]'], 'E1092:') 726971caf53SBram Moolenaar 727971caf53SBram Moolenaar # type becomes list<any> 72830fd8204SBram Moolenaar var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 7294f5e3977SBram Moolenaar 7304f5e3977SBram Moolenaar var lines =<< trim END 7314f5e3977SBram Moolenaar var d = {dd: test_null_list()} 7324f5e3977SBram Moolenaar d.dd[0] = 0 7334f5e3977SBram Moolenaar END 7344f5e3977SBram Moolenaar CheckDefExecFailure(lines, 'E1147:', 2) 7357a40ff00SBram Moolenaar 7367a40ff00SBram Moolenaar lines =<< trim END 7377a40ff00SBram Moolenaar def OneArg(x: bool) 7387a40ff00SBram Moolenaar enddef 7397a40ff00SBram Moolenaar def TwoArgs(x: bool, y: bool) 7407a40ff00SBram Moolenaar enddef 7417a40ff00SBram Moolenaar var fl: list<func(bool, bool, bool)> = [OneArg, TwoArgs] 7427a40ff00SBram Moolenaar END 7437a40ff00SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012:', 5) 744971caf53SBram Moolenaarenddef 745971caf53SBram Moolenaar 74697f227d9SBram Moolenaardef PartFuncBool(b: bool): string 747b7480cd8SBram Moolenaar return 'done' 748b7480cd8SBram Moolenaarenddef 749b7480cd8SBram Moolenaar 750b7480cd8SBram Moolenaardef Test_assignment_partial() 75197f227d9SBram Moolenaar var lines =<< trim END 75297f227d9SBram Moolenaar var Partial: func(): string = function(PartFuncBool, [true]) 753b7480cd8SBram Moolenaar assert_equal('done', Partial()) 75497f227d9SBram Moolenaar END 75597f227d9SBram Moolenaar CheckDefAndScriptSuccess(lines) 75622f85d04SBram Moolenaar 75722f85d04SBram Moolenaar lines =<< trim END 75822f85d04SBram Moolenaar vim9script 75922f85d04SBram Moolenaar def Func(b: bool) 76022f85d04SBram Moolenaar enddef 76122f85d04SBram Moolenaar var Ref: func = function(Func, [true]) 76222f85d04SBram Moolenaar assert_equal('func()', typename(Ref)) 76322f85d04SBram Moolenaar Ref() 76422f85d04SBram Moolenaar END 76522f85d04SBram Moolenaar CheckScriptSuccess(lines) 766b7480cd8SBram Moolenaarenddef 767b7480cd8SBram Moolenaar 768f30a14dbSBram Moolenaardef Test_assignment_list_any_index() 769f30a14dbSBram Moolenaar var l: list<number> = [1, 2] 770f30a14dbSBram Moolenaar for [x, y, _] 771f30a14dbSBram Moolenaar in [[0, 1, ''], [1, 3, '']] 772f30a14dbSBram Moolenaar l[x] = l[x] + y 773f30a14dbSBram Moolenaar endfor 774f30a14dbSBram Moolenaar assert_equal([2, 5], l) 775f30a14dbSBram Moolenaarenddef 776f30a14dbSBram Moolenaar 777971caf53SBram Moolenaardef Test_assignment_list_vim9script() 77830fd8204SBram Moolenaar var lines =<< trim END 779971caf53SBram Moolenaar vim9script 78030fd8204SBram Moolenaar var v1: number 78130fd8204SBram Moolenaar var v2: number 78230fd8204SBram Moolenaar var v3: number 783971caf53SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 784971caf53SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 785971caf53SBram Moolenaar END 786971caf53SBram Moolenaar CheckScriptSuccess(lines) 787971caf53SBram Moolenaarenddef 788971caf53SBram Moolenaar 789971caf53SBram Moolenaardef Test_assignment_dict() 790e0de171eSBram Moolenaar var dict1: dict<bool> = {one: false, two: true} 791e0de171eSBram Moolenaar var dict2: dict<number> = {one: 1, two: 2} 792e0de171eSBram Moolenaar var dict3: dict<string> = {key: 'value'} 793e0de171eSBram Moolenaar var dict4: dict<any> = {one: 1, two: '2'} 794e0de171eSBram Moolenaar var dict5: dict<blob> = {one: 0z01, two: 0z02} 795971caf53SBram Moolenaar 796971caf53SBram Moolenaar # overwrite 797971caf53SBram Moolenaar dict3['key'] = 'another' 798e0de171eSBram Moolenaar assert_equal(dict3, {key: 'another'}) 799fc74d03eSBram Moolenaar dict3.key = 'yet another' 800e0de171eSBram Moolenaar assert_equal(dict3, {key: 'yet another'}) 801fc74d03eSBram Moolenaar 802d24602f4SBram Moolenaar # member "any" can also be a dict and assigned to 803d24602f4SBram Moolenaar var anydict: dict<any> = {nest: {}, nr: 0} 804d24602f4SBram Moolenaar anydict.nest['this'] = 123 805d24602f4SBram Moolenaar anydict.nest.that = 456 806d24602f4SBram Moolenaar assert_equal({nest: {this: 123, that: 456}, nr: 0}, anydict) 807d24602f4SBram Moolenaar 808fc74d03eSBram Moolenaar var lines =<< trim END 809d88dc4d4SBram Moolenaar var dd = {} 810d88dc4d4SBram Moolenaar dd.two = 2 811d88dc4d4SBram Moolenaar assert_equal({two: 2}, dd) 812d88dc4d4SBram Moolenaar END 8134f5e3977SBram Moolenaar CheckDefAndScriptSuccess(lines) 8144f5e3977SBram Moolenaar 8154f5e3977SBram Moolenaar lines =<< trim END 8164f5e3977SBram Moolenaar var d = {dd: {}} 8174f5e3977SBram Moolenaar d.dd[0] = 2 8184f5e3977SBram Moolenaar d.dd['x'] = 3 8194f5e3977SBram Moolenaar d.dd.y = 4 8204f5e3977SBram Moolenaar assert_equal({dd: {0: 2, x: 3, y: 4}}, d) 8214f5e3977SBram Moolenaar END 8224f5e3977SBram Moolenaar CheckDefAndScriptSuccess(lines) 823d88dc4d4SBram Moolenaar 824d88dc4d4SBram Moolenaar lines =<< trim END 825e0de171eSBram Moolenaar var dd = {one: 1} 826fc74d03eSBram Moolenaar dd.one) = 2 827fc74d03eSBram Moolenaar END 828d88dc4d4SBram Moolenaar CheckDefFailure(lines, 'E488:', 2) 829d88dc4d4SBram Moolenaar 830d88dc4d4SBram Moolenaar lines =<< trim END 831d88dc4d4SBram Moolenaar var dd = {one: 1} 832d88dc4d4SBram Moolenaar var dd.one = 2 833d88dc4d4SBram Moolenaar END 834d88dc4d4SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1017:', 2) 835971caf53SBram Moolenaar 836971caf53SBram Moolenaar # empty key can be used 83730fd8204SBram Moolenaar var dd = {} 838971caf53SBram Moolenaar dd[""] = 6 839e0de171eSBram Moolenaar assert_equal({['']: 6}, dd) 840971caf53SBram Moolenaar 841971caf53SBram Moolenaar # type becomes dict<any> 842e0de171eSBram Moolenaar var somedict = rand() > 0 ? {a: 1, b: 2} : {a: 'a', b: 'b'} 843971caf53SBram Moolenaar 844971caf53SBram Moolenaar # assignment to script-local dict 845fc74d03eSBram Moolenaar lines =<< trim END 846971caf53SBram Moolenaar vim9script 84730fd8204SBram Moolenaar var test: dict<any> = {} 848971caf53SBram Moolenaar def FillDict(): dict<any> 849971caf53SBram Moolenaar test['a'] = 43 850971caf53SBram Moolenaar return test 851971caf53SBram Moolenaar enddef 852e0de171eSBram Moolenaar assert_equal({a: 43}, FillDict()) 853971caf53SBram Moolenaar END 854971caf53SBram Moolenaar CheckScriptSuccess(lines) 855971caf53SBram Moolenaar 856971caf53SBram Moolenaar lines =<< trim END 857971caf53SBram Moolenaar vim9script 85830fd8204SBram Moolenaar var test: dict<any> 859971caf53SBram Moolenaar def FillDict(): dict<any> 860971caf53SBram Moolenaar test['a'] = 43 861971caf53SBram Moolenaar return test 862971caf53SBram Moolenaar enddef 863971caf53SBram Moolenaar FillDict() 8643beaf9cdSBram Moolenaar assert_equal({a: 43}, test) 865971caf53SBram Moolenaar END 8663beaf9cdSBram Moolenaar CheckScriptSuccess(lines) 867971caf53SBram Moolenaar 868971caf53SBram Moolenaar # assignment to global dict 869971caf53SBram Moolenaar lines =<< trim END 870971caf53SBram Moolenaar vim9script 871971caf53SBram Moolenaar g:test = {} 872971caf53SBram Moolenaar def FillDict(): dict<any> 873971caf53SBram Moolenaar g:test['a'] = 43 874971caf53SBram Moolenaar return g:test 875971caf53SBram Moolenaar enddef 876e0de171eSBram Moolenaar assert_equal({a: 43}, FillDict()) 877971caf53SBram Moolenaar END 878971caf53SBram Moolenaar CheckScriptSuccess(lines) 879971caf53SBram Moolenaar 880971caf53SBram Moolenaar # assignment to buffer dict 881971caf53SBram Moolenaar lines =<< trim END 882971caf53SBram Moolenaar vim9script 883971caf53SBram Moolenaar b:test = {} 884971caf53SBram Moolenaar def FillDict(): dict<any> 885971caf53SBram Moolenaar b:test['a'] = 43 886971caf53SBram Moolenaar return b:test 887971caf53SBram Moolenaar enddef 888e0de171eSBram Moolenaar assert_equal({a: 43}, FillDict()) 889971caf53SBram Moolenaar END 890971caf53SBram Moolenaar CheckScriptSuccess(lines) 8914f5e3977SBram Moolenaar 8924f5e3977SBram Moolenaar lines =<< trim END 8934f5e3977SBram Moolenaar var d = {dd: test_null_dict()} 8944f5e3977SBram Moolenaar d.dd[0] = 0 8954f5e3977SBram Moolenaar END 8964f5e3977SBram Moolenaar CheckDefExecFailure(lines, 'E1103:', 2) 8974f5e3977SBram Moolenaar 8984f5e3977SBram Moolenaar lines =<< trim END 8994f5e3977SBram Moolenaar var d = {dd: 'string'} 9004f5e3977SBram Moolenaar d.dd[0] = 0 9014f5e3977SBram Moolenaar END 9024f5e3977SBram Moolenaar CheckDefExecFailure(lines, 'E1148:', 2) 9033a3b10e8SBram Moolenaar 9043a3b10e8SBram Moolenaar lines =<< trim END 9053a3b10e8SBram Moolenaar var n: any 9063a3b10e8SBram Moolenaar n.key = 5 9073a3b10e8SBram Moolenaar END 9083a3b10e8SBram Moolenaar CheckDefExecAndScriptFailure2(lines, 'E1148:', 'E1203: Dot can only be used on a dictionary: n.key = 5', 2) 909971caf53SBram Moolenaarenddef 910971caf53SBram Moolenaar 911971caf53SBram Moolenaardef Test_assignment_local() 912971caf53SBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 913971caf53SBram Moolenaar # changed. 91430fd8204SBram Moolenaar var script_lines: list<string> =<< trim END 915971caf53SBram Moolenaar let b:existing = 'yes' 916971caf53SBram Moolenaar let w:existing = 'yes' 917971caf53SBram Moolenaar let t:existing = 'yes' 918971caf53SBram Moolenaar 919971caf53SBram Moolenaar def Test_assignment_local_internal() 920971caf53SBram Moolenaar b:newvar = 'new' 921971caf53SBram Moolenaar assert_equal('new', b:newvar) 922971caf53SBram Moolenaar assert_equal('yes', b:existing) 923971caf53SBram Moolenaar b:existing = 'no' 924971caf53SBram Moolenaar assert_equal('no', b:existing) 925971caf53SBram Moolenaar b:existing ..= 'NO' 926971caf53SBram Moolenaar assert_equal('noNO', b:existing) 927971caf53SBram Moolenaar 928971caf53SBram Moolenaar w:newvar = 'new' 929971caf53SBram Moolenaar assert_equal('new', w:newvar) 930971caf53SBram Moolenaar assert_equal('yes', w:existing) 931971caf53SBram Moolenaar w:existing = 'no' 932971caf53SBram Moolenaar assert_equal('no', w:existing) 933971caf53SBram Moolenaar w:existing ..= 'NO' 934971caf53SBram Moolenaar assert_equal('noNO', w:existing) 935971caf53SBram Moolenaar 936971caf53SBram Moolenaar t:newvar = 'new' 937971caf53SBram Moolenaar assert_equal('new', t:newvar) 938971caf53SBram Moolenaar assert_equal('yes', t:existing) 939971caf53SBram Moolenaar t:existing = 'no' 940971caf53SBram Moolenaar assert_equal('no', t:existing) 941971caf53SBram Moolenaar t:existing ..= 'NO' 942971caf53SBram Moolenaar assert_equal('noNO', t:existing) 943971caf53SBram Moolenaar enddef 944971caf53SBram Moolenaar call Test_assignment_local_internal() 945971caf53SBram Moolenaar END 946971caf53SBram Moolenaar CheckScriptSuccess(script_lines) 947971caf53SBram Moolenaarenddef 948971caf53SBram Moolenaar 949971caf53SBram Moolenaardef Test_assignment_default() 950971caf53SBram Moolenaar # Test default values. 95130fd8204SBram Moolenaar var thebool: bool 952971caf53SBram Moolenaar assert_equal(v:false, thebool) 953971caf53SBram Moolenaar 95430fd8204SBram Moolenaar var thenumber: number 955971caf53SBram Moolenaar assert_equal(0, thenumber) 956971caf53SBram Moolenaar 957971caf53SBram Moolenaar if has('float') 95830fd8204SBram Moolenaar var thefloat: float 959971caf53SBram Moolenaar assert_equal(0.0, thefloat) 960971caf53SBram Moolenaar endif 961971caf53SBram Moolenaar 96230fd8204SBram Moolenaar var thestring: string 963971caf53SBram Moolenaar assert_equal('', thestring) 964971caf53SBram Moolenaar 96530fd8204SBram Moolenaar var theblob: blob 966971caf53SBram Moolenaar assert_equal(0z, theblob) 967971caf53SBram Moolenaar 96830fd8204SBram Moolenaar var Thefunc: func 969971caf53SBram Moolenaar assert_equal(test_null_function(), Thefunc) 970971caf53SBram Moolenaar 97130fd8204SBram Moolenaar var thelist: list<any> 972971caf53SBram Moolenaar assert_equal([], thelist) 973971caf53SBram Moolenaar 97430fd8204SBram Moolenaar var thedict: dict<any> 975971caf53SBram Moolenaar assert_equal({}, thedict) 976971caf53SBram Moolenaar 977971caf53SBram Moolenaar if has('channel') 97830fd8204SBram Moolenaar var thejob: job 979971caf53SBram Moolenaar assert_equal(test_null_job(), thejob) 980971caf53SBram Moolenaar 98130fd8204SBram Moolenaar var thechannel: channel 982971caf53SBram Moolenaar assert_equal(test_null_channel(), thechannel) 983971caf53SBram Moolenaar 984971caf53SBram Moolenaar if has('unix') && executable('cat') 985971caf53SBram Moolenaar # check with non-null job and channel, types must match 986e0de171eSBram Moolenaar thejob = job_start("cat ", {}) 987971caf53SBram Moolenaar thechannel = job_getchannel(thejob) 988971caf53SBram Moolenaar job_stop(thejob, 'kill') 989971caf53SBram Moolenaar endif 990971caf53SBram Moolenaar endif 991971caf53SBram Moolenaar 99230fd8204SBram Moolenaar var nr = 1234 | nr = 5678 993971caf53SBram Moolenaar assert_equal(5678, nr) 994971caf53SBram Moolenaarenddef 995971caf53SBram Moolenaar 9963862ea3fSBram Moolenaarlet scriptvar = 'init' 9973862ea3fSBram Moolenaar 998971caf53SBram Moolenaardef Test_assignment_var_list() 999da7c20c9SBram Moolenaar var lines =<< trim END 100030fd8204SBram Moolenaar var v1: string 100130fd8204SBram Moolenaar var v2: string 100230fd8204SBram Moolenaar var vrem: list<string> 1003971caf53SBram Moolenaar [v1] = ['aaa'] 1004971caf53SBram Moolenaar assert_equal('aaa', v1) 1005971caf53SBram Moolenaar 1006971caf53SBram Moolenaar [v1, v2] = ['one', 'two'] 1007971caf53SBram Moolenaar assert_equal('one', v1) 1008971caf53SBram Moolenaar assert_equal('two', v2) 1009971caf53SBram Moolenaar 1010971caf53SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 1011971caf53SBram Moolenaar assert_equal('one', v1) 1012971caf53SBram Moolenaar assert_equal('two', v2) 1013971caf53SBram Moolenaar assert_equal([], vrem) 1014971caf53SBram Moolenaar 1015971caf53SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 1016971caf53SBram Moolenaar assert_equal('one', v1) 1017971caf53SBram Moolenaar assert_equal('two', v2) 1018971caf53SBram Moolenaar assert_equal(['three'], vrem) 1019971caf53SBram Moolenaar 1020971caf53SBram Moolenaar [&ts, &sw] = [3, 4] 1021971caf53SBram Moolenaar assert_equal(3, &ts) 1022971caf53SBram Moolenaar assert_equal(4, &sw) 1023971caf53SBram Moolenaar set ts=8 sw=4 1024004d9b00SBram Moolenaar 1025004d9b00SBram Moolenaar [@a, @z] = ['aa', 'zz'] 1026004d9b00SBram Moolenaar assert_equal('aa', @a) 1027004d9b00SBram Moolenaar assert_equal('zz', @z) 1028004d9b00SBram Moolenaar 1029004d9b00SBram Moolenaar [$SOME_VAR, $OTHER_VAR] = ['some', 'other'] 1030004d9b00SBram Moolenaar assert_equal('some', $SOME_VAR) 1031004d9b00SBram Moolenaar assert_equal('other', $OTHER_VAR) 1032004d9b00SBram Moolenaar 10333862ea3fSBram Moolenaar [g:globalvar, b:bufvar, w:winvar, t:tabvar, v:errmsg] = 10343862ea3fSBram Moolenaar ['global', 'buf', 'win', 'tab', 'error'] 1035004d9b00SBram Moolenaar assert_equal('global', g:globalvar) 1036004d9b00SBram Moolenaar assert_equal('buf', b:bufvar) 1037004d9b00SBram Moolenaar assert_equal('win', w:winvar) 1038004d9b00SBram Moolenaar assert_equal('tab', t:tabvar) 1039004d9b00SBram Moolenaar assert_equal('error', v:errmsg) 1040004d9b00SBram Moolenaar unlet g:globalvar 1041da7c20c9SBram Moolenaar END 1042da7c20c9SBram Moolenaar CheckDefAndScriptSuccess(lines) 10433862ea3fSBram Moolenaar 10443862ea3fSBram Moolenaar [g:globalvar, s:scriptvar, b:bufvar] = ['global', 'script', 'buf'] 10453862ea3fSBram Moolenaar assert_equal('global', g:globalvar) 10463862ea3fSBram Moolenaar assert_equal('script', s:scriptvar) 10473862ea3fSBram Moolenaar assert_equal('buf', b:bufvar) 10483862ea3fSBram Moolenaar 10493862ea3fSBram Moolenaar lines =<< trim END 10503862ea3fSBram Moolenaar vim9script 10513862ea3fSBram Moolenaar var s:scriptvar = 'init' 10523862ea3fSBram Moolenaar [g:globalvar, s:scriptvar, w:winvar] = ['global', 'script', 'win'] 10533862ea3fSBram Moolenaar assert_equal('global', g:globalvar) 10543862ea3fSBram Moolenaar assert_equal('script', s:scriptvar) 10553862ea3fSBram Moolenaar assert_equal('win', w:winvar) 10563862ea3fSBram Moolenaar END 10573862ea3fSBram Moolenaar CheckScriptSuccess(lines) 1058971caf53SBram Moolenaarenddef 1059971caf53SBram Moolenaar 1060971caf53SBram Moolenaardef Test_assignment_vim9script() 106130fd8204SBram Moolenaar var lines =<< trim END 1062971caf53SBram Moolenaar vim9script 1063971caf53SBram Moolenaar def Func(): list<number> 1064971caf53SBram Moolenaar return [1, 2] 1065971caf53SBram Moolenaar enddef 10669830938eSBram Moolenaar var name1: number 10679830938eSBram Moolenaar var name2: number 10689830938eSBram Moolenaar [name1, name2] = 1069971caf53SBram Moolenaar Func() 10709830938eSBram Moolenaar assert_equal(1, name1) 10719830938eSBram Moolenaar assert_equal(2, name2) 107230fd8204SBram Moolenaar var ll = 1073971caf53SBram Moolenaar Func() 1074971caf53SBram Moolenaar assert_equal([1, 2], ll) 1075971caf53SBram Moolenaar 1076971caf53SBram Moolenaar @/ = 'text' 1077971caf53SBram Moolenaar assert_equal('text', @/) 1078971caf53SBram Moolenaar @0 = 'zero' 1079971caf53SBram Moolenaar assert_equal('zero', @0) 1080971caf53SBram Moolenaar @1 = 'one' 1081971caf53SBram Moolenaar assert_equal('one', @1) 1082971caf53SBram Moolenaar @9 = 'nine' 1083971caf53SBram Moolenaar assert_equal('nine', @9) 1084971caf53SBram Moolenaar @- = 'minus' 1085971caf53SBram Moolenaar assert_equal('minus', @-) 1086971caf53SBram Moolenaar if has('clipboard_working') 1087971caf53SBram Moolenaar @* = 'star' 1088971caf53SBram Moolenaar assert_equal('star', @*) 1089971caf53SBram Moolenaar @+ = 'plus' 1090971caf53SBram Moolenaar assert_equal('plus', @+) 1091971caf53SBram Moolenaar endif 1092971caf53SBram Moolenaar 109330fd8204SBram Moolenaar var a: number = 123 1094971caf53SBram Moolenaar assert_equal(123, a) 109530fd8204SBram Moolenaar var s: string = 'yes' 1096971caf53SBram Moolenaar assert_equal('yes', s) 109730fd8204SBram Moolenaar var b: number = 42 1098971caf53SBram Moolenaar assert_equal(42, b) 109930fd8204SBram Moolenaar var w: number = 43 1100971caf53SBram Moolenaar assert_equal(43, w) 110130fd8204SBram Moolenaar var t: number = 44 1102971caf53SBram Moolenaar assert_equal(44, t) 11037a66a171SBram Moolenaar 11047a66a171SBram Moolenaar var to_var = 0 11057a66a171SBram Moolenaar to_var = 3 11067a66a171SBram Moolenaar assert_equal(3, to_var) 1107971caf53SBram Moolenaar END 1108971caf53SBram Moolenaar CheckScriptSuccess(lines) 110906f9c694SBram Moolenaar 111006f9c694SBram Moolenaar lines =<< trim END 111106f9c694SBram Moolenaar vim9script 111206f9c694SBram Moolenaar var n: number 111306f9c694SBram Moolenaar def Func() 111406f9c694SBram Moolenaar n = 'string' 111506f9c694SBram Moolenaar enddef 111606f9c694SBram Moolenaar defcompile 111706f9c694SBram Moolenaar END 111806f9c694SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got string') 1119971caf53SBram Moolenaarenddef 1120971caf53SBram Moolenaar 1121971caf53SBram Moolenaardef Mess(): string 1122971caf53SBram Moolenaar v:foldstart = 123 1123971caf53SBram Moolenaar return 'xxx' 1124971caf53SBram Moolenaarenddef 1125971caf53SBram Moolenaar 1126971caf53SBram Moolenaardef Test_assignment_failure() 11279830938eSBram Moolenaar CheckDefFailure(['var name=234'], 'E1004:') 11289830938eSBram Moolenaar CheckDefFailure(['var name =234'], 'E1004:') 11299830938eSBram Moolenaar CheckDefFailure(['var name= 234'], 'E1004:') 1130971caf53SBram Moolenaar 11319830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name=234'], 'E1004:') 11329830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name=234'], "before and after '='") 11339830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name =234'], 'E1004:') 11349830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name= 234'], 'E1004:') 11359830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], 'E1004:') 11369830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], "before and after '+='") 11379830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], 'E1004:') 11389830938eSBram Moolenaar CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], "before and after '..='") 1139971caf53SBram Moolenaar 114030fd8204SBram Moolenaar CheckDefFailure(['var true = 1'], 'E1034:') 114130fd8204SBram Moolenaar CheckDefFailure(['var false = 1'], 'E1034:') 114274235771SBram Moolenaar CheckDefFailure(['var null = 1'], 'E1034:') 114374235771SBram Moolenaar CheckDefFailure(['var this = 1'], 'E1034:') 1144971caf53SBram Moolenaar 1145971caf53SBram Moolenaar CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 114630fd8204SBram Moolenaar CheckDefExecFailure(['var a: number', 1147971caf53SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 114830fd8204SBram Moolenaar CheckDefExecFailure(['var a: number', 1149971caf53SBram Moolenaar '[a] = []'], 'E1093:') 115030fd8204SBram Moolenaar CheckDefExecFailure(['var x: number', 115130fd8204SBram Moolenaar 'var y: number', 1152971caf53SBram Moolenaar '[x, y] = [1]'], 'E1093:') 1153352134bbSBram Moolenaar CheckDefExecFailure(['var x: string', 1154352134bbSBram Moolenaar 'var y: string', 1155352134bbSBram Moolenaar '[x, y] = ["x"]'], 'E1093:') 115630fd8204SBram Moolenaar CheckDefExecFailure(['var x: number', 115730fd8204SBram Moolenaar 'var y: number', 115830fd8204SBram Moolenaar 'var z: list<number>', 1159971caf53SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 1160971caf53SBram Moolenaar 116130fd8204SBram Moolenaar CheckDefFailure(['var somevar'], "E1022:") 116230fd8204SBram Moolenaar CheckDefFailure(['var &tabstop = 4'], 'E1052:') 1163971caf53SBram Moolenaar CheckDefFailure(['&g:option = 5'], 'E113:') 116430fd8204SBram Moolenaar CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:') 1165971caf53SBram Moolenaar 116630fd8204SBram Moolenaar CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:') 116730fd8204SBram Moolenaar CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:') 1168971caf53SBram Moolenaar 1169971caf53SBram Moolenaar if has('dnd') 117030fd8204SBram Moolenaar CheckDefFailure(['var @~ = 5'], 'E1066:') 1171971caf53SBram Moolenaar else 117230fd8204SBram Moolenaar CheckDefFailure(['var @~ = 5'], 'E354:') 1173971caf53SBram Moolenaar CheckDefFailure(['@~ = 5'], 'E354:') 1174971caf53SBram Moolenaar endif 117530fd8204SBram Moolenaar CheckDefFailure(['var @a = 5'], 'E1066:') 117630fd8204SBram Moolenaar CheckDefFailure(['var @/ = "x"'], 'E1066:') 117730fd8204SBram Moolenaar CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:') 1178971caf53SBram Moolenaar 117930fd8204SBram Moolenaar CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:') 118030fd8204SBram Moolenaar CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:') 118130fd8204SBram Moolenaar CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:') 118230fd8204SBram Moolenaar CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:') 1183971caf53SBram Moolenaar 118430fd8204SBram Moolenaar CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:') 118530fd8204SBram Moolenaar CheckDefFailure(['var xnr += 4'], 'E1020:', 1) 118630fd8204SBram Moolenaar CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:') 118730fd8204SBram Moolenaar CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1) 118830fd8204SBram Moolenaar CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:') 1189971caf53SBram Moolenaar 119030fd8204SBram Moolenaar CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:') 1191971caf53SBram Moolenaar 11929830938eSBram Moolenaar CheckDefFailure(['var name: list<string> = [123]'], 'expected list<string> but got list<number>') 11939830938eSBram Moolenaar CheckDefFailure(['var name: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 1194971caf53SBram Moolenaar 1195e0de171eSBram Moolenaar CheckDefFailure(['var name: dict<string> = {key: 123}'], 'expected dict<string> but got dict<number>') 1196e0de171eSBram Moolenaar CheckDefFailure(['var name: dict<number> = {key: "xx"}'], 'expected dict<number> but got dict<string>') 1197971caf53SBram Moolenaar 11989830938eSBram Moolenaar CheckDefFailure(['var name = feedkeys("0")'], 'E1031:') 11999830938eSBram Moolenaar CheckDefFailure(['var name: number = feedkeys("0")'], 'expected number but got void') 1200971caf53SBram Moolenaar 12019830938eSBram Moolenaar CheckDefFailure(['var name: dict <number>'], 'E1068:') 12029830938eSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 1203971caf53SBram Moolenaar 1204971caf53SBram Moolenaar assert_fails('s/^/\=Mess()/n', 'E794:') 12059830938eSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 1206971caf53SBram Moolenaar 1207971caf53SBram Moolenaar CheckDefFailure(['w:foo: number = 10'], 1208971caf53SBram Moolenaar 'E488: Trailing characters: : number = 1') 1209971caf53SBram Moolenaar CheckDefFailure(['t:foo: bool = true'], 1210971caf53SBram Moolenaar 'E488: Trailing characters: : bool = true') 1211971caf53SBram Moolenaar CheckDefFailure(['b:foo: string = "x"'], 1212971caf53SBram Moolenaar 'E488: Trailing characters: : string = "x"') 1213971caf53SBram Moolenaar CheckDefFailure(['g:foo: number = 123'], 1214971caf53SBram Moolenaar 'E488: Trailing characters: : number = 123') 1215971caf53SBram Moolenaarenddef 1216971caf53SBram Moolenaar 1217971caf53SBram Moolenaardef Test_assign_list() 1218e65081d1SBram Moolenaar var lines =<< trim END 121930fd8204SBram Moolenaar var l: list<string> = [] 1220971caf53SBram Moolenaar l[0] = 'value' 1221971caf53SBram Moolenaar assert_equal('value', l[0]) 1222971caf53SBram Moolenaar 1223971caf53SBram Moolenaar l[1] = 'asdf' 1224971caf53SBram Moolenaar assert_equal('value', l[0]) 1225971caf53SBram Moolenaar assert_equal('asdf', l[1]) 1226971caf53SBram Moolenaar assert_equal('asdf', l[-1]) 1227971caf53SBram Moolenaar assert_equal('value', l[-2]) 1228971caf53SBram Moolenaar 122930fd8204SBram Moolenaar var nrl: list<number> = [] 1230971caf53SBram Moolenaar for i in range(5) 1231971caf53SBram Moolenaar nrl[i] = i 1232971caf53SBram Moolenaar endfor 1233971caf53SBram Moolenaar assert_equal([0, 1, 2, 3, 4], nrl) 1234334a8b4bSBram Moolenaar 1235e65081d1SBram Moolenaar var ul: list<any> 1236e65081d1SBram Moolenaar ul[0] = 1 1237e65081d1SBram Moolenaar ul[1] = 2 1238e65081d1SBram Moolenaar ul[2] = 3 1239e65081d1SBram Moolenaar assert_equal([1, 2, 3], ul) 1240e65081d1SBram Moolenaar END 1241e65081d1SBram Moolenaar CheckDefAndScriptSuccess(lines) 1242e65081d1SBram Moolenaar 1243334a8b4bSBram Moolenaar CheckDefFailure(["var l: list<number> = ['', true]"], 'E1012: Type mismatch; expected list<number> but got list<any>', 1) 1244334a8b4bSBram Moolenaar CheckDefFailure(["var l: list<list<number>> = [['', true]]"], 'E1012: Type mismatch; expected list<list<number>> but got list<list<any>>', 1) 1245971caf53SBram Moolenaarenddef 1246971caf53SBram Moolenaar 1247971caf53SBram Moolenaardef Test_assign_dict() 1248c368957bSBram Moolenaar var lines =<< trim END 124930fd8204SBram Moolenaar var d: dict<string> = {} 1250971caf53SBram Moolenaar d['key'] = 'value' 1251971caf53SBram Moolenaar assert_equal('value', d['key']) 1252971caf53SBram Moolenaar 1253971caf53SBram Moolenaar d[123] = 'qwerty' 1254971caf53SBram Moolenaar assert_equal('qwerty', d[123]) 1255971caf53SBram Moolenaar assert_equal('qwerty', d['123']) 1256971caf53SBram Moolenaar 125730fd8204SBram Moolenaar var nrd: dict<number> = {} 1258971caf53SBram Moolenaar for i in range(3) 1259971caf53SBram Moolenaar nrd[i] = i 1260971caf53SBram Moolenaar endfor 1261e0de171eSBram Moolenaar assert_equal({0: 0, 1: 1, 2: 2}, nrd) 1262334a8b4bSBram Moolenaar 1263c368957bSBram Moolenaar d.somekey = 'someval' 1264c368957bSBram Moolenaar assert_equal({key: 'value', '123': 'qwerty', somekey: 'someval'}, d) 126523e2e115SBram Moolenaar unlet d.somekey 126623e2e115SBram Moolenaar assert_equal({key: 'value', '123': 'qwerty'}, d) 1267c368957bSBram Moolenaar END 1268c368957bSBram Moolenaar CheckDefAndScriptSuccess(lines) 1269c368957bSBram Moolenaar 1270e0de171eSBram Moolenaar CheckDefFailure(["var d: dict<number> = {a: '', b: true}"], 'E1012: Type mismatch; expected dict<number> but got dict<any>', 1) 1271e0de171eSBram Moolenaar CheckDefFailure(["var d: dict<dict<number>> = {x: {a: '', b: true}}"], 'E1012: Type mismatch; expected dict<dict<number>> but got dict<dict<any>>', 1) 1272971caf53SBram Moolenaarenddef 1273971caf53SBram Moolenaar 127404bdd573SBram Moolenaardef Test_assign_dict_unknown_type() 127530fd8204SBram Moolenaar var lines =<< trim END 127604bdd573SBram Moolenaar vim9script 127730fd8204SBram Moolenaar var mylist = [] 1278e0de171eSBram Moolenaar mylist += [{one: 'one'}] 127904bdd573SBram Moolenaar def Func() 128030fd8204SBram Moolenaar var dd = mylist[0] 128104bdd573SBram Moolenaar assert_equal('one', dd.one) 128204bdd573SBram Moolenaar enddef 128304bdd573SBram Moolenaar Func() 128404bdd573SBram Moolenaar END 128504bdd573SBram Moolenaar CheckScriptSuccess(lines) 128604bdd573SBram Moolenaar 1287ce2c5444SBram Moolenaar lines =<< trim END 1288ce2c5444SBram Moolenaar vim9script 1289ce2c5444SBram Moolenaar var mylist = [[]] 1290e0de171eSBram Moolenaar mylist[0] += [{one: 'one'}] 1291ce2c5444SBram Moolenaar def Func() 1292ce2c5444SBram Moolenaar var dd = mylist[0][0] 1293ce2c5444SBram Moolenaar assert_equal('one', dd.one) 1294ce2c5444SBram Moolenaar enddef 1295ce2c5444SBram Moolenaar Func() 1296ce2c5444SBram Moolenaar END 1297ce2c5444SBram Moolenaar CheckScriptSuccess(lines) 129804bdd573SBram Moolenaarenddef 129904bdd573SBram Moolenaar 1300f76ec1eeSBram Moolenaardef Test_assign_dict_with_op() 1301f76ec1eeSBram Moolenaar var lines =<< trim END 1302f76ec1eeSBram Moolenaar var ds: dict<string> = {a: 'x'} 1303f76ec1eeSBram Moolenaar ds['a'] ..= 'y' 1304f76ec1eeSBram Moolenaar ds.a ..= 'z' 1305f76ec1eeSBram Moolenaar assert_equal('xyz', ds.a) 1306f76ec1eeSBram Moolenaar 1307f76ec1eeSBram Moolenaar var dn: dict<number> = {a: 9} 1308f76ec1eeSBram Moolenaar dn['a'] += 2 1309f76ec1eeSBram Moolenaar assert_equal(11, dn.a) 1310f76ec1eeSBram Moolenaar dn.a += 2 1311f76ec1eeSBram Moolenaar assert_equal(13, dn.a) 1312f76ec1eeSBram Moolenaar 1313f76ec1eeSBram Moolenaar dn['a'] -= 3 1314f76ec1eeSBram Moolenaar assert_equal(10, dn.a) 1315f76ec1eeSBram Moolenaar dn.a -= 2 1316f76ec1eeSBram Moolenaar assert_equal(8, dn.a) 1317f76ec1eeSBram Moolenaar 1318f76ec1eeSBram Moolenaar dn['a'] *= 2 1319f76ec1eeSBram Moolenaar assert_equal(16, dn.a) 1320f76ec1eeSBram Moolenaar dn.a *= 2 1321f76ec1eeSBram Moolenaar assert_equal(32, dn.a) 1322f76ec1eeSBram Moolenaar 1323f76ec1eeSBram Moolenaar dn['a'] /= 3 1324f76ec1eeSBram Moolenaar assert_equal(10, dn.a) 1325f76ec1eeSBram Moolenaar dn.a /= 2 1326f76ec1eeSBram Moolenaar assert_equal(5, dn.a) 1327f76ec1eeSBram Moolenaar 1328f76ec1eeSBram Moolenaar dn['a'] %= 3 1329f76ec1eeSBram Moolenaar assert_equal(2, dn.a) 1330f76ec1eeSBram Moolenaar dn.a %= 6 1331f76ec1eeSBram Moolenaar assert_equal(2, dn.a) 1332b9c0cd89SBram Moolenaar 1333b9c0cd89SBram Moolenaar var dd: dict<dict<list<any>>> 1334b9c0cd89SBram Moolenaar dd.a = {} 1335b9c0cd89SBram Moolenaar dd.a.b = [0] 1336b9c0cd89SBram Moolenaar dd.a.b += [1] 1337b9c0cd89SBram Moolenaar assert_equal({a: {b: [0, 1]}}, dd) 13380d351a04SBram Moolenaar 13390d351a04SBram Moolenaar var dab = {a: ['b']} 13400d351a04SBram Moolenaar dab.a[0] ..= 'c' 13410d351a04SBram Moolenaar assert_equal({a: ['bc']}, dab) 1342f76ec1eeSBram Moolenaar END 1343e42939afSBram Moolenaar CheckDefAndScriptSuccess(lines) 1344e42939afSBram Moolenaarenddef 1345e42939afSBram Moolenaar 1346e42939afSBram Moolenaardef Test_assign_list_with_op() 1347e42939afSBram Moolenaar var lines =<< trim END 1348e42939afSBram Moolenaar var ls: list<string> = ['x'] 1349e42939afSBram Moolenaar ls[0] ..= 'y' 1350e42939afSBram Moolenaar assert_equal('xy', ls[0]) 1351e42939afSBram Moolenaar 1352e42939afSBram Moolenaar var ln: list<number> = [9] 1353e42939afSBram Moolenaar ln[0] += 2 1354e42939afSBram Moolenaar assert_equal(11, ln[0]) 1355e42939afSBram Moolenaar 1356e42939afSBram Moolenaar ln[0] -= 3 1357e42939afSBram Moolenaar assert_equal(8, ln[0]) 1358e42939afSBram Moolenaar 1359e42939afSBram Moolenaar ln[0] *= 2 1360e42939afSBram Moolenaar assert_equal(16, ln[0]) 1361e42939afSBram Moolenaar 1362e42939afSBram Moolenaar ln[0] /= 3 1363e42939afSBram Moolenaar assert_equal(5, ln[0]) 1364e42939afSBram Moolenaar 1365e42939afSBram Moolenaar ln[0] %= 3 1366e42939afSBram Moolenaar assert_equal(2, ln[0]) 1367e42939afSBram Moolenaar END 1368e42939afSBram Moolenaar CheckDefAndScriptSuccess(lines) 1369e42939afSBram Moolenaarenddef 1370e42939afSBram Moolenaar 1371e42939afSBram Moolenaardef Test_assign_with_op_fails() 1372e42939afSBram Moolenaar var lines =<< trim END 1373e42939afSBram Moolenaar var s = 'abc' 1374e42939afSBram Moolenaar s[1] += 'x' 1375e42939afSBram Moolenaar END 1376e42939afSBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1141:', 'E689:', 2) 1377e42939afSBram Moolenaar 1378e42939afSBram Moolenaar lines =<< trim END 1379e42939afSBram Moolenaar var s = 'abc' 1380e42939afSBram Moolenaar s[1] ..= 'x' 1381e42939afSBram Moolenaar END 1382e42939afSBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1141:', 'E689:', 2) 1383b9c0cd89SBram Moolenaar 1384b9c0cd89SBram Moolenaar lines =<< trim END 1385b9c0cd89SBram Moolenaar var dd: dict<dict<list<any>>> 1386b9c0cd89SBram Moolenaar dd.a = {} 1387b9c0cd89SBram Moolenaar dd.a.b += [1] 1388b9c0cd89SBram Moolenaar END 1389b9c0cd89SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E716:', 3) 1390f76ec1eeSBram Moolenaarenddef 1391f76ec1eeSBram Moolenaar 1392971caf53SBram Moolenaardef Test_assign_lambda() 1393971caf53SBram Moolenaar # check if assign a lambda to a variable which type is func or any. 139430fd8204SBram Moolenaar var lines =<< trim END 1395971caf53SBram Moolenaar vim9script 13962949cfdbSBram Moolenaar var FuncRef = () => 123 1397971caf53SBram Moolenaar assert_equal(123, FuncRef()) 13982949cfdbSBram Moolenaar var FuncRef_Func: func = () => 123 1399971caf53SBram Moolenaar assert_equal(123, FuncRef_Func()) 14002949cfdbSBram Moolenaar var FuncRef_Any: any = () => 123 1401971caf53SBram Moolenaar assert_equal(123, FuncRef_Any()) 140206409501SBram Moolenaar var FuncRef_Number: func(): number = () => 321 140306409501SBram Moolenaar assert_equal(321, FuncRef_Number()) 1404971caf53SBram Moolenaar END 1405971caf53SBram Moolenaar CheckScriptSuccess(lines) 1406328eac2bSBram Moolenaar 1407328eac2bSBram Moolenaar lines =<< trim END 1408328eac2bSBram Moolenaar var Ref: func(number) 1409328eac2bSBram Moolenaar Ref = (j) => !j 1410328eac2bSBram Moolenaar END 141106409501SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool') 1412c7dac853SBram Moolenaar 1413c7dac853SBram Moolenaar lines =<< trim END 1414c7dac853SBram Moolenaar echo filter([1, 2, 3], (_, v: string) => v + 1) 1415c7dac853SBram Moolenaar END 1416c7dac853SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1051:') 1417971caf53SBram Moolenaarenddef 1418971caf53SBram Moolenaar 1419c0e29010SBram Moolenaardef Test_heredoc() 1420c0e29010SBram Moolenaar var lines =<< trim END # comment 1421c0e29010SBram Moolenaar text 1422c0e29010SBram Moolenaar END 1423c0e29010SBram Moolenaar assert_equal(['text'], lines) 1424c0e29010SBram Moolenaar 1425c0e29010SBram Moolenaar CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:') 1426c0e29010SBram Moolenaar CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:') 14272914a20aSBram Moolenaar 14282914a20aSBram Moolenaar lines =<< trim [END] 14292914a20aSBram Moolenaar def Func() 14302914a20aSBram Moolenaar var&lines =<< trim END 14312914a20aSBram Moolenaar x 14322914a20aSBram Moolenaar x 1433b5b9480eSBram Moolenaar enddef 1434b5b9480eSBram Moolenaar defcompile 1435b5b9480eSBram Moolenaar [END] 1436b5b9480eSBram Moolenaar CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END') 1437b5b9480eSBram Moolenaar delfunc! g:Func 1438b5b9480eSBram Moolenaar 1439b5b9480eSBram Moolenaar lines =<< trim [END] 1440b5b9480eSBram Moolenaar def Func() 1441b5b9480eSBram Moolenaar var lines =<< trim END 1442b5b9480eSBram Moolenaar x 1443b5b9480eSBram Moolenaar x 14442914a20aSBram Moolenaar x 14452914a20aSBram Moolenaar x 14462914a20aSBram Moolenaar x 14472914a20aSBram Moolenaar x 14482914a20aSBram Moolenaar x 14492914a20aSBram Moolenaar x 14502914a20aSBram Moolenaar enddef 14512914a20aSBram Moolenaar call Func() 14522914a20aSBram Moolenaar [END] 1453b5b9480eSBram Moolenaar CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END') 14542d870f8dSBram Moolenaar delfunc! g:Func 145581530e36SBram Moolenaar 145681530e36SBram Moolenaar lines =<< trim END 145781530e36SBram Moolenaar var lines: number =<< trim STOP 145881530e36SBram Moolenaar aaa 145981530e36SBram Moolenaar bbb 146081530e36SBram Moolenaar STOP 146181530e36SBram Moolenaar END 146281530e36SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<string>', 1) 1463c0e29010SBram Moolenaarenddef 1464c0e29010SBram Moolenaar 1465083966f6SBram Moolenaardef Test_var_func_call() 146655759b52SBram Moolenaar var lines =<< trim END 146755759b52SBram Moolenaar vim9script 146855759b52SBram Moolenaar func GetValue() 146955759b52SBram Moolenaar if exists('g:count') 147055759b52SBram Moolenaar let g:count += 1 147155759b52SBram Moolenaar else 147255759b52SBram Moolenaar let g:count = 1 147355759b52SBram Moolenaar endif 147455759b52SBram Moolenaar return 'this' 147555759b52SBram Moolenaar endfunc 147655759b52SBram Moolenaar var val: string = GetValue() 147755759b52SBram Moolenaar # env var is always a string 147855759b52SBram Moolenaar var env = $TERM 147955759b52SBram Moolenaar END 148055759b52SBram Moolenaar writefile(lines, 'Xfinished') 148155759b52SBram Moolenaar source Xfinished 148255759b52SBram Moolenaar # GetValue() is not called during discovery phase 148355759b52SBram Moolenaar assert_equal(1, g:count) 148455759b52SBram Moolenaar 148555759b52SBram Moolenaar unlet g:count 148655759b52SBram Moolenaar delete('Xfinished') 148755759b52SBram Moolenaarenddef 148855759b52SBram Moolenaar 1489083966f6SBram Moolenaardef Test_var_missing_type() 149055759b52SBram Moolenaar var lines =<< trim END 149155759b52SBram Moolenaar vim9script 149255759b52SBram Moolenaar var name = g:unknown 149355759b52SBram Moolenaar END 149455759b52SBram Moolenaar CheckScriptFailure(lines, 'E121:') 149555759b52SBram Moolenaar 149655759b52SBram Moolenaar lines =<< trim END 149755759b52SBram Moolenaar vim9script 149855759b52SBram Moolenaar var nr: number = 123 149955759b52SBram Moolenaar var name = nr 150055759b52SBram Moolenaar END 150155759b52SBram Moolenaar CheckScriptSuccess(lines) 150255759b52SBram Moolenaarenddef 150355759b52SBram Moolenaar 1504083966f6SBram Moolenaardef Test_var_declaration() 150555759b52SBram Moolenaar var lines =<< trim END 150655759b52SBram Moolenaar vim9script 150755759b52SBram Moolenaar var name: string 150855759b52SBram Moolenaar g:var_uninit = name 150955759b52SBram Moolenaar name = 'text' 151055759b52SBram Moolenaar g:var_test = name 151155759b52SBram Moolenaar # prefixing s: is optional 151255759b52SBram Moolenaar s:name = 'prefixed' 151355759b52SBram Moolenaar g:var_prefixed = s:name 151455759b52SBram Moolenaar 15157257af47SBram Moolenaar const FOO: number = 123 15167257af47SBram Moolenaar assert_equal(123, FOO) 151789b474ddSBram Moolenaar const FOOS = 'foos' 151889b474ddSBram Moolenaar assert_equal('foos', FOOS) 151989b474ddSBram Moolenaar final FLIST = [1] 152089b474ddSBram Moolenaar assert_equal([1], FLIST) 152189b474ddSBram Moolenaar FLIST[0] = 11 152289b474ddSBram Moolenaar assert_equal([11], FLIST) 152389b474ddSBram Moolenaar 152489b474ddSBram Moolenaar const g:FOO: number = 321 152589b474ddSBram Moolenaar assert_equal(321, g:FOO) 152689b474ddSBram Moolenaar const g:FOOS = 'gfoos' 152789b474ddSBram Moolenaar assert_equal('gfoos', g:FOOS) 152889b474ddSBram Moolenaar final g:FLIST = [2] 152989b474ddSBram Moolenaar assert_equal([2], g:FLIST) 153089b474ddSBram Moolenaar g:FLIST[0] = 22 153189b474ddSBram Moolenaar assert_equal([22], g:FLIST) 153289b474ddSBram Moolenaar 1533d877a570SBram Moolenaar def SetGlobalConst() 1534d877a570SBram Moolenaar const g:globConst = 123 1535d877a570SBram Moolenaar enddef 1536d877a570SBram Moolenaar SetGlobalConst() 1537d877a570SBram Moolenaar assert_equal(123, g:globConst) 1538d877a570SBram Moolenaar assert_true(islocked('g:globConst')) 1539d877a570SBram Moolenaar 154089b474ddSBram Moolenaar const w:FOO: number = 46 154189b474ddSBram Moolenaar assert_equal(46, w:FOO) 154289b474ddSBram Moolenaar const w:FOOS = 'wfoos' 154389b474ddSBram Moolenaar assert_equal('wfoos', w:FOOS) 154489b474ddSBram Moolenaar final w:FLIST = [3] 154589b474ddSBram Moolenaar assert_equal([3], w:FLIST) 154689b474ddSBram Moolenaar w:FLIST[0] = 33 154789b474ddSBram Moolenaar assert_equal([33], w:FLIST) 15487257af47SBram Moolenaar 154955759b52SBram Moolenaar var s:other: number 155055759b52SBram Moolenaar other = 1234 155155759b52SBram Moolenaar g:other_var = other 155255759b52SBram Moolenaar 1553ccc25aa2SBram Moolenaar var xyz: string # comment 1554ccc25aa2SBram Moolenaar 155555759b52SBram Moolenaar # type is inferred 15563862ea3fSBram Moolenaar var s:dict = {['a']: 222} 155755759b52SBram Moolenaar def GetDictVal(key: any) 155855759b52SBram Moolenaar g:dict_val = s:dict[key] 155955759b52SBram Moolenaar enddef 156055759b52SBram Moolenaar GetDictVal('a') 156108251757SBram Moolenaar 156208251757SBram Moolenaar final adict: dict<string> = {} 156308251757SBram Moolenaar def ChangeAdict() 156408251757SBram Moolenaar adict.foo = 'foo' 156508251757SBram Moolenaar enddef 156608251757SBram Moolenaar ChangeAdict() 156755759b52SBram Moolenaar END 156855759b52SBram Moolenaar CheckScriptSuccess(lines) 156955759b52SBram Moolenaar assert_equal('', g:var_uninit) 157055759b52SBram Moolenaar assert_equal('text', g:var_test) 157155759b52SBram Moolenaar assert_equal('prefixed', g:var_prefixed) 157255759b52SBram Moolenaar assert_equal(1234, g:other_var) 157355759b52SBram Moolenaar assert_equal(222, g:dict_val) 157455759b52SBram Moolenaar 157555759b52SBram Moolenaar unlet g:var_uninit 157655759b52SBram Moolenaar unlet g:var_test 157755759b52SBram Moolenaar unlet g:var_prefixed 157855759b52SBram Moolenaar unlet g:other_var 15796e50ec2fSBram Moolenaar unlet g:globConst 158089b474ddSBram Moolenaar unlet g:FOO 158189b474ddSBram Moolenaar unlet g:FOOS 158289b474ddSBram Moolenaar unlet g:FLIST 158389b474ddSBram Moolenaar unlet w:FOO 158489b474ddSBram Moolenaar unlet w:FOOS 158589b474ddSBram Moolenaar unlet w:FLIST 158655759b52SBram Moolenaarenddef 158755759b52SBram Moolenaar 1588083966f6SBram Moolenaardef Test_var_declaration_fails() 158955759b52SBram Moolenaar var lines =<< trim END 159055759b52SBram Moolenaar vim9script 159155759b52SBram Moolenaar final var: string 159255759b52SBram Moolenaar END 159355759b52SBram Moolenaar CheckScriptFailure(lines, 'E1125:') 159455759b52SBram Moolenaar 159555759b52SBram Moolenaar lines =<< trim END 159655759b52SBram Moolenaar vim9script 159789b474ddSBram Moolenaar const g:constvar = 'string' 159889b474ddSBram Moolenaar g:constvar = 'xx' 159989b474ddSBram Moolenaar END 160089b474ddSBram Moolenaar CheckScriptFailure(lines, 'E741:') 160189b474ddSBram Moolenaar unlet g:constvar 160289b474ddSBram Moolenaar 160389b474ddSBram Moolenaar lines =<< trim END 160489b474ddSBram Moolenaar vim9script 1605f5906aa7SBram Moolenaar var name = 'one' 1606f5906aa7SBram Moolenaar lockvar name 1607f5906aa7SBram Moolenaar def SetLocked() 1608f5906aa7SBram Moolenaar name = 'two' 1609f5906aa7SBram Moolenaar enddef 1610f5906aa7SBram Moolenaar SetLocked() 1611f5906aa7SBram Moolenaar END 1612dcf29ac8SBram Moolenaar CheckScriptFailure(lines, 'E741: Value is locked: name', 1) 1613dcf29ac8SBram Moolenaar 1614dcf29ac8SBram Moolenaar lines =<< trim END 1615dcf29ac8SBram Moolenaar let s:legacy = 'one' 1616dcf29ac8SBram Moolenaar lockvar s:legacy 1617dcf29ac8SBram Moolenaar def SetLocked() 1618dcf29ac8SBram Moolenaar s:legacy = 'two' 1619dcf29ac8SBram Moolenaar enddef 1620dcf29ac8SBram Moolenaar call SetLocked() 1621dcf29ac8SBram Moolenaar END 1622dcf29ac8SBram Moolenaar CheckScriptFailure(lines, 'E741: Value is locked: s:legacy', 1) 1623f5906aa7SBram Moolenaar 1624f5906aa7SBram Moolenaar lines =<< trim END 1625f5906aa7SBram Moolenaar vim9script 1626d877a570SBram Moolenaar def SetGlobalConst() 1627d877a570SBram Moolenaar const g:globConst = 123 1628d877a570SBram Moolenaar enddef 1629d877a570SBram Moolenaar SetGlobalConst() 1630d877a570SBram Moolenaar g:globConst = 234 1631d877a570SBram Moolenaar END 16326e50ec2fSBram Moolenaar CheckScriptFailure(lines, 'E741: Value is locked: g:globConst', 6) 1633d877a570SBram Moolenaar unlet g:globConst 1634d877a570SBram Moolenaar 1635d877a570SBram Moolenaar lines =<< trim END 1636d877a570SBram Moolenaar vim9script 163708251757SBram Moolenaar const cdict: dict<string> = {} 163808251757SBram Moolenaar def Change() 163908251757SBram Moolenaar cdict.foo = 'foo' 164008251757SBram Moolenaar enddef 164108251757SBram Moolenaar defcompile 164208251757SBram Moolenaar END 164308251757SBram Moolenaar CheckScriptFailure(lines, 'E46:') 164408251757SBram Moolenaar 164508251757SBram Moolenaar lines =<< trim END 164608251757SBram Moolenaar vim9script 164789b474ddSBram Moolenaar final w:finalvar = [9] 164889b474ddSBram Moolenaar w:finalvar = [8] 164989b474ddSBram Moolenaar END 165089b474ddSBram Moolenaar CheckScriptFailure(lines, 'E1122:') 165189b474ddSBram Moolenaar unlet w:finalvar 165289b474ddSBram Moolenaar 165389b474ddSBram Moolenaar lines =<< trim END 165489b474ddSBram Moolenaar vim9script 165555759b52SBram Moolenaar const var: string 165655759b52SBram Moolenaar END 165755759b52SBram Moolenaar CheckScriptFailure(lines, 'E1021:') 165855759b52SBram Moolenaar 165955759b52SBram Moolenaar lines =<< trim END 166055759b52SBram Moolenaar vim9script 166155759b52SBram Moolenaar var 9var: string 166255759b52SBram Moolenaar END 1663ccc25aa2SBram Moolenaar CheckScriptFailure(lines, 'E488:') 16647257af47SBram Moolenaar 16657257af47SBram Moolenaar CheckDefFailure(['var foo.bar = 2'], 'E1087:') 16667257af47SBram Moolenaar CheckDefFailure(['var foo[3] = 2'], 'E1087:') 16677257af47SBram Moolenaar CheckDefFailure(['const foo: number'], 'E1021:') 166855759b52SBram Moolenaarenddef 166955759b52SBram Moolenaar 1670643ce6c0SBram Moolenaardef Test_script_local_in_legacy() 1671643ce6c0SBram Moolenaar # OK to define script-local later when prefixed with s: 1672643ce6c0SBram Moolenaar var lines =<< trim END 1673643ce6c0SBram Moolenaar def SetLater() 167496cf4ba8SBram Moolenaar s:legvar = 'two' 1675643ce6c0SBram Moolenaar enddef 1676643ce6c0SBram Moolenaar defcompile 167796cf4ba8SBram Moolenaar let s:legvar = 'one' 1678643ce6c0SBram Moolenaar call SetLater() 167996cf4ba8SBram Moolenaar call assert_equal('two', s:legvar) 1680643ce6c0SBram Moolenaar END 1681643ce6c0SBram Moolenaar CheckScriptSuccess(lines) 1682643ce6c0SBram Moolenaar 1683643ce6c0SBram Moolenaar # OK to leave out s: prefix when script-local already defined 1684643ce6c0SBram Moolenaar lines =<< trim END 168596cf4ba8SBram Moolenaar let s:legvar = 'one' 1686643ce6c0SBram Moolenaar def SetNoPrefix() 168796cf4ba8SBram Moolenaar legvar = 'two' 1688643ce6c0SBram Moolenaar enddef 1689643ce6c0SBram Moolenaar call SetNoPrefix() 169096cf4ba8SBram Moolenaar call assert_equal('two', s:legvar) 1691643ce6c0SBram Moolenaar END 1692643ce6c0SBram Moolenaar CheckScriptSuccess(lines) 1693643ce6c0SBram Moolenaar 1694643ce6c0SBram Moolenaar # Not OK to leave out s: prefix when script-local defined later 1695643ce6c0SBram Moolenaar lines =<< trim END 1696643ce6c0SBram Moolenaar def SetLaterNoPrefix() 169796cf4ba8SBram Moolenaar legvar = 'two' 1698643ce6c0SBram Moolenaar enddef 1699643ce6c0SBram Moolenaar defcompile 170096cf4ba8SBram Moolenaar let s:legvar = 'one' 1701643ce6c0SBram Moolenaar END 1702643ce6c0SBram Moolenaar CheckScriptFailure(lines, 'E476:', 1) 170347bc9c33SBram Moolenaar 170447bc9c33SBram Moolenaar edit! Xfile 170547bc9c33SBram Moolenaar lines =<< trim END 170647bc9c33SBram Moolenaar var edit: bool 170747bc9c33SBram Moolenaar legacy edit 170847bc9c33SBram Moolenaar END 170947bc9c33SBram Moolenaar CheckDefAndScriptSuccess(lines) 1710643ce6c0SBram Moolenaarenddef 1711643ce6c0SBram Moolenaar 1712083966f6SBram Moolenaardef Test_var_type_check() 171355759b52SBram Moolenaar var lines =<< trim END 171455759b52SBram Moolenaar vim9script 171555759b52SBram Moolenaar var name: string 171655759b52SBram Moolenaar name = 1234 171755759b52SBram Moolenaar END 171855759b52SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 171955759b52SBram Moolenaar 172055759b52SBram Moolenaar lines =<< trim END 172155759b52SBram Moolenaar vim9script 172255759b52SBram Moolenaar var name:string 172355759b52SBram Moolenaar END 172455759b52SBram Moolenaar CheckScriptFailure(lines, 'E1069:') 172555759b52SBram Moolenaar 172660faf865SBram Moolenaar CheckDefAndScriptFailure(['var n:number = 42'], 'E1069:') 172760faf865SBram Moolenaar 172855759b52SBram Moolenaar lines =<< trim END 172955759b52SBram Moolenaar vim9script 173055759b52SBram Moolenaar var name: asdf 173155759b52SBram Moolenaar END 173255759b52SBram Moolenaar CheckScriptFailure(lines, 'E1010:') 173355759b52SBram Moolenaar 173455759b52SBram Moolenaar lines =<< trim END 173555759b52SBram Moolenaar vim9script 173655759b52SBram Moolenaar var s:l: list<number> 173755759b52SBram Moolenaar s:l = [] 173855759b52SBram Moolenaar END 173955759b52SBram Moolenaar CheckScriptSuccess(lines) 174055759b52SBram Moolenaar 174155759b52SBram Moolenaar lines =<< trim END 174255759b52SBram Moolenaar vim9script 174355759b52SBram Moolenaar var s:d: dict<number> 174455759b52SBram Moolenaar s:d = {} 174555759b52SBram Moolenaar END 174655759b52SBram Moolenaar CheckScriptSuccess(lines) 1747378697acSBram Moolenaar 1748378697acSBram Moolenaar lines =<< trim END 1749378697acSBram Moolenaar vim9script 1750378697acSBram Moolenaar var d = {a: 1, b: [2]} 1751378697acSBram Moolenaar def Func(b: bool) 1752378697acSBram Moolenaar var l: list<number> = b ? d.b : [3] 1753378697acSBram Moolenaar enddef 1754378697acSBram Moolenaar defcompile 1755378697acSBram Moolenaar END 1756378697acSBram Moolenaar CheckScriptSuccess(lines) 175755759b52SBram Moolenaarenddef 175855759b52SBram Moolenaar 175955759b52SBram Moolenaarlet g:dict_number = #{one: 1, two: 2} 176055759b52SBram Moolenaar 1761083966f6SBram Moolenaardef Test_var_list_dict_type() 176255759b52SBram Moolenaar var ll: list<number> 176355759b52SBram Moolenaar ll = [1, 2, 2, 3, 3, 3]->uniq() 176455759b52SBram Moolenaar ll->assert_equal([1, 2, 3]) 176555759b52SBram Moolenaar 176655759b52SBram Moolenaar var dd: dict<number> 176755759b52SBram Moolenaar dd = g:dict_number 176855759b52SBram Moolenaar dd->assert_equal(g:dict_number) 176955759b52SBram Moolenaar 177055759b52SBram Moolenaar var lines =<< trim END 177155759b52SBram Moolenaar var ll: list<number> 177255759b52SBram Moolenaar ll = [1, 2, 3]->map('"one"') 177355759b52SBram Moolenaar END 177470250fb4SBram Moolenaar CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string') 177555759b52SBram Moolenaarenddef 177655759b52SBram Moolenaar 1777083966f6SBram Moolenaardef Test_cannot_use_let() 1778083966f6SBram Moolenaar CheckDefAndScriptFailure(['let a = 34'], 'E1126:', 1) 1779083966f6SBram Moolenaarenddef 1780083966f6SBram Moolenaar 178155759b52SBram Moolenaardef Test_unlet() 178255759b52SBram Moolenaar g:somevar = 'yes' 178355759b52SBram Moolenaar assert_true(exists('g:somevar')) 178455759b52SBram Moolenaar unlet g:somevar 178555759b52SBram Moolenaar assert_false(exists('g:somevar')) 178655759b52SBram Moolenaar unlet! g:somevar 178755759b52SBram Moolenaar 178855759b52SBram Moolenaar # also works for script-local variable in legacy Vim script 178955759b52SBram Moolenaar s:somevar = 'legacy' 179055759b52SBram Moolenaar assert_true(exists('s:somevar')) 179155759b52SBram Moolenaar unlet s:somevar 179255759b52SBram Moolenaar assert_false(exists('s:somevar')) 179355759b52SBram Moolenaar unlet! s:somevar 179455759b52SBram Moolenaar 17950acbf5aeSBram Moolenaar CheckDefExecFailure([ 17960acbf5aeSBram Moolenaar 'var dd = 111', 17970acbf5aeSBram Moolenaar 'unlet dd', 17980acbf5aeSBram Moolenaar ], 'E1081:', 2) 17990acbf5aeSBram Moolenaar 1800752fc692SBram Moolenaar # dict unlet 1801752fc692SBram Moolenaar var dd = {a: 1, b: 2, c: 3} 1802752fc692SBram Moolenaar unlet dd['a'] 1803752fc692SBram Moolenaar unlet dd.c 1804752fc692SBram Moolenaar assert_equal({b: 2}, dd) 1805752fc692SBram Moolenaar 1806752fc692SBram Moolenaar # list unlet 1807752fc692SBram Moolenaar var ll = [1, 2, 3, 4] 1808752fc692SBram Moolenaar unlet ll[1] 1809752fc692SBram Moolenaar unlet ll[-1] 1810752fc692SBram Moolenaar assert_equal([1, 3], ll) 1811752fc692SBram Moolenaar 18125b5ae29bSBram Moolenaar ll = [1, 2, 3, 4] 18135b5ae29bSBram Moolenaar unlet ll[0 : 1] 18145b5ae29bSBram Moolenaar assert_equal([3, 4], ll) 18155b5ae29bSBram Moolenaar 18165b5ae29bSBram Moolenaar ll = [1, 2, 3, 4] 18175b5ae29bSBram Moolenaar unlet ll[2 : 8] 18185b5ae29bSBram Moolenaar assert_equal([1, 2], ll) 18195b5ae29bSBram Moolenaar 18205b5ae29bSBram Moolenaar ll = [1, 2, 3, 4] 18215b5ae29bSBram Moolenaar unlet ll[-2 : -1] 18225b5ae29bSBram Moolenaar assert_equal([1, 2], ll) 18235b5ae29bSBram Moolenaar 18245b5ae29bSBram Moolenaar CheckDefFailure([ 18255b5ae29bSBram Moolenaar 'var ll = [1, 2]', 18265b5ae29bSBram Moolenaar 'll[1 : 2] = 7', 18274f0884d6SBram Moolenaar ], 'E1012: Type mismatch; expected list<number> but got number', 2) 18285b5ae29bSBram Moolenaar CheckDefFailure([ 18295b5ae29bSBram Moolenaar 'var dd = {a: 1}', 18305b5ae29bSBram Moolenaar 'unlet dd["a" : "a"]', 18315b5ae29bSBram Moolenaar ], 'E1166:', 2) 18325b5ae29bSBram Moolenaar CheckDefExecFailure([ 18335b5ae29bSBram Moolenaar 'unlet g:adict[0 : 1]', 18345b5ae29bSBram Moolenaar ], 'E1148:', 1) 18355b5ae29bSBram Moolenaar CheckDefFailure([ 18365b5ae29bSBram Moolenaar 'var ll = [1, 2]', 18375b5ae29bSBram Moolenaar 'unlet ll[0:1]', 18385b5ae29bSBram Moolenaar ], 'E1004:', 2) 18395b5ae29bSBram Moolenaar CheckDefFailure([ 18405b5ae29bSBram Moolenaar 'var ll = [1, 2]', 18415b5ae29bSBram Moolenaar 'unlet ll[0 :1]', 18425b5ae29bSBram Moolenaar ], 'E1004:', 2) 18435b5ae29bSBram Moolenaar CheckDefFailure([ 18445b5ae29bSBram Moolenaar 'var ll = [1, 2]', 18455b5ae29bSBram Moolenaar 'unlet ll[0: 1]', 18465b5ae29bSBram Moolenaar ], 'E1004:', 2) 18475b5ae29bSBram Moolenaar 18485b5ae29bSBram Moolenaar CheckDefFailure([ 18495b5ae29bSBram Moolenaar 'var ll = [1, 2]', 18505b5ae29bSBram Moolenaar 'unlet ll["x" : 1]', 18515b5ae29bSBram Moolenaar ], 'E1012:', 2) 18525b5ae29bSBram Moolenaar CheckDefFailure([ 18535b5ae29bSBram Moolenaar 'var ll = [1, 2]', 18545b5ae29bSBram Moolenaar 'unlet ll[0 : "x"]', 18555b5ae29bSBram Moolenaar ], 'E1012:', 2) 18565b5ae29bSBram Moolenaar 1857752fc692SBram Moolenaar # list of dict unlet 1858752fc692SBram Moolenaar var dl = [{a: 1, b: 2}, {c: 3}] 1859752fc692SBram Moolenaar unlet dl[0]['b'] 1860752fc692SBram Moolenaar assert_equal([{a: 1}, {c: 3}], dl) 1861752fc692SBram Moolenaar 1862752fc692SBram Moolenaar CheckDefExecFailure([ 1863752fc692SBram Moolenaar 'var ll = test_null_list()', 1864752fc692SBram Moolenaar 'unlet ll[0]', 18650acbf5aeSBram Moolenaar ], 'E684:', 2) 1866752fc692SBram Moolenaar CheckDefExecFailure([ 1867752fc692SBram Moolenaar 'var ll = [1]', 1868752fc692SBram Moolenaar 'unlet ll[2]', 18690acbf5aeSBram Moolenaar ], 'E684:', 2) 18700acbf5aeSBram Moolenaar CheckDefExecFailure([ 18710acbf5aeSBram Moolenaar 'var ll = [1]', 18720acbf5aeSBram Moolenaar 'unlet ll[g:astring]', 1873f30a14dbSBram Moolenaar ], 'E1012:', 2) 1874752fc692SBram Moolenaar CheckDefExecFailure([ 1875752fc692SBram Moolenaar 'var dd = test_null_dict()', 1876752fc692SBram Moolenaar 'unlet dd["a"]', 18770acbf5aeSBram Moolenaar ], 'E716:', 2) 1878752fc692SBram Moolenaar CheckDefExecFailure([ 1879752fc692SBram Moolenaar 'var dd = {a: 1}', 1880752fc692SBram Moolenaar 'unlet dd["b"]', 18810acbf5aeSBram Moolenaar ], 'E716:', 2) 18820acbf5aeSBram Moolenaar CheckDefExecFailure([ 18830acbf5aeSBram Moolenaar 'var dd = {a: 1}', 18840acbf5aeSBram Moolenaar 'unlet dd[g:alist]', 18850acbf5aeSBram Moolenaar ], 'E1105:', 2) 1886752fc692SBram Moolenaar 18872ef951ddSBram Moolenaar # can compile unlet before variable exists 1888752fc692SBram Moolenaar g:someDict = {key: 'val'} 1889752fc692SBram Moolenaar var k = 'key' 1890752fc692SBram Moolenaar unlet g:someDict[k] 1891752fc692SBram Moolenaar assert_equal({}, g:someDict) 1892752fc692SBram Moolenaar unlet g:someDict 1893752fc692SBram Moolenaar assert_false(exists('g:someDict')) 18942ef951ddSBram Moolenaar 189555759b52SBram Moolenaar CheckScriptFailure([ 189655759b52SBram Moolenaar 'vim9script', 189755759b52SBram Moolenaar 'var svar = 123', 189855759b52SBram Moolenaar 'unlet svar', 189955759b52SBram Moolenaar ], 'E1081:') 190055759b52SBram Moolenaar CheckScriptFailure([ 190155759b52SBram Moolenaar 'vim9script', 190255759b52SBram Moolenaar 'var svar = 123', 190355759b52SBram Moolenaar 'unlet s:svar', 190455759b52SBram Moolenaar ], 'E1081:') 190555759b52SBram Moolenaar CheckScriptFailure([ 190655759b52SBram Moolenaar 'vim9script', 190755759b52SBram Moolenaar 'var svar = 123', 190855759b52SBram Moolenaar 'def Func()', 190955759b52SBram Moolenaar ' unlet svar', 191055759b52SBram Moolenaar 'enddef', 191155759b52SBram Moolenaar 'defcompile', 191255759b52SBram Moolenaar ], 'E1081:') 191355759b52SBram Moolenaar CheckScriptFailure([ 191455759b52SBram Moolenaar 'vim9script', 191555759b52SBram Moolenaar 'var svar = 123', 19169aed729fSBram Moolenaar 'func Func()', 19179aed729fSBram Moolenaar ' unlet s:svar', 19189aed729fSBram Moolenaar 'endfunc', 19199aed729fSBram Moolenaar 'Func()', 19209aed729fSBram Moolenaar ], 'E1081:') 19219aed729fSBram Moolenaar CheckScriptFailure([ 19229aed729fSBram Moolenaar 'vim9script', 19239aed729fSBram Moolenaar 'var svar = 123', 192455759b52SBram Moolenaar 'def Func()', 192555759b52SBram Moolenaar ' unlet s:svar', 192655759b52SBram Moolenaar 'enddef', 192755759b52SBram Moolenaar 'defcompile', 192855759b52SBram Moolenaar ], 'E1081:') 192955759b52SBram Moolenaar 19300acbf5aeSBram Moolenaar writefile(['vim9script', 'export var svar = 1234'], 'XunletExport.vim') 19310acbf5aeSBram Moolenaar var lines =<< trim END 19320acbf5aeSBram Moolenaar vim9script 19330acbf5aeSBram Moolenaar import svar from './XunletExport.vim' 19340acbf5aeSBram Moolenaar def UnletSvar() 19350acbf5aeSBram Moolenaar unlet svar 19360acbf5aeSBram Moolenaar enddef 19370acbf5aeSBram Moolenaar defcompile 19380acbf5aeSBram Moolenaar END 19390acbf5aeSBram Moolenaar CheckScriptFailure(lines, 'E1081:', 1) 19400acbf5aeSBram Moolenaar delete('XunletExport.vim') 19410acbf5aeSBram Moolenaar 194255759b52SBram Moolenaar $ENVVAR = 'foobar' 194355759b52SBram Moolenaar assert_equal('foobar', $ENVVAR) 194455759b52SBram Moolenaar unlet $ENVVAR 194555759b52SBram Moolenaar assert_equal('', $ENVVAR) 194655759b52SBram Moolenaarenddef 194755759b52SBram Moolenaar 1948c5f59fabSBram Moolenaardef Test_expr_error_no_assign() 1949c5f59fabSBram Moolenaar var lines =<< trim END 1950c5f59fabSBram Moolenaar vim9script 1951c5f59fabSBram Moolenaar var x = invalid 1952c5f59fabSBram Moolenaar echo x 1953c5f59fabSBram Moolenaar END 1954c5f59fabSBram Moolenaar CheckScriptFailureList(lines, ['E121:', 'E121:']) 1955c5f59fabSBram Moolenaar 1956c5f59fabSBram Moolenaar lines =<< trim END 1957c5f59fabSBram Moolenaar vim9script 1958c5f59fabSBram Moolenaar var x = 1 / 0 1959c5f59fabSBram Moolenaar echo x 1960c5f59fabSBram Moolenaar END 1961227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E1154:') 1962c5f59fabSBram Moolenaar 1963c5f59fabSBram Moolenaar lines =<< trim END 1964c5f59fabSBram Moolenaar vim9script 1965c5f59fabSBram Moolenaar var x = 1 % 0 1966c5f59fabSBram Moolenaar echo x 1967c5f59fabSBram Moolenaar END 1968227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E1154:') 1969ccc25aa2SBram Moolenaar 1970ccc25aa2SBram Moolenaar lines =<< trim END 1971ccc25aa2SBram Moolenaar var x: string 'string' 1972ccc25aa2SBram Moolenaar END 1973ccc25aa2SBram Moolenaar CheckDefAndScriptFailure(lines, 'E488:') 1974c5f59fabSBram Moolenaarenddef 1975c5f59fabSBram Moolenaar 1976c5f59fabSBram Moolenaar 197717126b13SBram Moolenaardef Test_assign_command_modifier() 197817126b13SBram Moolenaar var lines =<< trim END 197917126b13SBram Moolenaar var verbose = 0 198017126b13SBram Moolenaar verbose = 1 198117126b13SBram Moolenaar assert_equal(1, verbose) 198217126b13SBram Moolenaar silent verbose = 2 198317126b13SBram Moolenaar assert_equal(2, verbose) 198417126b13SBram Moolenaar silent verbose += 2 198517126b13SBram Moolenaar assert_equal(4, verbose) 198617126b13SBram Moolenaar silent verbose -= 1 198717126b13SBram Moolenaar assert_equal(3, verbose) 198817126b13SBram Moolenaar 198917126b13SBram Moolenaar var topleft = {one: 1} 199017126b13SBram Moolenaar sandbox topleft.one = 3 199117126b13SBram Moolenaar assert_equal({one: 3}, topleft) 199217126b13SBram Moolenaar leftabove topleft[' '] = 4 199317126b13SBram Moolenaar assert_equal({one: 3, ' ': 4}, topleft) 19949e0f883fSBram Moolenaar 19959e0f883fSBram Moolenaar var x: number 19969e0f883fSBram Moolenaar var y: number 19979e0f883fSBram Moolenaar silent [x, y] = [1, 2] 19989e0f883fSBram Moolenaar assert_equal(1, x) 19999e0f883fSBram Moolenaar assert_equal(2, y) 200017126b13SBram Moolenaar END 200117126b13SBram Moolenaar CheckDefAndScriptSuccess(lines) 200217126b13SBram Moolenaarenddef 200317126b13SBram Moolenaar 200474f4a965SBram Moolenaardef Test_assign_alt_buf_register() 200574f4a965SBram Moolenaar var lines =<< trim END 200674f4a965SBram Moolenaar edit 'file_b1' 200774f4a965SBram Moolenaar var b1 = bufnr() 200874f4a965SBram Moolenaar edit 'file_b2' 200974f4a965SBram Moolenaar var b2 = bufnr() 201074f4a965SBram Moolenaar assert_equal(b1, bufnr('#')) 201174f4a965SBram Moolenaar @# = b2 201274f4a965SBram Moolenaar assert_equal(b2, bufnr('#')) 201374f4a965SBram Moolenaar END 201474f4a965SBram Moolenaar CheckDefAndScriptSuccess(lines) 201574f4a965SBram Moolenaarenddef 201674f4a965SBram Moolenaar 20173215466aSBram Moolenaardef Test_script_funcref_case() 20183215466aSBram Moolenaar var lines =<< trim END 20193215466aSBram Moolenaar var Len = (s: string): number => len(s) + 1 20203215466aSBram Moolenaar assert_equal(5, Len('asdf')) 20213215466aSBram Moolenaar END 20223215466aSBram Moolenaar CheckDefAndScriptSuccess(lines) 20233215466aSBram Moolenaar 20243215466aSBram Moolenaar lines =<< trim END 20253215466aSBram Moolenaar var len = (s: string): number => len(s) + 1 20263215466aSBram Moolenaar END 20273215466aSBram Moolenaar CheckDefAndScriptFailure(lines, 'E704:') 20283215466aSBram Moolenaar 20293215466aSBram Moolenaar lines =<< trim END 20303215466aSBram Moolenaar vim9script 20313215466aSBram Moolenaar var s:Len = (s: string): number => len(s) + 2 20323215466aSBram Moolenaar assert_equal(6, Len('asdf')) 20333215466aSBram Moolenaar END 20343215466aSBram Moolenaar CheckScriptSuccess(lines) 20353215466aSBram Moolenaar 20363215466aSBram Moolenaar lines =<< trim END 20373215466aSBram Moolenaar vim9script 20383215466aSBram Moolenaar var s:len = (s: string): number => len(s) + 1 20393215466aSBram Moolenaar END 20403215466aSBram Moolenaar CheckScriptFailure(lines, 'E704:') 20413215466aSBram Moolenaarenddef 20423215466aSBram Moolenaar 2043bdc0f1c6SBram Moolenaardef Test_inc_dec() 2044bdc0f1c6SBram Moolenaar var lines =<< trim END 2045bdc0f1c6SBram Moolenaar var nr = 7 2046bdc0f1c6SBram Moolenaar ++nr 2047730bf300SBram Moolenaar assert_equal(8, nr) 2048bdc0f1c6SBram Moolenaar --nr 2049730bf300SBram Moolenaar assert_equal(7, nr) 2050f3d30842SBram Moolenaar ++nr | ++nr 2051f3d30842SBram Moolenaar assert_equal(9, nr) 2052f3d30842SBram Moolenaar ++nr # comment 2053f3d30842SBram Moolenaar assert_equal(10, nr) 2054bdc0f1c6SBram Moolenaar 2055bdc0f1c6SBram Moolenaar var ll = [1, 2] 2056bdc0f1c6SBram Moolenaar --ll[0] 2057bdc0f1c6SBram Moolenaar ++ll[1] 2058730bf300SBram Moolenaar assert_equal([0, 3], ll) 2059730bf300SBram Moolenaar 2060730bf300SBram Moolenaar g:count = 1 2061730bf300SBram Moolenaar ++g:count 2062730bf300SBram Moolenaar --g:count 2063730bf300SBram Moolenaar assert_equal(1, g:count) 2064730bf300SBram Moolenaar unlet g:count 2065bdc0f1c6SBram Moolenaar END 2066bdc0f1c6SBram Moolenaar CheckDefAndScriptSuccess(lines) 206722480d14SBram Moolenaar 206822480d14SBram Moolenaar lines =<< trim END 206922480d14SBram Moolenaar var nr = 7 207022480d14SBram Moolenaar ++ nr 207122480d14SBram Moolenaar END 207222480d14SBram Moolenaar CheckDefAndScriptFailure(lines, "E1202: No white space allowed after '++': ++ nr") 2073bdc0f1c6SBram Moolenaarenddef 2074bdc0f1c6SBram Moolenaar 2075327d3ee4SBram Moolenaardef Test_abort_after_error() 2076327d3ee4SBram Moolenaar # should abort after strpart() fails, not give another type error 2077327d3ee4SBram Moolenaar var lines =<< trim END 2078327d3ee4SBram Moolenaar vim9script 2079327d3ee4SBram Moolenaar var x: string 2080327d3ee4SBram Moolenaar x = strpart(1, 2) 2081327d3ee4SBram Moolenaar END 2082327d3ee4SBram Moolenaar writefile(lines, 'Xtestscript') 2083327d3ee4SBram Moolenaar var expected = 'E1174: String required for argument 1' 2084327d3ee4SBram Moolenaar assert_fails('so Xtestscript', [expected, expected], 3) 2085327d3ee4SBram Moolenaar 2086327d3ee4SBram Moolenaar delete('Xtestscript') 2087327d3ee4SBram Moolenaarenddef 2088327d3ee4SBram Moolenaar 2089327d3ee4SBram Moolenaar 209055759b52SBram Moolenaar 2091971caf53SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2092