18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 78a7d6542SBram Moolenaar 88a7d6542SBram Moolenaardef Test_syntax() 98a7d6542SBram Moolenaar let var = 234 108a7d6542SBram Moolenaar let other: list<string> = ['asdf'] 118a7d6542SBram Moolenaarenddef 128a7d6542SBram Moolenaar 136e587dcbSBram Moolenaarlet s:appendToMe = 'xxx' 146e587dcbSBram Moolenaarlet s:addToMe = 111 15401d9ffbSBram Moolenaarlet g:existing = 'yes' 16a8c17704SBram Moolenaarlet g:inc_counter = 1 17a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some' 18a6e67e4fSBram Moolenaarlet g:alist = [7] 19a6e67e4fSBram Moolenaarlet g:astring = 'text' 20f0b9f43cSBram Moolenaarlet g:anumber = 123 216e587dcbSBram Moolenaar 228a7d6542SBram Moolenaardef Test_assignment() 238a7d6542SBram Moolenaar let bool1: bool = true 248a7d6542SBram Moolenaar assert_equal(v:true, bool1) 258a7d6542SBram Moolenaar let bool2: bool = false 268a7d6542SBram Moolenaar assert_equal(v:false, bool2) 278a7d6542SBram Moolenaar 28f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string'], 'E1069:') 29f93c7feaSBram Moolenaar call CheckDefFailure(['let x:string = "x"'], 'E1069:') 301cc2a94fSBram Moolenaar call CheckDefFailure(['let a:string = "x"'], 'E1069:') 31f93c7feaSBram Moolenaar 324cdb13ceSBram Moolenaar let nr: number = 1234 334cdb13ceSBram Moolenaar call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:') 344cdb13ceSBram Moolenaar 35b209750bSBram Moolenaar let a: number = 6 #comment 369be61bbbSBram Moolenaar assert_equal(6, a) 379be61bbbSBram Moolenaar 3842a480bfSBram Moolenaar if has('channel') 3942a480bfSBram Moolenaar let chan1: channel 40fbdd08edSBram Moolenaar let job1: job 41f51cb4e0SBram Moolenaar let job2: job = job_start('willfail') 4242a480bfSBram Moolenaar endif 43fbdd08edSBram Moolenaar if has('float') 44fbdd08edSBram Moolenaar let float1: float = 3.4 45fbdd08edSBram Moolenaar endif 465deeb3f1SBram Moolenaar let Funky1: func 475deeb3f1SBram Moolenaar let Funky2: func = function('len') 484c17ad94SBram Moolenaar let Party2: func = funcref('g:Test_syntax') 4942a480bfSBram Moolenaar 50b209750bSBram Moolenaar g:newvar = 'new' #comment 51401d9ffbSBram Moolenaar assert_equal('new', g:newvar) 52401d9ffbSBram Moolenaar 53401d9ffbSBram Moolenaar assert_equal('yes', g:existing) 54401d9ffbSBram Moolenaar g:existing = 'no' 55401d9ffbSBram Moolenaar assert_equal('no', g:existing) 56401d9ffbSBram Moolenaar 57b283a8a6SBram Moolenaar v:char = 'abc' 586e587dcbSBram Moolenaar assert_equal('abc', v:char) 59b283a8a6SBram Moolenaar 60b283a8a6SBram Moolenaar $ENVVAR = 'foobar' 616e587dcbSBram Moolenaar assert_equal('foobar', $ENVVAR) 62b283a8a6SBram Moolenaar $ENVVAR = '' 636e587dcbSBram Moolenaar 64b5ed2660SBram Moolenaar let lines =<< trim END 65b5ed2660SBram Moolenaar vim9script 66b5ed2660SBram Moolenaar $ENVVAR = 'barfoo' 67b5ed2660SBram Moolenaar assert_equal('barfoo', $ENVVAR) 68b5ed2660SBram Moolenaar $ENVVAR = '' 69b5ed2660SBram Moolenaar END 70b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 71b5ed2660SBram Moolenaar 72fd1823e0SBram Moolenaar s:appendToMe ..= 'yyy' 73fd1823e0SBram Moolenaar assert_equal('xxxyyy', s:appendToMe) 74fd1823e0SBram Moolenaar s:addToMe += 222 75fd1823e0SBram Moolenaar assert_equal(333, s:addToMe) 760bbf722aSBram Moolenaar s:newVar = 'new' 770bbf722aSBram Moolenaar assert_equal('new', s:newVar) 78a8c17704SBram Moolenaar 79a8c17704SBram Moolenaar set ts=7 80a8c17704SBram Moolenaar &ts += 1 81a8c17704SBram Moolenaar assert_equal(8, &ts) 8280c34ca3SBram Moolenaar &ts -= 3 8380c34ca3SBram Moolenaar assert_equal(5, &ts) 8480c34ca3SBram Moolenaar &ts *= 2 8580c34ca3SBram Moolenaar assert_equal(10, &ts) 8680c34ca3SBram Moolenaar &ts /= 3 8780c34ca3SBram Moolenaar assert_equal(3, &ts) 8880c34ca3SBram Moolenaar set ts=10 8980c34ca3SBram Moolenaar &ts %= 4 9080c34ca3SBram Moolenaar assert_equal(2, &ts) 91b5ed2660SBram Moolenaar 92b5ed2660SBram Moolenaar lines =<< trim END 93b5ed2660SBram Moolenaar vim9script 94b5ed2660SBram Moolenaar &ts = 6 95b5ed2660SBram Moolenaar &ts += 3 96b5ed2660SBram Moolenaar assert_equal(9, &ts) 97b5ed2660SBram Moolenaar END 98b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 99b5ed2660SBram Moolenaar 100a8c17704SBram Moolenaar call CheckDefFailure(['¬ex += 3'], 'E113:') 101a8c17704SBram Moolenaar call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') 102a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = [7]'], 'E1013:') 103a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list') 104a6e67e4fSBram Moolenaar call CheckDefFailure(['&ts = "xx"'], 'E1013:') 105a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string') 106a8c17704SBram Moolenaar call CheckDefFailure(['&path += 3'], 'E1013:') 107a6e67e4fSBram Moolenaar call CheckDefExecFailure(['&bs = "asdf"'], 'E474:') 108cb711abfSBram Moolenaar # test freeing ISN_STOREOPT 109585fea7bSBram Moolenaar call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:') 11080c34ca3SBram Moolenaar &ts = 8 111a8c17704SBram Moolenaar 11233afa244SBram Moolenaar call CheckDefFailure(['let s:var = 123'], 'E1101:') 11333afa244SBram Moolenaar call CheckDefFailure(['let s:var: number'], 'E1101:') 11433afa244SBram Moolenaar 115a8c17704SBram Moolenaar g:inc_counter += 1 116a8c17704SBram Moolenaar assert_equal(2, g:inc_counter) 117a8c17704SBram Moolenaar 118a8c17704SBram Moolenaar $SOME_ENV_VAR ..= 'more' 119a8c17704SBram Moolenaar assert_equal('somemore', $SOME_ENV_VAR) 120a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:') 121a8c17704SBram Moolenaar call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:') 122a8c17704SBram Moolenaar 123a8c17704SBram Moolenaar @a = 'areg' 124a8c17704SBram Moolenaar @a ..= 'add' 125a8c17704SBram Moolenaar assert_equal('aregadd', @a) 126a8c17704SBram Moolenaar call CheckDefFailure(['@a += "more"'], 'E1013:') 127a8c17704SBram Moolenaar call CheckDefFailure(['@a += 123'], 'E1013:') 128e69f6d04SBram Moolenaar 129b5ed2660SBram Moolenaar lines =<< trim END 130b5ed2660SBram Moolenaar vim9script 131b5ed2660SBram Moolenaar @c = 'areg' 132b5ed2660SBram Moolenaar @c ..= 'add' 133b5ed2660SBram Moolenaar assert_equal('aregadd', @c) 134b5ed2660SBram Moolenaar END 135b5ed2660SBram Moolenaar call CheckScriptSuccess(lines) 136b5ed2660SBram Moolenaar 137e69f6d04SBram Moolenaar v:errmsg = 'none' 138e69f6d04SBram Moolenaar v:errmsg ..= 'again' 139e69f6d04SBram Moolenaar assert_equal('noneagain', v:errmsg) 140e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += "more"'], 'E1013:') 141e69f6d04SBram Moolenaar call CheckDefFailure(['v:errmsg += 123'], 'E1013:') 14233afa244SBram Moolenaar 14333afa244SBram Moolenaar # single letter variables 14433afa244SBram Moolenaar a = 123 14533afa244SBram Moolenaar assert_equal(123, a) 14633afa244SBram Moolenaar let b: number 14733afa244SBram Moolenaar b = 123 14833afa244SBram Moolenaar assert_equal(123, b) 14933afa244SBram Moolenaar let g: number 15033afa244SBram Moolenaar g = 123 15133afa244SBram Moolenaar assert_equal(123, g) 15233afa244SBram Moolenaar let s: number 15333afa244SBram Moolenaar s = 123 15433afa244SBram Moolenaar assert_equal(123, s) 15533afa244SBram Moolenaar let t: number 15633afa244SBram Moolenaar t = 123 15733afa244SBram Moolenaar assert_equal(123, t) 15833afa244SBram Moolenaar let v: number 15933afa244SBram Moolenaar v = 123 16033afa244SBram Moolenaar assert_equal(123, v) 16133afa244SBram Moolenaar let w: number 16233afa244SBram Moolenaar w = 123 16333afa244SBram Moolenaar assert_equal(123, w) 1645deeb3f1SBram Moolenaarenddef 1655deeb3f1SBram Moolenaar 1663b74b6b4SBram Moolenaardef Test_vim9_single_char_vars() 1673b74b6b4SBram Moolenaar let lines =<< trim END 1683b74b6b4SBram Moolenaar vim9script 1693b74b6b4SBram Moolenaar 170f5be8cdbSBram Moolenaar # single character variable declarations work 1713b74b6b4SBram Moolenaar let a: string 1723b74b6b4SBram Moolenaar let b: number 1733b74b6b4SBram Moolenaar let l: list<any> 1743b74b6b4SBram Moolenaar let s: string 1753b74b6b4SBram Moolenaar let t: number 1763b74b6b4SBram Moolenaar let v: number 1773b74b6b4SBram Moolenaar let w: number 1783b74b6b4SBram Moolenaar 179f5be8cdbSBram Moolenaar # script-local variables can be used without s: prefix 1803b74b6b4SBram Moolenaar a = 'script-a' 1813b74b6b4SBram Moolenaar b = 111 1823b74b6b4SBram Moolenaar l = [1, 2, 3] 1833b74b6b4SBram Moolenaar s = 'script-s' 1843b74b6b4SBram Moolenaar t = 222 1853b74b6b4SBram Moolenaar v = 333 1863b74b6b4SBram Moolenaar w = 444 1873b74b6b4SBram Moolenaar 1883b74b6b4SBram Moolenaar assert_equal('script-a', a) 1893b74b6b4SBram Moolenaar assert_equal(111, b) 1903b74b6b4SBram Moolenaar assert_equal([1, 2, 3], l) 1913b74b6b4SBram Moolenaar assert_equal('script-s', s) 1923b74b6b4SBram Moolenaar assert_equal(222, t) 1933b74b6b4SBram Moolenaar assert_equal(333, v) 1943b74b6b4SBram Moolenaar assert_equal(444, w) 1953b74b6b4SBram Moolenaar END 1963b74b6b4SBram Moolenaar writefile(lines, 'Xsinglechar') 1973b74b6b4SBram Moolenaar source Xsinglechar 1983b74b6b4SBram Moolenaar delete('Xsinglechar') 1993b74b6b4SBram Moolenaarenddef 2003b74b6b4SBram Moolenaar 20184370087SBram Moolenaardef Test_assignment_list() 20284370087SBram Moolenaar let list1: list<bool> = [false, true, false] 20384370087SBram Moolenaar let list2: list<number> = [1, 2, 3] 20484370087SBram Moolenaar let list3: list<string> = ['sdf', 'asdf'] 20584370087SBram Moolenaar let list4: list<any> = ['yes', true, 1234] 20684370087SBram Moolenaar let list5: list<blob> = [0z01, 0z02] 20784370087SBram Moolenaar 20884370087SBram Moolenaar let listS: list<string> = [] 20984370087SBram Moolenaar let listN: list<number> = [] 21084370087SBram Moolenaar 21184370087SBram Moolenaar assert_equal([1, 2, 3], list2) 21284370087SBram Moolenaar list2[-1] = 99 21384370087SBram Moolenaar assert_equal([1, 2, 99], list2) 21484370087SBram Moolenaar list2[-2] = 88 21584370087SBram Moolenaar assert_equal([1, 88, 99], list2) 21684370087SBram Moolenaar list2[-3] = 77 21784370087SBram Moolenaar assert_equal([77, 88, 99], list2) 21884370087SBram Moolenaar call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:') 219c5b1c20bSBram Moolenaar call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:') 22084370087SBram Moolenaar 22184370087SBram Moolenaar # type becomes list<any> 22284370087SBram Moolenaar let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c'] 22384370087SBram Moolenaarenddef 22484370087SBram Moolenaar 225b31be3f9SBram Moolenaardef Test_assignment_list_vim9script() 226b31be3f9SBram Moolenaar let lines =<< trim END 227b31be3f9SBram Moolenaar vim9script 228b31be3f9SBram Moolenaar let v1: number 229b31be3f9SBram Moolenaar let v2: number 230b31be3f9SBram Moolenaar let v3: number 231b31be3f9SBram Moolenaar [v1, v2, v3] = [1, 2, 3] 232b31be3f9SBram Moolenaar assert_equal([1, 2, 3], [v1, v2, v3]) 233b31be3f9SBram Moolenaar END 234b31be3f9SBram Moolenaar call CheckScriptSuccess(lines) 235b31be3f9SBram Moolenaarenddef 236b31be3f9SBram Moolenaar 23784370087SBram Moolenaardef Test_assignment_dict() 23884370087SBram Moolenaar let dict1: dict<bool> = #{one: false, two: true} 23984370087SBram Moolenaar let dict2: dict<number> = #{one: 1, two: 2} 24084370087SBram Moolenaar let dict3: dict<string> = #{key: 'value'} 24184370087SBram Moolenaar let dict4: dict<any> = #{one: 1, two: '2'} 24274fae513SBram Moolenaar let dict5: dict<blob> = #{one: 0z01, two: 0z02} 24384370087SBram Moolenaar 244f5be8cdbSBram Moolenaar # overwrite 245c785b9a7SBram Moolenaar dict3['key'] = 'another' 246c785b9a7SBram Moolenaar 24758626872SBram Moolenaar # empty key can be used 24858626872SBram Moolenaar let dd = {} 24958626872SBram Moolenaar dd[""] = 6 25058626872SBram Moolenaar assert_equal({'': 6}, dd) 25184370087SBram Moolenaar 25284370087SBram Moolenaar # type becomes dict<any> 25384370087SBram Moolenaar let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} 2548e4c8c85SBram Moolenaar 2558e4c8c85SBram Moolenaar # assignment to script-local dict 2568e4c8c85SBram Moolenaar let lines =<< trim END 2578e4c8c85SBram Moolenaar vim9script 2588e4c8c85SBram Moolenaar let test: dict<any> = {} 2598e4c8c85SBram Moolenaar def FillDict(): dict<any> 2608e4c8c85SBram Moolenaar test['a'] = 43 2618e4c8c85SBram Moolenaar return test 2628e4c8c85SBram Moolenaar enddef 2638e4c8c85SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2648e4c8c85SBram Moolenaar END 2658e4c8c85SBram Moolenaar call CheckScriptSuccess(lines) 2668e4c8c85SBram Moolenaar 2678e4c8c85SBram Moolenaar lines =<< trim END 2688e4c8c85SBram Moolenaar vim9script 2698e4c8c85SBram Moolenaar let test: dict<any> 2708e4c8c85SBram Moolenaar def FillDict(): dict<any> 2718e4c8c85SBram Moolenaar test['a'] = 43 2728e4c8c85SBram Moolenaar return test 2738e4c8c85SBram Moolenaar enddef 2748e4c8c85SBram Moolenaar FillDict() 2758e4c8c85SBram Moolenaar END 2768e4c8c85SBram Moolenaar call CheckScriptFailure(lines, 'E1103:') 2772caa1594SBram Moolenaar 2782caa1594SBram Moolenaar # assignment to global dict 2792caa1594SBram Moolenaar lines =<< trim END 2802caa1594SBram Moolenaar vim9script 2812caa1594SBram Moolenaar g:test = {} 2822caa1594SBram Moolenaar def FillDict(): dict<any> 2832caa1594SBram Moolenaar g:test['a'] = 43 2842caa1594SBram Moolenaar return g:test 2852caa1594SBram Moolenaar enddef 2862caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2872caa1594SBram Moolenaar END 2882caa1594SBram Moolenaar call CheckScriptSuccess(lines) 2892caa1594SBram Moolenaar 2902caa1594SBram Moolenaar # assignment to buffer dict 2912caa1594SBram Moolenaar lines =<< trim END 2922caa1594SBram Moolenaar vim9script 2932caa1594SBram Moolenaar b:test = {} 2942caa1594SBram Moolenaar def FillDict(): dict<any> 2952caa1594SBram Moolenaar b:test['a'] = 43 2962caa1594SBram Moolenaar return b:test 2972caa1594SBram Moolenaar enddef 2982caa1594SBram Moolenaar assert_equal(#{a: 43}, FillDict()) 2992caa1594SBram Moolenaar END 3002caa1594SBram Moolenaar call CheckScriptSuccess(lines) 30184370087SBram Moolenaarenddef 30284370087SBram Moolenaar 303d3aac291SBram Moolenaardef Test_assignment_local() 304f5be8cdbSBram Moolenaar # Test in a separated file in order not to the current buffer/window/tab is 305f5be8cdbSBram Moolenaar # changed. 306d3aac291SBram Moolenaar let script_lines: list<string> =<< trim END 307d3aac291SBram Moolenaar let b:existing = 'yes' 308d3aac291SBram Moolenaar let w:existing = 'yes' 309d3aac291SBram Moolenaar let t:existing = 'yes' 310d3aac291SBram Moolenaar 311d3aac291SBram Moolenaar def Test_assignment_local_internal() 312d3aac291SBram Moolenaar b:newvar = 'new' 313d3aac291SBram Moolenaar assert_equal('new', b:newvar) 314d3aac291SBram Moolenaar assert_equal('yes', b:existing) 315d3aac291SBram Moolenaar b:existing = 'no' 316d3aac291SBram Moolenaar assert_equal('no', b:existing) 317396f3138SBram Moolenaar b:existing ..= 'NO' 318396f3138SBram Moolenaar assert_equal('noNO', b:existing) 319d3aac291SBram Moolenaar 320d3aac291SBram Moolenaar w:newvar = 'new' 321d3aac291SBram Moolenaar assert_equal('new', w:newvar) 322d3aac291SBram Moolenaar assert_equal('yes', w:existing) 323d3aac291SBram Moolenaar w:existing = 'no' 324d3aac291SBram Moolenaar assert_equal('no', w:existing) 325396f3138SBram Moolenaar w:existing ..= 'NO' 326396f3138SBram Moolenaar assert_equal('noNO', w:existing) 327d3aac291SBram Moolenaar 328d3aac291SBram Moolenaar t:newvar = 'new' 329d3aac291SBram Moolenaar assert_equal('new', t:newvar) 330d3aac291SBram Moolenaar assert_equal('yes', t:existing) 331d3aac291SBram Moolenaar t:existing = 'no' 332d3aac291SBram Moolenaar assert_equal('no', t:existing) 333396f3138SBram Moolenaar t:existing ..= 'NO' 334396f3138SBram Moolenaar assert_equal('noNO', t:existing) 335d3aac291SBram Moolenaar enddef 336d3aac291SBram Moolenaar call Test_assignment_local_internal() 337d3aac291SBram Moolenaar END 338d3aac291SBram Moolenaar call CheckScriptSuccess(script_lines) 339d3aac291SBram Moolenaarenddef 340d3aac291SBram Moolenaar 3415deeb3f1SBram Moolenaardef Test_assignment_default() 342e69f6d04SBram Moolenaar 343cb711abfSBram Moolenaar # Test default values. 344e69f6d04SBram Moolenaar let thebool: bool 345e69f6d04SBram Moolenaar assert_equal(v:false, thebool) 346e69f6d04SBram Moolenaar 347e69f6d04SBram Moolenaar let thenumber: number 348e69f6d04SBram Moolenaar assert_equal(0, thenumber) 349e69f6d04SBram Moolenaar 350e69f6d04SBram Moolenaar if has('float') 351e69f6d04SBram Moolenaar let thefloat: float 352e69f6d04SBram Moolenaar assert_equal(0.0, thefloat) 353e69f6d04SBram Moolenaar endif 354e69f6d04SBram Moolenaar 355e69f6d04SBram Moolenaar let thestring: string 356e69f6d04SBram Moolenaar assert_equal('', thestring) 357e69f6d04SBram Moolenaar 358e69f6d04SBram Moolenaar let theblob: blob 359e69f6d04SBram Moolenaar assert_equal(0z, theblob) 360e69f6d04SBram Moolenaar 3615deeb3f1SBram Moolenaar let Thefunc: func 3625deeb3f1SBram Moolenaar assert_equal(test_null_function(), Thefunc) 363e69f6d04SBram Moolenaar 364e69f6d04SBram Moolenaar let thelist: list<any> 365e69f6d04SBram Moolenaar assert_equal([], thelist) 366e69f6d04SBram Moolenaar 367e69f6d04SBram Moolenaar let thedict: dict<any> 368e69f6d04SBram Moolenaar assert_equal({}, thedict) 369e69f6d04SBram Moolenaar 3702c869deeSBram Moolenaar if has('channel') 371e69f6d04SBram Moolenaar let thejob: job 372e69f6d04SBram Moolenaar assert_equal(test_null_job(), thejob) 373e69f6d04SBram Moolenaar 374e69f6d04SBram Moolenaar let thechannel: channel 375e69f6d04SBram Moolenaar assert_equal(test_null_channel(), thechannel) 376c785b9a7SBram Moolenaar 377c785b9a7SBram Moolenaar if has('unix') && executable('cat') 378f5be8cdbSBram Moolenaar # check with non-null job and channel, types must match 379c785b9a7SBram Moolenaar thejob = job_start("cat ", #{}) 380c785b9a7SBram Moolenaar thechannel = job_getchannel(thejob) 381c785b9a7SBram Moolenaar job_stop(thejob, 'kill') 382c785b9a7SBram Moolenaar endif 3832c869deeSBram Moolenaar endif 384585fea7bSBram Moolenaar 385585fea7bSBram Moolenaar let nr = 1234 | nr = 5678 386585fea7bSBram Moolenaar assert_equal(5678, nr) 3878a7d6542SBram Moolenaarenddef 3888a7d6542SBram Moolenaar 38947a519a9SBram Moolenaardef Test_assignment_var_list() 39047a519a9SBram Moolenaar let v1: string 39147a519a9SBram Moolenaar let v2: string 3929af78769SBram Moolenaar let vrem: list<string> 3939af78769SBram Moolenaar [v1] = ['aaa'] 3949af78769SBram Moolenaar assert_equal('aaa', v1) 3959af78769SBram Moolenaar 39647a519a9SBram Moolenaar [v1, v2] = ['one', 'two'] 39747a519a9SBram Moolenaar assert_equal('one', v1) 39847a519a9SBram Moolenaar assert_equal('two', v2) 3999af78769SBram Moolenaar 4009af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two'] 4019af78769SBram Moolenaar assert_equal('one', v1) 4029af78769SBram Moolenaar assert_equal('two', v2) 4039af78769SBram Moolenaar assert_equal([], vrem) 4049af78769SBram Moolenaar 4059af78769SBram Moolenaar [v1, v2; vrem] = ['one', 'two', 'three'] 4069af78769SBram Moolenaar assert_equal('one', v1) 4079af78769SBram Moolenaar assert_equal('two', v2) 4089af78769SBram Moolenaar assert_equal(['three'], vrem) 40947a519a9SBram Moolenaarenddef 41047a519a9SBram Moolenaar 411c7e44a7eSBram Moolenaardef Test_assignment_vim9script() 412c7e44a7eSBram Moolenaar let lines =<< trim END 413c7e44a7eSBram Moolenaar vim9script 414c7e44a7eSBram Moolenaar def Func(): list<number> 415c7e44a7eSBram Moolenaar return [1, 2] 416c7e44a7eSBram Moolenaar enddef 417c7e44a7eSBram Moolenaar let var1: number 418c7e44a7eSBram Moolenaar let var2: number 419c7e44a7eSBram Moolenaar [var1, var2] = 420c7e44a7eSBram Moolenaar Func() 421c7e44a7eSBram Moolenaar assert_equal(1, var1) 422c7e44a7eSBram Moolenaar assert_equal(2, var2) 423c7e44a7eSBram Moolenaar let ll = 424c7e44a7eSBram Moolenaar Func() 425c7e44a7eSBram Moolenaar assert_equal([1, 2], ll) 426c7e44a7eSBram Moolenaar END 427c7e44a7eSBram Moolenaar CheckScriptSuccess(lines) 428c7e44a7eSBram Moolenaarenddef 429c7e44a7eSBram Moolenaar 430cab27678SBram Moolenaardef Mess(): string 431cab27678SBram Moolenaar v:foldstart = 123 432cab27678SBram Moolenaar return 'xxx' 433cab27678SBram Moolenaarenddef 434cab27678SBram Moolenaar 435d72c1bf0SBram Moolenaardef Test_assignment_failure() 4368a7d6542SBram Moolenaar call CheckDefFailure(['let var=234'], 'E1004:') 4378a7d6542SBram Moolenaar call CheckDefFailure(['let var =234'], 'E1004:') 4388a7d6542SBram Moolenaar call CheckDefFailure(['let var= 234'], 'E1004:') 4398a7d6542SBram Moolenaar 44063be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:') 44163be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='") 44263be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:') 44363be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:') 44463be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:') 44563be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='") 44663be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:') 44763be3d4bSBram Moolenaar call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='") 44863be3d4bSBram Moolenaar 4498a7d6542SBram Moolenaar call CheckDefFailure(['let true = 1'], 'E1034:') 4508a7d6542SBram Moolenaar call CheckDefFailure(['let false = 1'], 'E1034:') 4518a7d6542SBram Moolenaar 4529b7bf9e9SBram Moolenaar call CheckDefFailure(['[a; b; c] = g:list'], 'E452:') 4539af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4549af78769SBram Moolenaar '[a] = test_null_list()'], 'E1093:') 4559af78769SBram Moolenaar call CheckDefExecFailure(['let a: number', 4569af78769SBram Moolenaar '[a] = []'], 'E1093:') 4579af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 4589af78769SBram Moolenaar 'let y: number', 4599af78769SBram Moolenaar '[x, y] = [1]'], 'E1093:') 4609af78769SBram Moolenaar call CheckDefExecFailure(['let x: number', 4619af78769SBram Moolenaar 'let y: number', 4629af78769SBram Moolenaar 'let z: list<number>', 4639af78769SBram Moolenaar '[x, y; z] = [1]'], 'E1093:') 4649be61bbbSBram Moolenaar 465e69f6d04SBram Moolenaar call CheckDefFailure(['let somevar'], "E1022:") 466c2ee44ccSBram Moolenaar call CheckDefFailure(['let &tabstop = 4'], 'E1052:') 4679be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 468c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:') 4699be61bbbSBram Moolenaar 470e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 471c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:') 4729be61bbbSBram Moolenaar 473*434d72cbSBram Moolenaar if has('dnd') 47465821727SBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E1066:') 475*434d72cbSBram Moolenaar else 476*434d72cbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 477*434d72cbSBram Moolenaar call CheckDefFailure(['@~ = 5'], 'E354:') 478*434d72cbSBram Moolenaar endif 4799be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 48065821727SBram Moolenaar call CheckDefFailure(['let @/ = "x"'], 'E1066:') 481c2ee44ccSBram Moolenaar call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:') 4829be61bbbSBram Moolenaar 483e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 484e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 485e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 486e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 4879be61bbbSBram Moolenaar 4889be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 4899be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 4909be61bbbSBram Moolenaar 491822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 49233fa29cfSBram Moolenaar 4938a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 4948a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 4958a7d6542SBram Moolenaar 4968a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 4978a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 4988a7d6542SBram Moolenaar 4998a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 5008a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 50142a480bfSBram Moolenaar 502d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 50342a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 504cab27678SBram Moolenaar 505cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 506cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 50743e969d3SBram Moolenaar 50843e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 50943e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 51043e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 51143e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 51243e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 51343e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 51443e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 51543e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 516d72c1bf0SBram Moolenaarenddef 517d72c1bf0SBram Moolenaar 518d72c1bf0SBram Moolenaardef Test_unlet() 519d72c1bf0SBram Moolenaar g:somevar = 'yes' 520d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 521d72c1bf0SBram Moolenaar unlet g:somevar 522d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 523d72c1bf0SBram Moolenaar unlet! g:somevar 524d72c1bf0SBram Moolenaar 525d72c1bf0SBram Moolenaar call CheckScriptFailure([ 526d72c1bf0SBram Moolenaar 'vim9script', 527d72c1bf0SBram Moolenaar 'let svar = 123', 528d72c1bf0SBram Moolenaar 'unlet svar', 529d72c1bf0SBram Moolenaar ], 'E1081:') 530d72c1bf0SBram Moolenaar call CheckScriptFailure([ 531d72c1bf0SBram Moolenaar 'vim9script', 532d72c1bf0SBram Moolenaar 'let svar = 123', 533d72c1bf0SBram Moolenaar 'unlet s:svar', 534d72c1bf0SBram Moolenaar ], 'E1081:') 535d72c1bf0SBram Moolenaar call CheckScriptFailure([ 536d72c1bf0SBram Moolenaar 'vim9script', 537d72c1bf0SBram Moolenaar 'let svar = 123', 538d72c1bf0SBram Moolenaar 'def Func()', 539d72c1bf0SBram Moolenaar ' unlet svar', 540d72c1bf0SBram Moolenaar 'enddef', 541822ba247SBram Moolenaar 'defcompile', 542d72c1bf0SBram Moolenaar ], 'E1081:') 543d72c1bf0SBram Moolenaar call CheckScriptFailure([ 544d72c1bf0SBram Moolenaar 'vim9script', 545d72c1bf0SBram Moolenaar 'let svar = 123', 546d72c1bf0SBram Moolenaar 'def Func()', 547d72c1bf0SBram Moolenaar ' unlet s:svar', 548d72c1bf0SBram Moolenaar 'enddef', 549822ba247SBram Moolenaar 'defcompile', 550d72c1bf0SBram Moolenaar ], 'E1081:') 5517bdaea6eSBram Moolenaar 5527bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 5537bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 5547bdaea6eSBram Moolenaar unlet $ENVVAR 5557bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 556d72c1bf0SBram Moolenaarenddef 557599c89c8SBram Moolenaar 5584c17ad94SBram Moolenaardef Test_delfunction() 559f5be8cdbSBram Moolenaar # Check function is defined in script namespace 5604c17ad94SBram Moolenaar CheckScriptSuccess([ 5614c17ad94SBram Moolenaar 'vim9script', 5624c17ad94SBram Moolenaar 'func CheckMe()', 5634c17ad94SBram Moolenaar ' return 123', 5644c17ad94SBram Moolenaar 'endfunc', 5654c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 5664c17ad94SBram Moolenaar ]) 5674c17ad94SBram Moolenaar 568f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 5694c17ad94SBram Moolenaar CheckScriptFailure([ 5704c17ad94SBram Moolenaar 'vim9script', 5714c17ad94SBram Moolenaar 'func DeleteMe1()', 5724c17ad94SBram Moolenaar 'endfunc', 5734c17ad94SBram Moolenaar 'delfunction DeleteMe1', 5744c17ad94SBram Moolenaar ], 'E1084:') 5754c17ad94SBram Moolenaar CheckScriptFailure([ 5764c17ad94SBram Moolenaar 'vim9script', 5774c17ad94SBram Moolenaar 'func DeleteMe2()', 5784c17ad94SBram Moolenaar 'endfunc', 5794c17ad94SBram Moolenaar 'def DoThat()', 5804c17ad94SBram Moolenaar ' delfunction DeleteMe2', 5814c17ad94SBram Moolenaar 'enddef', 5824c17ad94SBram Moolenaar 'DoThat()', 5834c17ad94SBram Moolenaar ], 'E1084:') 5844c17ad94SBram Moolenaar CheckScriptFailure([ 5854c17ad94SBram Moolenaar 'vim9script', 5864c17ad94SBram Moolenaar 'def DeleteMe3()', 5874c17ad94SBram Moolenaar 'enddef', 5884c17ad94SBram Moolenaar 'delfunction DeleteMe3', 5894c17ad94SBram Moolenaar ], 'E1084:') 5904c17ad94SBram Moolenaar CheckScriptFailure([ 5914c17ad94SBram Moolenaar 'vim9script', 5924c17ad94SBram Moolenaar 'def DeleteMe4()', 5934c17ad94SBram Moolenaar 'enddef', 5944c17ad94SBram Moolenaar 'def DoThat()', 5954c17ad94SBram Moolenaar ' delfunction DeleteMe4', 5964c17ad94SBram Moolenaar 'enddef', 5974c17ad94SBram Moolenaar 'DoThat()', 5984c17ad94SBram Moolenaar ], 'E1084:') 599925e9fd6SBram Moolenaar 600925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 601925e9fd6SBram Moolenaar let lines =<< trim END 602925e9fd6SBram Moolenaar vim9script 603925e9fd6SBram Moolenaar def g:Global(): string 604925e9fd6SBram Moolenaar return "yes" 605925e9fd6SBram Moolenaar enddef 606925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 607925e9fd6SBram Moolenaar def! g:Global(): string 608925e9fd6SBram Moolenaar return "no" 609925e9fd6SBram Moolenaar enddef 610925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 611925e9fd6SBram Moolenaar delfunc g:Global 612925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 613925e9fd6SBram Moolenaar END 614925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 615925e9fd6SBram Moolenaar 616925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 617925e9fd6SBram Moolenaar lines =<< trim END 618925e9fd6SBram Moolenaar vim9script 619925e9fd6SBram Moolenaar func g:Global() 620925e9fd6SBram Moolenaar return "yes" 621925e9fd6SBram Moolenaar endfunc 622925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 623925e9fd6SBram Moolenaar def! g:Global(): string 624925e9fd6SBram Moolenaar return "no" 625925e9fd6SBram Moolenaar enddef 626925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 627925e9fd6SBram Moolenaar delfunc g:Global 628925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 629925e9fd6SBram Moolenaar END 630925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 631925e9fd6SBram Moolenaar 632925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 633925e9fd6SBram Moolenaar lines =<< trim END 634925e9fd6SBram Moolenaar vim9script 635925e9fd6SBram Moolenaar def g:Global(): string 636925e9fd6SBram Moolenaar return "yes" 637925e9fd6SBram Moolenaar enddef 638925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 639925e9fd6SBram Moolenaar func! g:Global() 640925e9fd6SBram Moolenaar return "no" 641925e9fd6SBram Moolenaar endfunc 642925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 643925e9fd6SBram Moolenaar delfunc g:Global 644925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 645925e9fd6SBram Moolenaar END 646925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6474c17ad94SBram Moolenaarenddef 6484c17ad94SBram Moolenaar 649599c89c8SBram Moolenaarfunc Test_wrong_type() 650599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 651599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 652599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 653599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 654599c89c8SBram Moolenaar 655599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 656599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 65742a480bfSBram Moolenaar 65842a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 65942a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 66042a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 66142a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 66242a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 66342a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 66442a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 66542a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 66642a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 66742a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 66842a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 669a0a9f43aSBram Moolenaar 670a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 671a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 6728a7d6542SBram Moolenaarendfunc 6738a7d6542SBram Moolenaar 6748a7d6542SBram Moolenaarfunc Test_const() 6758a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 6768a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 6778a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 6789be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 6798a7d6542SBram Moolenaarendfunc 6808a7d6542SBram Moolenaar 681df069eecSBram Moolenaardef Test_range_no_colon() 682df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 683df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 684df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 685df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 686df069eecSBram Moolenaarenddef 687df069eecSBram Moolenaar 688df069eecSBram Moolenaar 6898a7d6542SBram Moolenaardef Test_block() 6908a7d6542SBram Moolenaar let outer = 1 6918a7d6542SBram Moolenaar { 6928a7d6542SBram Moolenaar let inner = 2 6938a7d6542SBram Moolenaar assert_equal(1, outer) 6948a7d6542SBram Moolenaar assert_equal(2, inner) 6958a7d6542SBram Moolenaar } 6968a7d6542SBram Moolenaar assert_equal(1, outer) 6978a7d6542SBram Moolenaarenddef 6988a7d6542SBram Moolenaar 6998a7d6542SBram Moolenaarfunc Test_block_failure() 7008a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 701585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 702585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 7038a7d6542SBram Moolenaarendfunc 7048a7d6542SBram Moolenaar 705585fea7bSBram Moolenaardef Test_cmd_modifier() 706585fea7bSBram Moolenaar tab echo '0' 707585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 708585fea7bSBram Moolenaarenddef 709585fea7bSBram Moolenaar 710d032f34aSBram Moolenaarfunc g:NoSuchFunc() 711d032f34aSBram Moolenaar echo 'none' 712d032f34aSBram Moolenaarendfunc 713d032f34aSBram Moolenaar 7148a7d6542SBram Moolenaardef Test_try_catch() 7158a7d6542SBram Moolenaar let l = [] 7167a092245SBram Moolenaar try # comment 7178a7d6542SBram Moolenaar add(l, '1') 7188a7d6542SBram Moolenaar throw 'wrong' 7198a7d6542SBram Moolenaar add(l, '2') 7207a092245SBram Moolenaar catch # comment 7218a7d6542SBram Moolenaar add(l, v:exception) 7227a092245SBram Moolenaar finally # comment 7238a7d6542SBram Moolenaar add(l, '3') 7247a092245SBram Moolenaar endtry # comment 7258a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 72668d130c6SBram Moolenaar 727e859312eSBram Moolenaar l = [] 728e859312eSBram Moolenaar try 729e859312eSBram Moolenaar try 730e859312eSBram Moolenaar add(l, '1') 731e859312eSBram Moolenaar throw 'wrong' 732e859312eSBram Moolenaar add(l, '2') 733e859312eSBram Moolenaar catch /right/ 734e859312eSBram Moolenaar add(l, v:exception) 735e859312eSBram Moolenaar endtry 736e859312eSBram Moolenaar catch /wrong/ 737e859312eSBram Moolenaar add(l, 'caught') 738e859312eSBram Moolenaar finally 739e859312eSBram Moolenaar add(l, 'finally') 740e859312eSBram Moolenaar endtry 741e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 742e859312eSBram Moolenaar 74368d130c6SBram Moolenaar let n: number 74468d130c6SBram Moolenaar try 74568d130c6SBram Moolenaar n = l[3] 74668d130c6SBram Moolenaar catch /E684:/ 74768d130c6SBram Moolenaar n = 99 74868d130c6SBram Moolenaar endtry 74968d130c6SBram Moolenaar assert_equal(99, n) 75068d130c6SBram Moolenaar 75168d130c6SBram Moolenaar try 75268d130c6SBram Moolenaar n = g:astring[3] 75368d130c6SBram Moolenaar catch /E714:/ 75468d130c6SBram Moolenaar n = 77 75568d130c6SBram Moolenaar endtry 75668d130c6SBram Moolenaar assert_equal(77, n) 75768d130c6SBram Moolenaar 75868d130c6SBram Moolenaar try 75968d130c6SBram Moolenaar n = l[g:astring] 76068d130c6SBram Moolenaar catch /E39:/ 76168d130c6SBram Moolenaar n = 77 76268d130c6SBram Moolenaar endtry 76368d130c6SBram Moolenaar assert_equal(77, n) 76468d130c6SBram Moolenaar 76568d130c6SBram Moolenaar try 76668d130c6SBram Moolenaar n = s:does_not_exist 76768d130c6SBram Moolenaar catch /E121:/ 768f0b9f43cSBram Moolenaar n = 111 769f0b9f43cSBram Moolenaar endtry 770f0b9f43cSBram Moolenaar assert_equal(111, n) 771f0b9f43cSBram Moolenaar 772f0b9f43cSBram Moolenaar try 773f0b9f43cSBram Moolenaar n = g:does_not_exist 774f0b9f43cSBram Moolenaar catch /E121:/ 77568d130c6SBram Moolenaar n = 121 77668d130c6SBram Moolenaar endtry 77768d130c6SBram Moolenaar assert_equal(121, n) 77868d130c6SBram Moolenaar 77968d130c6SBram Moolenaar let d = #{one: 1} 78068d130c6SBram Moolenaar try 78168d130c6SBram Moolenaar n = d[g:astring] 78268d130c6SBram Moolenaar catch /E716:/ 78368d130c6SBram Moolenaar n = 222 78468d130c6SBram Moolenaar endtry 78568d130c6SBram Moolenaar assert_equal(222, n) 786f0b9f43cSBram Moolenaar 787f0b9f43cSBram Moolenaar try 788f0b9f43cSBram Moolenaar n = -g:astring 789f0b9f43cSBram Moolenaar catch /E39:/ 790f0b9f43cSBram Moolenaar n = 233 791f0b9f43cSBram Moolenaar endtry 792f0b9f43cSBram Moolenaar assert_equal(233, n) 793f0b9f43cSBram Moolenaar 794f0b9f43cSBram Moolenaar try 795f0b9f43cSBram Moolenaar n = +g:astring 796f0b9f43cSBram Moolenaar catch /E1030:/ 797f0b9f43cSBram Moolenaar n = 244 798f0b9f43cSBram Moolenaar endtry 799f0b9f43cSBram Moolenaar assert_equal(244, n) 800f0b9f43cSBram Moolenaar 801f0b9f43cSBram Moolenaar try 802f0b9f43cSBram Moolenaar n = +g:alist 803f0b9f43cSBram Moolenaar catch /E745:/ 804f0b9f43cSBram Moolenaar n = 255 805f0b9f43cSBram Moolenaar endtry 806f0b9f43cSBram Moolenaar assert_equal(255, n) 807f0b9f43cSBram Moolenaar 808f0b9f43cSBram Moolenaar let nd: dict<any> 809f0b9f43cSBram Moolenaar try 810f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 811f0b9f43cSBram Moolenaar catch /E1029:/ 812f0b9f43cSBram Moolenaar n = 266 813f0b9f43cSBram Moolenaar endtry 814f0b9f43cSBram Moolenaar assert_equal(266, n) 815f0b9f43cSBram Moolenaar 816f0b9f43cSBram Moolenaar try 817f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 818f0b9f43cSBram Moolenaar catch /E1093:/ 819f0b9f43cSBram Moolenaar n = 277 820f0b9f43cSBram Moolenaar endtry 821f0b9f43cSBram Moolenaar assert_equal(277, n) 822f0b9f43cSBram Moolenaar 823e859312eSBram Moolenaar try 824e859312eSBram Moolenaar &ts = g:astring 825e859312eSBram Moolenaar catch /E1029:/ 826e859312eSBram Moolenaar n = 288 827e859312eSBram Moolenaar endtry 828e859312eSBram Moolenaar assert_equal(288, n) 829e859312eSBram Moolenaar 830e859312eSBram Moolenaar try 831e859312eSBram Moolenaar &backspace = 'asdf' 832e859312eSBram Moolenaar catch /E474:/ 833e859312eSBram Moolenaar n = 299 834e859312eSBram Moolenaar endtry 835e859312eSBram Moolenaar assert_equal(299, n) 836e859312eSBram Moolenaar 837e859312eSBram Moolenaar l = [1] 838e859312eSBram Moolenaar try 839e859312eSBram Moolenaar l[3] = 3 840e859312eSBram Moolenaar catch /E684:/ 841e859312eSBram Moolenaar n = 300 842e859312eSBram Moolenaar endtry 843e859312eSBram Moolenaar assert_equal(300, n) 844e859312eSBram Moolenaar 845e859312eSBram Moolenaar try 846e859312eSBram Moolenaar unlet g:does_not_exist 847e859312eSBram Moolenaar catch /E108:/ 848e859312eSBram Moolenaar n = 322 849e859312eSBram Moolenaar endtry 850e859312eSBram Moolenaar assert_equal(322, n) 851e859312eSBram Moolenaar 852e859312eSBram Moolenaar try 853e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 854e859312eSBram Moolenaar catch /E721:/ 855e859312eSBram Moolenaar n = 333 856e859312eSBram Moolenaar endtry 857e859312eSBram Moolenaar assert_equal(333, n) 858e859312eSBram Moolenaar 859e859312eSBram Moolenaar try 860e859312eSBram Moolenaar l = DeletedFunc() 861e859312eSBram Moolenaar catch /E933:/ 862e859312eSBram Moolenaar n = 344 863e859312eSBram Moolenaar endtry 864e859312eSBram Moolenaar assert_equal(344, n) 865d032f34aSBram Moolenaar 866d032f34aSBram Moolenaar try 867d032f34aSBram Moolenaar echo len(v:true) 868d032f34aSBram Moolenaar catch /E701:/ 869d032f34aSBram Moolenaar n = 355 870d032f34aSBram Moolenaar endtry 871d032f34aSBram Moolenaar assert_equal(355, n) 872d032f34aSBram Moolenaar 873d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 874d032f34aSBram Moolenaar delfunc g:NoSuchFunc 875d032f34aSBram Moolenaar try 876d032f34aSBram Moolenaar echo P() 877d032f34aSBram Moolenaar catch /E117:/ 878d032f34aSBram Moolenaar n = 366 879d032f34aSBram Moolenaar endtry 880d032f34aSBram Moolenaar assert_equal(366, n) 881d032f34aSBram Moolenaar 882d032f34aSBram Moolenaar try 883d032f34aSBram Moolenaar echo g:NoSuchFunc() 884d032f34aSBram Moolenaar catch /E117:/ 885d032f34aSBram Moolenaar n = 377 886d032f34aSBram Moolenaar endtry 887d032f34aSBram Moolenaar assert_equal(377, n) 888d032f34aSBram Moolenaar 889d032f34aSBram Moolenaar try 890d032f34aSBram Moolenaar echo g:alist + 4 891d032f34aSBram Moolenaar catch /E745:/ 892d032f34aSBram Moolenaar n = 388 893d032f34aSBram Moolenaar endtry 894d032f34aSBram Moolenaar assert_equal(388, n) 895d032f34aSBram Moolenaar 896d032f34aSBram Moolenaar try 897d032f34aSBram Moolenaar echo 4 + g:alist 898d032f34aSBram Moolenaar catch /E745:/ 899d032f34aSBram Moolenaar n = 399 900d032f34aSBram Moolenaar endtry 901d032f34aSBram Moolenaar assert_equal(399, n) 902d032f34aSBram Moolenaar 903d032f34aSBram Moolenaar try 904d032f34aSBram Moolenaar echo g:alist.member 905d032f34aSBram Moolenaar catch /E715:/ 906d032f34aSBram Moolenaar n = 400 907d032f34aSBram Moolenaar endtry 908d032f34aSBram Moolenaar assert_equal(400, n) 909d032f34aSBram Moolenaar 910d032f34aSBram Moolenaar try 911d032f34aSBram Moolenaar echo d.member 912d032f34aSBram Moolenaar catch /E716:/ 913d032f34aSBram Moolenaar n = 411 914d032f34aSBram Moolenaar endtry 915d032f34aSBram Moolenaar assert_equal(411, n) 9168a7d6542SBram Moolenaarenddef 9178a7d6542SBram Moolenaar 918e859312eSBram Moolenaardef DeletedFunc(): list<any> 919e859312eSBram Moolenaar return ['delete me'] 920e859312eSBram Moolenaarenddef 921e859312eSBram Moolenaardefcompile 922e859312eSBram Moolenaardelfunc DeletedFunc 923e859312eSBram Moolenaar 924257cc5eeSBram Moolenaardef ThrowFromDef() 925a72cfb80SBram Moolenaar throw "getout" # comment 926257cc5eeSBram Moolenaarenddef 927257cc5eeSBram Moolenaar 928257cc5eeSBram Moolenaarfunc CatchInFunc() 929257cc5eeSBram Moolenaar try 930257cc5eeSBram Moolenaar call ThrowFromDef() 931257cc5eeSBram Moolenaar catch 932257cc5eeSBram Moolenaar let g:thrown_func = v:exception 933257cc5eeSBram Moolenaar endtry 934257cc5eeSBram Moolenaarendfunc 935257cc5eeSBram Moolenaar 936257cc5eeSBram Moolenaardef CatchInDef() 937257cc5eeSBram Moolenaar try 938257cc5eeSBram Moolenaar ThrowFromDef() 939257cc5eeSBram Moolenaar catch 940257cc5eeSBram Moolenaar g:thrown_def = v:exception 941257cc5eeSBram Moolenaar endtry 942257cc5eeSBram Moolenaarenddef 943257cc5eeSBram Moolenaar 944f575adffSBram Moolenaardef ReturnFinally(): string 945f575adffSBram Moolenaar try 946f575adffSBram Moolenaar return 'intry' 947f575adffSBram Moolenaar finally 948f575adffSBram Moolenaar g:in_finally = 'finally' 949f575adffSBram Moolenaar endtry 950f575adffSBram Moolenaar return 'end' 951f575adffSBram Moolenaarenddef 952f575adffSBram Moolenaar 953257cc5eeSBram Moolenaardef Test_try_catch_nested() 954257cc5eeSBram Moolenaar CatchInFunc() 955257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 956257cc5eeSBram Moolenaar 957257cc5eeSBram Moolenaar CatchInDef() 958257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 959f575adffSBram Moolenaar 960f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 961f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 962f575adffSBram Moolenaarenddef 963f575adffSBram Moolenaar 964f575adffSBram Moolenaardef Test_try_catch_match() 965f575adffSBram Moolenaar let seq = 'a' 966f575adffSBram Moolenaar try 967f575adffSBram Moolenaar throw 'something' 968f575adffSBram Moolenaar catch /nothing/ 969f575adffSBram Moolenaar seq ..= 'x' 970f575adffSBram Moolenaar catch /some/ 971f575adffSBram Moolenaar seq ..= 'b' 972f575adffSBram Moolenaar catch /asdf/ 973f575adffSBram Moolenaar seq ..= 'x' 974e8c4abbbSBram Moolenaar catch ?a\?sdf? 975e8c4abbbSBram Moolenaar seq ..= 'y' 976f575adffSBram Moolenaar finally 977f575adffSBram Moolenaar seq ..= 'c' 978f575adffSBram Moolenaar endtry 979f575adffSBram Moolenaar assert_equal('abc', seq) 980257cc5eeSBram Moolenaarenddef 981257cc5eeSBram Moolenaar 982e8c4abbbSBram Moolenaardef Test_try_catch_fails() 983e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 984e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 985e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 986585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 987585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 988585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 989585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 990585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 991585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 992585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 993585fea7bSBram Moolenaar 994a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 995585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 996e8c4abbbSBram Moolenaarenddef 997e8c4abbbSBram Moolenaar 998006ad48bSBram Moolenaardef Test_throw_vimscript() 999f5be8cdbSBram Moolenaar # only checks line continuation 1000006ad48bSBram Moolenaar let lines =<< trim END 1001006ad48bSBram Moolenaar vim9script 1002006ad48bSBram Moolenaar try 1003006ad48bSBram Moolenaar throw 'one' 1004006ad48bSBram Moolenaar .. 'two' 1005006ad48bSBram Moolenaar catch 1006006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 1007006ad48bSBram Moolenaar endtry 1008006ad48bSBram Moolenaar END 1009006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1010006ad48bSBram Moolenaarenddef 1011006ad48bSBram Moolenaar 101237c83711SBram Moolenaardef Test_cexpr_vimscript() 1013f5be8cdbSBram Moolenaar # only checks line continuation 101437c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 101537c83711SBram Moolenaar let lines =<< trim END 101637c83711SBram Moolenaar vim9script 101737c83711SBram Moolenaar cexpr 'File' 101837c83711SBram Moolenaar .. ' someFile' .. 101937c83711SBram Moolenaar ' line 19' 102037c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 102137c83711SBram Moolenaar END 102237c83711SBram Moolenaar CheckScriptSuccess(lines) 102337c83711SBram Moolenaar set errorformat& 102437c83711SBram Moolenaarenddef 102537c83711SBram Moolenaar 1026b209750bSBram Moolenaardef Test_list_vimscript() 1027b209750bSBram Moolenaar # checks line continuation and comments 1028b209750bSBram Moolenaar let lines =<< trim END 1029b209750bSBram Moolenaar vim9script 1030b209750bSBram Moolenaar let mylist = [ 1031b209750bSBram Moolenaar 'one', 1032b209750bSBram Moolenaar # comment 1033b209750bSBram Moolenaar 'two', # empty line follows 1034b209750bSBram Moolenaar 1035b209750bSBram Moolenaar 'three', 1036b209750bSBram Moolenaar ] 1037b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1038b209750bSBram Moolenaar END 1039b209750bSBram Moolenaar CheckScriptSuccess(lines) 1040b209750bSBram Moolenaarenddef 1041b209750bSBram Moolenaar 10422a1381c3SBram Moolenaarif has('channel') 104340ee466cSBram Moolenaar let someJob = test_null_job() 104440ee466cSBram Moolenaar 104540ee466cSBram Moolenaar def FuncWithError() 104640ee466cSBram Moolenaar echomsg g:someJob 104740ee466cSBram Moolenaar enddef 104840ee466cSBram Moolenaar 104940ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 105040ee466cSBram Moolenaar try 105140ee466cSBram Moolenaar call FuncWithError() 105240ee466cSBram Moolenaar catch 105340ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 105440ee466cSBram Moolenaar endtry 105540ee466cSBram Moolenaar endfunc 10562a1381c3SBram Moolenaarendif 105740ee466cSBram Moolenaar 10588a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10598a7d6542SBram Moolenaar vim9script 10608a7d6542SBram Moolenaar let name: string = 'bob' 10618a7d6542SBram Moolenaar def Concat(arg: string): string 10628a7d6542SBram Moolenaar return name .. arg 10638a7d6542SBram Moolenaar enddef 1064227a69deSBram Moolenaar g:result = Concat('bie') 1065227a69deSBram Moolenaar g:localname = name 10668a7d6542SBram Moolenaar 10678a7d6542SBram Moolenaar export const CONST = 1234 10688a7d6542SBram Moolenaar export let exported = 9876 10696e587dcbSBram Moolenaar export let exp_name = 'John' 10708a7d6542SBram Moolenaar export def Exported(): string 10718a7d6542SBram Moolenaar return 'Exported' 10728a7d6542SBram Moolenaar enddef 10738a7d6542SBram MoolenaarEND 10748a7d6542SBram Moolenaar 10755269bd2aSBram Moolenaardef Test_vim9_import_export() 10768a7d6542SBram Moolenaar let import_script_lines =<< trim END 10778a7d6542SBram Moolenaar vim9script 10788a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 10798a7d6542SBram Moolenaar g:imported = exported 10806e587dcbSBram Moolenaar exported += 3 10816e587dcbSBram Moolenaar g:imported_added = exported 10828a7d6542SBram Moolenaar g:imported_func = Exported() 10836e587dcbSBram Moolenaar 108440f4f7a4SBram Moolenaar def GetExported(): string 108540f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 108640f4f7a4SBram Moolenaar return local_dict.ref() 108740f4f7a4SBram Moolenaar enddef 108840f4f7a4SBram Moolenaar g:funcref_result = GetExported() 108940f4f7a4SBram Moolenaar 10906e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 10916e587dcbSBram Moolenaar g:imported_name = exp_name 10926e587dcbSBram Moolenaar exp_name ..= ' Doe' 10936e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10945381c7a1SBram Moolenaar g:imported_later = exported 10958a7d6542SBram Moolenaar END 10968a7d6542SBram Moolenaar 10978a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 10988a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 10998a7d6542SBram Moolenaar 11008a7d6542SBram Moolenaar source Ximport.vim 11018a7d6542SBram Moolenaar 11028a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11038a7d6542SBram Moolenaar assert_equal('bob', g:localname) 11048a7d6542SBram Moolenaar assert_equal(9876, g:imported) 11056e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 11065381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 11078a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 110840f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11096e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11106e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11118a7d6542SBram Moolenaar assert_false(exists('g:name')) 11128a7d6542SBram Moolenaar 11138a7d6542SBram Moolenaar unlet g:result 11148a7d6542SBram Moolenaar unlet g:localname 11158a7d6542SBram Moolenaar unlet g:imported 11166e587dcbSBram Moolenaar unlet g:imported_added 11175381c7a1SBram Moolenaar unlet g:imported_later 11188a7d6542SBram Moolenaar unlet g:imported_func 11196e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11208a7d6542SBram Moolenaar delete('Ximport.vim') 1121f2d5c240SBram Moolenaar 11221c991144SBram Moolenaar # similar, with line breaks 11231c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11241c991144SBram Moolenaar vim9script 11251c991144SBram Moolenaar import { 11261c991144SBram Moolenaar exported, 11271c991144SBram Moolenaar Exported, 11281c991144SBram Moolenaar } 11291c991144SBram Moolenaar from 11301c991144SBram Moolenaar './Xexport.vim' 11311c991144SBram Moolenaar g:imported = exported 11321c991144SBram Moolenaar exported += 5 11331c991144SBram Moolenaar g:imported_added = exported 11341c991144SBram Moolenaar g:imported_func = Exported() 11351c991144SBram Moolenaar END 11361c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11371c991144SBram Moolenaar source Ximport_lbr.vim 11381c991144SBram Moolenaar 11391c991144SBram Moolenaar assert_equal(9876, g:imported) 11401c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11411c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11421c991144SBram Moolenaar 11431c991144SBram Moolenaar # exported script not sourced again 11441c991144SBram Moolenaar assert_false(exists('g:result')) 11451c991144SBram Moolenaar unlet g:imported 11461c991144SBram Moolenaar unlet g:imported_added 11471c991144SBram Moolenaar unlet g:imported_func 11481c991144SBram Moolenaar delete('Ximport_lbr.vim') 11491c991144SBram Moolenaar 11501c991144SBram Moolenaar # import inside :def function 11515381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 11525381c7a1SBram Moolenaar vim9script 11535381c7a1SBram Moolenaar def ImportInDef() 11545381c7a1SBram Moolenaar import exported from './Xexport.vim' 11555381c7a1SBram Moolenaar g:imported = exported 11565381c7a1SBram Moolenaar exported += 7 11575381c7a1SBram Moolenaar g:imported_added = exported 11585381c7a1SBram Moolenaar enddef 11595381c7a1SBram Moolenaar ImportInDef() 11605381c7a1SBram Moolenaar END 11615381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11625381c7a1SBram Moolenaar source Ximport2.vim 1163f5be8cdbSBram Moolenaar # TODO: this should be 9879 11645381c7a1SBram Moolenaar assert_equal(9876, g:imported) 11655381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 11665381c7a1SBram Moolenaar unlet g:imported 11675381c7a1SBram Moolenaar unlet g:imported_added 11685381c7a1SBram Moolenaar delete('Ximport2.vim') 11695381c7a1SBram Moolenaar 1170f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1171f2d5c240SBram Moolenaar vim9script 1172f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1173f2d5c240SBram Moolenaar def UseExport() 1174f2d5c240SBram Moolenaar g:imported = Export.exported 1175f2d5c240SBram Moolenaar enddef 1176f2d5c240SBram Moolenaar UseExport() 1177f2d5c240SBram Moolenaar END 1178f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1179f2d5c240SBram Moolenaar source Ximport.vim 11805381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1181f2d5c240SBram Moolenaar 1182599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1183599c89c8SBram Moolenaar vim9script 1184599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1185599c89c8SBram Moolenaar def Func() 1186599c89c8SBram Moolenaar let dummy = 1 1187599c89c8SBram Moolenaar let imported = Export + dummy 1188599c89c8SBram Moolenaar enddef 1189822ba247SBram Moolenaar defcompile 1190599c89c8SBram Moolenaar END 1191599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1192599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1193599c89c8SBram Moolenaar 1194599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1195599c89c8SBram Moolenaar vim9script 1196599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1197599c89c8SBram Moolenaar def Func() 1198599c89c8SBram Moolenaar let imported = Export . exported 1199599c89c8SBram Moolenaar enddef 1200822ba247SBram Moolenaar defcompile 1201599c89c8SBram Moolenaar END 1202599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1203599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1204599c89c8SBram Moolenaar 1205599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1206599c89c8SBram Moolenaar vim9script 1207599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1208599c89c8SBram Moolenaar def Func() 1209599c89c8SBram Moolenaar let imported = Export. 1210599c89c8SBram Moolenaar enddef 1211822ba247SBram Moolenaar defcompile 1212599c89c8SBram Moolenaar END 1213599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1214599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1215599c89c8SBram Moolenaar 12161c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12171c991144SBram Moolenaar vim9script 12181c991144SBram Moolenaar import * 12191c991144SBram Moolenaar as Export 12201c991144SBram Moolenaar from 12211c991144SBram Moolenaar './Xexport.vim' 12221c991144SBram Moolenaar def UseExport() 12231c991144SBram Moolenaar g:imported = Export.exported 12241c991144SBram Moolenaar enddef 12251c991144SBram Moolenaar UseExport() 12261c991144SBram Moolenaar END 12271c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12281c991144SBram Moolenaar source Ximport.vim 12291c991144SBram Moolenaar assert_equal(9883, g:imported) 12301c991144SBram Moolenaar 1231f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1232f2d5c240SBram Moolenaar vim9script 1233f2d5c240SBram Moolenaar import * from './Xexport.vim' 1234f2d5c240SBram Moolenaar END 1235f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1236f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1237f2d5c240SBram Moolenaar 1238f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1239fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1240fa29c8abSBram Moolenaar vim9script 1241fa29c8abSBram Moolenaar import name from './Xexport.vim' 1242fa29c8abSBram Moolenaar END 1243fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1244fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1245fa29c8abSBram Moolenaar 1246f5be8cdbSBram Moolenaar # try to import something that is already defined 12475269bd2aSBram Moolenaar let import_already_defined =<< trim END 12485269bd2aSBram Moolenaar vim9script 12495269bd2aSBram Moolenaar let exported = 'something' 12505269bd2aSBram Moolenaar import exported from './Xexport.vim' 12515269bd2aSBram Moolenaar END 12525269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12535269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12545269bd2aSBram Moolenaar 1255f5be8cdbSBram Moolenaar # try to import something that is already defined 12565269bd2aSBram Moolenaar import_already_defined =<< trim END 12575269bd2aSBram Moolenaar vim9script 12585269bd2aSBram Moolenaar let exported = 'something' 12595269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 12605269bd2aSBram Moolenaar END 12615269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12625269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12635269bd2aSBram Moolenaar 1264f5be8cdbSBram Moolenaar # try to import something that is already defined 12655269bd2aSBram Moolenaar import_already_defined =<< trim END 12665269bd2aSBram Moolenaar vim9script 12675269bd2aSBram Moolenaar let exported = 'something' 12685269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 12695269bd2aSBram Moolenaar END 12705269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12715269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12725269bd2aSBram Moolenaar 1273f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1274fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1275fa29c8abSBram Moolenaar vim9script 1276fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1277fa29c8abSBram Moolenaar END 1278fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1279fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1280fa29c8abSBram Moolenaar 1281fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1282fa29c8abSBram Moolenaar vim9script 1283fa29c8abSBram Moolenaar import name './Xexport.vim' 1284fa29c8abSBram Moolenaar END 1285fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1286fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1287fa29c8abSBram Moolenaar 1288fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1289fa29c8abSBram Moolenaar vim9script 1290fa29c8abSBram Moolenaar import name from Xexport.vim 1291fa29c8abSBram Moolenaar END 1292fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1293fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1294fa29c8abSBram Moolenaar 1295fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1296fa29c8abSBram Moolenaar vim9script 1297fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1298fa29c8abSBram Moolenaar END 1299fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1300fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1301fa29c8abSBram Moolenaar 1302fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1303fa29c8abSBram Moolenaar vim9script 1304fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1305fa29c8abSBram Moolenaar END 13065269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 13075269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1308fa29c8abSBram Moolenaar 1309f2d5c240SBram Moolenaar delete('Ximport.vim') 13105269bd2aSBram Moolenaar delete('Ximport3.vim') 13118a7d6542SBram Moolenaar delete('Xexport.vim') 13128a7d6542SBram Moolenaar 1313f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1314750802b5SBram Moolenaar set cpo&vi 1315750802b5SBram Moolenaar let cpo_before = &cpo 1316750802b5SBram Moolenaar let lines =<< trim END 1317750802b5SBram Moolenaar vim9script 1318750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1319750802b5SBram Moolenaar END 1320750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1321750802b5SBram Moolenaar source Xvim9_script 1322750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1323750802b5SBram Moolenaar set cpo&vim 1324750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1325750802b5SBram Moolenaar delete('Xvim9_script') 1326750802b5SBram Moolenaarenddef 1327750802b5SBram Moolenaar 1328750802b5SBram Moolenaardef Test_vim9script_fails() 13298a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 13308a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1331750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 13329721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 13339b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1334750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1335750802b5SBram Moolenaar 1336c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1337c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1338c785b9a7SBram Moolenaar 1339750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1340a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 13418a7d6542SBram Moolenaarenddef 13428a7d6542SBram Moolenaar 1343f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1344101f4810SBram Moolenaar CheckRunVimInTerminal 1345101f4810SBram Moolenaar 13469bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1347c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13489bb3eb3eSBram Moolenaarendfunc 13499bb3eb3eSBram Moolenaar 1350c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1351101f4810SBram Moolenaar let export =<< trim END 1352101f4810SBram Moolenaar vim9script 1353101f4810SBram Moolenaar export def Foo(): number 1354101f4810SBram Moolenaar return 0 1355101f4810SBram Moolenaar enddef 1356101f4810SBram Moolenaar END 13579bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1358101f4810SBram Moolenaar 13599bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 13609bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13619bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1362101f4810SBram Moolenaar 13639bb3eb3eSBram Moolenaar delete('Xexport.vim') 13649bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13659bb3eb3eSBram Moolenaarenddef 1366101f4810SBram Moolenaar 13674c17ad94SBram Moolenaardef Test_vim9script_reload_import() 13688a7d6542SBram Moolenaar let lines =<< trim END 13698a7d6542SBram Moolenaar vim9script 13708a7d6542SBram Moolenaar const var = '' 13718a7d6542SBram Moolenaar let valone = 1234 13728a7d6542SBram Moolenaar def MyFunc(arg: string) 13738a7d6542SBram Moolenaar valone = 5678 13748a7d6542SBram Moolenaar enddef 13758a7d6542SBram Moolenaar END 13768a7d6542SBram Moolenaar let morelines =<< trim END 13778a7d6542SBram Moolenaar let valtwo = 222 13788a7d6542SBram Moolenaar export def GetValtwo(): number 13798a7d6542SBram Moolenaar return valtwo 13808a7d6542SBram Moolenaar enddef 13818a7d6542SBram Moolenaar END 138203afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13838a7d6542SBram Moolenaar source Xreload.vim 13848a7d6542SBram Moolenaar source Xreload.vim 13858a7d6542SBram Moolenaar source Xreload.vim 13868a7d6542SBram Moolenaar 13878a7d6542SBram Moolenaar let testlines =<< trim END 13888a7d6542SBram Moolenaar vim9script 13898a7d6542SBram Moolenaar def TheFunc() 13908a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13918a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13928a7d6542SBram Moolenaar enddef 13938a7d6542SBram Moolenaar TheFunc() 13948a7d6542SBram Moolenaar END 13958a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 13968a7d6542SBram Moolenaar source Ximport.vim 13978a7d6542SBram Moolenaar 1398f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1399f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 14008a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14018a7d6542SBram Moolenaar source Ximport.vim 14028a7d6542SBram Moolenaar 1403f5be8cdbSBram Moolenaar # cannot declare a var twice 14048a7d6542SBram Moolenaar lines =<< trim END 14058a7d6542SBram Moolenaar vim9script 14068a7d6542SBram Moolenaar let valone = 1234 14078a7d6542SBram Moolenaar let valone = 5678 14088a7d6542SBram Moolenaar END 14098a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14108a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 14118a7d6542SBram Moolenaar 14128a7d6542SBram Moolenaar delete('Xreload.vim') 14138a7d6542SBram Moolenaar delete('Ximport.vim') 14148a7d6542SBram Moolenaarenddef 14158a7d6542SBram Moolenaar 1416fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1417fe465a01SBram Moolenaar" script-local name. 1418fe465a01SBram Moolenaardef Test_vim9script_funcref() 1419fe465a01SBram Moolenaar let sortlines =<< trim END 1420fe465a01SBram Moolenaar vim9script 1421fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1422bed36b93SBram Moolenaar return i2 - i1 1423fe465a01SBram Moolenaar enddef 1424fe465a01SBram Moolenaar 1425fe465a01SBram Moolenaar export def FastSort(): list<number> 1426fe465a01SBram Moolenaar return range(5)->sort(Compare) 1427fe465a01SBram Moolenaar enddef 1428fe465a01SBram Moolenaar END 1429fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1430fe465a01SBram Moolenaar 1431fe465a01SBram Moolenaar let lines =<< trim END 1432fe465a01SBram Moolenaar vim9script 1433fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1434fe465a01SBram Moolenaar def Test() 1435fe465a01SBram Moolenaar g:result = FastSort() 1436fe465a01SBram Moolenaar enddef 1437fe465a01SBram Moolenaar Test() 1438fe465a01SBram Moolenaar END 1439fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1440fe465a01SBram Moolenaar 1441fe465a01SBram Moolenaar source Xscript.vim 1442fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1443fe465a01SBram Moolenaar 1444fe465a01SBram Moolenaar unlet g:result 1445fe465a01SBram Moolenaar delete('Xsort.vim') 1446fe465a01SBram Moolenaar delete('Xscript.vim') 1447fe465a01SBram Moolenaarenddef 1448fe465a01SBram Moolenaar 1449c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1450c620c055SBram Moolenaar" script where FastFilter() is called from. 1451c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1452c620c055SBram Moolenaar let filterLines =<< trim END 1453c620c055SBram Moolenaar vim9script 1454c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1455c620c055SBram Moolenaar return idx % 2 == 1 1456c620c055SBram Moolenaar enddef 1457c620c055SBram Moolenaar export def FastFilter(): list<number> 1458c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1459c620c055SBram Moolenaar enddef 1460c620c055SBram Moolenaar END 1461c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1462c620c055SBram Moolenaar 1463c620c055SBram Moolenaar let lines =<< trim END 1464c620c055SBram Moolenaar vim9script 1465c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1466c620c055SBram Moolenaar def Test() 1467c620c055SBram Moolenaar let x: list<number> = FastFilter() 1468c620c055SBram Moolenaar enddef 1469c620c055SBram Moolenaar Test() 1470c620c055SBram Moolenaar END 1471c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1472c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1473c620c055SBram Moolenaar 1474c620c055SBram Moolenaar delete('Xfilter.vim') 1475c620c055SBram Moolenaar delete('Ximport.vim') 1476c620c055SBram Moolenaarenddef 1477c620c055SBram Moolenaar 14784c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 14794c17ad94SBram Moolenaar let first_lines =<< trim END 14804c17ad94SBram Moolenaar vim9script 14814c17ad94SBram Moolenaar def FuncYes(): string 14824c17ad94SBram Moolenaar return 'yes' 14834c17ad94SBram Moolenaar enddef 14844c17ad94SBram Moolenaar END 148503afdcf1SBram Moolenaar let withno_lines =<< trim END 14864c17ad94SBram Moolenaar def FuncNo(): string 14874c17ad94SBram Moolenaar return 'no' 14884c17ad94SBram Moolenaar enddef 14894c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 14904c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 14914c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 149203afdcf1SBram Moolenaar enddef 149303afdcf1SBram Moolenaar END 149403afdcf1SBram Moolenaar let nono_lines =<< trim END 149503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 149603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 14974c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 14984c17ad94SBram Moolenaar enddef 14994c17ad94SBram Moolenaar END 15004c17ad94SBram Moolenaar 15014c17ad94SBram Moolenaar # FuncNo() is defined 150203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15034c17ad94SBram Moolenaar source Xreloaded.vim 15044c17ad94SBram Moolenaar g:DoCheck(true) 15054c17ad94SBram Moolenaar 15064c17ad94SBram Moolenaar # FuncNo() is not redefined 150703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 15084c17ad94SBram Moolenaar source Xreloaded.vim 150903afdcf1SBram Moolenaar g:DoCheck() 15104c17ad94SBram Moolenaar 15114c17ad94SBram Moolenaar # FuncNo() is back 151203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15134c17ad94SBram Moolenaar source Xreloaded.vim 151403afdcf1SBram Moolenaar g:DoCheck() 15154c17ad94SBram Moolenaar 15164c17ad94SBram Moolenaar delete('Xreloaded.vim') 15174c17ad94SBram Moolenaarenddef 15184c17ad94SBram Moolenaar 151989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 152089483d40SBram Moolenaar # write the script with a script-local variable 152189483d40SBram Moolenaar let lines =<< trim END 152289483d40SBram Moolenaar vim9script 152389483d40SBram Moolenaar let var = 'string' 152489483d40SBram Moolenaar END 152589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 152689483d40SBram Moolenaar source XreloadVar.vim 152789483d40SBram Moolenaar 152889483d40SBram Moolenaar # now write the script using the same variable locally - works 152989483d40SBram Moolenaar lines =<< trim END 153089483d40SBram Moolenaar vim9script 153189483d40SBram Moolenaar def Func() 153289483d40SBram Moolenaar let var = 'string' 153389483d40SBram Moolenaar enddef 153489483d40SBram Moolenaar END 153589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 153689483d40SBram Moolenaar source XreloadVar.vim 153789483d40SBram Moolenaar 153889483d40SBram Moolenaar delete('XreloadVar.vim') 153989483d40SBram Moolenaarenddef 154089483d40SBram Moolenaar 15418a7d6542SBram Moolenaardef Test_import_absolute() 15428a7d6542SBram Moolenaar let import_lines = [ 1543e6085c53SBram Moolenaar 'vim9script', 1544e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1545e6085c53SBram Moolenaar 'def UseExported()', 1546e6085c53SBram Moolenaar ' g:imported_abs = exported', 1547e6085c53SBram Moolenaar ' exported = 8888', 1548e6085c53SBram Moolenaar ' g:imported_after = exported', 1549e6085c53SBram Moolenaar 'enddef', 1550e6085c53SBram Moolenaar 'UseExported()', 1551e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1552e6085c53SBram Moolenaar ] 15538a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15548a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15558a7d6542SBram Moolenaar 15568a7d6542SBram Moolenaar source Ximport_abs.vim 15578a7d6542SBram Moolenaar 15588a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 15594e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1560675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1561675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1562675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1563675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1564675f716eSBram Moolenaar 'exported = 8888.*' .. 1565675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1566675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1567675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1568675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1569e6085c53SBram Moolenaar g:import_disassembled) 15708a7d6542SBram Moolenaar unlet g:imported_abs 15714e12a5dfSBram Moolenaar unlet g:import_disassembled 15728a7d6542SBram Moolenaar 15738a7d6542SBram Moolenaar delete('Ximport_abs.vim') 15748a7d6542SBram Moolenaar delete('Xexport_abs.vim') 15758a7d6542SBram Moolenaarenddef 15768a7d6542SBram Moolenaar 15778a7d6542SBram Moolenaardef Test_import_rtp() 15788a7d6542SBram Moolenaar let import_lines = [ 1579e6085c53SBram Moolenaar 'vim9script', 1580e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1581e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1582e6085c53SBram Moolenaar ] 15838a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 15848a7d6542SBram Moolenaar mkdir('import') 15858a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 15868a7d6542SBram Moolenaar 15878a7d6542SBram Moolenaar let save_rtp = &rtp 15888a7d6542SBram Moolenaar &rtp = getcwd() 15898a7d6542SBram Moolenaar source Ximport_rtp.vim 15908a7d6542SBram Moolenaar &rtp = save_rtp 15918a7d6542SBram Moolenaar 15928a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 15938a7d6542SBram Moolenaar unlet g:imported_rtp 15948a7d6542SBram Moolenaar 15958a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 159689483d40SBram Moolenaar delete('import', 'rf') 15978a7d6542SBram Moolenaarenddef 15988a7d6542SBram Moolenaar 159925e0f586SBram Moolenaardef Test_import_compile_error() 160025e0f586SBram Moolenaar let export_lines = [ 160125e0f586SBram Moolenaar 'vim9script', 160225e0f586SBram Moolenaar 'export def ExpFunc(): string', 160325e0f586SBram Moolenaar ' return notDefined', 160425e0f586SBram Moolenaar 'enddef', 160525e0f586SBram Moolenaar ] 160625e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 160725e0f586SBram Moolenaar 160825e0f586SBram Moolenaar let import_lines = [ 160925e0f586SBram Moolenaar 'vim9script', 161025e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 161125e0f586SBram Moolenaar 'def ImpFunc()', 161225e0f586SBram Moolenaar ' echo ExpFunc()', 161325e0f586SBram Moolenaar 'enddef', 161425e0f586SBram Moolenaar 'defcompile', 161525e0f586SBram Moolenaar ] 161625e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 161725e0f586SBram Moolenaar 161825e0f586SBram Moolenaar try 161925e0f586SBram Moolenaar source Ximport.vim 162025e0f586SBram Moolenaar catch /E1001/ 1621f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 162225e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 162325e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 162425e0f586SBram Moolenaar endtry 162525e0f586SBram Moolenaar 162625e0f586SBram Moolenaar delete('Xexported.vim') 162725e0f586SBram Moolenaar delete('Ximport.vim') 162825e0f586SBram Moolenaarenddef 162925e0f586SBram Moolenaar 1630eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1631eef2102eSBram Moolenaar let export_lines =<< trim END 1632eef2102eSBram Moolenaar vim9script 1633eef2102eSBram Moolenaar export def Func() 1634eef2102eSBram Moolenaar echo 'imported' 1635eef2102eSBram Moolenaar enddef 1636eef2102eSBram Moolenaar END 1637eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1638eef2102eSBram Moolenaar 1639eef2102eSBram Moolenaar let lines =<< trim END 1640eef2102eSBram Moolenaar vim9script 1641eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1642eef2102eSBram Moolenaar def Func() 1643eef2102eSBram Moolenaar echo 'local to function' 1644eef2102eSBram Moolenaar enddef 1645eef2102eSBram Moolenaar END 1646eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1647eef2102eSBram Moolenaar 1648eef2102eSBram Moolenaar lines =<< trim END 1649eef2102eSBram Moolenaar vim9script 1650eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1651eef2102eSBram Moolenaar def Outer() 1652eef2102eSBram Moolenaar def Func() 1653eef2102eSBram Moolenaar echo 'local to function' 1654eef2102eSBram Moolenaar enddef 1655eef2102eSBram Moolenaar enddef 1656eef2102eSBram Moolenaar defcompile 1657eef2102eSBram Moolenaar END 1658eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1659eef2102eSBram Moolenaar 1660eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1661eef2102eSBram Moolenaarenddef 1662eef2102eSBram Moolenaar 1663b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1664b9a2cac3SBram Moolenaar let lines =<< trim END 1665b9a2cac3SBram Moolenaar vim9script 1666b9a2cac3SBram Moolenaar def Func() 1667b9a2cac3SBram Moolenaar echo 'one' 1668b9a2cac3SBram Moolenaar enddef 1669b9a2cac3SBram Moolenaar def Func() 1670b9a2cac3SBram Moolenaar echo 'two' 1671b9a2cac3SBram Moolenaar enddef 1672b9a2cac3SBram Moolenaar END 1673b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1674b9a2cac3SBram Moolenaarenddef 1675b9a2cac3SBram Moolenaar 16768a7d6542SBram Moolenaardef Test_fixed_size_list() 1677f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 16788a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 16798a7d6542SBram Moolenaar l->remove(0) 16808a7d6542SBram Moolenaar l->add(5) 16818a7d6542SBram Moolenaar l->insert(99, 1) 16820f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 16838a7d6542SBram Moolenaarenddef 16848a7d6542SBram Moolenaar 1685ae616494SBram Moolenaardef Test_no_insert_xit() 1686ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1687ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1688f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1689f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1690f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1691ae616494SBram Moolenaar 1692ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1693ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1694ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1695ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1696f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1697f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1698f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1699f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1700f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1701ae616494SBram Moolenaarenddef 1702ae616494SBram Moolenaar 1703158906cfSBram Moolenaardef IfElse(what: number): string 1704158906cfSBram Moolenaar let res = '' 1705158906cfSBram Moolenaar if what == 1 1706158906cfSBram Moolenaar res = "one" 1707158906cfSBram Moolenaar elseif what == 2 1708158906cfSBram Moolenaar res = "two" 1709a259d8d3SBram Moolenaar else 1710158906cfSBram Moolenaar res = "three" 1711a259d8d3SBram Moolenaar endif 1712158906cfSBram Moolenaar return res 1713a259d8d3SBram Moolenaarenddef 1714a259d8d3SBram Moolenaar 1715158906cfSBram Moolenaardef Test_if_elseif_else() 1716158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1717158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1718158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 17190f18b6d1SBram Moolenaarenddef 17200f18b6d1SBram Moolenaar 1721e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1722e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1723e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1724e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1725e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1726585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1727e8c4abbbSBram Moolenaarenddef 1728e8c4abbbSBram Moolenaar 17296d69bf60SBram Moolenaarlet g:bool_true = v:true 17306d69bf60SBram Moolenaarlet g:bool_false = v:false 17316d69bf60SBram Moolenaar 17326d69bf60SBram Moolenaardef Test_if_const_expr() 17336d69bf60SBram Moolenaar let res = false 17346d69bf60SBram Moolenaar if true ? true : false 17356d69bf60SBram Moolenaar res = true 17366d69bf60SBram Moolenaar endif 17376d69bf60SBram Moolenaar assert_equal(true, res) 17386d69bf60SBram Moolenaar 1739585fea7bSBram Moolenaar g:glob = 2 1740585fea7bSBram Moolenaar if false 17416797966dSBram Moolenaar execute('g:glob = 3') 1742585fea7bSBram Moolenaar endif 1743585fea7bSBram Moolenaar assert_equal(2, g:glob) 1744585fea7bSBram Moolenaar if true 17456797966dSBram Moolenaar execute('g:glob = 3') 1746585fea7bSBram Moolenaar endif 1747585fea7bSBram Moolenaar assert_equal(3, g:glob) 1748585fea7bSBram Moolenaar 17496d69bf60SBram Moolenaar res = false 17506d69bf60SBram Moolenaar if g:bool_true ? true : false 17516d69bf60SBram Moolenaar res = true 17526d69bf60SBram Moolenaar endif 17536d69bf60SBram Moolenaar assert_equal(true, res) 17546d69bf60SBram Moolenaar 17556d69bf60SBram Moolenaar res = false 17566d69bf60SBram Moolenaar if true ? g:bool_true : false 17576d69bf60SBram Moolenaar res = true 17586d69bf60SBram Moolenaar endif 17596d69bf60SBram Moolenaar assert_equal(true, res) 17606d69bf60SBram Moolenaar 17616d69bf60SBram Moolenaar res = false 17626d69bf60SBram Moolenaar if true ? true : g:bool_false 17636d69bf60SBram Moolenaar res = true 17646d69bf60SBram Moolenaar endif 17656d69bf60SBram Moolenaar assert_equal(true, res) 17666d69bf60SBram Moolenaar 17676d69bf60SBram Moolenaar res = false 17686d69bf60SBram Moolenaar if true ? false : true 17696d69bf60SBram Moolenaar res = true 17706d69bf60SBram Moolenaar endif 17716d69bf60SBram Moolenaar assert_equal(false, res) 17726d69bf60SBram Moolenaar 17736d69bf60SBram Moolenaar res = false 17746d69bf60SBram Moolenaar if false ? false : true 17756d69bf60SBram Moolenaar res = true 17766d69bf60SBram Moolenaar endif 17776d69bf60SBram Moolenaar assert_equal(true, res) 17786d69bf60SBram Moolenaar 17796d69bf60SBram Moolenaar res = false 17806d69bf60SBram Moolenaar if false ? true : false 17816d69bf60SBram Moolenaar res = true 17826d69bf60SBram Moolenaar endif 17836d69bf60SBram Moolenaar assert_equal(false, res) 17846d69bf60SBram Moolenaar 17856d69bf60SBram Moolenaar res = false 1786e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1787e8c4abbbSBram Moolenaar res = true 1788e8c4abbbSBram Moolenaar endif 1789e8c4abbbSBram Moolenaar assert_equal(false, res) 1790e8c4abbbSBram Moolenaar 1791e8c4abbbSBram Moolenaar res = false 17926d69bf60SBram Moolenaar if true && true 17936d69bf60SBram Moolenaar res = true 17946d69bf60SBram Moolenaar endif 17956d69bf60SBram Moolenaar assert_equal(true, res) 17966d69bf60SBram Moolenaar 17976d69bf60SBram Moolenaar res = false 17986d69bf60SBram Moolenaar if true && false 17996d69bf60SBram Moolenaar res = true 18006d69bf60SBram Moolenaar endif 18016d69bf60SBram Moolenaar assert_equal(false, res) 18026d69bf60SBram Moolenaar 18036d69bf60SBram Moolenaar res = false 18046d69bf60SBram Moolenaar if g:bool_true && false 18056d69bf60SBram Moolenaar res = true 18066d69bf60SBram Moolenaar endif 18076d69bf60SBram Moolenaar assert_equal(false, res) 18086d69bf60SBram Moolenaar 18096d69bf60SBram Moolenaar res = false 18106d69bf60SBram Moolenaar if true && g:bool_false 18116d69bf60SBram Moolenaar res = true 18126d69bf60SBram Moolenaar endif 18136d69bf60SBram Moolenaar assert_equal(false, res) 18146d69bf60SBram Moolenaar 18156d69bf60SBram Moolenaar res = false 18166d69bf60SBram Moolenaar if false && false 18176d69bf60SBram Moolenaar res = true 18186d69bf60SBram Moolenaar endif 18196d69bf60SBram Moolenaar assert_equal(false, res) 18206d69bf60SBram Moolenaar 18216d69bf60SBram Moolenaar res = false 18226d69bf60SBram Moolenaar if true || false 18236d69bf60SBram Moolenaar res = true 18246d69bf60SBram Moolenaar endif 18256d69bf60SBram Moolenaar assert_equal(true, res) 18266d69bf60SBram Moolenaar 18276d69bf60SBram Moolenaar res = false 18286d69bf60SBram Moolenaar if g:bool_true || false 18296d69bf60SBram Moolenaar res = true 18306d69bf60SBram Moolenaar endif 18316d69bf60SBram Moolenaar assert_equal(true, res) 18326d69bf60SBram Moolenaar 18336d69bf60SBram Moolenaar res = false 18346d69bf60SBram Moolenaar if true || g:bool_false 18356d69bf60SBram Moolenaar res = true 18366d69bf60SBram Moolenaar endif 18376d69bf60SBram Moolenaar assert_equal(true, res) 18386d69bf60SBram Moolenaar 18396d69bf60SBram Moolenaar res = false 18406d69bf60SBram Moolenaar if false || false 18416d69bf60SBram Moolenaar res = true 18426d69bf60SBram Moolenaar endif 18436d69bf60SBram Moolenaar assert_equal(false, res) 184480c34ca3SBram Moolenaarenddef 18456d69bf60SBram Moolenaar 184680c34ca3SBram Moolenaardef Test_if_const_expr_fails() 184780c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 184880c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1849e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1850e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 18516d69bf60SBram Moolenaarenddef 18526d69bf60SBram Moolenaar 185372abcf42SBram Moolenaardef RunNested(i: number): number 185472abcf42SBram Moolenaar let x: number = 0 185572abcf42SBram Moolenaar if i % 2 185672abcf42SBram Moolenaar if 1 1857f5be8cdbSBram Moolenaar # comment 185872abcf42SBram Moolenaar else 1859f5be8cdbSBram Moolenaar # comment 186072abcf42SBram Moolenaar endif 186172abcf42SBram Moolenaar x += 1 186272abcf42SBram Moolenaar else 186372abcf42SBram Moolenaar x += 1000 186472abcf42SBram Moolenaar endif 186572abcf42SBram Moolenaar return x 186672abcf42SBram Moolenaarenddef 186772abcf42SBram Moolenaar 186872abcf42SBram Moolenaardef Test_nested_if() 186972abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 187072abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 187172abcf42SBram Moolenaarenddef 187272abcf42SBram Moolenaar 1873ad39c094SBram Moolenaardef Test_execute_cmd() 1874ad39c094SBram Moolenaar new 1875ad39c094SBram Moolenaar setline(1, 'default') 1876ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1877ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1878a72cfb80SBram Moolenaar 1879a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1880a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1881a72cfb80SBram Moolenaar 1882ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1883ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1884a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1885ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1886a72cfb80SBram Moolenaar 1887ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1888ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1889a72cfb80SBram Moolenaar 1890ad39c094SBram Moolenaar let cmd_first = 'call ' 1891ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1892ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1893ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1894ad39c094SBram Moolenaar bwipe! 1895585fea7bSBram Moolenaar 18962d6b20d6SBram Moolenaar let n = true 18972d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 18982d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 18992d6b20d6SBram Moolenaar 1900585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1901a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1902ad39c094SBram Moolenaarenddef 1903ad39c094SBram Moolenaar 190447e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1905f5be8cdbSBram Moolenaar # only checks line continuation 190647e880d6SBram Moolenaar let lines =<< trim END 190747e880d6SBram Moolenaar vim9script 190847e880d6SBram Moolenaar execute 'g:someVar' 190947e880d6SBram Moolenaar .. ' = ' .. 191047e880d6SBram Moolenaar '28' 191147e880d6SBram Moolenaar assert_equal(28, g:someVar) 191247e880d6SBram Moolenaar unlet g:someVar 191347e880d6SBram Moolenaar END 191447e880d6SBram Moolenaar CheckScriptSuccess(lines) 191547e880d6SBram Moolenaarenddef 191647e880d6SBram Moolenaar 1917ad39c094SBram Moolenaardef Test_echo_cmd() 1918a72cfb80SBram Moolenaar echo 'some' # comment 1919585fea7bSBram Moolenaar echon 'thing' 1920ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1921ad39c094SBram Moolenaar 1922a72cfb80SBram Moolenaar echo "some" # comment 1923a72cfb80SBram Moolenaar echon "thing" 1924a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1925a72cfb80SBram Moolenaar 1926ad39c094SBram Moolenaar let str1 = 'some' 1927ad39c094SBram Moolenaar let str2 = 'more' 1928ad39c094SBram Moolenaar echo str1 str2 1929ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1930a72cfb80SBram Moolenaar 1931a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1932ad39c094SBram Moolenaarenddef 1933ad39c094SBram Moolenaar 1934f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1935f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1936f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1937f93c7feaSBram Moolenaar echo 'clear' 1938df069eecSBram Moolenaar :1messages 1939f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1940f93c7feaSBram Moolenaar 1941f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1942f93c7feaSBram Moolenaarenddef 1943f93c7feaSBram Moolenaar 194447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1945f5be8cdbSBram Moolenaar # only checks line continuation 194647e880d6SBram Moolenaar let lines =<< trim END 194747e880d6SBram Moolenaar vim9script 194847e880d6SBram Moolenaar echomsg 'here' 194947e880d6SBram Moolenaar .. ' is ' .. 195047e880d6SBram Moolenaar 'a message' 195147e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 195247e880d6SBram Moolenaar END 195347e880d6SBram Moolenaar CheckScriptSuccess(lines) 195447e880d6SBram Moolenaarenddef 195547e880d6SBram Moolenaar 1956f93c7feaSBram Moolenaardef Test_echoerr_cmd() 195740ee466cSBram Moolenaar try 195840ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 195940ee466cSBram Moolenaar catch 196040ee466cSBram Moolenaar assert_match('something wrong', v:exception) 196140ee466cSBram Moolenaar endtry 1962f93c7feaSBram Moolenaarenddef 1963f93c7feaSBram Moolenaar 196447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1965f5be8cdbSBram Moolenaar # only checks line continuation 196647e880d6SBram Moolenaar let lines =<< trim END 196747e880d6SBram Moolenaar vim9script 196847e880d6SBram Moolenaar try 196947e880d6SBram Moolenaar echoerr 'this' 197047e880d6SBram Moolenaar .. ' is ' .. 197147e880d6SBram Moolenaar 'wrong' 197247e880d6SBram Moolenaar catch 197347e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 197447e880d6SBram Moolenaar endtry 197547e880d6SBram Moolenaar END 197647e880d6SBram Moolenaar CheckScriptSuccess(lines) 197747e880d6SBram Moolenaarenddef 197847e880d6SBram Moolenaar 197941fe0617SBram Moolenaardef Test_for_outside_of_function() 198041fe0617SBram Moolenaar let lines =<< trim END 198141fe0617SBram Moolenaar vim9script 198241fe0617SBram Moolenaar new 198341fe0617SBram Moolenaar for var in range(0, 3) 198441fe0617SBram Moolenaar append(line('$'), var) 198541fe0617SBram Moolenaar endfor 198641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 198741fe0617SBram Moolenaar bwipe! 198841fe0617SBram Moolenaar END 198941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 199041fe0617SBram Moolenaar source Xvim9for.vim 199141fe0617SBram Moolenaar delete('Xvim9for.vim') 199241fe0617SBram Moolenaarenddef 19938a7d6542SBram Moolenaar 1994e8c4abbbSBram Moolenaardef Test_for_loop() 1995e8c4abbbSBram Moolenaar let result = '' 1996e8c4abbbSBram Moolenaar for cnt in range(7) 1997e8c4abbbSBram Moolenaar if cnt == 4 1998e8c4abbbSBram Moolenaar break 1999e8c4abbbSBram Moolenaar endif 2000e8c4abbbSBram Moolenaar if cnt == 2 2001e8c4abbbSBram Moolenaar continue 2002e8c4abbbSBram Moolenaar endif 2003e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2004e8c4abbbSBram Moolenaar endfor 2005e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 20060ad3e894SBram Moolenaar 20070ad3e894SBram Moolenaar let concat = '' 20080ad3e894SBram Moolenaar for str in eval('["one", "two"]') 20090ad3e894SBram Moolenaar concat ..= str 20100ad3e894SBram Moolenaar endfor 20110ad3e894SBram Moolenaar assert_equal('onetwo', concat) 2012e8c4abbbSBram Moolenaarenddef 2013e8c4abbbSBram Moolenaar 2014e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2015675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 2016675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 2017675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 2018822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 20190ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 2020675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2021675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2022675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2023e8c4abbbSBram Moolenaarenddef 2024e8c4abbbSBram Moolenaar 2025d0df1aacSBram Moolenaardef Test_while_loop() 2026d0df1aacSBram Moolenaar let result = '' 2027d0df1aacSBram Moolenaar let cnt = 0 2028d0df1aacSBram Moolenaar while cnt < 555 2029d0df1aacSBram Moolenaar if cnt == 3 2030d0df1aacSBram Moolenaar break 2031d0df1aacSBram Moolenaar endif 2032d0df1aacSBram Moolenaar cnt += 1 2033d0df1aacSBram Moolenaar if cnt == 2 2034d0df1aacSBram Moolenaar continue 2035d0df1aacSBram Moolenaar endif 2036d0df1aacSBram Moolenaar result ..= cnt .. '_' 2037d0df1aacSBram Moolenaar endwhile 2038d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2039d0df1aacSBram Moolenaarenddef 2040d0df1aacSBram Moolenaar 2041e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2042675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2043675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2044675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2045675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2046675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2047675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2048675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2049bd5da371SBram Moolenaarenddef 2050bd5da371SBram Moolenaar 20519645e2d9SBram Moolenaardef Test_interrupt_loop() 205297acfc78SBram Moolenaar let caught = false 20539645e2d9SBram Moolenaar let x = 0 205497acfc78SBram Moolenaar try 20559645e2d9SBram Moolenaar while 1 20569645e2d9SBram Moolenaar x += 1 20579645e2d9SBram Moolenaar if x == 100 20589645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 20599645e2d9SBram Moolenaar endif 20609645e2d9SBram Moolenaar endwhile 206197acfc78SBram Moolenaar catch 206297acfc78SBram Moolenaar caught = true 206397acfc78SBram Moolenaar assert_equal(100, x) 206497acfc78SBram Moolenaar endtry 206597acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 20669645e2d9SBram Moolenaarenddef 206720431c9dSBram Moolenaar 20684fdae999SBram Moolenaardef Test_automatic_line_continuation() 20694fdae999SBram Moolenaar let mylist = [ 20704fdae999SBram Moolenaar 'one', 20714fdae999SBram Moolenaar 'two', 20724fdae999SBram Moolenaar 'three', 2073f5be8cdbSBram Moolenaar ] # comment 20744fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 20754fdae999SBram Moolenaar 20764fdae999SBram Moolenaar let mydict = { 20774fdae999SBram Moolenaar 'one': 1, 20784fdae999SBram Moolenaar 'two': 2, 20794fdae999SBram Moolenaar 'three': 20804fdae999SBram Moolenaar 3, 2081f5be8cdbSBram Moolenaar } # comment 20824fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 20834fdae999SBram Moolenaar mydict = #{ 20842c330432SBram Moolenaar one: 1, # comment 20852c330432SBram Moolenaar two: # comment 20862c330432SBram Moolenaar 2, # comment 20872c330432SBram Moolenaar three: 3 # comment 20882c330432SBram Moolenaar } 20892c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 20902c330432SBram Moolenaar mydict = #{ 20912c330432SBram Moolenaar one: 1, 20924fdae999SBram Moolenaar two: 20934fdae999SBram Moolenaar 2, 20942c330432SBram Moolenaar three: 3 20954fdae999SBram Moolenaar } 20964fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2097e6085c53SBram Moolenaar 2098e6085c53SBram Moolenaar assert_equal( 2099e6085c53SBram Moolenaar ['one', 'two', 'three'], 2100e6085c53SBram Moolenaar split('one two three') 2101e6085c53SBram Moolenaar ) 21024fdae999SBram Moolenaarenddef 21034fdae999SBram Moolenaar 21047a092245SBram Moolenaardef Test_vim9_comment() 21057a092245SBram Moolenaar CheckScriptSuccess([ 21067a092245SBram Moolenaar 'vim9script', 21077a092245SBram Moolenaar '# something', 21087a092245SBram Moolenaar ]) 21097a092245SBram Moolenaar CheckScriptFailure([ 21107a092245SBram Moolenaar 'vim9script', 21117a092245SBram Moolenaar ':# something', 21127a092245SBram Moolenaar ], 'E488:') 21137a092245SBram Moolenaar CheckScriptFailure([ 21147a092245SBram Moolenaar '# something', 21157a092245SBram Moolenaar ], 'E488:') 21167a092245SBram Moolenaar CheckScriptFailure([ 21177a092245SBram Moolenaar ':# something', 21187a092245SBram Moolenaar ], 'E488:') 21197a092245SBram Moolenaar 21204a8d9f2eSBram Moolenaar { # block start 21214a8d9f2eSBram Moolenaar } # block end 21224a8d9f2eSBram Moolenaar CheckDefFailure([ 21234a8d9f2eSBram Moolenaar '{# comment', 21244a8d9f2eSBram Moolenaar ], 'E488:') 21254a8d9f2eSBram Moolenaar CheckDefFailure([ 21264a8d9f2eSBram Moolenaar '{', 21274a8d9f2eSBram Moolenaar '}# comment', 21284a8d9f2eSBram Moolenaar ], 'E488:') 21294a8d9f2eSBram Moolenaar 21304a8d9f2eSBram Moolenaar echo "yes" # comment 21314a8d9f2eSBram Moolenaar CheckDefFailure([ 21324a8d9f2eSBram Moolenaar 'echo "yes"# comment', 21334a8d9f2eSBram Moolenaar ], 'E488:') 21347a092245SBram Moolenaar CheckScriptSuccess([ 21357a092245SBram Moolenaar 'vim9script', 21367a092245SBram Moolenaar 'echo "yes" # something', 21377a092245SBram Moolenaar ]) 21387a092245SBram Moolenaar CheckScriptFailure([ 21397a092245SBram Moolenaar 'vim9script', 21407a092245SBram Moolenaar 'echo "yes"# something', 21417a092245SBram Moolenaar ], 'E121:') 21427a092245SBram Moolenaar CheckScriptFailure([ 21437a092245SBram Moolenaar 'vim9script', 21447a092245SBram Moolenaar 'echo# something', 21457a092245SBram Moolenaar ], 'E121:') 21467a092245SBram Moolenaar CheckScriptFailure([ 21477a092245SBram Moolenaar 'echo "yes" # something', 21487a092245SBram Moolenaar ], 'E121:') 21497a092245SBram Moolenaar 21504a8d9f2eSBram Moolenaar exe "echo" # comment 21514a8d9f2eSBram Moolenaar CheckDefFailure([ 21524a8d9f2eSBram Moolenaar 'exe "echo"# comment', 21534a8d9f2eSBram Moolenaar ], 'E488:') 21544a8d9f2eSBram Moolenaar CheckScriptSuccess([ 21554a8d9f2eSBram Moolenaar 'vim9script', 21564a8d9f2eSBram Moolenaar 'exe "echo" # something', 21574a8d9f2eSBram Moolenaar ]) 21584a8d9f2eSBram Moolenaar CheckScriptFailure([ 21594a8d9f2eSBram Moolenaar 'vim9script', 21604a8d9f2eSBram Moolenaar 'exe "echo"# something', 21614a8d9f2eSBram Moolenaar ], 'E121:') 21624a8d9f2eSBram Moolenaar CheckDefFailure([ 21634a8d9f2eSBram Moolenaar 'exe # comment', 21644a8d9f2eSBram Moolenaar ], 'E1015:') 21654a8d9f2eSBram Moolenaar CheckScriptFailure([ 21664a8d9f2eSBram Moolenaar 'vim9script', 21674a8d9f2eSBram Moolenaar 'exe# something', 21684a8d9f2eSBram Moolenaar ], 'E121:') 21694a8d9f2eSBram Moolenaar CheckScriptFailure([ 21704a8d9f2eSBram Moolenaar 'exe "echo" # something', 21714a8d9f2eSBram Moolenaar ], 'E121:') 21724a8d9f2eSBram Moolenaar 21737a092245SBram Moolenaar CheckDefFailure([ 21747a092245SBram Moolenaar 'try# comment', 21757a092245SBram Moolenaar ' echo "yes"', 21767a092245SBram Moolenaar 'catch', 21777a092245SBram Moolenaar 'endtry', 21787a092245SBram Moolenaar ], 'E488:') 21792c5ed4e3SBram Moolenaar CheckScriptFailure([ 21802c5ed4e3SBram Moolenaar 'vim9script', 21812c5ed4e3SBram Moolenaar 'try# comment', 21822c5ed4e3SBram Moolenaar 'echo "yes"', 21832c5ed4e3SBram Moolenaar ], 'E488:') 21847a092245SBram Moolenaar CheckDefFailure([ 21857a092245SBram Moolenaar 'try', 2186a72cfb80SBram Moolenaar ' throw#comment', 2187a72cfb80SBram Moolenaar 'catch', 2188a72cfb80SBram Moolenaar 'endtry', 2189a72cfb80SBram Moolenaar ], 'E1015:') 2190a72cfb80SBram Moolenaar CheckDefFailure([ 2191a72cfb80SBram Moolenaar 'try', 2192a72cfb80SBram Moolenaar ' throw "yes"#comment', 2193a72cfb80SBram Moolenaar 'catch', 2194a72cfb80SBram Moolenaar 'endtry', 2195a72cfb80SBram Moolenaar ], 'E488:') 2196a72cfb80SBram Moolenaar CheckDefFailure([ 2197a72cfb80SBram Moolenaar 'try', 21987a092245SBram Moolenaar ' echo "yes"', 21997a092245SBram Moolenaar 'catch# comment', 22007a092245SBram Moolenaar 'endtry', 22017a092245SBram Moolenaar ], 'E488:') 22022c5ed4e3SBram Moolenaar CheckScriptFailure([ 22032c5ed4e3SBram Moolenaar 'vim9script', 22042c5ed4e3SBram Moolenaar 'try', 22052c5ed4e3SBram Moolenaar ' echo "yes"', 22062c5ed4e3SBram Moolenaar 'catch# comment', 22072c5ed4e3SBram Moolenaar 'endtry', 22082c5ed4e3SBram Moolenaar ], 'E654:') 22092c5ed4e3SBram Moolenaar CheckDefFailure([ 22102c5ed4e3SBram Moolenaar 'try', 22112c5ed4e3SBram Moolenaar ' echo "yes"', 22122c5ed4e3SBram Moolenaar 'catch /pat/# comment', 22132c5ed4e3SBram Moolenaar 'endtry', 22142c5ed4e3SBram Moolenaar ], 'E488:') 22157a092245SBram Moolenaar CheckDefFailure([ 22167a092245SBram Moolenaar 'try', 22177a092245SBram Moolenaar 'echo "yes"', 22187a092245SBram Moolenaar 'catch', 22197a092245SBram Moolenaar 'endtry# comment', 22207a092245SBram Moolenaar ], 'E488:') 22212c5ed4e3SBram Moolenaar CheckScriptFailure([ 22222c5ed4e3SBram Moolenaar 'vim9script', 22232c5ed4e3SBram Moolenaar 'try', 22242c5ed4e3SBram Moolenaar ' echo "yes"', 22252c5ed4e3SBram Moolenaar 'catch', 22262c5ed4e3SBram Moolenaar 'endtry# comment', 22279b7bf9e9SBram Moolenaar ], 'E488:') 22282c5ed4e3SBram Moolenaar 22292c5ed4e3SBram Moolenaar CheckScriptSuccess([ 22302c5ed4e3SBram Moolenaar 'vim9script', 22312c5ed4e3SBram Moolenaar 'hi # comment', 22322c5ed4e3SBram Moolenaar ]) 22332c5ed4e3SBram Moolenaar CheckScriptFailure([ 22342c5ed4e3SBram Moolenaar 'vim9script', 22352c5ed4e3SBram Moolenaar 'hi# comment', 22362c5ed4e3SBram Moolenaar ], 'E416:') 22371966c248SBram Moolenaar CheckScriptSuccess([ 22381966c248SBram Moolenaar 'vim9script', 22391966c248SBram Moolenaar 'hi Search # comment', 22401966c248SBram Moolenaar ]) 22411966c248SBram Moolenaar CheckScriptFailure([ 22421966c248SBram Moolenaar 'vim9script', 22431966c248SBram Moolenaar 'hi Search# comment', 22441966c248SBram Moolenaar ], 'E416:') 22451966c248SBram Moolenaar CheckScriptSuccess([ 22461966c248SBram Moolenaar 'vim9script', 22471966c248SBram Moolenaar 'hi link This Search # comment', 22481966c248SBram Moolenaar ]) 22491966c248SBram Moolenaar CheckScriptFailure([ 22501966c248SBram Moolenaar 'vim9script', 22511966c248SBram Moolenaar 'hi link This That# comment', 22521966c248SBram Moolenaar ], 'E413:') 22531966c248SBram Moolenaar CheckScriptSuccess([ 22541966c248SBram Moolenaar 'vim9script', 22551966c248SBram Moolenaar 'hi clear This # comment', 22561966c248SBram Moolenaar 'hi clear # comment', 22571966c248SBram Moolenaar ]) 2258f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2259f5be8cdbSBram Moolenaar # hi clear This# comment', 22601966c248SBram Moolenaar CheckScriptFailure([ 22611966c248SBram Moolenaar 'vim9script', 22621966c248SBram Moolenaar 'hi clear# comment', 22631966c248SBram Moolenaar ], 'E416:') 22641966c248SBram Moolenaar 22651966c248SBram Moolenaar CheckScriptSuccess([ 22661966c248SBram Moolenaar 'vim9script', 22671966c248SBram Moolenaar 'hi Group term=bold', 22681966c248SBram Moolenaar 'match Group /todo/ # comment', 22691966c248SBram Moolenaar ]) 22701966c248SBram Moolenaar CheckScriptFailure([ 22711966c248SBram Moolenaar 'vim9script', 22721966c248SBram Moolenaar 'hi Group term=bold', 22731966c248SBram Moolenaar 'match Group /todo/# comment', 22741966c248SBram Moolenaar ], 'E488:') 22751966c248SBram Moolenaar CheckScriptSuccess([ 22761966c248SBram Moolenaar 'vim9script', 22771966c248SBram Moolenaar 'match # comment', 22781966c248SBram Moolenaar ]) 22791966c248SBram Moolenaar CheckScriptFailure([ 22801966c248SBram Moolenaar 'vim9script', 22811966c248SBram Moolenaar 'match# comment', 22821966c248SBram Moolenaar ], 'E475:') 22831966c248SBram Moolenaar CheckScriptSuccess([ 22841966c248SBram Moolenaar 'vim9script', 22851966c248SBram Moolenaar 'match none # comment', 22861966c248SBram Moolenaar ]) 22871966c248SBram Moolenaar CheckScriptFailure([ 22881966c248SBram Moolenaar 'vim9script', 22891966c248SBram Moolenaar 'match none# comment', 22901966c248SBram Moolenaar ], 'E475:') 22911966c248SBram Moolenaar 22921966c248SBram Moolenaar CheckScriptSuccess([ 22931966c248SBram Moolenaar 'vim9script', 22941966c248SBram Moolenaar 'menutrans clear # comment', 22951966c248SBram Moolenaar ]) 22961966c248SBram Moolenaar CheckScriptFailure([ 22971966c248SBram Moolenaar 'vim9script', 22981966c248SBram Moolenaar 'menutrans clear# comment text', 22991966c248SBram Moolenaar ], 'E474:') 23001966c248SBram Moolenaar 23011966c248SBram Moolenaar CheckScriptSuccess([ 23021966c248SBram Moolenaar 'vim9script', 23031966c248SBram Moolenaar 'syntax clear # comment', 23041966c248SBram Moolenaar ]) 23051966c248SBram Moolenaar CheckScriptFailure([ 23061966c248SBram Moolenaar 'vim9script', 23071966c248SBram Moolenaar 'syntax clear# comment text', 23081966c248SBram Moolenaar ], 'E28:') 23091966c248SBram Moolenaar CheckScriptSuccess([ 23101966c248SBram Moolenaar 'vim9script', 23111966c248SBram Moolenaar 'syntax keyword Word some', 23121966c248SBram Moolenaar 'syntax clear Word # comment', 23131966c248SBram Moolenaar ]) 23141966c248SBram Moolenaar CheckScriptFailure([ 23151966c248SBram Moolenaar 'vim9script', 23161966c248SBram Moolenaar 'syntax keyword Word some', 23171966c248SBram Moolenaar 'syntax clear Word# comment text', 23181966c248SBram Moolenaar ], 'E28:') 23191966c248SBram Moolenaar 23201966c248SBram Moolenaar CheckScriptSuccess([ 23211966c248SBram Moolenaar 'vim9script', 23221966c248SBram Moolenaar 'syntax list # comment', 23231966c248SBram Moolenaar ]) 23241966c248SBram Moolenaar CheckScriptFailure([ 23251966c248SBram Moolenaar 'vim9script', 23261966c248SBram Moolenaar 'syntax list# comment text', 23271966c248SBram Moolenaar ], 'E28:') 23281966c248SBram Moolenaar 23291966c248SBram Moolenaar CheckScriptSuccess([ 23301966c248SBram Moolenaar 'vim9script', 23311966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 23321966c248SBram Moolenaar ]) 23331966c248SBram Moolenaar CheckScriptFailure([ 23341966c248SBram Moolenaar 'vim9script', 23351966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 23361966c248SBram Moolenaar ], 'E475:') 23371966c248SBram Moolenaar 23381966c248SBram Moolenaar CheckScriptSuccess([ 23391966c248SBram Moolenaar 'vim9script', 23401966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 23411966c248SBram Moolenaar ]) 23421966c248SBram Moolenaar CheckScriptFailure([ 23431966c248SBram Moolenaar 'vim9script', 23441966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 23451966c248SBram Moolenaar ], 'E789:') 23461966c248SBram Moolenaar 23471966c248SBram Moolenaar CheckScriptSuccess([ 23481966c248SBram Moolenaar 'vim9script', 23491966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 23501966c248SBram Moolenaar ]) 23511966c248SBram Moolenaar CheckScriptFailure([ 23521966c248SBram Moolenaar 'vim9script', 23531966c248SBram Moolenaar 'syntax match Word /pat/# comment', 23541966c248SBram Moolenaar ], 'E402:') 23551966c248SBram Moolenaar 23561966c248SBram Moolenaar CheckScriptSuccess([ 23571966c248SBram Moolenaar 'vim9script', 23581966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 23591966c248SBram Moolenaar ]) 23601966c248SBram Moolenaar CheckScriptFailure([ 23611966c248SBram Moolenaar 'vim9script', 23621966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 23631966c248SBram Moolenaar ], 'E475:') 23641966c248SBram Moolenaar CheckScriptFailure([ 23651966c248SBram Moolenaar 'vim9script', 23661966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 23671966c248SBram Moolenaar ], 'E406:') 23681966c248SBram Moolenaar CheckScriptFailure([ 23691966c248SBram Moolenaar 'vim9script', 23701966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 23711966c248SBram Moolenaar ], 'E475:') 23721966c248SBram Moolenaar 23731966c248SBram Moolenaar CheckScriptSuccess([ 23741966c248SBram Moolenaar 'vim9script', 23751966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 23761966c248SBram Moolenaar ]) 23771966c248SBram Moolenaar CheckScriptFailure([ 23781966c248SBram Moolenaar 'vim9script', 23791966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2380d032f34aSBram Moolenaar ], 'E402:') 23811966c248SBram Moolenaar 23821966c248SBram Moolenaar CheckScriptSuccess([ 23831966c248SBram Moolenaar 'vim9script', 23841966c248SBram Moolenaar 'syntax sync # comment', 23851966c248SBram Moolenaar ]) 23861966c248SBram Moolenaar CheckScriptFailure([ 23871966c248SBram Moolenaar 'vim9script', 23881966c248SBram Moolenaar 'syntax sync# comment', 23891966c248SBram Moolenaar ], 'E404:') 23901966c248SBram Moolenaar CheckScriptSuccess([ 23911966c248SBram Moolenaar 'vim9script', 23921966c248SBram Moolenaar 'syntax sync ccomment # comment', 23931966c248SBram Moolenaar ]) 23941966c248SBram Moolenaar CheckScriptFailure([ 23951966c248SBram Moolenaar 'vim9script', 23961966c248SBram Moolenaar 'syntax sync ccomment# comment', 23971966c248SBram Moolenaar ], 'E404:') 23981966c248SBram Moolenaar 23991966c248SBram Moolenaar CheckScriptSuccess([ 24001966c248SBram Moolenaar 'vim9script', 24011966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 24021966c248SBram Moolenaar ]) 24031966c248SBram Moolenaar CheckScriptFailure([ 24041966c248SBram Moolenaar 'vim9script', 24051966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 24061966c248SBram Moolenaar ], 'E475:') 2407a72cfb80SBram Moolenaar 2408a72cfb80SBram Moolenaar CheckScriptSuccess([ 2409a72cfb80SBram Moolenaar 'vim9script', 2410a72cfb80SBram Moolenaar 'command Echo echo # comment', 2411a72cfb80SBram Moolenaar 'command Echo # comment', 2412a72cfb80SBram Moolenaar ]) 2413a72cfb80SBram Moolenaar CheckScriptFailure([ 2414a72cfb80SBram Moolenaar 'vim9script', 2415a72cfb80SBram Moolenaar 'command Echo echo# comment', 2416a72cfb80SBram Moolenaar 'Echo', 2417a72cfb80SBram Moolenaar ], 'E121:') 2418a72cfb80SBram Moolenaar CheckScriptFailure([ 2419a72cfb80SBram Moolenaar 'vim9script', 2420a72cfb80SBram Moolenaar 'command Echo# comment', 2421a72cfb80SBram Moolenaar ], 'E182:') 2422a72cfb80SBram Moolenaar CheckScriptFailure([ 2423a72cfb80SBram Moolenaar 'vim9script', 2424a72cfb80SBram Moolenaar 'command Echo echo', 2425a72cfb80SBram Moolenaar 'command Echo# comment', 2426a72cfb80SBram Moolenaar ], 'E182:') 2427a72cfb80SBram Moolenaar 2428a72cfb80SBram Moolenaar CheckScriptSuccess([ 2429a72cfb80SBram Moolenaar 'vim9script', 2430a72cfb80SBram Moolenaar 'function # comment', 2431a72cfb80SBram Moolenaar ]) 2432a72cfb80SBram Moolenaar CheckScriptFailure([ 2433a72cfb80SBram Moolenaar 'vim9script', 24349898107fSBram Moolenaar 'function " comment', 24359898107fSBram Moolenaar ], 'E129:') 24369898107fSBram Moolenaar CheckScriptFailure([ 24379898107fSBram Moolenaar 'vim9script', 2438a72cfb80SBram Moolenaar 'function# comment', 2439a72cfb80SBram Moolenaar ], 'E129:') 2440a72cfb80SBram Moolenaar CheckScriptSuccess([ 2441a72cfb80SBram Moolenaar 'vim9script', 2442a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2443a72cfb80SBram Moolenaar ]) 2444a72cfb80SBram Moolenaar CheckScriptFailure([ 2445a72cfb80SBram Moolenaar 'vim9script', 2446a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2447a72cfb80SBram Moolenaar ], 'E488:') 2448a72cfb80SBram Moolenaar 2449a72cfb80SBram Moolenaar CheckScriptSuccess([ 2450a72cfb80SBram Moolenaar 'vim9script', 24514c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2452a72cfb80SBram Moolenaar 'endfunc', 24534c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2454a72cfb80SBram Moolenaar ]) 2455a72cfb80SBram Moolenaar CheckScriptFailure([ 2456a72cfb80SBram Moolenaar 'vim9script', 24574c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2458a72cfb80SBram Moolenaar 'endfunc', 24594c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2460a72cfb80SBram Moolenaar ], 'E488:') 2461a72cfb80SBram Moolenaar 2462a72cfb80SBram Moolenaar CheckScriptSuccess([ 2463a72cfb80SBram Moolenaar 'vim9script', 2464a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2465a72cfb80SBram Moolenaar ]) 2466a72cfb80SBram Moolenaar CheckScriptFailure([ 2467a72cfb80SBram Moolenaar 'vim9script', 2468a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2469a72cfb80SBram Moolenaar ], 'E488:') 2470e7e4838fSBram Moolenaar 2471e7e4838fSBram Moolenaar CheckScriptFailure([ 2472e7e4838fSBram Moolenaar 'def Test() " comment', 2473e7e4838fSBram Moolenaar 'enddef', 2474e7e4838fSBram Moolenaar ], 'E488:') 2475e7e4838fSBram Moolenaar CheckScriptFailure([ 2476e7e4838fSBram Moolenaar 'vim9script', 2477e7e4838fSBram Moolenaar 'def Test() " comment', 2478e7e4838fSBram Moolenaar 'enddef', 2479e7e4838fSBram Moolenaar ], 'E488:') 2480e7e4838fSBram Moolenaar 2481e7e4838fSBram Moolenaar CheckScriptSuccess([ 2482e7e4838fSBram Moolenaar 'func Test() " comment', 2483e7e4838fSBram Moolenaar 'endfunc', 2484e7e4838fSBram Moolenaar ]) 24859898107fSBram Moolenaar CheckScriptSuccess([ 2486e7e4838fSBram Moolenaar 'vim9script', 2487e7e4838fSBram Moolenaar 'func Test() " comment', 2488e7e4838fSBram Moolenaar 'endfunc', 24899898107fSBram Moolenaar ]) 2490e7e4838fSBram Moolenaar 2491e7e4838fSBram Moolenaar CheckScriptSuccess([ 2492e7e4838fSBram Moolenaar 'def Test() # comment', 2493e7e4838fSBram Moolenaar 'enddef', 2494e7e4838fSBram Moolenaar ]) 2495e7e4838fSBram Moolenaar CheckScriptFailure([ 2496e7e4838fSBram Moolenaar 'func Test() # comment', 2497e7e4838fSBram Moolenaar 'endfunc', 2498e7e4838fSBram Moolenaar ], 'E488:') 24992c5ed4e3SBram Moolenaarenddef 25002c5ed4e3SBram Moolenaar 25012c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 25022c5ed4e3SBram Moolenaar CheckCanRunGui 25032c5ed4e3SBram Moolenaar 25042c5ed4e3SBram Moolenaar CheckScriptFailure([ 25052c5ed4e3SBram Moolenaar 'vim9script', 25062c5ed4e3SBram Moolenaar 'gui#comment' 25072c5ed4e3SBram Moolenaar ], 'E499:') 25082c5ed4e3SBram Moolenaar CheckScriptFailure([ 25092c5ed4e3SBram Moolenaar 'vim9script', 25102c5ed4e3SBram Moolenaar 'gui -f#comment' 25112c5ed4e3SBram Moolenaar ], 'E499:') 25127a092245SBram Moolenaarenddef 25137a092245SBram Moolenaar 2514a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 25156797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 25166797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2517a26b9700SBram Moolenaar 2518a26b9700SBram Moolenaar edit test.vim 2519a26b9700SBram Moolenaar doautocmd TabEnter #comment 2520a26b9700SBram Moolenaar assert_equal(1, g:entered) 2521a26b9700SBram Moolenaar 2522a26b9700SBram Moolenaar doautocmd TabEnter f.x 2523a26b9700SBram Moolenaar assert_equal(2, g:entered) 2524a26b9700SBram Moolenaar 2525a26b9700SBram Moolenaar g:entered = 0 2526a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2527a26b9700SBram Moolenaar assert_equal(2, g:entered) 2528a26b9700SBram Moolenaar 2529a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2530a26b9700SBram Moolenaar 2531a26b9700SBram Moolenaar au! TabEnter 2532a26b9700SBram Moolenaar unlet g:entered 2533d72c1bf0SBram Moolenaar 2534d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2535d72c1bf0SBram Moolenaar 'vim9script', 25366797966dSBram Moolenaar 'g:var = 123', 2537e55b1c09SBram Moolenaar 'b:var = 456', 2538e55b1c09SBram Moolenaar 'w:var = 777', 2539e55b1c09SBram Moolenaar 't:var = 888', 2540d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2541d72c1bf0SBram Moolenaar ]) 2542d72c1bf0SBram Moolenaar 2543d72c1bf0SBram Moolenaar CheckScriptFailure([ 2544d72c1bf0SBram Moolenaar 'vim9script', 2545d72c1bf0SBram Moolenaar 'let g:var = 123', 2546e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2547e55b1c09SBram Moolenaar 2548e55b1c09SBram Moolenaar CheckScriptFailure([ 2549e55b1c09SBram Moolenaar 'vim9script', 2550e55b1c09SBram Moolenaar 'let b:var = 123', 2551e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2552e55b1c09SBram Moolenaar 2553e55b1c09SBram Moolenaar CheckScriptFailure([ 2554e55b1c09SBram Moolenaar 'vim9script', 2555e55b1c09SBram Moolenaar 'let w:var = 123', 2556e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2557e55b1c09SBram Moolenaar 2558e55b1c09SBram Moolenaar CheckScriptFailure([ 2559e55b1c09SBram Moolenaar 'vim9script', 2560e55b1c09SBram Moolenaar 'let t:var = 123', 2561e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2562e55b1c09SBram Moolenaar 2563e55b1c09SBram Moolenaar CheckScriptFailure([ 2564e55b1c09SBram Moolenaar 'vim9script', 2565e55b1c09SBram Moolenaar 'let v:version = 123', 2566e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2567e55b1c09SBram Moolenaar 2568e55b1c09SBram Moolenaar CheckScriptFailure([ 2569e55b1c09SBram Moolenaar 'vim9script', 2570e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2571e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 25726797966dSBram Moolenaar 25736797966dSBram Moolenaar CheckScriptFailure([ 25746797966dSBram Moolenaar 'vim9script', 25756797966dSBram Moolenaar 'g:var = 123', 257632e35117SBram Moolenaar 'unlet g:var# comment1', 2577d72c1bf0SBram Moolenaar ], 'E108:') 2578d72c1bf0SBram Moolenaar 2579d72c1bf0SBram Moolenaar CheckScriptFailure([ 2580d72c1bf0SBram Moolenaar 'let g:var = 123', 2581d72c1bf0SBram Moolenaar 'unlet g:var # something', 2582d72c1bf0SBram Moolenaar ], 'E488:') 2583faac4104SBram Moolenaar 2584faac4104SBram Moolenaar CheckScriptSuccess([ 2585faac4104SBram Moolenaar 'vim9script', 258632e35117SBram Moolenaar 'if 1 # comment2', 2587faac4104SBram Moolenaar ' echo "yes"', 2588faac4104SBram Moolenaar 'elseif 2 #comment', 2589faac4104SBram Moolenaar ' echo "no"', 2590faac4104SBram Moolenaar 'endif', 2591faac4104SBram Moolenaar ]) 2592faac4104SBram Moolenaar 2593faac4104SBram Moolenaar CheckScriptFailure([ 2594faac4104SBram Moolenaar 'vim9script', 259532e35117SBram Moolenaar 'if 1# comment3', 2596faac4104SBram Moolenaar ' echo "yes"', 2597faac4104SBram Moolenaar 'endif', 2598faac4104SBram Moolenaar ], 'E15:') 2599faac4104SBram Moolenaar 2600faac4104SBram Moolenaar CheckScriptFailure([ 2601faac4104SBram Moolenaar 'vim9script', 260232e35117SBram Moolenaar 'if 0 # comment4', 2603faac4104SBram Moolenaar ' echo "yes"', 2604faac4104SBram Moolenaar 'elseif 2#comment', 2605faac4104SBram Moolenaar ' echo "no"', 2606faac4104SBram Moolenaar 'endif', 2607faac4104SBram Moolenaar ], 'E15:') 2608faac4104SBram Moolenaar 2609faac4104SBram Moolenaar CheckScriptSuccess([ 2610faac4104SBram Moolenaar 'vim9script', 261132e35117SBram Moolenaar 'let v = 1 # comment5', 2612faac4104SBram Moolenaar ]) 2613faac4104SBram Moolenaar 2614faac4104SBram Moolenaar CheckScriptFailure([ 2615faac4104SBram Moolenaar 'vim9script', 261632e35117SBram Moolenaar 'let v = 1# comment6', 261732e35117SBram Moolenaar ], 'E15:') 2618faac4104SBram Moolenaar 2619faac4104SBram Moolenaar CheckScriptSuccess([ 2620faac4104SBram Moolenaar 'vim9script', 2621faac4104SBram Moolenaar 'new' 2622faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2623df069eecSBram Moolenaar ':$', 2624faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2625faac4104SBram Moolenaar 'bwipe!', 2626faac4104SBram Moolenaar ]) 2627faac4104SBram Moolenaar 2628f5be8cdbSBram Moolenaar CheckScriptFailure([ 2629f5be8cdbSBram Moolenaar 'vim9script', 2630f5be8cdbSBram Moolenaar 'new' 2631f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2632f5be8cdbSBram Moolenaar ':$', 2633f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2634f5be8cdbSBram Moolenaar 'bwipe!', 2635f5be8cdbSBram Moolenaar ], 'E488:') 2636f5be8cdbSBram Moolenaar 2637f5be8cdbSBram Moolenaar CheckScriptFailure([ 2638f5be8cdbSBram Moolenaar 'vim9script', 2639f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2640f5be8cdbSBram Moolenaar ], 'E477:') 2641a26b9700SBram Moolenaarenddef 2642a26b9700SBram Moolenaar 26437e5bd91dSBram Moolenaardef Test_finish() 26447e5bd91dSBram Moolenaar let lines =<< trim END 26457e5bd91dSBram Moolenaar vim9script 26466797966dSBram Moolenaar g:res = 'one' 26477e5bd91dSBram Moolenaar if v:false | finish | endif 26486797966dSBram Moolenaar g:res = 'two' 26497e5bd91dSBram Moolenaar finish 26506797966dSBram Moolenaar g:res = 'three' 26517e5bd91dSBram Moolenaar END 26527e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 26537e5bd91dSBram Moolenaar source Xfinished 26547e5bd91dSBram Moolenaar assert_equal('two', g:res) 26557e5bd91dSBram Moolenaar 26567e5bd91dSBram Moolenaar unlet g:res 26577e5bd91dSBram Moolenaar delete('Xfinished') 26587e5bd91dSBram Moolenaarenddef 26597e5bd91dSBram Moolenaar 266032e35117SBram Moolenaardef Test_let_func_call() 266132e35117SBram Moolenaar let lines =<< trim END 266232e35117SBram Moolenaar vim9script 266332e35117SBram Moolenaar func GetValue() 266432e35117SBram Moolenaar if exists('g:count') 266532e35117SBram Moolenaar let g:count += 1 266632e35117SBram Moolenaar else 266732e35117SBram Moolenaar let g:count = 1 266832e35117SBram Moolenaar endif 266932e35117SBram Moolenaar return 'this' 267032e35117SBram Moolenaar endfunc 267132e35117SBram Moolenaar let val: string = GetValue() 2672f5be8cdbSBram Moolenaar # env var is always a string 2673df671b46SBram Moolenaar let env = $TERM 267432e35117SBram Moolenaar END 267532e35117SBram Moolenaar writefile(lines, 'Xfinished') 267632e35117SBram Moolenaar source Xfinished 2677f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 267832e35117SBram Moolenaar assert_equal(1, g:count) 267932e35117SBram Moolenaar 268032e35117SBram Moolenaar unlet g:count 268132e35117SBram Moolenaar delete('Xfinished') 268232e35117SBram Moolenaarenddef 268332e35117SBram Moolenaar 268432e35117SBram Moolenaardef Test_let_missing_type() 268532e35117SBram Moolenaar let lines =<< trim END 268632e35117SBram Moolenaar vim9script 2687df671b46SBram Moolenaar let var = g:unknown 2688227a69deSBram Moolenaar END 2689822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2690227a69deSBram Moolenaar 2691227a69deSBram Moolenaar lines =<< trim END 2692227a69deSBram Moolenaar vim9script 2693227a69deSBram Moolenaar let nr: number = 123 2694227a69deSBram Moolenaar let var = nr 2695227a69deSBram Moolenaar END 2696822ba247SBram Moolenaar CheckScriptSuccess(lines) 269732e35117SBram Moolenaarenddef 269832e35117SBram Moolenaar 2699c82a5b5dSBram Moolenaardef Test_let_declaration() 2700c82a5b5dSBram Moolenaar let lines =<< trim END 2701c82a5b5dSBram Moolenaar vim9script 2702c82a5b5dSBram Moolenaar let var: string 2703c82a5b5dSBram Moolenaar g:var_uninit = var 2704c82a5b5dSBram Moolenaar var = 'text' 2705c82a5b5dSBram Moolenaar g:var_test = var 2706f5be8cdbSBram Moolenaar # prefixing s: is optional 2707984dddbeSBram Moolenaar s:var = 'prefixed' 2708984dddbeSBram Moolenaar g:var_prefixed = s:var 2709984dddbeSBram Moolenaar 2710984dddbeSBram Moolenaar let s:other: number 2711984dddbeSBram Moolenaar other = 1234 2712984dddbeSBram Moolenaar g:other_var = other 2713c82a5b5dSBram Moolenaar END 2714c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2715c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2716c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2717984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2718984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2719c82a5b5dSBram Moolenaar 2720c82a5b5dSBram Moolenaar unlet g:var_uninit 2721c82a5b5dSBram Moolenaar unlet g:var_test 2722984dddbeSBram Moolenaar unlet g:var_prefixed 2723984dddbeSBram Moolenaar unlet g:other_var 2724c82a5b5dSBram Moolenaarenddef 2725c82a5b5dSBram Moolenaar 2726c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2727c5b1c20bSBram Moolenaar let lines =<< trim END 2728c5b1c20bSBram Moolenaar vim9script 2729c5b1c20bSBram Moolenaar const var: string 2730c5b1c20bSBram Moolenaar END 2731c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2732c5b1c20bSBram Moolenaar 2733c5b1c20bSBram Moolenaar lines =<< trim END 2734c5b1c20bSBram Moolenaar vim9script 2735c5b1c20bSBram Moolenaar let 9var: string 2736c5b1c20bSBram Moolenaar END 2737c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2738c5b1c20bSBram Moolenaarenddef 2739c5b1c20bSBram Moolenaar 274034db91f7SBram Moolenaardef Test_let_type_check() 274134db91f7SBram Moolenaar let lines =<< trim END 274234db91f7SBram Moolenaar vim9script 274334db91f7SBram Moolenaar let var: string 274434db91f7SBram Moolenaar var = 1234 274534db91f7SBram Moolenaar END 274634db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2747984dddbeSBram Moolenaar 2748984dddbeSBram Moolenaar lines =<< trim END 2749984dddbeSBram Moolenaar vim9script 2750984dddbeSBram Moolenaar let var:string 2751984dddbeSBram Moolenaar END 2752984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2753c5b1c20bSBram Moolenaar 2754c5b1c20bSBram Moolenaar lines =<< trim END 2755c5b1c20bSBram Moolenaar vim9script 2756c5b1c20bSBram Moolenaar let var: asdf 2757c5b1c20bSBram Moolenaar END 2758c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 275934db91f7SBram Moolenaarenddef 276034db91f7SBram Moolenaar 2761a5d0077eSBram Moolenaardef Test_forward_declaration() 2762a5d0077eSBram Moolenaar let lines =<< trim END 2763a5d0077eSBram Moolenaar vim9script 2764a5d0077eSBram Moolenaar def GetValue(): string 2765a5d0077eSBram Moolenaar return theVal 2766a5d0077eSBram Moolenaar enddef 2767a5d0077eSBram Moolenaar let theVal = 'something' 2768822ba247SBram Moolenaar g:initVal = GetValue() 2769a5d0077eSBram Moolenaar theVal = 'else' 2770a5d0077eSBram Moolenaar g:laterVal = GetValue() 2771a5d0077eSBram Moolenaar END 2772a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2773a5d0077eSBram Moolenaar source Xforward 2774a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2775a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2776a5d0077eSBram Moolenaar 2777a5d0077eSBram Moolenaar unlet g:initVal 2778a5d0077eSBram Moolenaar unlet g:laterVal 2779a5d0077eSBram Moolenaar delete('Xforward') 2780a5d0077eSBram Moolenaarenddef 2781a5d0077eSBram Moolenaar 27829721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 27839721fb4eSBram Moolenaar let legacy_lines =<< trim END 27849721fb4eSBram Moolenaar source Xvim9_script.vim 27859721fb4eSBram Moolenaar 27869721fb4eSBram Moolenaar call assert_false(exists('local')) 27879721fb4eSBram Moolenaar call assert_false(exists('exported')) 27889721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 27899721fb4eSBram Moolenaar call assert_equal('global', global) 27909721fb4eSBram Moolenaar call assert_equal('global', g:global) 27919721fb4eSBram Moolenaar 27929721fb4eSBram Moolenaar " imported variable becomes script-local 27939721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 27949721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 27959721fb4eSBram Moolenaar call assert_false(exists('exported')) 27969721fb4eSBram Moolenaar 27979721fb4eSBram Moolenaar " imported function becomes script-local 27989721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 27999721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 28009721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 28019721fb4eSBram Moolenaar END 28029721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 28039721fb4eSBram Moolenaar 28049721fb4eSBram Moolenaar let vim9_lines =<< trim END 28059721fb4eSBram Moolenaar vim9script 28069721fb4eSBram Moolenaar let local = 'local' 28079721fb4eSBram Moolenaar g:global = 'global' 28089721fb4eSBram Moolenaar export let exported = 'exported' 28099721fb4eSBram Moolenaar export def GetText(): string 28109721fb4eSBram Moolenaar return 'text' 28119721fb4eSBram Moolenaar enddef 28129721fb4eSBram Moolenaar END 28139721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 28149721fb4eSBram Moolenaar 28159721fb4eSBram Moolenaar source Xlegacy_script.vim 28169721fb4eSBram Moolenaar 28179721fb4eSBram Moolenaar assert_equal('global', g:global) 2818f5be8cdbSBram Moolenaar unlet g:global 28199721fb4eSBram Moolenaar 28209721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 28219721fb4eSBram Moolenaar delete('Xvim9_script.vim') 28229721fb4eSBram Moolenaarenddef 2823a5d0077eSBram Moolenaar 2824eeb27bfeSBram Moolenaardef Test_vim9_copen() 2825eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2826eeb27bfeSBram Moolenaar copen 2827eeb27bfeSBram Moolenaar quit 2828eeb27bfeSBram Moolenaarenddef 2829eeb27bfeSBram Moolenaar 28302d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 28312d6b20d6SBram Moolenaardef Test_vim9_autoload() 28322d6b20d6SBram Moolenaar let lines =<< trim END 28332d6b20d6SBram Moolenaar vim9script 28342d6b20d6SBram Moolenaar def foo#test() 28352d6b20d6SBram Moolenaar echomsg getreg('"') 28362d6b20d6SBram Moolenaar enddef 28372d6b20d6SBram Moolenaar END 28382d6b20d6SBram Moolenaar 28392d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 28402d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 28412d6b20d6SBram Moolenaar let save_rtp = &rtp 28422d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 28432d6b20d6SBram Moolenaar augroup test 28442d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 28452d6b20d6SBram Moolenaar augroup END 28462d6b20d6SBram Moolenaar 28472d6b20d6SBram Moolenaar normal Y 28482d6b20d6SBram Moolenaar 28492d6b20d6SBram Moolenaar augroup test 28502d6b20d6SBram Moolenaar autocmd! 28512d6b20d6SBram Moolenaar augroup END 28522d6b20d6SBram Moolenaar delete('Xdir', 'rf') 28532d6b20d6SBram Moolenaar &rtp = save_rtp 28542d6b20d6SBram Moolenaarenddef 28552d6b20d6SBram Moolenaar 2856585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2857585fea7bSBram Moolenaardef Test_substitute_cmd() 2858585fea7bSBram Moolenaar new 2859585fea7bSBram Moolenaar setline(1, 'something') 2860585fea7bSBram Moolenaar :substitute(some(other( 2861585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2862585fea7bSBram Moolenaar bwipe! 2863585fea7bSBram Moolenaar 2864f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2865585fea7bSBram Moolenaar let lines =<< trim END 2866585fea7bSBram Moolenaar vim9script 2867585fea7bSBram Moolenaar new 2868585fea7bSBram Moolenaar setline(1, 'something') 2869585fea7bSBram Moolenaar :substitute(some(other( 2870585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2871585fea7bSBram Moolenaar bwipe! 2872585fea7bSBram Moolenaar END 2873585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2874585fea7bSBram Moolenaar source Xvim9lines 2875585fea7bSBram Moolenaar 2876585fea7bSBram Moolenaar delete('Xvim9lines') 2877585fea7bSBram Moolenaarenddef 2878585fea7bSBram Moolenaar 28798a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2880