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:") 4669be61bbbSBram Moolenaar call CheckDefFailure(['let &option'], 'E1052:') 4679be61bbbSBram Moolenaar call CheckDefFailure(['&g:option = 5'], 'E113:') 4689be61bbbSBram Moolenaar 469e55b1c09SBram Moolenaar call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:') 4709be61bbbSBram Moolenaar 4719be61bbbSBram Moolenaar call CheckDefFailure(['let @~ = 5'], 'E354:') 4729be61bbbSBram Moolenaar call CheckDefFailure(['let @a = 5'], 'E1066:') 4739be61bbbSBram Moolenaar 474e55b1c09SBram Moolenaar call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:') 475e55b1c09SBram Moolenaar call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:') 476e55b1c09SBram Moolenaar call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:') 477e55b1c09SBram Moolenaar call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:') 4789be61bbbSBram Moolenaar 4799be61bbbSBram Moolenaar call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:') 4809be61bbbSBram Moolenaar call CheckDefFailure(['let xnr += 4'], 'E1020:') 4819be61bbbSBram Moolenaar 482822ba247SBram Moolenaar call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:') 48333fa29cfSBram Moolenaar 4848a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>') 4858a7d6542SBram Moolenaar call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>') 4868a7d6542SBram Moolenaar 4878a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>') 4888a7d6542SBram Moolenaar call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>') 4898a7d6542SBram Moolenaar 4908a7d6542SBram Moolenaar call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:') 4918a7d6542SBram Moolenaar call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void') 49242a480bfSBram Moolenaar 493d77a8525SBram Moolenaar call CheckDefFailure(['let var: dict <number>'], 'E1068:') 49442a480bfSBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 495cab27678SBram Moolenaar 496cab27678SBram Moolenaar call assert_fails('s/^/\=Mess()/n', 'E794:') 497cab27678SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 49843e969d3SBram Moolenaar 49943e969d3SBram Moolenaar call CheckDefFailure(['w:foo: number = 10'], 50043e969d3SBram Moolenaar 'E488: Trailing characters: : number = 1') 50143e969d3SBram Moolenaar call CheckDefFailure(['t:foo: bool = true'], 50243e969d3SBram Moolenaar 'E488: Trailing characters: : bool = true') 50343e969d3SBram Moolenaar call CheckDefFailure(['b:foo: string = "x"'], 50443e969d3SBram Moolenaar 'E488: Trailing characters: : string = "x"') 50543e969d3SBram Moolenaar call CheckDefFailure(['g:foo: number = 123'], 50643e969d3SBram Moolenaar 'E488: Trailing characters: : number = 123') 507d72c1bf0SBram Moolenaarenddef 508d72c1bf0SBram Moolenaar 509d72c1bf0SBram Moolenaardef Test_unlet() 510d72c1bf0SBram Moolenaar g:somevar = 'yes' 511d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 512d72c1bf0SBram Moolenaar unlet g:somevar 513d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 514d72c1bf0SBram Moolenaar unlet! g:somevar 515d72c1bf0SBram Moolenaar 516d72c1bf0SBram Moolenaar call CheckScriptFailure([ 517d72c1bf0SBram Moolenaar 'vim9script', 518d72c1bf0SBram Moolenaar 'let svar = 123', 519d72c1bf0SBram Moolenaar 'unlet svar', 520d72c1bf0SBram Moolenaar ], 'E1081:') 521d72c1bf0SBram Moolenaar call CheckScriptFailure([ 522d72c1bf0SBram Moolenaar 'vim9script', 523d72c1bf0SBram Moolenaar 'let svar = 123', 524d72c1bf0SBram Moolenaar 'unlet s:svar', 525d72c1bf0SBram Moolenaar ], 'E1081:') 526d72c1bf0SBram Moolenaar call CheckScriptFailure([ 527d72c1bf0SBram Moolenaar 'vim9script', 528d72c1bf0SBram Moolenaar 'let svar = 123', 529d72c1bf0SBram Moolenaar 'def Func()', 530d72c1bf0SBram Moolenaar ' unlet svar', 531d72c1bf0SBram Moolenaar 'enddef', 532822ba247SBram Moolenaar 'defcompile', 533d72c1bf0SBram Moolenaar ], 'E1081:') 534d72c1bf0SBram Moolenaar call CheckScriptFailure([ 535d72c1bf0SBram Moolenaar 'vim9script', 536d72c1bf0SBram Moolenaar 'let svar = 123', 537d72c1bf0SBram Moolenaar 'def Func()', 538d72c1bf0SBram Moolenaar ' unlet s:svar', 539d72c1bf0SBram Moolenaar 'enddef', 540822ba247SBram Moolenaar 'defcompile', 541d72c1bf0SBram Moolenaar ], 'E1081:') 5427bdaea6eSBram Moolenaar 5437bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 5447bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 5457bdaea6eSBram Moolenaar unlet $ENVVAR 5467bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 547d72c1bf0SBram Moolenaarenddef 548599c89c8SBram Moolenaar 5494c17ad94SBram Moolenaardef Test_delfunction() 550f5be8cdbSBram Moolenaar # Check function is defined in script namespace 5514c17ad94SBram Moolenaar CheckScriptSuccess([ 5524c17ad94SBram Moolenaar 'vim9script', 5534c17ad94SBram Moolenaar 'func CheckMe()', 5544c17ad94SBram Moolenaar ' return 123', 5554c17ad94SBram Moolenaar 'endfunc', 5564c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 5574c17ad94SBram Moolenaar ]) 5584c17ad94SBram Moolenaar 559f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 5604c17ad94SBram Moolenaar CheckScriptFailure([ 5614c17ad94SBram Moolenaar 'vim9script', 5624c17ad94SBram Moolenaar 'func DeleteMe1()', 5634c17ad94SBram Moolenaar 'endfunc', 5644c17ad94SBram Moolenaar 'delfunction DeleteMe1', 5654c17ad94SBram Moolenaar ], 'E1084:') 5664c17ad94SBram Moolenaar CheckScriptFailure([ 5674c17ad94SBram Moolenaar 'vim9script', 5684c17ad94SBram Moolenaar 'func DeleteMe2()', 5694c17ad94SBram Moolenaar 'endfunc', 5704c17ad94SBram Moolenaar 'def DoThat()', 5714c17ad94SBram Moolenaar ' delfunction DeleteMe2', 5724c17ad94SBram Moolenaar 'enddef', 5734c17ad94SBram Moolenaar 'DoThat()', 5744c17ad94SBram Moolenaar ], 'E1084:') 5754c17ad94SBram Moolenaar CheckScriptFailure([ 5764c17ad94SBram Moolenaar 'vim9script', 5774c17ad94SBram Moolenaar 'def DeleteMe3()', 5784c17ad94SBram Moolenaar 'enddef', 5794c17ad94SBram Moolenaar 'delfunction DeleteMe3', 5804c17ad94SBram Moolenaar ], 'E1084:') 5814c17ad94SBram Moolenaar CheckScriptFailure([ 5824c17ad94SBram Moolenaar 'vim9script', 5834c17ad94SBram Moolenaar 'def DeleteMe4()', 5844c17ad94SBram Moolenaar 'enddef', 5854c17ad94SBram Moolenaar 'def DoThat()', 5864c17ad94SBram Moolenaar ' delfunction DeleteMe4', 5874c17ad94SBram Moolenaar 'enddef', 5884c17ad94SBram Moolenaar 'DoThat()', 5894c17ad94SBram Moolenaar ], 'E1084:') 590925e9fd6SBram Moolenaar 591925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 592925e9fd6SBram Moolenaar let lines =<< trim END 593925e9fd6SBram Moolenaar vim9script 594925e9fd6SBram Moolenaar def g:Global(): string 595925e9fd6SBram Moolenaar return "yes" 596925e9fd6SBram Moolenaar enddef 597925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 598925e9fd6SBram Moolenaar def! g:Global(): string 599925e9fd6SBram Moolenaar return "no" 600925e9fd6SBram Moolenaar enddef 601925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 602925e9fd6SBram Moolenaar delfunc g:Global 603925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 604925e9fd6SBram Moolenaar END 605925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 606925e9fd6SBram Moolenaar 607925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 608925e9fd6SBram Moolenaar lines =<< trim END 609925e9fd6SBram Moolenaar vim9script 610925e9fd6SBram Moolenaar func g:Global() 611925e9fd6SBram Moolenaar return "yes" 612925e9fd6SBram Moolenaar endfunc 613925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 614925e9fd6SBram Moolenaar def! g:Global(): string 615925e9fd6SBram Moolenaar return "no" 616925e9fd6SBram Moolenaar enddef 617925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 618925e9fd6SBram Moolenaar delfunc g:Global 619925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 620925e9fd6SBram Moolenaar END 621925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 622925e9fd6SBram Moolenaar 623925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 624925e9fd6SBram Moolenaar lines =<< trim END 625925e9fd6SBram Moolenaar vim9script 626925e9fd6SBram Moolenaar def g:Global(): string 627925e9fd6SBram Moolenaar return "yes" 628925e9fd6SBram Moolenaar enddef 629925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 630925e9fd6SBram Moolenaar func! g:Global() 631925e9fd6SBram Moolenaar return "no" 632925e9fd6SBram Moolenaar endfunc 633925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 634925e9fd6SBram Moolenaar delfunc g:Global 635925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 636925e9fd6SBram Moolenaar END 637925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 6384c17ad94SBram Moolenaarenddef 6394c17ad94SBram Moolenaar 640599c89c8SBram Moolenaarfunc Test_wrong_type() 641599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<nothing>'], 'E1010:') 642599c89c8SBram Moolenaar call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 643599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 644599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 645599c89c8SBram Moolenaar 646599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<number'], 'E1009:') 647599c89c8SBram Moolenaar call CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 64842a480bfSBram Moolenaar 64942a480bfSBram Moolenaar call CheckDefFailure(['let var: ally'], 'E1010:') 65042a480bfSBram Moolenaar call CheckDefFailure(['let var: bram'], 'E1010:') 65142a480bfSBram Moolenaar call CheckDefFailure(['let var: cathy'], 'E1010:') 65242a480bfSBram Moolenaar call CheckDefFailure(['let var: dom'], 'E1010:') 65342a480bfSBram Moolenaar call CheckDefFailure(['let var: freddy'], 'E1010:') 65442a480bfSBram Moolenaar call CheckDefFailure(['let var: john'], 'E1010:') 65542a480bfSBram Moolenaar call CheckDefFailure(['let var: larry'], 'E1010:') 65642a480bfSBram Moolenaar call CheckDefFailure(['let var: ned'], 'E1010:') 65742a480bfSBram Moolenaar call CheckDefFailure(['let var: pam'], 'E1010:') 65842a480bfSBram Moolenaar call CheckDefFailure(['let var: sam'], 'E1010:') 65942a480bfSBram Moolenaar call CheckDefFailure(['let var: vim'], 'E1010:') 660a0a9f43aSBram Moolenaar 661a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 662a0a9f43aSBram Moolenaar call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 6638a7d6542SBram Moolenaarendfunc 6648a7d6542SBram Moolenaar 6658a7d6542SBram Moolenaarfunc Test_const() 6668a7d6542SBram Moolenaar call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 6678a7d6542SBram Moolenaar call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 6688a7d6542SBram Moolenaar call CheckDefFailure(['const two'], 'E1021:') 6699be61bbbSBram Moolenaar call CheckDefFailure(['const &option'], 'E996:') 6708a7d6542SBram Moolenaarendfunc 6718a7d6542SBram Moolenaar 672df069eecSBram Moolenaardef Test_range_no_colon() 673df069eecSBram Moolenaar call CheckDefFailure(['%s/a/b/'], 'E1050:') 674df069eecSBram Moolenaar call CheckDefFailure(['+ s/a/b/'], 'E1050:') 675df069eecSBram Moolenaar call CheckDefFailure(['- s/a/b/'], 'E1050:') 676df069eecSBram Moolenaar call CheckDefFailure(['. s/a/b/'], 'E1050:') 677df069eecSBram Moolenaarenddef 678df069eecSBram Moolenaar 679df069eecSBram Moolenaar 6808a7d6542SBram Moolenaardef Test_block() 6818a7d6542SBram Moolenaar let outer = 1 6828a7d6542SBram Moolenaar { 6838a7d6542SBram Moolenaar let inner = 2 6848a7d6542SBram Moolenaar assert_equal(1, outer) 6858a7d6542SBram Moolenaar assert_equal(2, inner) 6868a7d6542SBram Moolenaar } 6878a7d6542SBram Moolenaar assert_equal(1, outer) 6888a7d6542SBram Moolenaarenddef 6898a7d6542SBram Moolenaar 6908a7d6542SBram Moolenaarfunc Test_block_failure() 6918a7d6542SBram Moolenaar call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 692585fea7bSBram Moolenaar call CheckDefFailure(['}'], 'E1025:') 693585fea7bSBram Moolenaar call CheckDefFailure(['{', 'echo 1'], 'E1026:') 6948a7d6542SBram Moolenaarendfunc 6958a7d6542SBram Moolenaar 696585fea7bSBram Moolenaardef Test_cmd_modifier() 697585fea7bSBram Moolenaar tab echo '0' 698585fea7bSBram Moolenaar call CheckDefFailure(['5tab echo 3'], 'E16:') 699585fea7bSBram Moolenaarenddef 700585fea7bSBram Moolenaar 701d032f34aSBram Moolenaarfunc g:NoSuchFunc() 702d032f34aSBram Moolenaar echo 'none' 703d032f34aSBram Moolenaarendfunc 704d032f34aSBram Moolenaar 7058a7d6542SBram Moolenaardef Test_try_catch() 7068a7d6542SBram Moolenaar let l = [] 7077a092245SBram Moolenaar try # comment 7088a7d6542SBram Moolenaar add(l, '1') 7098a7d6542SBram Moolenaar throw 'wrong' 7108a7d6542SBram Moolenaar add(l, '2') 7117a092245SBram Moolenaar catch # comment 7128a7d6542SBram Moolenaar add(l, v:exception) 7137a092245SBram Moolenaar finally # comment 7148a7d6542SBram Moolenaar add(l, '3') 7157a092245SBram Moolenaar endtry # comment 7168a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 71768d130c6SBram Moolenaar 718e859312eSBram Moolenaar l = [] 719e859312eSBram Moolenaar try 720e859312eSBram Moolenaar try 721e859312eSBram Moolenaar add(l, '1') 722e859312eSBram Moolenaar throw 'wrong' 723e859312eSBram Moolenaar add(l, '2') 724e859312eSBram Moolenaar catch /right/ 725e859312eSBram Moolenaar add(l, v:exception) 726e859312eSBram Moolenaar endtry 727e859312eSBram Moolenaar catch /wrong/ 728e859312eSBram Moolenaar add(l, 'caught') 729e859312eSBram Moolenaar finally 730e859312eSBram Moolenaar add(l, 'finally') 731e859312eSBram Moolenaar endtry 732e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 733e859312eSBram Moolenaar 73468d130c6SBram Moolenaar let n: number 73568d130c6SBram Moolenaar try 73668d130c6SBram Moolenaar n = l[3] 73768d130c6SBram Moolenaar catch /E684:/ 73868d130c6SBram Moolenaar n = 99 73968d130c6SBram Moolenaar endtry 74068d130c6SBram Moolenaar assert_equal(99, n) 74168d130c6SBram Moolenaar 74268d130c6SBram Moolenaar try 74368d130c6SBram Moolenaar n = g:astring[3] 74468d130c6SBram Moolenaar catch /E714:/ 74568d130c6SBram Moolenaar n = 77 74668d130c6SBram Moolenaar endtry 74768d130c6SBram Moolenaar assert_equal(77, n) 74868d130c6SBram Moolenaar 74968d130c6SBram Moolenaar try 75068d130c6SBram Moolenaar n = l[g:astring] 75168d130c6SBram Moolenaar catch /E39:/ 75268d130c6SBram Moolenaar n = 77 75368d130c6SBram Moolenaar endtry 75468d130c6SBram Moolenaar assert_equal(77, n) 75568d130c6SBram Moolenaar 75668d130c6SBram Moolenaar try 75768d130c6SBram Moolenaar n = s:does_not_exist 75868d130c6SBram Moolenaar catch /E121:/ 759f0b9f43cSBram Moolenaar n = 111 760f0b9f43cSBram Moolenaar endtry 761f0b9f43cSBram Moolenaar assert_equal(111, n) 762f0b9f43cSBram Moolenaar 763f0b9f43cSBram Moolenaar try 764f0b9f43cSBram Moolenaar n = g:does_not_exist 765f0b9f43cSBram Moolenaar catch /E121:/ 76668d130c6SBram Moolenaar n = 121 76768d130c6SBram Moolenaar endtry 76868d130c6SBram Moolenaar assert_equal(121, n) 76968d130c6SBram Moolenaar 77068d130c6SBram Moolenaar let d = #{one: 1} 77168d130c6SBram Moolenaar try 77268d130c6SBram Moolenaar n = d[g:astring] 77368d130c6SBram Moolenaar catch /E716:/ 77468d130c6SBram Moolenaar n = 222 77568d130c6SBram Moolenaar endtry 77668d130c6SBram Moolenaar assert_equal(222, n) 777f0b9f43cSBram Moolenaar 778f0b9f43cSBram Moolenaar try 779f0b9f43cSBram Moolenaar n = -g:astring 780f0b9f43cSBram Moolenaar catch /E39:/ 781f0b9f43cSBram Moolenaar n = 233 782f0b9f43cSBram Moolenaar endtry 783f0b9f43cSBram Moolenaar assert_equal(233, n) 784f0b9f43cSBram Moolenaar 785f0b9f43cSBram Moolenaar try 786f0b9f43cSBram Moolenaar n = +g:astring 787f0b9f43cSBram Moolenaar catch /E1030:/ 788f0b9f43cSBram Moolenaar n = 244 789f0b9f43cSBram Moolenaar endtry 790f0b9f43cSBram Moolenaar assert_equal(244, n) 791f0b9f43cSBram Moolenaar 792f0b9f43cSBram Moolenaar try 793f0b9f43cSBram Moolenaar n = +g:alist 794f0b9f43cSBram Moolenaar catch /E745:/ 795f0b9f43cSBram Moolenaar n = 255 796f0b9f43cSBram Moolenaar endtry 797f0b9f43cSBram Moolenaar assert_equal(255, n) 798f0b9f43cSBram Moolenaar 799f0b9f43cSBram Moolenaar let nd: dict<any> 800f0b9f43cSBram Moolenaar try 801f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 802f0b9f43cSBram Moolenaar catch /E1029:/ 803f0b9f43cSBram Moolenaar n = 266 804f0b9f43cSBram Moolenaar endtry 805f0b9f43cSBram Moolenaar assert_equal(266, n) 806f0b9f43cSBram Moolenaar 807f0b9f43cSBram Moolenaar try 808f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 809f0b9f43cSBram Moolenaar catch /E1093:/ 810f0b9f43cSBram Moolenaar n = 277 811f0b9f43cSBram Moolenaar endtry 812f0b9f43cSBram Moolenaar assert_equal(277, n) 813f0b9f43cSBram Moolenaar 814e859312eSBram Moolenaar try 815e859312eSBram Moolenaar &ts = g:astring 816e859312eSBram Moolenaar catch /E1029:/ 817e859312eSBram Moolenaar n = 288 818e859312eSBram Moolenaar endtry 819e859312eSBram Moolenaar assert_equal(288, n) 820e859312eSBram Moolenaar 821e859312eSBram Moolenaar try 822e859312eSBram Moolenaar &backspace = 'asdf' 823e859312eSBram Moolenaar catch /E474:/ 824e859312eSBram Moolenaar n = 299 825e859312eSBram Moolenaar endtry 826e859312eSBram Moolenaar assert_equal(299, n) 827e859312eSBram Moolenaar 828e859312eSBram Moolenaar l = [1] 829e859312eSBram Moolenaar try 830e859312eSBram Moolenaar l[3] = 3 831e859312eSBram Moolenaar catch /E684:/ 832e859312eSBram Moolenaar n = 300 833e859312eSBram Moolenaar endtry 834e859312eSBram Moolenaar assert_equal(300, n) 835e859312eSBram Moolenaar 836e859312eSBram Moolenaar try 837e859312eSBram Moolenaar unlet g:does_not_exist 838e859312eSBram Moolenaar catch /E108:/ 839e859312eSBram Moolenaar n = 322 840e859312eSBram Moolenaar endtry 841e859312eSBram Moolenaar assert_equal(322, n) 842e859312eSBram Moolenaar 843e859312eSBram Moolenaar try 844e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 845e859312eSBram Moolenaar catch /E721:/ 846e859312eSBram Moolenaar n = 333 847e859312eSBram Moolenaar endtry 848e859312eSBram Moolenaar assert_equal(333, n) 849e859312eSBram Moolenaar 850e859312eSBram Moolenaar try 851e859312eSBram Moolenaar l = DeletedFunc() 852e859312eSBram Moolenaar catch /E933:/ 853e859312eSBram Moolenaar n = 344 854e859312eSBram Moolenaar endtry 855e859312eSBram Moolenaar assert_equal(344, n) 856d032f34aSBram Moolenaar 857d032f34aSBram Moolenaar try 858d032f34aSBram Moolenaar echo len(v:true) 859d032f34aSBram Moolenaar catch /E701:/ 860d032f34aSBram Moolenaar n = 355 861d032f34aSBram Moolenaar endtry 862d032f34aSBram Moolenaar assert_equal(355, n) 863d032f34aSBram Moolenaar 864d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 865d032f34aSBram Moolenaar delfunc g:NoSuchFunc 866d032f34aSBram Moolenaar try 867d032f34aSBram Moolenaar echo P() 868d032f34aSBram Moolenaar catch /E117:/ 869d032f34aSBram Moolenaar n = 366 870d032f34aSBram Moolenaar endtry 871d032f34aSBram Moolenaar assert_equal(366, n) 872d032f34aSBram Moolenaar 873d032f34aSBram Moolenaar try 874d032f34aSBram Moolenaar echo g:NoSuchFunc() 875d032f34aSBram Moolenaar catch /E117:/ 876d032f34aSBram Moolenaar n = 377 877d032f34aSBram Moolenaar endtry 878d032f34aSBram Moolenaar assert_equal(377, n) 879d032f34aSBram Moolenaar 880d032f34aSBram Moolenaar try 881d032f34aSBram Moolenaar echo g:alist + 4 882d032f34aSBram Moolenaar catch /E745:/ 883d032f34aSBram Moolenaar n = 388 884d032f34aSBram Moolenaar endtry 885d032f34aSBram Moolenaar assert_equal(388, n) 886d032f34aSBram Moolenaar 887d032f34aSBram Moolenaar try 888d032f34aSBram Moolenaar echo 4 + g:alist 889d032f34aSBram Moolenaar catch /E745:/ 890d032f34aSBram Moolenaar n = 399 891d032f34aSBram Moolenaar endtry 892d032f34aSBram Moolenaar assert_equal(399, n) 893d032f34aSBram Moolenaar 894d032f34aSBram Moolenaar try 895d032f34aSBram Moolenaar echo g:alist.member 896d032f34aSBram Moolenaar catch /E715:/ 897d032f34aSBram Moolenaar n = 400 898d032f34aSBram Moolenaar endtry 899d032f34aSBram Moolenaar assert_equal(400, n) 900d032f34aSBram Moolenaar 901d032f34aSBram Moolenaar try 902d032f34aSBram Moolenaar echo d.member 903d032f34aSBram Moolenaar catch /E716:/ 904d032f34aSBram Moolenaar n = 411 905d032f34aSBram Moolenaar endtry 906d032f34aSBram Moolenaar assert_equal(411, n) 9078a7d6542SBram Moolenaarenddef 9088a7d6542SBram Moolenaar 909e859312eSBram Moolenaardef DeletedFunc(): list<any> 910e859312eSBram Moolenaar return ['delete me'] 911e859312eSBram Moolenaarenddef 912e859312eSBram Moolenaardefcompile 913e859312eSBram Moolenaardelfunc DeletedFunc 914e859312eSBram Moolenaar 915257cc5eeSBram Moolenaardef ThrowFromDef() 916a72cfb80SBram Moolenaar throw "getout" # comment 917257cc5eeSBram Moolenaarenddef 918257cc5eeSBram Moolenaar 919257cc5eeSBram Moolenaarfunc CatchInFunc() 920257cc5eeSBram Moolenaar try 921257cc5eeSBram Moolenaar call ThrowFromDef() 922257cc5eeSBram Moolenaar catch 923257cc5eeSBram Moolenaar let g:thrown_func = v:exception 924257cc5eeSBram Moolenaar endtry 925257cc5eeSBram Moolenaarendfunc 926257cc5eeSBram Moolenaar 927257cc5eeSBram Moolenaardef CatchInDef() 928257cc5eeSBram Moolenaar try 929257cc5eeSBram Moolenaar ThrowFromDef() 930257cc5eeSBram Moolenaar catch 931257cc5eeSBram Moolenaar g:thrown_def = v:exception 932257cc5eeSBram Moolenaar endtry 933257cc5eeSBram Moolenaarenddef 934257cc5eeSBram Moolenaar 935f575adffSBram Moolenaardef ReturnFinally(): string 936f575adffSBram Moolenaar try 937f575adffSBram Moolenaar return 'intry' 938f575adffSBram Moolenaar finally 939f575adffSBram Moolenaar g:in_finally = 'finally' 940f575adffSBram Moolenaar endtry 941f575adffSBram Moolenaar return 'end' 942f575adffSBram Moolenaarenddef 943f575adffSBram Moolenaar 944257cc5eeSBram Moolenaardef Test_try_catch_nested() 945257cc5eeSBram Moolenaar CatchInFunc() 946257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 947257cc5eeSBram Moolenaar 948257cc5eeSBram Moolenaar CatchInDef() 949257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 950f575adffSBram Moolenaar 951f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 952f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 953f575adffSBram Moolenaarenddef 954f575adffSBram Moolenaar 955f575adffSBram Moolenaardef Test_try_catch_match() 956f575adffSBram Moolenaar let seq = 'a' 957f575adffSBram Moolenaar try 958f575adffSBram Moolenaar throw 'something' 959f575adffSBram Moolenaar catch /nothing/ 960f575adffSBram Moolenaar seq ..= 'x' 961f575adffSBram Moolenaar catch /some/ 962f575adffSBram Moolenaar seq ..= 'b' 963f575adffSBram Moolenaar catch /asdf/ 964f575adffSBram Moolenaar seq ..= 'x' 965e8c4abbbSBram Moolenaar catch ?a\?sdf? 966e8c4abbbSBram Moolenaar seq ..= 'y' 967f575adffSBram Moolenaar finally 968f575adffSBram Moolenaar seq ..= 'c' 969f575adffSBram Moolenaar endtry 970f575adffSBram Moolenaar assert_equal('abc', seq) 971257cc5eeSBram Moolenaarenddef 972257cc5eeSBram Moolenaar 973e8c4abbbSBram Moolenaardef Test_try_catch_fails() 974e8c4abbbSBram Moolenaar call CheckDefFailure(['catch'], 'E603:') 975e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 976e8c4abbbSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 977585fea7bSBram Moolenaar call CheckDefFailure(['finally'], 'E606:') 978585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 979585fea7bSBram Moolenaar call CheckDefFailure(['endtry'], 'E602:') 980585fea7bSBram Moolenaar call CheckDefFailure(['while 1', 'endtry'], 'E170:') 981585fea7bSBram Moolenaar call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 982585fea7bSBram Moolenaar call CheckDefFailure(['if 2', 'endtry'], 'E171:') 983585fea7bSBram Moolenaar call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 984585fea7bSBram Moolenaar 985a72cfb80SBram Moolenaar call CheckDefFailure(['throw'], 'E1015:') 986585fea7bSBram Moolenaar call CheckDefFailure(['throw xxx'], 'E1001:') 987e8c4abbbSBram Moolenaarenddef 988e8c4abbbSBram Moolenaar 989006ad48bSBram Moolenaardef Test_throw_vimscript() 990f5be8cdbSBram Moolenaar # only checks line continuation 991006ad48bSBram Moolenaar let lines =<< trim END 992006ad48bSBram Moolenaar vim9script 993006ad48bSBram Moolenaar try 994006ad48bSBram Moolenaar throw 'one' 995006ad48bSBram Moolenaar .. 'two' 996006ad48bSBram Moolenaar catch 997006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 998006ad48bSBram Moolenaar endtry 999006ad48bSBram Moolenaar END 1000006ad48bSBram Moolenaar CheckScriptSuccess(lines) 1001006ad48bSBram Moolenaarenddef 1002006ad48bSBram Moolenaar 100337c83711SBram Moolenaardef Test_cexpr_vimscript() 1004f5be8cdbSBram Moolenaar # only checks line continuation 100537c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 100637c83711SBram Moolenaar let lines =<< trim END 100737c83711SBram Moolenaar vim9script 100837c83711SBram Moolenaar cexpr 'File' 100937c83711SBram Moolenaar .. ' someFile' .. 101037c83711SBram Moolenaar ' line 19' 101137c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 101237c83711SBram Moolenaar END 101337c83711SBram Moolenaar CheckScriptSuccess(lines) 101437c83711SBram Moolenaar set errorformat& 101537c83711SBram Moolenaarenddef 101637c83711SBram Moolenaar 1017b209750bSBram Moolenaardef Test_list_vimscript() 1018b209750bSBram Moolenaar # checks line continuation and comments 1019b209750bSBram Moolenaar let lines =<< trim END 1020b209750bSBram Moolenaar vim9script 1021b209750bSBram Moolenaar let mylist = [ 1022b209750bSBram Moolenaar 'one', 1023b209750bSBram Moolenaar # comment 1024b209750bSBram Moolenaar 'two', # empty line follows 1025b209750bSBram Moolenaar 1026b209750bSBram Moolenaar 'three', 1027b209750bSBram Moolenaar ] 1028b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1029b209750bSBram Moolenaar END 1030b209750bSBram Moolenaar CheckScriptSuccess(lines) 1031b209750bSBram Moolenaarenddef 1032b209750bSBram Moolenaar 10332a1381c3SBram Moolenaarif has('channel') 103440ee466cSBram Moolenaar let someJob = test_null_job() 103540ee466cSBram Moolenaar 103640ee466cSBram Moolenaar def FuncWithError() 103740ee466cSBram Moolenaar echomsg g:someJob 103840ee466cSBram Moolenaar enddef 103940ee466cSBram Moolenaar 104040ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 104140ee466cSBram Moolenaar try 104240ee466cSBram Moolenaar call FuncWithError() 104340ee466cSBram Moolenaar catch 104440ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 104540ee466cSBram Moolenaar endtry 104640ee466cSBram Moolenaar endfunc 10472a1381c3SBram Moolenaarendif 104840ee466cSBram Moolenaar 10498a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10508a7d6542SBram Moolenaar vim9script 10518a7d6542SBram Moolenaar let name: string = 'bob' 10528a7d6542SBram Moolenaar def Concat(arg: string): string 10538a7d6542SBram Moolenaar return name .. arg 10548a7d6542SBram Moolenaar enddef 1055227a69deSBram Moolenaar g:result = Concat('bie') 1056227a69deSBram Moolenaar g:localname = name 10578a7d6542SBram Moolenaar 10588a7d6542SBram Moolenaar export const CONST = 1234 10598a7d6542SBram Moolenaar export let exported = 9876 10606e587dcbSBram Moolenaar export let exp_name = 'John' 10618a7d6542SBram Moolenaar export def Exported(): string 10628a7d6542SBram Moolenaar return 'Exported' 10638a7d6542SBram Moolenaar enddef 10648a7d6542SBram MoolenaarEND 10658a7d6542SBram Moolenaar 10665269bd2aSBram Moolenaardef Test_vim9_import_export() 10678a7d6542SBram Moolenaar let import_script_lines =<< trim END 10688a7d6542SBram Moolenaar vim9script 10698a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 10708a7d6542SBram Moolenaar g:imported = exported 10716e587dcbSBram Moolenaar exported += 3 10726e587dcbSBram Moolenaar g:imported_added = exported 10738a7d6542SBram Moolenaar g:imported_func = Exported() 10746e587dcbSBram Moolenaar 107540f4f7a4SBram Moolenaar def GetExported(): string 107640f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 107740f4f7a4SBram Moolenaar return local_dict.ref() 107840f4f7a4SBram Moolenaar enddef 107940f4f7a4SBram Moolenaar g:funcref_result = GetExported() 108040f4f7a4SBram Moolenaar 10816e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 10826e587dcbSBram Moolenaar g:imported_name = exp_name 10836e587dcbSBram Moolenaar exp_name ..= ' Doe' 10846e587dcbSBram Moolenaar g:imported_name_appended = exp_name 10855381c7a1SBram Moolenaar g:imported_later = exported 10868a7d6542SBram Moolenaar END 10878a7d6542SBram Moolenaar 10888a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 10898a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 10908a7d6542SBram Moolenaar 10918a7d6542SBram Moolenaar source Ximport.vim 10928a7d6542SBram Moolenaar 10938a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 10948a7d6542SBram Moolenaar assert_equal('bob', g:localname) 10958a7d6542SBram Moolenaar assert_equal(9876, g:imported) 10966e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 10975381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 10988a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 109940f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11006e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11016e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11028a7d6542SBram Moolenaar assert_false(exists('g:name')) 11038a7d6542SBram Moolenaar 11048a7d6542SBram Moolenaar unlet g:result 11058a7d6542SBram Moolenaar unlet g:localname 11068a7d6542SBram Moolenaar unlet g:imported 11076e587dcbSBram Moolenaar unlet g:imported_added 11085381c7a1SBram Moolenaar unlet g:imported_later 11098a7d6542SBram Moolenaar unlet g:imported_func 11106e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11118a7d6542SBram Moolenaar delete('Ximport.vim') 1112f2d5c240SBram Moolenaar 11131c991144SBram Moolenaar # similar, with line breaks 11141c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 11151c991144SBram Moolenaar vim9script 11161c991144SBram Moolenaar import { 11171c991144SBram Moolenaar exported, 11181c991144SBram Moolenaar Exported, 11191c991144SBram Moolenaar } 11201c991144SBram Moolenaar from 11211c991144SBram Moolenaar './Xexport.vim' 11221c991144SBram Moolenaar g:imported = exported 11231c991144SBram Moolenaar exported += 5 11241c991144SBram Moolenaar g:imported_added = exported 11251c991144SBram Moolenaar g:imported_func = Exported() 11261c991144SBram Moolenaar END 11271c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 11281c991144SBram Moolenaar source Ximport_lbr.vim 11291c991144SBram Moolenaar 11301c991144SBram Moolenaar assert_equal(9876, g:imported) 11311c991144SBram Moolenaar assert_equal(9881, g:imported_added) 11321c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 11331c991144SBram Moolenaar 11341c991144SBram Moolenaar # exported script not sourced again 11351c991144SBram Moolenaar assert_false(exists('g:result')) 11361c991144SBram Moolenaar unlet g:imported 11371c991144SBram Moolenaar unlet g:imported_added 11381c991144SBram Moolenaar unlet g:imported_func 11391c991144SBram Moolenaar delete('Ximport_lbr.vim') 11401c991144SBram Moolenaar 11411c991144SBram Moolenaar # import inside :def function 11425381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 11435381c7a1SBram Moolenaar vim9script 11445381c7a1SBram Moolenaar def ImportInDef() 11455381c7a1SBram Moolenaar import exported from './Xexport.vim' 11465381c7a1SBram Moolenaar g:imported = exported 11475381c7a1SBram Moolenaar exported += 7 11485381c7a1SBram Moolenaar g:imported_added = exported 11495381c7a1SBram Moolenaar enddef 11505381c7a1SBram Moolenaar ImportInDef() 11515381c7a1SBram Moolenaar END 11525381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 11535381c7a1SBram Moolenaar source Ximport2.vim 1154f5be8cdbSBram Moolenaar # TODO: this should be 9879 11555381c7a1SBram Moolenaar assert_equal(9876, g:imported) 11565381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 11575381c7a1SBram Moolenaar unlet g:imported 11585381c7a1SBram Moolenaar unlet g:imported_added 11595381c7a1SBram Moolenaar delete('Ximport2.vim') 11605381c7a1SBram Moolenaar 1161f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 1162f2d5c240SBram Moolenaar vim9script 1163f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1164f2d5c240SBram Moolenaar def UseExport() 1165f2d5c240SBram Moolenaar g:imported = Export.exported 1166f2d5c240SBram Moolenaar enddef 1167f2d5c240SBram Moolenaar UseExport() 1168f2d5c240SBram Moolenaar END 1169f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1170f2d5c240SBram Moolenaar source Ximport.vim 11715381c7a1SBram Moolenaar assert_equal(9883, g:imported) 1172f2d5c240SBram Moolenaar 1173599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 1174599c89c8SBram Moolenaar vim9script 1175599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1176599c89c8SBram Moolenaar def Func() 1177599c89c8SBram Moolenaar let dummy = 1 1178599c89c8SBram Moolenaar let imported = Export + dummy 1179599c89c8SBram Moolenaar enddef 1180822ba247SBram Moolenaar defcompile 1181599c89c8SBram Moolenaar END 1182599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 1183599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1060:') 1184599c89c8SBram Moolenaar 1185599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 1186599c89c8SBram Moolenaar vim9script 1187599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1188599c89c8SBram Moolenaar def Func() 1189599c89c8SBram Moolenaar let imported = Export . exported 1190599c89c8SBram Moolenaar enddef 1191822ba247SBram Moolenaar defcompile 1192599c89c8SBram Moolenaar END 1193599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 1194599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1195599c89c8SBram Moolenaar 1196599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 1197599c89c8SBram Moolenaar vim9script 1198599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1199599c89c8SBram Moolenaar def Func() 1200599c89c8SBram Moolenaar let imported = Export. 1201599c89c8SBram Moolenaar enddef 1202822ba247SBram Moolenaar defcompile 1203599c89c8SBram Moolenaar END 1204599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 1205599c89c8SBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1206599c89c8SBram Moolenaar 12071c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 12081c991144SBram Moolenaar vim9script 12091c991144SBram Moolenaar import * 12101c991144SBram Moolenaar as Export 12111c991144SBram Moolenaar from 12121c991144SBram Moolenaar './Xexport.vim' 12131c991144SBram Moolenaar def UseExport() 12141c991144SBram Moolenaar g:imported = Export.exported 12151c991144SBram Moolenaar enddef 12161c991144SBram Moolenaar UseExport() 12171c991144SBram Moolenaar END 12181c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 12191c991144SBram Moolenaar source Ximport.vim 12201c991144SBram Moolenaar assert_equal(9883, g:imported) 12211c991144SBram Moolenaar 1222f2d5c240SBram Moolenaar let import_star_lines =<< trim END 1223f2d5c240SBram Moolenaar vim9script 1224f2d5c240SBram Moolenaar import * from './Xexport.vim' 1225f2d5c240SBram Moolenaar END 1226f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 1227f2d5c240SBram Moolenaar assert_fails('source Ximport.vim', 'E1045:') 1228f2d5c240SBram Moolenaar 1229f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1230fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 1231fa29c8abSBram Moolenaar vim9script 1232fa29c8abSBram Moolenaar import name from './Xexport.vim' 1233fa29c8abSBram Moolenaar END 1234fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 1235fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:') 1236fa29c8abSBram Moolenaar 1237f5be8cdbSBram Moolenaar # try to import something that is already defined 12385269bd2aSBram Moolenaar let import_already_defined =<< trim END 12395269bd2aSBram Moolenaar vim9script 12405269bd2aSBram Moolenaar let exported = 'something' 12415269bd2aSBram Moolenaar import exported from './Xexport.vim' 12425269bd2aSBram Moolenaar END 12435269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 12445269bd2aSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:') 12455269bd2aSBram Moolenaar 1246f5be8cdbSBram Moolenaar # try to import something that is already defined 12475269bd2aSBram Moolenaar import_already_defined =<< trim END 12485269bd2aSBram Moolenaar vim9script 12495269bd2aSBram Moolenaar let exported = 'something' 12505269bd2aSBram Moolenaar import * as 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 {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 # import a very long name, requires making a copy 1265fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 1266fa29c8abSBram Moolenaar vim9script 1267fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1268fa29c8abSBram Moolenaar END 1269fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 1270fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:') 1271fa29c8abSBram Moolenaar 1272fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 1273fa29c8abSBram Moolenaar vim9script 1274fa29c8abSBram Moolenaar import name './Xexport.vim' 1275fa29c8abSBram Moolenaar END 1276fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 1277fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:') 1278fa29c8abSBram Moolenaar 1279fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 1280fa29c8abSBram Moolenaar vim9script 1281fa29c8abSBram Moolenaar import name from Xexport.vim 1282fa29c8abSBram Moolenaar END 1283fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 1284fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:') 1285fa29c8abSBram Moolenaar 1286fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 1287fa29c8abSBram Moolenaar vim9script 1288fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1289fa29c8abSBram Moolenaar END 1290fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 1291fa29c8abSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:') 1292fa29c8abSBram Moolenaar 1293fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 1294fa29c8abSBram Moolenaar vim9script 1295fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1296fa29c8abSBram Moolenaar END 12975269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 12985269bd2aSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:') 1299fa29c8abSBram Moolenaar 1300f2d5c240SBram Moolenaar delete('Ximport.vim') 13015269bd2aSBram Moolenaar delete('Ximport3.vim') 13028a7d6542SBram Moolenaar delete('Xexport.vim') 13038a7d6542SBram Moolenaar 1304f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1305750802b5SBram Moolenaar set cpo&vi 1306750802b5SBram Moolenaar let cpo_before = &cpo 1307750802b5SBram Moolenaar let lines =<< trim END 1308750802b5SBram Moolenaar vim9script 1309750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1310750802b5SBram Moolenaar END 1311750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1312750802b5SBram Moolenaar source Xvim9_script 1313750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1314750802b5SBram Moolenaar set cpo&vim 1315750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1316750802b5SBram Moolenaar delete('Xvim9_script') 1317750802b5SBram Moolenaarenddef 1318750802b5SBram Moolenaar 1319750802b5SBram Moolenaardef Test_vim9script_fails() 13208a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 13218a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1322750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 13239721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 13249b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1325750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1326750802b5SBram Moolenaar 1327c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:') 1328c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1329c785b9a7SBram Moolenaar 1330750802b5SBram Moolenaar assert_fails('vim9script', 'E1038') 1331a26b9700SBram Moolenaar assert_fails('export something', 'E1043') 13328a7d6542SBram Moolenaarenddef 13338a7d6542SBram Moolenaar 1334f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1335101f4810SBram Moolenaar CheckRunVimInTerminal 1336101f4810SBram Moolenaar 13379bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1338c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 13399bb3eb3eSBram Moolenaarendfunc 13409bb3eb3eSBram Moolenaar 1341c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1342101f4810SBram Moolenaar let export =<< trim END 1343101f4810SBram Moolenaar vim9script 1344101f4810SBram Moolenaar export def Foo(): number 1345101f4810SBram Moolenaar return 0 1346101f4810SBram Moolenaar enddef 1347101f4810SBram Moolenaar END 13489bb3eb3eSBram Moolenaar writefile(export, 'Xexport.vim') 1349101f4810SBram Moolenaar 13509bb3eb3eSBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{ 13519bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 13529bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1353101f4810SBram Moolenaar 13549bb3eb3eSBram Moolenaar delete('Xexport.vim') 13559bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 13569bb3eb3eSBram Moolenaarenddef 1357101f4810SBram Moolenaar 13584c17ad94SBram Moolenaardef Test_vim9script_reload_import() 13598a7d6542SBram Moolenaar let lines =<< trim END 13608a7d6542SBram Moolenaar vim9script 13618a7d6542SBram Moolenaar const var = '' 13628a7d6542SBram Moolenaar let valone = 1234 13638a7d6542SBram Moolenaar def MyFunc(arg: string) 13648a7d6542SBram Moolenaar valone = 5678 13658a7d6542SBram Moolenaar enddef 13668a7d6542SBram Moolenaar END 13678a7d6542SBram Moolenaar let morelines =<< trim END 13688a7d6542SBram Moolenaar let valtwo = 222 13698a7d6542SBram Moolenaar export def GetValtwo(): number 13708a7d6542SBram Moolenaar return valtwo 13718a7d6542SBram Moolenaar enddef 13728a7d6542SBram Moolenaar END 137303afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 13748a7d6542SBram Moolenaar source Xreload.vim 13758a7d6542SBram Moolenaar source Xreload.vim 13768a7d6542SBram Moolenaar source Xreload.vim 13778a7d6542SBram Moolenaar 13788a7d6542SBram Moolenaar let testlines =<< trim END 13798a7d6542SBram Moolenaar vim9script 13808a7d6542SBram Moolenaar def TheFunc() 13818a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 13828a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 13838a7d6542SBram Moolenaar enddef 13848a7d6542SBram Moolenaar TheFunc() 13858a7d6542SBram Moolenaar END 13868a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 13878a7d6542SBram Moolenaar source Ximport.vim 13888a7d6542SBram Moolenaar 1389f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1390f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 13918a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 13928a7d6542SBram Moolenaar source Ximport.vim 13938a7d6542SBram Moolenaar 1394f5be8cdbSBram Moolenaar # cannot declare a var twice 13958a7d6542SBram Moolenaar lines =<< trim END 13968a7d6542SBram Moolenaar vim9script 13978a7d6542SBram Moolenaar let valone = 1234 13988a7d6542SBram Moolenaar let valone = 5678 13998a7d6542SBram Moolenaar END 14008a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 14018a7d6542SBram Moolenaar assert_fails('source Xreload.vim', 'E1041:') 14028a7d6542SBram Moolenaar 14038a7d6542SBram Moolenaar delete('Xreload.vim') 14048a7d6542SBram Moolenaar delete('Ximport.vim') 14058a7d6542SBram Moolenaarenddef 14068a7d6542SBram Moolenaar 1407fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1408fe465a01SBram Moolenaar" script-local name. 1409fe465a01SBram Moolenaardef Test_vim9script_funcref() 1410fe465a01SBram Moolenaar let sortlines =<< trim END 1411fe465a01SBram Moolenaar vim9script 1412fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1413bed36b93SBram Moolenaar return i2 - i1 1414fe465a01SBram Moolenaar enddef 1415fe465a01SBram Moolenaar 1416fe465a01SBram Moolenaar export def FastSort(): list<number> 1417fe465a01SBram Moolenaar return range(5)->sort(Compare) 1418fe465a01SBram Moolenaar enddef 1419fe465a01SBram Moolenaar END 1420fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1421fe465a01SBram Moolenaar 1422fe465a01SBram Moolenaar let lines =<< trim END 1423fe465a01SBram Moolenaar vim9script 1424fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1425fe465a01SBram Moolenaar def Test() 1426fe465a01SBram Moolenaar g:result = FastSort() 1427fe465a01SBram Moolenaar enddef 1428fe465a01SBram Moolenaar Test() 1429fe465a01SBram Moolenaar END 1430fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1431fe465a01SBram Moolenaar 1432fe465a01SBram Moolenaar source Xscript.vim 1433fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1434fe465a01SBram Moolenaar 1435fe465a01SBram Moolenaar unlet g:result 1436fe465a01SBram Moolenaar delete('Xsort.vim') 1437fe465a01SBram Moolenaar delete('Xscript.vim') 1438fe465a01SBram Moolenaarenddef 1439fe465a01SBram Moolenaar 1440c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the 1441c620c055SBram Moolenaar" script where FastFilter() is called from. 1442c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1443c620c055SBram Moolenaar let filterLines =<< trim END 1444c620c055SBram Moolenaar vim9script 1445c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1446c620c055SBram Moolenaar return idx % 2 == 1 1447c620c055SBram Moolenaar enddef 1448c620c055SBram Moolenaar export def FastFilter(): list<number> 1449c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1450c620c055SBram Moolenaar enddef 1451c620c055SBram Moolenaar END 1452c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1453c620c055SBram Moolenaar 1454c620c055SBram Moolenaar let lines =<< trim END 1455c620c055SBram Moolenaar vim9script 1456c620c055SBram Moolenaar import {FilterFunc, FastFilter} from './Xfilter.vim' 1457c620c055SBram Moolenaar def Test() 1458c620c055SBram Moolenaar let x: list<number> = FastFilter() 1459c620c055SBram Moolenaar enddef 1460c620c055SBram Moolenaar Test() 1461c620c055SBram Moolenaar END 1462c620c055SBram Moolenaar writefile(lines, 'Ximport.vim') 1463c620c055SBram Moolenaar assert_fails('source Ximport.vim', 'E121:') 1464c620c055SBram Moolenaar 1465c620c055SBram Moolenaar delete('Xfilter.vim') 1466c620c055SBram Moolenaar delete('Ximport.vim') 1467c620c055SBram Moolenaarenddef 1468c620c055SBram Moolenaar 14694c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 14704c17ad94SBram Moolenaar let first_lines =<< trim END 14714c17ad94SBram Moolenaar vim9script 14724c17ad94SBram Moolenaar def FuncYes(): string 14734c17ad94SBram Moolenaar return 'yes' 14744c17ad94SBram Moolenaar enddef 14754c17ad94SBram Moolenaar END 147603afdcf1SBram Moolenaar let withno_lines =<< trim END 14774c17ad94SBram Moolenaar def FuncNo(): string 14784c17ad94SBram Moolenaar return 'no' 14794c17ad94SBram Moolenaar enddef 14804c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 14814c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 14824c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 148303afdcf1SBram Moolenaar enddef 148403afdcf1SBram Moolenaar END 148503afdcf1SBram Moolenaar let nono_lines =<< trim END 148603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 148703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 14884c17ad94SBram Moolenaar assert_fails('call FuncNo()', 'E117:') 14894c17ad94SBram Moolenaar enddef 14904c17ad94SBram Moolenaar END 14914c17ad94SBram Moolenaar 14924c17ad94SBram Moolenaar # FuncNo() is defined 149303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 14944c17ad94SBram Moolenaar source Xreloaded.vim 14954c17ad94SBram Moolenaar g:DoCheck(true) 14964c17ad94SBram Moolenaar 14974c17ad94SBram Moolenaar # FuncNo() is not redefined 149803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 14994c17ad94SBram Moolenaar source Xreloaded.vim 150003afdcf1SBram Moolenaar g:DoCheck() 15014c17ad94SBram Moolenaar 15024c17ad94SBram Moolenaar # FuncNo() is back 150303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 15044c17ad94SBram Moolenaar source Xreloaded.vim 150503afdcf1SBram Moolenaar g:DoCheck() 15064c17ad94SBram Moolenaar 15074c17ad94SBram Moolenaar delete('Xreloaded.vim') 15084c17ad94SBram Moolenaarenddef 15094c17ad94SBram Moolenaar 151089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 151189483d40SBram Moolenaar # write the script with a script-local variable 151289483d40SBram Moolenaar let lines =<< trim END 151389483d40SBram Moolenaar vim9script 151489483d40SBram Moolenaar let var = 'string' 151589483d40SBram Moolenaar END 151689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 151789483d40SBram Moolenaar source XreloadVar.vim 151889483d40SBram Moolenaar 151989483d40SBram Moolenaar # now write the script using the same variable locally - works 152089483d40SBram Moolenaar lines =<< trim END 152189483d40SBram Moolenaar vim9script 152289483d40SBram Moolenaar def Func() 152389483d40SBram Moolenaar let var = 'string' 152489483d40SBram Moolenaar enddef 152589483d40SBram Moolenaar END 152689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 152789483d40SBram Moolenaar source XreloadVar.vim 152889483d40SBram Moolenaar 152989483d40SBram Moolenaar delete('XreloadVar.vim') 153089483d40SBram Moolenaarenddef 153189483d40SBram Moolenaar 15328a7d6542SBram Moolenaardef Test_import_absolute() 15338a7d6542SBram Moolenaar let import_lines = [ 1534e6085c53SBram Moolenaar 'vim9script', 1535e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1536e6085c53SBram Moolenaar 'def UseExported()', 1537e6085c53SBram Moolenaar ' g:imported_abs = exported', 1538e6085c53SBram Moolenaar ' exported = 8888', 1539e6085c53SBram Moolenaar ' g:imported_after = exported', 1540e6085c53SBram Moolenaar 'enddef', 1541e6085c53SBram Moolenaar 'UseExported()', 1542e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1543e6085c53SBram Moolenaar ] 15448a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 15458a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 15468a7d6542SBram Moolenaar 15478a7d6542SBram Moolenaar source Ximport_abs.vim 15488a7d6542SBram Moolenaar 15498a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 15504e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1551675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1552675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1553675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1554675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1555675f716eSBram Moolenaar 'exported = 8888.*' .. 1556675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1557675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1558675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1559675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1560e6085c53SBram Moolenaar g:import_disassembled) 15618a7d6542SBram Moolenaar unlet g:imported_abs 15624e12a5dfSBram Moolenaar unlet g:import_disassembled 15638a7d6542SBram Moolenaar 15648a7d6542SBram Moolenaar delete('Ximport_abs.vim') 15658a7d6542SBram Moolenaar delete('Xexport_abs.vim') 15668a7d6542SBram Moolenaarenddef 15678a7d6542SBram Moolenaar 15688a7d6542SBram Moolenaardef Test_import_rtp() 15698a7d6542SBram Moolenaar let import_lines = [ 1570e6085c53SBram Moolenaar 'vim9script', 1571e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1572e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1573e6085c53SBram Moolenaar ] 15748a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 15758a7d6542SBram Moolenaar mkdir('import') 15768a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 15778a7d6542SBram Moolenaar 15788a7d6542SBram Moolenaar let save_rtp = &rtp 15798a7d6542SBram Moolenaar &rtp = getcwd() 15808a7d6542SBram Moolenaar source Ximport_rtp.vim 15818a7d6542SBram Moolenaar &rtp = save_rtp 15828a7d6542SBram Moolenaar 15838a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 15848a7d6542SBram Moolenaar unlet g:imported_rtp 15858a7d6542SBram Moolenaar 15868a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 158789483d40SBram Moolenaar delete('import', 'rf') 15888a7d6542SBram Moolenaarenddef 15898a7d6542SBram Moolenaar 159025e0f586SBram Moolenaardef Test_import_compile_error() 159125e0f586SBram Moolenaar let export_lines = [ 159225e0f586SBram Moolenaar 'vim9script', 159325e0f586SBram Moolenaar 'export def ExpFunc(): string', 159425e0f586SBram Moolenaar ' return notDefined', 159525e0f586SBram Moolenaar 'enddef', 159625e0f586SBram Moolenaar ] 159725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 159825e0f586SBram Moolenaar 159925e0f586SBram Moolenaar let import_lines = [ 160025e0f586SBram Moolenaar 'vim9script', 160125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 160225e0f586SBram Moolenaar 'def ImpFunc()', 160325e0f586SBram Moolenaar ' echo ExpFunc()', 160425e0f586SBram Moolenaar 'enddef', 160525e0f586SBram Moolenaar 'defcompile', 160625e0f586SBram Moolenaar ] 160725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 160825e0f586SBram Moolenaar 160925e0f586SBram Moolenaar try 161025e0f586SBram Moolenaar source Ximport.vim 161125e0f586SBram Moolenaar catch /E1001/ 1612f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 161325e0f586SBram Moolenaar assert_match('E1001: variable not found: notDefined', v:exception) 161425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 161525e0f586SBram Moolenaar endtry 161625e0f586SBram Moolenaar 161725e0f586SBram Moolenaar delete('Xexported.vim') 161825e0f586SBram Moolenaar delete('Ximport.vim') 161925e0f586SBram Moolenaarenddef 162025e0f586SBram Moolenaar 1621*eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1622*eef2102eSBram Moolenaar let export_lines =<< trim END 1623*eef2102eSBram Moolenaar vim9script 1624*eef2102eSBram Moolenaar export def Func() 1625*eef2102eSBram Moolenaar echo 'imported' 1626*eef2102eSBram Moolenaar enddef 1627*eef2102eSBram Moolenaar END 1628*eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1629*eef2102eSBram Moolenaar 1630*eef2102eSBram Moolenaar let lines =<< trim END 1631*eef2102eSBram Moolenaar vim9script 1632*eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1633*eef2102eSBram Moolenaar def Func() 1634*eef2102eSBram Moolenaar echo 'local to function' 1635*eef2102eSBram Moolenaar enddef 1636*eef2102eSBram Moolenaar END 1637*eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1638*eef2102eSBram Moolenaar 1639*eef2102eSBram Moolenaar lines =<< trim END 1640*eef2102eSBram Moolenaar vim9script 1641*eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1642*eef2102eSBram Moolenaar def Outer() 1643*eef2102eSBram Moolenaar def Func() 1644*eef2102eSBram Moolenaar echo 'local to function' 1645*eef2102eSBram Moolenaar enddef 1646*eef2102eSBram Moolenaar enddef 1647*eef2102eSBram Moolenaar defcompile 1648*eef2102eSBram Moolenaar END 1649*eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1650*eef2102eSBram Moolenaar 1651*eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1652*eef2102eSBram Moolenaarenddef 1653*eef2102eSBram Moolenaar 16548a7d6542SBram Moolenaardef Test_fixed_size_list() 1655f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 16568a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 16578a7d6542SBram Moolenaar l->remove(0) 16588a7d6542SBram Moolenaar l->add(5) 16598a7d6542SBram Moolenaar l->insert(99, 1) 16600f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 16618a7d6542SBram Moolenaarenddef 16628a7d6542SBram Moolenaar 1663ae616494SBram Moolenaardef Test_no_insert_xit() 1664ae616494SBram Moolenaar call CheckDefExecFailure(['a = 1'], 'E1100:') 1665ae616494SBram Moolenaar call CheckDefExecFailure(['c = 1'], 'E1100:') 1666f5a48010SBram Moolenaar call CheckDefExecFailure(['i = 1'], 'E1100:') 1667f5a48010SBram Moolenaar call CheckDefExecFailure(['t = 1'], 'E1100:') 1668f5a48010SBram Moolenaar call CheckDefExecFailure(['x = 1'], 'E1100:') 1669ae616494SBram Moolenaar 1670ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1671ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1672ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1673ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1674f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1675f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1676f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1677f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1678f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1679ae616494SBram Moolenaarenddef 1680ae616494SBram Moolenaar 1681158906cfSBram Moolenaardef IfElse(what: number): string 1682158906cfSBram Moolenaar let res = '' 1683158906cfSBram Moolenaar if what == 1 1684158906cfSBram Moolenaar res = "one" 1685158906cfSBram Moolenaar elseif what == 2 1686158906cfSBram Moolenaar res = "two" 1687a259d8d3SBram Moolenaar else 1688158906cfSBram Moolenaar res = "three" 1689a259d8d3SBram Moolenaar endif 1690158906cfSBram Moolenaar return res 1691a259d8d3SBram Moolenaarenddef 1692a259d8d3SBram Moolenaar 1693158906cfSBram Moolenaardef Test_if_elseif_else() 1694158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1695158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1696158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 16970f18b6d1SBram Moolenaarenddef 16980f18b6d1SBram Moolenaar 1699e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1700e8c4abbbSBram Moolenaar call CheckDefFailure(['elseif true'], 'E582:') 1701e8c4abbbSBram Moolenaar call CheckDefFailure(['else'], 'E581:') 1702e8c4abbbSBram Moolenaar call CheckDefFailure(['endif'], 'E580:') 1703e8c4abbbSBram Moolenaar call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1704585fea7bSBram Moolenaar call CheckDefFailure(['if true', 'echo 1'], 'E171:') 1705e8c4abbbSBram Moolenaarenddef 1706e8c4abbbSBram Moolenaar 17076d69bf60SBram Moolenaarlet g:bool_true = v:true 17086d69bf60SBram Moolenaarlet g:bool_false = v:false 17096d69bf60SBram Moolenaar 17106d69bf60SBram Moolenaardef Test_if_const_expr() 17116d69bf60SBram Moolenaar let res = false 17126d69bf60SBram Moolenaar if true ? true : false 17136d69bf60SBram Moolenaar res = true 17146d69bf60SBram Moolenaar endif 17156d69bf60SBram Moolenaar assert_equal(true, res) 17166d69bf60SBram Moolenaar 1717585fea7bSBram Moolenaar g:glob = 2 1718585fea7bSBram Moolenaar if false 17196797966dSBram Moolenaar execute('g:glob = 3') 1720585fea7bSBram Moolenaar endif 1721585fea7bSBram Moolenaar assert_equal(2, g:glob) 1722585fea7bSBram Moolenaar if true 17236797966dSBram Moolenaar execute('g:glob = 3') 1724585fea7bSBram Moolenaar endif 1725585fea7bSBram Moolenaar assert_equal(3, g:glob) 1726585fea7bSBram Moolenaar 17276d69bf60SBram Moolenaar res = false 17286d69bf60SBram Moolenaar if g:bool_true ? true : false 17296d69bf60SBram Moolenaar res = true 17306d69bf60SBram Moolenaar endif 17316d69bf60SBram Moolenaar assert_equal(true, res) 17326d69bf60SBram Moolenaar 17336d69bf60SBram Moolenaar res = false 17346d69bf60SBram Moolenaar if true ? g:bool_true : false 17356d69bf60SBram Moolenaar res = true 17366d69bf60SBram Moolenaar endif 17376d69bf60SBram Moolenaar assert_equal(true, res) 17386d69bf60SBram Moolenaar 17396d69bf60SBram Moolenaar res = false 17406d69bf60SBram Moolenaar if true ? true : g:bool_false 17416d69bf60SBram Moolenaar res = true 17426d69bf60SBram Moolenaar endif 17436d69bf60SBram Moolenaar assert_equal(true, res) 17446d69bf60SBram Moolenaar 17456d69bf60SBram Moolenaar res = false 17466d69bf60SBram Moolenaar if true ? false : true 17476d69bf60SBram Moolenaar res = true 17486d69bf60SBram Moolenaar endif 17496d69bf60SBram Moolenaar assert_equal(false, res) 17506d69bf60SBram Moolenaar 17516d69bf60SBram Moolenaar res = false 17526d69bf60SBram Moolenaar if false ? false : true 17536d69bf60SBram Moolenaar res = true 17546d69bf60SBram Moolenaar endif 17556d69bf60SBram Moolenaar assert_equal(true, res) 17566d69bf60SBram Moolenaar 17576d69bf60SBram Moolenaar res = false 17586d69bf60SBram Moolenaar if false ? true : false 17596d69bf60SBram Moolenaar res = true 17606d69bf60SBram Moolenaar endif 17616d69bf60SBram Moolenaar assert_equal(false, res) 17626d69bf60SBram Moolenaar 17636d69bf60SBram Moolenaar res = false 1764e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1765e8c4abbbSBram Moolenaar res = true 1766e8c4abbbSBram Moolenaar endif 1767e8c4abbbSBram Moolenaar assert_equal(false, res) 1768e8c4abbbSBram Moolenaar 1769e8c4abbbSBram Moolenaar res = false 17706d69bf60SBram Moolenaar if true && true 17716d69bf60SBram Moolenaar res = true 17726d69bf60SBram Moolenaar endif 17736d69bf60SBram Moolenaar assert_equal(true, res) 17746d69bf60SBram Moolenaar 17756d69bf60SBram Moolenaar res = false 17766d69bf60SBram Moolenaar if true && false 17776d69bf60SBram Moolenaar res = true 17786d69bf60SBram Moolenaar endif 17796d69bf60SBram Moolenaar assert_equal(false, res) 17806d69bf60SBram Moolenaar 17816d69bf60SBram Moolenaar res = false 17826d69bf60SBram Moolenaar if g:bool_true && false 17836d69bf60SBram Moolenaar res = true 17846d69bf60SBram Moolenaar endif 17856d69bf60SBram Moolenaar assert_equal(false, res) 17866d69bf60SBram Moolenaar 17876d69bf60SBram Moolenaar res = false 17886d69bf60SBram Moolenaar if true && g:bool_false 17896d69bf60SBram Moolenaar res = true 17906d69bf60SBram Moolenaar endif 17916d69bf60SBram Moolenaar assert_equal(false, res) 17926d69bf60SBram Moolenaar 17936d69bf60SBram Moolenaar res = false 17946d69bf60SBram Moolenaar if false && false 17956d69bf60SBram Moolenaar res = true 17966d69bf60SBram Moolenaar endif 17976d69bf60SBram Moolenaar assert_equal(false, res) 17986d69bf60SBram Moolenaar 17996d69bf60SBram Moolenaar res = false 18006d69bf60SBram Moolenaar if true || false 18016d69bf60SBram Moolenaar res = true 18026d69bf60SBram Moolenaar endif 18036d69bf60SBram Moolenaar assert_equal(true, res) 18046d69bf60SBram Moolenaar 18056d69bf60SBram Moolenaar res = false 18066d69bf60SBram Moolenaar if g:bool_true || false 18076d69bf60SBram Moolenaar res = true 18086d69bf60SBram Moolenaar endif 18096d69bf60SBram Moolenaar assert_equal(true, res) 18106d69bf60SBram Moolenaar 18116d69bf60SBram Moolenaar res = false 18126d69bf60SBram Moolenaar if true || g:bool_false 18136d69bf60SBram Moolenaar res = true 18146d69bf60SBram Moolenaar endif 18156d69bf60SBram Moolenaar assert_equal(true, res) 18166d69bf60SBram Moolenaar 18176d69bf60SBram Moolenaar res = false 18186d69bf60SBram Moolenaar if false || false 18196d69bf60SBram Moolenaar res = true 18206d69bf60SBram Moolenaar endif 18216d69bf60SBram Moolenaar assert_equal(false, res) 182280c34ca3SBram Moolenaarenddef 18236d69bf60SBram Moolenaar 182480c34ca3SBram Moolenaardef Test_if_const_expr_fails() 182580c34ca3SBram Moolenaar call CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 182680c34ca3SBram Moolenaar call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1827e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa'"], 'E110:') 1828e8c4abbbSBram Moolenaar call CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 18296d69bf60SBram Moolenaarenddef 18306d69bf60SBram Moolenaar 183172abcf42SBram Moolenaardef RunNested(i: number): number 183272abcf42SBram Moolenaar let x: number = 0 183372abcf42SBram Moolenaar if i % 2 183472abcf42SBram Moolenaar if 1 1835f5be8cdbSBram Moolenaar # comment 183672abcf42SBram Moolenaar else 1837f5be8cdbSBram Moolenaar # comment 183872abcf42SBram Moolenaar endif 183972abcf42SBram Moolenaar x += 1 184072abcf42SBram Moolenaar else 184172abcf42SBram Moolenaar x += 1000 184272abcf42SBram Moolenaar endif 184372abcf42SBram Moolenaar return x 184472abcf42SBram Moolenaarenddef 184572abcf42SBram Moolenaar 184672abcf42SBram Moolenaardef Test_nested_if() 184772abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 184872abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 184972abcf42SBram Moolenaarenddef 185072abcf42SBram Moolenaar 1851ad39c094SBram Moolenaardef Test_execute_cmd() 1852ad39c094SBram Moolenaar new 1853ad39c094SBram Moolenaar setline(1, 'default') 1854ad39c094SBram Moolenaar execute 'call setline(1, "execute-string")' 1855ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1856a72cfb80SBram Moolenaar 1857a72cfb80SBram Moolenaar execute "call setline(1, 'execute-string')" 1858a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1859a72cfb80SBram Moolenaar 1860ad39c094SBram Moolenaar let cmd1 = 'call setline(1,' 1861ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1862a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1863ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1864a72cfb80SBram Moolenaar 1865ad39c094SBram Moolenaar execute cmd1 cmd2 '|call setline(1, "execute-var-string")' 1866ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1867a72cfb80SBram Moolenaar 1868ad39c094SBram Moolenaar let cmd_first = 'call ' 1869ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1870ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1871ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1872ad39c094SBram Moolenaar bwipe! 1873585fea7bSBram Moolenaar 18742d6b20d6SBram Moolenaar let n = true 18752d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 18762d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 18772d6b20d6SBram Moolenaar 1878585fea7bSBram Moolenaar call CheckDefFailure(['execute xxx'], 'E1001:') 1879a72cfb80SBram Moolenaar call CheckDefFailure(['execute "cmd"# comment'], 'E488:') 1880ad39c094SBram Moolenaarenddef 1881ad39c094SBram Moolenaar 188247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1883f5be8cdbSBram Moolenaar # only checks line continuation 188447e880d6SBram Moolenaar let lines =<< trim END 188547e880d6SBram Moolenaar vim9script 188647e880d6SBram Moolenaar execute 'g:someVar' 188747e880d6SBram Moolenaar .. ' = ' .. 188847e880d6SBram Moolenaar '28' 188947e880d6SBram Moolenaar assert_equal(28, g:someVar) 189047e880d6SBram Moolenaar unlet g:someVar 189147e880d6SBram Moolenaar END 189247e880d6SBram Moolenaar CheckScriptSuccess(lines) 189347e880d6SBram Moolenaarenddef 189447e880d6SBram Moolenaar 1895ad39c094SBram Moolenaardef Test_echo_cmd() 1896a72cfb80SBram Moolenaar echo 'some' # comment 1897585fea7bSBram Moolenaar echon 'thing' 1898ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1899ad39c094SBram Moolenaar 1900a72cfb80SBram Moolenaar echo "some" # comment 1901a72cfb80SBram Moolenaar echon "thing" 1902a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1903a72cfb80SBram Moolenaar 1904ad39c094SBram Moolenaar let str1 = 'some' 1905ad39c094SBram Moolenaar let str2 = 'more' 1906ad39c094SBram Moolenaar echo str1 str2 1907ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1908a72cfb80SBram Moolenaar 1909a72cfb80SBram Moolenaar call CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1910ad39c094SBram Moolenaarenddef 1911ad39c094SBram Moolenaar 1912f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1913f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1914f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1915f93c7feaSBram Moolenaar echo 'clear' 1916df069eecSBram Moolenaar :1messages 1917f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1918f93c7feaSBram Moolenaar 1919f93c7feaSBram Moolenaar call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1920f93c7feaSBram Moolenaarenddef 1921f93c7feaSBram Moolenaar 192247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1923f5be8cdbSBram Moolenaar # only checks line continuation 192447e880d6SBram Moolenaar let lines =<< trim END 192547e880d6SBram Moolenaar vim9script 192647e880d6SBram Moolenaar echomsg 'here' 192747e880d6SBram Moolenaar .. ' is ' .. 192847e880d6SBram Moolenaar 'a message' 192947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 193047e880d6SBram Moolenaar END 193147e880d6SBram Moolenaar CheckScriptSuccess(lines) 193247e880d6SBram Moolenaarenddef 193347e880d6SBram Moolenaar 1934f93c7feaSBram Moolenaardef Test_echoerr_cmd() 193540ee466cSBram Moolenaar try 193640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 193740ee466cSBram Moolenaar catch 193840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 193940ee466cSBram Moolenaar endtry 1940f93c7feaSBram Moolenaarenddef 1941f93c7feaSBram Moolenaar 194247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1943f5be8cdbSBram Moolenaar # only checks line continuation 194447e880d6SBram Moolenaar let lines =<< trim END 194547e880d6SBram Moolenaar vim9script 194647e880d6SBram Moolenaar try 194747e880d6SBram Moolenaar echoerr 'this' 194847e880d6SBram Moolenaar .. ' is ' .. 194947e880d6SBram Moolenaar 'wrong' 195047e880d6SBram Moolenaar catch 195147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 195247e880d6SBram Moolenaar endtry 195347e880d6SBram Moolenaar END 195447e880d6SBram Moolenaar CheckScriptSuccess(lines) 195547e880d6SBram Moolenaarenddef 195647e880d6SBram Moolenaar 195741fe0617SBram Moolenaardef Test_for_outside_of_function() 195841fe0617SBram Moolenaar let lines =<< trim END 195941fe0617SBram Moolenaar vim9script 196041fe0617SBram Moolenaar new 196141fe0617SBram Moolenaar for var in range(0, 3) 196241fe0617SBram Moolenaar append(line('$'), var) 196341fe0617SBram Moolenaar endfor 196441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 196541fe0617SBram Moolenaar bwipe! 196641fe0617SBram Moolenaar END 196741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 196841fe0617SBram Moolenaar source Xvim9for.vim 196941fe0617SBram Moolenaar delete('Xvim9for.vim') 197041fe0617SBram Moolenaarenddef 19718a7d6542SBram Moolenaar 1972e8c4abbbSBram Moolenaardef Test_for_loop() 1973e8c4abbbSBram Moolenaar let result = '' 1974e8c4abbbSBram Moolenaar for cnt in range(7) 1975e8c4abbbSBram Moolenaar if cnt == 4 1976e8c4abbbSBram Moolenaar break 1977e8c4abbbSBram Moolenaar endif 1978e8c4abbbSBram Moolenaar if cnt == 2 1979e8c4abbbSBram Moolenaar continue 1980e8c4abbbSBram Moolenaar endif 1981e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1982e8c4abbbSBram Moolenaar endfor 1983e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 19840ad3e894SBram Moolenaar 19850ad3e894SBram Moolenaar let concat = '' 19860ad3e894SBram Moolenaar for str in eval('["one", "two"]') 19870ad3e894SBram Moolenaar concat ..= str 19880ad3e894SBram Moolenaar endfor 19890ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1990e8c4abbbSBram Moolenaarenddef 1991e8c4abbbSBram Moolenaar 1992e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1993675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1994675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1995675f716eSBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:') 1996822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 19970ad3e894SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1013:') 1998675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1999675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2000675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 2001e8c4abbbSBram Moolenaarenddef 2002e8c4abbbSBram Moolenaar 2003d0df1aacSBram Moolenaardef Test_while_loop() 2004d0df1aacSBram Moolenaar let result = '' 2005d0df1aacSBram Moolenaar let cnt = 0 2006d0df1aacSBram Moolenaar while cnt < 555 2007d0df1aacSBram Moolenaar if cnt == 3 2008d0df1aacSBram Moolenaar break 2009d0df1aacSBram Moolenaar endif 2010d0df1aacSBram Moolenaar cnt += 1 2011d0df1aacSBram Moolenaar if cnt == 2 2012d0df1aacSBram Moolenaar continue 2013d0df1aacSBram Moolenaar endif 2014d0df1aacSBram Moolenaar result ..= cnt .. '_' 2015d0df1aacSBram Moolenaar endwhile 2016d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2017d0df1aacSBram Moolenaarenddef 2018d0df1aacSBram Moolenaar 2019e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2020675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2021675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2022675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2023675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2024675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2025675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2026675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2027bd5da371SBram Moolenaarenddef 2028bd5da371SBram Moolenaar 20299645e2d9SBram Moolenaardef Test_interrupt_loop() 203097acfc78SBram Moolenaar let caught = false 20319645e2d9SBram Moolenaar let x = 0 203297acfc78SBram Moolenaar try 20339645e2d9SBram Moolenaar while 1 20349645e2d9SBram Moolenaar x += 1 20359645e2d9SBram Moolenaar if x == 100 20369645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 20379645e2d9SBram Moolenaar endif 20389645e2d9SBram Moolenaar endwhile 203997acfc78SBram Moolenaar catch 204097acfc78SBram Moolenaar caught = true 204197acfc78SBram Moolenaar assert_equal(100, x) 204297acfc78SBram Moolenaar endtry 204397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 20449645e2d9SBram Moolenaarenddef 204520431c9dSBram Moolenaar 20464fdae999SBram Moolenaardef Test_automatic_line_continuation() 20474fdae999SBram Moolenaar let mylist = [ 20484fdae999SBram Moolenaar 'one', 20494fdae999SBram Moolenaar 'two', 20504fdae999SBram Moolenaar 'three', 2051f5be8cdbSBram Moolenaar ] # comment 20524fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 20534fdae999SBram Moolenaar 20544fdae999SBram Moolenaar let mydict = { 20554fdae999SBram Moolenaar 'one': 1, 20564fdae999SBram Moolenaar 'two': 2, 20574fdae999SBram Moolenaar 'three': 20584fdae999SBram Moolenaar 3, 2059f5be8cdbSBram Moolenaar } # comment 20604fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 20614fdae999SBram Moolenaar mydict = #{ 20622c330432SBram Moolenaar one: 1, # comment 20632c330432SBram Moolenaar two: # comment 20642c330432SBram Moolenaar 2, # comment 20652c330432SBram Moolenaar three: 3 # comment 20662c330432SBram Moolenaar } 20672c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 20682c330432SBram Moolenaar mydict = #{ 20692c330432SBram Moolenaar one: 1, 20704fdae999SBram Moolenaar two: 20714fdae999SBram Moolenaar 2, 20722c330432SBram Moolenaar three: 3 20734fdae999SBram Moolenaar } 20744fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 2075e6085c53SBram Moolenaar 2076e6085c53SBram Moolenaar assert_equal( 2077e6085c53SBram Moolenaar ['one', 'two', 'three'], 2078e6085c53SBram Moolenaar split('one two three') 2079e6085c53SBram Moolenaar ) 20804fdae999SBram Moolenaarenddef 20814fdae999SBram Moolenaar 20827a092245SBram Moolenaardef Test_vim9_comment() 20837a092245SBram Moolenaar CheckScriptSuccess([ 20847a092245SBram Moolenaar 'vim9script', 20857a092245SBram Moolenaar '# something', 20867a092245SBram Moolenaar ]) 20877a092245SBram Moolenaar CheckScriptFailure([ 20887a092245SBram Moolenaar 'vim9script', 20897a092245SBram Moolenaar ':# something', 20907a092245SBram Moolenaar ], 'E488:') 20917a092245SBram Moolenaar CheckScriptFailure([ 20927a092245SBram Moolenaar '# something', 20937a092245SBram Moolenaar ], 'E488:') 20947a092245SBram Moolenaar CheckScriptFailure([ 20957a092245SBram Moolenaar ':# something', 20967a092245SBram Moolenaar ], 'E488:') 20977a092245SBram Moolenaar 20984a8d9f2eSBram Moolenaar { # block start 20994a8d9f2eSBram Moolenaar } # block end 21004a8d9f2eSBram Moolenaar CheckDefFailure([ 21014a8d9f2eSBram Moolenaar '{# comment', 21024a8d9f2eSBram Moolenaar ], 'E488:') 21034a8d9f2eSBram Moolenaar CheckDefFailure([ 21044a8d9f2eSBram Moolenaar '{', 21054a8d9f2eSBram Moolenaar '}# comment', 21064a8d9f2eSBram Moolenaar ], 'E488:') 21074a8d9f2eSBram Moolenaar 21084a8d9f2eSBram Moolenaar echo "yes" # comment 21094a8d9f2eSBram Moolenaar CheckDefFailure([ 21104a8d9f2eSBram Moolenaar 'echo "yes"# comment', 21114a8d9f2eSBram Moolenaar ], 'E488:') 21127a092245SBram Moolenaar CheckScriptSuccess([ 21137a092245SBram Moolenaar 'vim9script', 21147a092245SBram Moolenaar 'echo "yes" # something', 21157a092245SBram Moolenaar ]) 21167a092245SBram Moolenaar CheckScriptFailure([ 21177a092245SBram Moolenaar 'vim9script', 21187a092245SBram Moolenaar 'echo "yes"# something', 21197a092245SBram Moolenaar ], 'E121:') 21207a092245SBram Moolenaar CheckScriptFailure([ 21217a092245SBram Moolenaar 'vim9script', 21227a092245SBram Moolenaar 'echo# something', 21237a092245SBram Moolenaar ], 'E121:') 21247a092245SBram Moolenaar CheckScriptFailure([ 21257a092245SBram Moolenaar 'echo "yes" # something', 21267a092245SBram Moolenaar ], 'E121:') 21277a092245SBram Moolenaar 21284a8d9f2eSBram Moolenaar exe "echo" # comment 21294a8d9f2eSBram Moolenaar CheckDefFailure([ 21304a8d9f2eSBram Moolenaar 'exe "echo"# comment', 21314a8d9f2eSBram Moolenaar ], 'E488:') 21324a8d9f2eSBram Moolenaar CheckScriptSuccess([ 21334a8d9f2eSBram Moolenaar 'vim9script', 21344a8d9f2eSBram Moolenaar 'exe "echo" # something', 21354a8d9f2eSBram Moolenaar ]) 21364a8d9f2eSBram Moolenaar CheckScriptFailure([ 21374a8d9f2eSBram Moolenaar 'vim9script', 21384a8d9f2eSBram Moolenaar 'exe "echo"# something', 21394a8d9f2eSBram Moolenaar ], 'E121:') 21404a8d9f2eSBram Moolenaar CheckDefFailure([ 21414a8d9f2eSBram Moolenaar 'exe # comment', 21424a8d9f2eSBram Moolenaar ], 'E1015:') 21434a8d9f2eSBram Moolenaar CheckScriptFailure([ 21444a8d9f2eSBram Moolenaar 'vim9script', 21454a8d9f2eSBram Moolenaar 'exe# something', 21464a8d9f2eSBram Moolenaar ], 'E121:') 21474a8d9f2eSBram Moolenaar CheckScriptFailure([ 21484a8d9f2eSBram Moolenaar 'exe "echo" # something', 21494a8d9f2eSBram Moolenaar ], 'E121:') 21504a8d9f2eSBram Moolenaar 21517a092245SBram Moolenaar CheckDefFailure([ 21527a092245SBram Moolenaar 'try# comment', 21537a092245SBram Moolenaar ' echo "yes"', 21547a092245SBram Moolenaar 'catch', 21557a092245SBram Moolenaar 'endtry', 21567a092245SBram Moolenaar ], 'E488:') 21572c5ed4e3SBram Moolenaar CheckScriptFailure([ 21582c5ed4e3SBram Moolenaar 'vim9script', 21592c5ed4e3SBram Moolenaar 'try# comment', 21602c5ed4e3SBram Moolenaar 'echo "yes"', 21612c5ed4e3SBram Moolenaar ], 'E488:') 21627a092245SBram Moolenaar CheckDefFailure([ 21637a092245SBram Moolenaar 'try', 2164a72cfb80SBram Moolenaar ' throw#comment', 2165a72cfb80SBram Moolenaar 'catch', 2166a72cfb80SBram Moolenaar 'endtry', 2167a72cfb80SBram Moolenaar ], 'E1015:') 2168a72cfb80SBram Moolenaar CheckDefFailure([ 2169a72cfb80SBram Moolenaar 'try', 2170a72cfb80SBram Moolenaar ' throw "yes"#comment', 2171a72cfb80SBram Moolenaar 'catch', 2172a72cfb80SBram Moolenaar 'endtry', 2173a72cfb80SBram Moolenaar ], 'E488:') 2174a72cfb80SBram Moolenaar CheckDefFailure([ 2175a72cfb80SBram Moolenaar 'try', 21767a092245SBram Moolenaar ' echo "yes"', 21777a092245SBram Moolenaar 'catch# comment', 21787a092245SBram Moolenaar 'endtry', 21797a092245SBram Moolenaar ], 'E488:') 21802c5ed4e3SBram Moolenaar CheckScriptFailure([ 21812c5ed4e3SBram Moolenaar 'vim9script', 21822c5ed4e3SBram Moolenaar 'try', 21832c5ed4e3SBram Moolenaar ' echo "yes"', 21842c5ed4e3SBram Moolenaar 'catch# comment', 21852c5ed4e3SBram Moolenaar 'endtry', 21862c5ed4e3SBram Moolenaar ], 'E654:') 21872c5ed4e3SBram Moolenaar CheckDefFailure([ 21882c5ed4e3SBram Moolenaar 'try', 21892c5ed4e3SBram Moolenaar ' echo "yes"', 21902c5ed4e3SBram Moolenaar 'catch /pat/# comment', 21912c5ed4e3SBram Moolenaar 'endtry', 21922c5ed4e3SBram Moolenaar ], 'E488:') 21937a092245SBram Moolenaar CheckDefFailure([ 21947a092245SBram Moolenaar 'try', 21957a092245SBram Moolenaar 'echo "yes"', 21967a092245SBram Moolenaar 'catch', 21977a092245SBram Moolenaar 'endtry# comment', 21987a092245SBram Moolenaar ], 'E488:') 21992c5ed4e3SBram Moolenaar CheckScriptFailure([ 22002c5ed4e3SBram Moolenaar 'vim9script', 22012c5ed4e3SBram Moolenaar 'try', 22022c5ed4e3SBram Moolenaar ' echo "yes"', 22032c5ed4e3SBram Moolenaar 'catch', 22042c5ed4e3SBram Moolenaar 'endtry# comment', 22059b7bf9e9SBram Moolenaar ], 'E488:') 22062c5ed4e3SBram Moolenaar 22072c5ed4e3SBram Moolenaar CheckScriptSuccess([ 22082c5ed4e3SBram Moolenaar 'vim9script', 22092c5ed4e3SBram Moolenaar 'hi # comment', 22102c5ed4e3SBram Moolenaar ]) 22112c5ed4e3SBram Moolenaar CheckScriptFailure([ 22122c5ed4e3SBram Moolenaar 'vim9script', 22132c5ed4e3SBram Moolenaar 'hi# comment', 22142c5ed4e3SBram Moolenaar ], 'E416:') 22151966c248SBram Moolenaar CheckScriptSuccess([ 22161966c248SBram Moolenaar 'vim9script', 22171966c248SBram Moolenaar 'hi Search # comment', 22181966c248SBram Moolenaar ]) 22191966c248SBram Moolenaar CheckScriptFailure([ 22201966c248SBram Moolenaar 'vim9script', 22211966c248SBram Moolenaar 'hi Search# comment', 22221966c248SBram Moolenaar ], 'E416:') 22231966c248SBram Moolenaar CheckScriptSuccess([ 22241966c248SBram Moolenaar 'vim9script', 22251966c248SBram Moolenaar 'hi link This Search # comment', 22261966c248SBram Moolenaar ]) 22271966c248SBram Moolenaar CheckScriptFailure([ 22281966c248SBram Moolenaar 'vim9script', 22291966c248SBram Moolenaar 'hi link This That# comment', 22301966c248SBram Moolenaar ], 'E413:') 22311966c248SBram Moolenaar CheckScriptSuccess([ 22321966c248SBram Moolenaar 'vim9script', 22331966c248SBram Moolenaar 'hi clear This # comment', 22341966c248SBram Moolenaar 'hi clear # comment', 22351966c248SBram Moolenaar ]) 2236f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2237f5be8cdbSBram Moolenaar # hi clear This# comment', 22381966c248SBram Moolenaar CheckScriptFailure([ 22391966c248SBram Moolenaar 'vim9script', 22401966c248SBram Moolenaar 'hi clear# comment', 22411966c248SBram Moolenaar ], 'E416:') 22421966c248SBram Moolenaar 22431966c248SBram Moolenaar CheckScriptSuccess([ 22441966c248SBram Moolenaar 'vim9script', 22451966c248SBram Moolenaar 'hi Group term=bold', 22461966c248SBram Moolenaar 'match Group /todo/ # comment', 22471966c248SBram Moolenaar ]) 22481966c248SBram Moolenaar CheckScriptFailure([ 22491966c248SBram Moolenaar 'vim9script', 22501966c248SBram Moolenaar 'hi Group term=bold', 22511966c248SBram Moolenaar 'match Group /todo/# comment', 22521966c248SBram Moolenaar ], 'E488:') 22531966c248SBram Moolenaar CheckScriptSuccess([ 22541966c248SBram Moolenaar 'vim9script', 22551966c248SBram Moolenaar 'match # comment', 22561966c248SBram Moolenaar ]) 22571966c248SBram Moolenaar CheckScriptFailure([ 22581966c248SBram Moolenaar 'vim9script', 22591966c248SBram Moolenaar 'match# comment', 22601966c248SBram Moolenaar ], 'E475:') 22611966c248SBram Moolenaar CheckScriptSuccess([ 22621966c248SBram Moolenaar 'vim9script', 22631966c248SBram Moolenaar 'match none # comment', 22641966c248SBram Moolenaar ]) 22651966c248SBram Moolenaar CheckScriptFailure([ 22661966c248SBram Moolenaar 'vim9script', 22671966c248SBram Moolenaar 'match none# comment', 22681966c248SBram Moolenaar ], 'E475:') 22691966c248SBram Moolenaar 22701966c248SBram Moolenaar CheckScriptSuccess([ 22711966c248SBram Moolenaar 'vim9script', 22721966c248SBram Moolenaar 'menutrans clear # comment', 22731966c248SBram Moolenaar ]) 22741966c248SBram Moolenaar CheckScriptFailure([ 22751966c248SBram Moolenaar 'vim9script', 22761966c248SBram Moolenaar 'menutrans clear# comment text', 22771966c248SBram Moolenaar ], 'E474:') 22781966c248SBram Moolenaar 22791966c248SBram Moolenaar CheckScriptSuccess([ 22801966c248SBram Moolenaar 'vim9script', 22811966c248SBram Moolenaar 'syntax clear # comment', 22821966c248SBram Moolenaar ]) 22831966c248SBram Moolenaar CheckScriptFailure([ 22841966c248SBram Moolenaar 'vim9script', 22851966c248SBram Moolenaar 'syntax clear# comment text', 22861966c248SBram Moolenaar ], 'E28:') 22871966c248SBram Moolenaar CheckScriptSuccess([ 22881966c248SBram Moolenaar 'vim9script', 22891966c248SBram Moolenaar 'syntax keyword Word some', 22901966c248SBram Moolenaar 'syntax clear Word # comment', 22911966c248SBram Moolenaar ]) 22921966c248SBram Moolenaar CheckScriptFailure([ 22931966c248SBram Moolenaar 'vim9script', 22941966c248SBram Moolenaar 'syntax keyword Word some', 22951966c248SBram Moolenaar 'syntax clear Word# comment text', 22961966c248SBram Moolenaar ], 'E28:') 22971966c248SBram Moolenaar 22981966c248SBram Moolenaar CheckScriptSuccess([ 22991966c248SBram Moolenaar 'vim9script', 23001966c248SBram Moolenaar 'syntax list # comment', 23011966c248SBram Moolenaar ]) 23021966c248SBram Moolenaar CheckScriptFailure([ 23031966c248SBram Moolenaar 'vim9script', 23041966c248SBram Moolenaar 'syntax list# comment text', 23051966c248SBram Moolenaar ], 'E28:') 23061966c248SBram Moolenaar 23071966c248SBram Moolenaar CheckScriptSuccess([ 23081966c248SBram Moolenaar 'vim9script', 23091966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 23101966c248SBram Moolenaar ]) 23111966c248SBram Moolenaar CheckScriptFailure([ 23121966c248SBram Moolenaar 'vim9script', 23131966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 23141966c248SBram Moolenaar ], 'E475:') 23151966c248SBram Moolenaar 23161966c248SBram Moolenaar CheckScriptSuccess([ 23171966c248SBram Moolenaar 'vim9script', 23181966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 23191966c248SBram Moolenaar ]) 23201966c248SBram Moolenaar CheckScriptFailure([ 23211966c248SBram Moolenaar 'vim9script', 23221966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 23231966c248SBram Moolenaar ], 'E789:') 23241966c248SBram Moolenaar 23251966c248SBram Moolenaar CheckScriptSuccess([ 23261966c248SBram Moolenaar 'vim9script', 23271966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 23281966c248SBram Moolenaar ]) 23291966c248SBram Moolenaar CheckScriptFailure([ 23301966c248SBram Moolenaar 'vim9script', 23311966c248SBram Moolenaar 'syntax match Word /pat/# comment', 23321966c248SBram Moolenaar ], 'E402:') 23331966c248SBram Moolenaar 23341966c248SBram Moolenaar CheckScriptSuccess([ 23351966c248SBram Moolenaar 'vim9script', 23361966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 23371966c248SBram Moolenaar ]) 23381966c248SBram Moolenaar CheckScriptFailure([ 23391966c248SBram Moolenaar 'vim9script', 23401966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 23411966c248SBram Moolenaar ], 'E475:') 23421966c248SBram Moolenaar CheckScriptFailure([ 23431966c248SBram Moolenaar 'vim9script', 23441966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 23451966c248SBram Moolenaar ], 'E406:') 23461966c248SBram Moolenaar CheckScriptFailure([ 23471966c248SBram Moolenaar 'vim9script', 23481966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 23491966c248SBram Moolenaar ], 'E475:') 23501966c248SBram Moolenaar 23511966c248SBram Moolenaar CheckScriptSuccess([ 23521966c248SBram Moolenaar 'vim9script', 23531966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 23541966c248SBram Moolenaar ]) 23551966c248SBram Moolenaar CheckScriptFailure([ 23561966c248SBram Moolenaar 'vim9script', 23571966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2358d032f34aSBram Moolenaar ], 'E402:') 23591966c248SBram Moolenaar 23601966c248SBram Moolenaar CheckScriptSuccess([ 23611966c248SBram Moolenaar 'vim9script', 23621966c248SBram Moolenaar 'syntax sync # comment', 23631966c248SBram Moolenaar ]) 23641966c248SBram Moolenaar CheckScriptFailure([ 23651966c248SBram Moolenaar 'vim9script', 23661966c248SBram Moolenaar 'syntax sync# comment', 23671966c248SBram Moolenaar ], 'E404:') 23681966c248SBram Moolenaar CheckScriptSuccess([ 23691966c248SBram Moolenaar 'vim9script', 23701966c248SBram Moolenaar 'syntax sync ccomment # comment', 23711966c248SBram Moolenaar ]) 23721966c248SBram Moolenaar CheckScriptFailure([ 23731966c248SBram Moolenaar 'vim9script', 23741966c248SBram Moolenaar 'syntax sync ccomment# comment', 23751966c248SBram Moolenaar ], 'E404:') 23761966c248SBram Moolenaar 23771966c248SBram Moolenaar CheckScriptSuccess([ 23781966c248SBram Moolenaar 'vim9script', 23791966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 23801966c248SBram Moolenaar ]) 23811966c248SBram Moolenaar CheckScriptFailure([ 23821966c248SBram Moolenaar 'vim9script', 23831966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 23841966c248SBram Moolenaar ], 'E475:') 2385a72cfb80SBram Moolenaar 2386a72cfb80SBram Moolenaar CheckScriptSuccess([ 2387a72cfb80SBram Moolenaar 'vim9script', 2388a72cfb80SBram Moolenaar 'command Echo echo # comment', 2389a72cfb80SBram Moolenaar 'command Echo # comment', 2390a72cfb80SBram Moolenaar ]) 2391a72cfb80SBram Moolenaar CheckScriptFailure([ 2392a72cfb80SBram Moolenaar 'vim9script', 2393a72cfb80SBram Moolenaar 'command Echo echo# comment', 2394a72cfb80SBram Moolenaar 'Echo', 2395a72cfb80SBram Moolenaar ], 'E121:') 2396a72cfb80SBram Moolenaar CheckScriptFailure([ 2397a72cfb80SBram Moolenaar 'vim9script', 2398a72cfb80SBram Moolenaar 'command Echo# comment', 2399a72cfb80SBram Moolenaar ], 'E182:') 2400a72cfb80SBram Moolenaar CheckScriptFailure([ 2401a72cfb80SBram Moolenaar 'vim9script', 2402a72cfb80SBram Moolenaar 'command Echo echo', 2403a72cfb80SBram Moolenaar 'command Echo# comment', 2404a72cfb80SBram Moolenaar ], 'E182:') 2405a72cfb80SBram Moolenaar 2406a72cfb80SBram Moolenaar CheckScriptSuccess([ 2407a72cfb80SBram Moolenaar 'vim9script', 2408a72cfb80SBram Moolenaar 'function # comment', 2409a72cfb80SBram Moolenaar ]) 2410a72cfb80SBram Moolenaar CheckScriptFailure([ 2411a72cfb80SBram Moolenaar 'vim9script', 24129898107fSBram Moolenaar 'function " comment', 24139898107fSBram Moolenaar ], 'E129:') 24149898107fSBram Moolenaar CheckScriptFailure([ 24159898107fSBram Moolenaar 'vim9script', 2416a72cfb80SBram Moolenaar 'function# comment', 2417a72cfb80SBram Moolenaar ], 'E129:') 2418a72cfb80SBram Moolenaar CheckScriptSuccess([ 2419a72cfb80SBram Moolenaar 'vim9script', 2420a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2421a72cfb80SBram Moolenaar ]) 2422a72cfb80SBram Moolenaar CheckScriptFailure([ 2423a72cfb80SBram Moolenaar 'vim9script', 2424a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2425a72cfb80SBram Moolenaar ], 'E488:') 2426a72cfb80SBram Moolenaar 2427a72cfb80SBram Moolenaar CheckScriptSuccess([ 2428a72cfb80SBram Moolenaar 'vim9script', 24294c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2430a72cfb80SBram Moolenaar 'endfunc', 24314c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2432a72cfb80SBram Moolenaar ]) 2433a72cfb80SBram Moolenaar CheckScriptFailure([ 2434a72cfb80SBram Moolenaar 'vim9script', 24354c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2436a72cfb80SBram Moolenaar 'endfunc', 24374c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2438a72cfb80SBram Moolenaar ], 'E488:') 2439a72cfb80SBram Moolenaar 2440a72cfb80SBram Moolenaar CheckScriptSuccess([ 2441a72cfb80SBram Moolenaar 'vim9script', 2442a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2443a72cfb80SBram Moolenaar ]) 2444a72cfb80SBram Moolenaar CheckScriptFailure([ 2445a72cfb80SBram Moolenaar 'vim9script', 2446a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2447a72cfb80SBram Moolenaar ], 'E488:') 2448e7e4838fSBram Moolenaar 2449e7e4838fSBram Moolenaar CheckScriptFailure([ 2450e7e4838fSBram Moolenaar 'def Test() " comment', 2451e7e4838fSBram Moolenaar 'enddef', 2452e7e4838fSBram Moolenaar ], 'E488:') 2453e7e4838fSBram Moolenaar CheckScriptFailure([ 2454e7e4838fSBram Moolenaar 'vim9script', 2455e7e4838fSBram Moolenaar 'def Test() " comment', 2456e7e4838fSBram Moolenaar 'enddef', 2457e7e4838fSBram Moolenaar ], 'E488:') 2458e7e4838fSBram Moolenaar 2459e7e4838fSBram Moolenaar CheckScriptSuccess([ 2460e7e4838fSBram Moolenaar 'func Test() " comment', 2461e7e4838fSBram Moolenaar 'endfunc', 2462e7e4838fSBram Moolenaar ]) 24639898107fSBram Moolenaar CheckScriptSuccess([ 2464e7e4838fSBram Moolenaar 'vim9script', 2465e7e4838fSBram Moolenaar 'func Test() " comment', 2466e7e4838fSBram Moolenaar 'endfunc', 24679898107fSBram Moolenaar ]) 2468e7e4838fSBram Moolenaar 2469e7e4838fSBram Moolenaar CheckScriptSuccess([ 2470e7e4838fSBram Moolenaar 'def Test() # comment', 2471e7e4838fSBram Moolenaar 'enddef', 2472e7e4838fSBram Moolenaar ]) 2473e7e4838fSBram Moolenaar CheckScriptFailure([ 2474e7e4838fSBram Moolenaar 'func Test() # comment', 2475e7e4838fSBram Moolenaar 'endfunc', 2476e7e4838fSBram Moolenaar ], 'E488:') 24772c5ed4e3SBram Moolenaarenddef 24782c5ed4e3SBram Moolenaar 24792c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 24802c5ed4e3SBram Moolenaar CheckCanRunGui 24812c5ed4e3SBram Moolenaar 24822c5ed4e3SBram Moolenaar CheckScriptFailure([ 24832c5ed4e3SBram Moolenaar 'vim9script', 24842c5ed4e3SBram Moolenaar 'gui#comment' 24852c5ed4e3SBram Moolenaar ], 'E499:') 24862c5ed4e3SBram Moolenaar CheckScriptFailure([ 24872c5ed4e3SBram Moolenaar 'vim9script', 24882c5ed4e3SBram Moolenaar 'gui -f#comment' 24892c5ed4e3SBram Moolenaar ], 'E499:') 24907a092245SBram Moolenaarenddef 24917a092245SBram Moolenaar 2492a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 24936797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 24946797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2495a26b9700SBram Moolenaar 2496a26b9700SBram Moolenaar edit test.vim 2497a26b9700SBram Moolenaar doautocmd TabEnter #comment 2498a26b9700SBram Moolenaar assert_equal(1, g:entered) 2499a26b9700SBram Moolenaar 2500a26b9700SBram Moolenaar doautocmd TabEnter f.x 2501a26b9700SBram Moolenaar assert_equal(2, g:entered) 2502a26b9700SBram Moolenaar 2503a26b9700SBram Moolenaar g:entered = 0 2504a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2505a26b9700SBram Moolenaar assert_equal(2, g:entered) 2506a26b9700SBram Moolenaar 2507a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2508a26b9700SBram Moolenaar 2509a26b9700SBram Moolenaar au! TabEnter 2510a26b9700SBram Moolenaar unlet g:entered 2511d72c1bf0SBram Moolenaar 2512d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2513d72c1bf0SBram Moolenaar 'vim9script', 25146797966dSBram Moolenaar 'g:var = 123', 2515e55b1c09SBram Moolenaar 'b:var = 456', 2516e55b1c09SBram Moolenaar 'w:var = 777', 2517e55b1c09SBram Moolenaar 't:var = 888', 2518d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2519d72c1bf0SBram Moolenaar ]) 2520d72c1bf0SBram Moolenaar 2521d72c1bf0SBram Moolenaar CheckScriptFailure([ 2522d72c1bf0SBram Moolenaar 'vim9script', 2523d72c1bf0SBram Moolenaar 'let g:var = 123', 2524e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2525e55b1c09SBram Moolenaar 2526e55b1c09SBram Moolenaar CheckScriptFailure([ 2527e55b1c09SBram Moolenaar 'vim9script', 2528e55b1c09SBram Moolenaar 'let b:var = 123', 2529e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2530e55b1c09SBram Moolenaar 2531e55b1c09SBram Moolenaar CheckScriptFailure([ 2532e55b1c09SBram Moolenaar 'vim9script', 2533e55b1c09SBram Moolenaar 'let w:var = 123', 2534e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2535e55b1c09SBram Moolenaar 2536e55b1c09SBram Moolenaar CheckScriptFailure([ 2537e55b1c09SBram Moolenaar 'vim9script', 2538e55b1c09SBram Moolenaar 'let t:var = 123', 2539e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2540e55b1c09SBram Moolenaar 2541e55b1c09SBram Moolenaar CheckScriptFailure([ 2542e55b1c09SBram Moolenaar 'vim9script', 2543e55b1c09SBram Moolenaar 'let v:version = 123', 2544e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2545e55b1c09SBram Moolenaar 2546e55b1c09SBram Moolenaar CheckScriptFailure([ 2547e55b1c09SBram Moolenaar 'vim9script', 2548e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2549e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 25506797966dSBram Moolenaar 25516797966dSBram Moolenaar CheckScriptFailure([ 25526797966dSBram Moolenaar 'vim9script', 25536797966dSBram Moolenaar 'g:var = 123', 255432e35117SBram Moolenaar 'unlet g:var# comment1', 2555d72c1bf0SBram Moolenaar ], 'E108:') 2556d72c1bf0SBram Moolenaar 2557d72c1bf0SBram Moolenaar CheckScriptFailure([ 2558d72c1bf0SBram Moolenaar 'let g:var = 123', 2559d72c1bf0SBram Moolenaar 'unlet g:var # something', 2560d72c1bf0SBram Moolenaar ], 'E488:') 2561faac4104SBram Moolenaar 2562faac4104SBram Moolenaar CheckScriptSuccess([ 2563faac4104SBram Moolenaar 'vim9script', 256432e35117SBram Moolenaar 'if 1 # comment2', 2565faac4104SBram Moolenaar ' echo "yes"', 2566faac4104SBram Moolenaar 'elseif 2 #comment', 2567faac4104SBram Moolenaar ' echo "no"', 2568faac4104SBram Moolenaar 'endif', 2569faac4104SBram Moolenaar ]) 2570faac4104SBram Moolenaar 2571faac4104SBram Moolenaar CheckScriptFailure([ 2572faac4104SBram Moolenaar 'vim9script', 257332e35117SBram Moolenaar 'if 1# comment3', 2574faac4104SBram Moolenaar ' echo "yes"', 2575faac4104SBram Moolenaar 'endif', 2576faac4104SBram Moolenaar ], 'E15:') 2577faac4104SBram Moolenaar 2578faac4104SBram Moolenaar CheckScriptFailure([ 2579faac4104SBram Moolenaar 'vim9script', 258032e35117SBram Moolenaar 'if 0 # comment4', 2581faac4104SBram Moolenaar ' echo "yes"', 2582faac4104SBram Moolenaar 'elseif 2#comment', 2583faac4104SBram Moolenaar ' echo "no"', 2584faac4104SBram Moolenaar 'endif', 2585faac4104SBram Moolenaar ], 'E15:') 2586faac4104SBram Moolenaar 2587faac4104SBram Moolenaar CheckScriptSuccess([ 2588faac4104SBram Moolenaar 'vim9script', 258932e35117SBram Moolenaar 'let v = 1 # comment5', 2590faac4104SBram Moolenaar ]) 2591faac4104SBram Moolenaar 2592faac4104SBram Moolenaar CheckScriptFailure([ 2593faac4104SBram Moolenaar 'vim9script', 259432e35117SBram Moolenaar 'let v = 1# comment6', 259532e35117SBram Moolenaar ], 'E15:') 2596faac4104SBram Moolenaar 2597faac4104SBram Moolenaar CheckScriptSuccess([ 2598faac4104SBram Moolenaar 'vim9script', 2599faac4104SBram Moolenaar 'new' 2600faac4104SBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2601df069eecSBram Moolenaar ':$', 2602faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2603faac4104SBram Moolenaar 'bwipe!', 2604faac4104SBram Moolenaar ]) 2605faac4104SBram Moolenaar 2606f5be8cdbSBram Moolenaar CheckScriptFailure([ 2607f5be8cdbSBram Moolenaar 'vim9script', 2608f5be8cdbSBram Moolenaar 'new' 2609f5be8cdbSBram Moolenaar 'call setline(1, ["# define pat", "last"])', 2610f5be8cdbSBram Moolenaar ':$', 2611f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2612f5be8cdbSBram Moolenaar 'bwipe!', 2613f5be8cdbSBram Moolenaar ], 'E488:') 2614f5be8cdbSBram Moolenaar 2615f5be8cdbSBram Moolenaar CheckScriptFailure([ 2616f5be8cdbSBram Moolenaar 'vim9script', 2617f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2618f5be8cdbSBram Moolenaar ], 'E477:') 2619a26b9700SBram Moolenaarenddef 2620a26b9700SBram Moolenaar 26217e5bd91dSBram Moolenaardef Test_finish() 26227e5bd91dSBram Moolenaar let lines =<< trim END 26237e5bd91dSBram Moolenaar vim9script 26246797966dSBram Moolenaar g:res = 'one' 26257e5bd91dSBram Moolenaar if v:false | finish | endif 26266797966dSBram Moolenaar g:res = 'two' 26277e5bd91dSBram Moolenaar finish 26286797966dSBram Moolenaar g:res = 'three' 26297e5bd91dSBram Moolenaar END 26307e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 26317e5bd91dSBram Moolenaar source Xfinished 26327e5bd91dSBram Moolenaar assert_equal('two', g:res) 26337e5bd91dSBram Moolenaar 26347e5bd91dSBram Moolenaar unlet g:res 26357e5bd91dSBram Moolenaar delete('Xfinished') 26367e5bd91dSBram Moolenaarenddef 26377e5bd91dSBram Moolenaar 263832e35117SBram Moolenaardef Test_let_func_call() 263932e35117SBram Moolenaar let lines =<< trim END 264032e35117SBram Moolenaar vim9script 264132e35117SBram Moolenaar func GetValue() 264232e35117SBram Moolenaar if exists('g:count') 264332e35117SBram Moolenaar let g:count += 1 264432e35117SBram Moolenaar else 264532e35117SBram Moolenaar let g:count = 1 264632e35117SBram Moolenaar endif 264732e35117SBram Moolenaar return 'this' 264832e35117SBram Moolenaar endfunc 264932e35117SBram Moolenaar let val: string = GetValue() 2650f5be8cdbSBram Moolenaar # env var is always a string 2651df671b46SBram Moolenaar let env = $TERM 265232e35117SBram Moolenaar END 265332e35117SBram Moolenaar writefile(lines, 'Xfinished') 265432e35117SBram Moolenaar source Xfinished 2655f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 265632e35117SBram Moolenaar assert_equal(1, g:count) 265732e35117SBram Moolenaar 265832e35117SBram Moolenaar unlet g:count 265932e35117SBram Moolenaar delete('Xfinished') 266032e35117SBram Moolenaarenddef 266132e35117SBram Moolenaar 266232e35117SBram Moolenaardef Test_let_missing_type() 266332e35117SBram Moolenaar let lines =<< trim END 266432e35117SBram Moolenaar vim9script 2665df671b46SBram Moolenaar let var = g:unknown 2666227a69deSBram Moolenaar END 2667822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2668227a69deSBram Moolenaar 2669227a69deSBram Moolenaar lines =<< trim END 2670227a69deSBram Moolenaar vim9script 2671227a69deSBram Moolenaar let nr: number = 123 2672227a69deSBram Moolenaar let var = nr 2673227a69deSBram Moolenaar END 2674822ba247SBram Moolenaar CheckScriptSuccess(lines) 267532e35117SBram Moolenaarenddef 267632e35117SBram Moolenaar 2677c82a5b5dSBram Moolenaardef Test_let_declaration() 2678c82a5b5dSBram Moolenaar let lines =<< trim END 2679c82a5b5dSBram Moolenaar vim9script 2680c82a5b5dSBram Moolenaar let var: string 2681c82a5b5dSBram Moolenaar g:var_uninit = var 2682c82a5b5dSBram Moolenaar var = 'text' 2683c82a5b5dSBram Moolenaar g:var_test = var 2684f5be8cdbSBram Moolenaar # prefixing s: is optional 2685984dddbeSBram Moolenaar s:var = 'prefixed' 2686984dddbeSBram Moolenaar g:var_prefixed = s:var 2687984dddbeSBram Moolenaar 2688984dddbeSBram Moolenaar let s:other: number 2689984dddbeSBram Moolenaar other = 1234 2690984dddbeSBram Moolenaar g:other_var = other 2691c82a5b5dSBram Moolenaar END 2692c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2693c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2694c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2695984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2696984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 2697c82a5b5dSBram Moolenaar 2698c82a5b5dSBram Moolenaar unlet g:var_uninit 2699c82a5b5dSBram Moolenaar unlet g:var_test 2700984dddbeSBram Moolenaar unlet g:var_prefixed 2701984dddbeSBram Moolenaar unlet g:other_var 2702c82a5b5dSBram Moolenaarenddef 2703c82a5b5dSBram Moolenaar 2704c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2705c5b1c20bSBram Moolenaar let lines =<< trim END 2706c5b1c20bSBram Moolenaar vim9script 2707c5b1c20bSBram Moolenaar const var: string 2708c5b1c20bSBram Moolenaar END 2709c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2710c5b1c20bSBram Moolenaar 2711c5b1c20bSBram Moolenaar lines =<< trim END 2712c5b1c20bSBram Moolenaar vim9script 2713c5b1c20bSBram Moolenaar let 9var: string 2714c5b1c20bSBram Moolenaar END 2715c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2716c5b1c20bSBram Moolenaarenddef 2717c5b1c20bSBram Moolenaar 271834db91f7SBram Moolenaardef Test_let_type_check() 271934db91f7SBram Moolenaar let lines =<< trim END 272034db91f7SBram Moolenaar vim9script 272134db91f7SBram Moolenaar let var: string 272234db91f7SBram Moolenaar var = 1234 272334db91f7SBram Moolenaar END 272434db91f7SBram Moolenaar CheckScriptFailure(lines, 'E1013:') 2725984dddbeSBram Moolenaar 2726984dddbeSBram Moolenaar lines =<< trim END 2727984dddbeSBram Moolenaar vim9script 2728984dddbeSBram Moolenaar let var:string 2729984dddbeSBram Moolenaar END 2730984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2731c5b1c20bSBram Moolenaar 2732c5b1c20bSBram Moolenaar lines =<< trim END 2733c5b1c20bSBram Moolenaar vim9script 2734c5b1c20bSBram Moolenaar let var: asdf 2735c5b1c20bSBram Moolenaar END 2736c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 273734db91f7SBram Moolenaarenddef 273834db91f7SBram Moolenaar 2739a5d0077eSBram Moolenaardef Test_forward_declaration() 2740a5d0077eSBram Moolenaar let lines =<< trim END 2741a5d0077eSBram Moolenaar vim9script 2742a5d0077eSBram Moolenaar def GetValue(): string 2743a5d0077eSBram Moolenaar return theVal 2744a5d0077eSBram Moolenaar enddef 2745a5d0077eSBram Moolenaar let theVal = 'something' 2746822ba247SBram Moolenaar g:initVal = GetValue() 2747a5d0077eSBram Moolenaar theVal = 'else' 2748a5d0077eSBram Moolenaar g:laterVal = GetValue() 2749a5d0077eSBram Moolenaar END 2750a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2751a5d0077eSBram Moolenaar source Xforward 2752a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2753a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2754a5d0077eSBram Moolenaar 2755a5d0077eSBram Moolenaar unlet g:initVal 2756a5d0077eSBram Moolenaar unlet g:laterVal 2757a5d0077eSBram Moolenaar delete('Xforward') 2758a5d0077eSBram Moolenaarenddef 2759a5d0077eSBram Moolenaar 27609721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 27619721fb4eSBram Moolenaar let legacy_lines =<< trim END 27629721fb4eSBram Moolenaar source Xvim9_script.vim 27639721fb4eSBram Moolenaar 27649721fb4eSBram Moolenaar call assert_false(exists('local')) 27659721fb4eSBram Moolenaar call assert_false(exists('exported')) 27669721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 27679721fb4eSBram Moolenaar call assert_equal('global', global) 27689721fb4eSBram Moolenaar call assert_equal('global', g:global) 27699721fb4eSBram Moolenaar 27709721fb4eSBram Moolenaar " imported variable becomes script-local 27719721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 27729721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 27739721fb4eSBram Moolenaar call assert_false(exists('exported')) 27749721fb4eSBram Moolenaar 27759721fb4eSBram Moolenaar " imported function becomes script-local 27769721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 27779721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 27789721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 27799721fb4eSBram Moolenaar END 27809721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 27819721fb4eSBram Moolenaar 27829721fb4eSBram Moolenaar let vim9_lines =<< trim END 27839721fb4eSBram Moolenaar vim9script 27849721fb4eSBram Moolenaar let local = 'local' 27859721fb4eSBram Moolenaar g:global = 'global' 27869721fb4eSBram Moolenaar export let exported = 'exported' 27879721fb4eSBram Moolenaar export def GetText(): string 27889721fb4eSBram Moolenaar return 'text' 27899721fb4eSBram Moolenaar enddef 27909721fb4eSBram Moolenaar END 27919721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 27929721fb4eSBram Moolenaar 27939721fb4eSBram Moolenaar source Xlegacy_script.vim 27949721fb4eSBram Moolenaar 27959721fb4eSBram Moolenaar assert_equal('global', g:global) 2796f5be8cdbSBram Moolenaar unlet g:global 27979721fb4eSBram Moolenaar 27989721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 27999721fb4eSBram Moolenaar delete('Xvim9_script.vim') 28009721fb4eSBram Moolenaarenddef 2801a5d0077eSBram Moolenaar 2802eeb27bfeSBram Moolenaardef Test_vim9_copen() 2803eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2804eeb27bfeSBram Moolenaar copen 2805eeb27bfeSBram Moolenaar quit 2806eeb27bfeSBram Moolenaarenddef 2807eeb27bfeSBram Moolenaar 28082d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 28092d6b20d6SBram Moolenaardef Test_vim9_autoload() 28102d6b20d6SBram Moolenaar let lines =<< trim END 28112d6b20d6SBram Moolenaar vim9script 28122d6b20d6SBram Moolenaar def foo#test() 28132d6b20d6SBram Moolenaar echomsg getreg('"') 28142d6b20d6SBram Moolenaar enddef 28152d6b20d6SBram Moolenaar END 28162d6b20d6SBram Moolenaar 28172d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 28182d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 28192d6b20d6SBram Moolenaar let save_rtp = &rtp 28202d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 28212d6b20d6SBram Moolenaar augroup test 28222d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 28232d6b20d6SBram Moolenaar augroup END 28242d6b20d6SBram Moolenaar 28252d6b20d6SBram Moolenaar normal Y 28262d6b20d6SBram Moolenaar 28272d6b20d6SBram Moolenaar augroup test 28282d6b20d6SBram Moolenaar autocmd! 28292d6b20d6SBram Moolenaar augroup END 28302d6b20d6SBram Moolenaar delete('Xdir', 'rf') 28312d6b20d6SBram Moolenaar &rtp = save_rtp 28322d6b20d6SBram Moolenaarenddef 28332d6b20d6SBram Moolenaar 2834585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2835585fea7bSBram Moolenaardef Test_substitute_cmd() 2836585fea7bSBram Moolenaar new 2837585fea7bSBram Moolenaar setline(1, 'something') 2838585fea7bSBram Moolenaar :substitute(some(other( 2839585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2840585fea7bSBram Moolenaar bwipe! 2841585fea7bSBram Moolenaar 2842f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2843585fea7bSBram Moolenaar let lines =<< trim END 2844585fea7bSBram Moolenaar vim9script 2845585fea7bSBram Moolenaar new 2846585fea7bSBram Moolenaar setline(1, 'something') 2847585fea7bSBram Moolenaar :substitute(some(other( 2848585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2849585fea7bSBram Moolenaar bwipe! 2850585fea7bSBram Moolenaar END 2851585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2852585fea7bSBram Moolenaar source Xvim9lines 2853585fea7bSBram Moolenaar 2854585fea7bSBram Moolenaar delete('Xvim9lines') 2855585fea7bSBram Moolenaarenddef 2856585fea7bSBram Moolenaar 28578a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2858