15d7ead3bSBram Moolenaar" Test various aspects of the Vim script language. 2b544f3c8SBram Moolenaar" Most of this was formerly in test49. 3b544f3c8SBram Moolenaar 48c5a278fSBram Moolenaarsource check.vim 593344c2dSBram Moolenaarsource shared.vim 6a6296200SBram Moolenaarsource script_util.vim 78c5a278fSBram Moolenaar 8b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 9b544f3c8SBram Moolenaar" Test environment {{{1 10b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 11b544f3c8SBram Moolenaar 12b544f3c8SBram Moolenaar" Append a message to the "messages" file 131e115360SBram Moolenaarfunc Xout(text) 14b544f3c8SBram Moolenaar split messages 15b544f3c8SBram Moolenaar $put =a:text 16b544f3c8SBram Moolenaar wq 17b544f3c8SBram Moolenaarendfunc 18b544f3c8SBram Moolenaar 19b544f3c8SBram Moolenaarcom! -nargs=1 Xout call Xout(<args>) 20b544f3c8SBram Moolenaar 21a6296200SBram Moolenaar" Create a new instance of Vim and run the commands in 'test' and then 'verify' 22a6296200SBram Moolenaar" The commands in 'test' are expected to store the test results in the Xtest.out 23a6296200SBram Moolenaar" file. If the test passes successfully, then Xtest.out should be empty. 24a6296200SBram Moolenaarfunc RunInNewVim(test, verify) 25a6296200SBram Moolenaar let init =<< trim END 26a6296200SBram Moolenaar source script_util.vim 27a6296200SBram Moolenaar XpathINIT 28a6296200SBram Moolenaar XloopINIT 29a6296200SBram Moolenaar END 30a6296200SBram Moolenaar let cleanup =<< trim END 31a6296200SBram Moolenaar call writefile(v:errors, 'Xtest.out') 32a6296200SBram Moolenaar qall 33a6296200SBram Moolenaar END 34a6296200SBram Moolenaar call writefile(init, 'Xtest.vim') 35a6296200SBram Moolenaar call writefile(a:test, 'Xtest.vim', 'a') 36a6296200SBram Moolenaar call writefile(a:verify, 'Xverify.vim') 37a6296200SBram Moolenaar call writefile(cleanup, 'Xverify.vim', 'a') 38a6296200SBram Moolenaar call RunVim([], [], "-S Xtest.vim -S Xverify.vim") 39a6296200SBram Moolenaar call assert_equal([], readfile('Xtest.out')) 40a6296200SBram Moolenaar call delete('Xtest.out') 41a6296200SBram Moolenaar call delete('Xtest.vim') 42a6296200SBram Moolenaar call delete('Xverify.vim') 431e115360SBram Moolenaarendfunc 44b544f3c8SBram Moolenaar 45b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 46b544f3c8SBram Moolenaar" Test 1: :endwhile in function {{{1 47b544f3c8SBram Moolenaar" 48b544f3c8SBram Moolenaar" Detect if a broken loop is (incorrectly) reactivated by the 49b544f3c8SBram Moolenaar" :endwhile. Use a :return to prevent an endless loop, and make 50b544f3c8SBram Moolenaar" this test first to get a meaningful result on an error before other 51b544f3c8SBram Moolenaar" tests will hang. 52b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 53b544f3c8SBram Moolenaar 54a6296200SBram Moolenaarfunc T1_F() 55b544f3c8SBram Moolenaar Xpath 'a' 56b544f3c8SBram Moolenaar let first = 1 57b544f3c8SBram Moolenaar while 1 58b544f3c8SBram Moolenaar Xpath 'b' 59b544f3c8SBram Moolenaar if first 60b544f3c8SBram Moolenaar Xpath 'c' 61b544f3c8SBram Moolenaar let first = 0 62b544f3c8SBram Moolenaar break 63b544f3c8SBram Moolenaar else 64b544f3c8SBram Moolenaar Xpath 'd' 65b544f3c8SBram Moolenaar return 66b544f3c8SBram Moolenaar endif 67b544f3c8SBram Moolenaar endwhile 68a6296200SBram Moolenaarendfunc 69b544f3c8SBram Moolenaar 70a6296200SBram Moolenaarfunc T1_G() 71b544f3c8SBram Moolenaar Xpath 'h' 72b544f3c8SBram Moolenaar let first = 1 73b544f3c8SBram Moolenaar while 1 74b544f3c8SBram Moolenaar Xpath 'i' 75b544f3c8SBram Moolenaar if first 76b544f3c8SBram Moolenaar Xpath 'j' 77b544f3c8SBram Moolenaar let first = 0 78b544f3c8SBram Moolenaar break 79b544f3c8SBram Moolenaar else 80b544f3c8SBram Moolenaar Xpath 'k' 81b544f3c8SBram Moolenaar return 82b544f3c8SBram Moolenaar endif 83b544f3c8SBram Moolenaar if 1 " unmatched :if 84b544f3c8SBram Moolenaar endwhile 85a6296200SBram Moolenaarendfunc 86b544f3c8SBram Moolenaar 87b544f3c8SBram Moolenaarfunc Test_endwhile_function() 88b544f3c8SBram Moolenaar XpathINIT 89b544f3c8SBram Moolenaar call T1_F() 90b544f3c8SBram Moolenaar Xpath 'F' 91b544f3c8SBram Moolenaar 92b544f3c8SBram Moolenaar try 93b544f3c8SBram Moolenaar call T1_G() 94b544f3c8SBram Moolenaar catch 95b544f3c8SBram Moolenaar " Catch missing :endif 96b544f3c8SBram Moolenaar call assert_true(v:exception =~ 'E171') 97b544f3c8SBram Moolenaar Xpath 'x' 98b544f3c8SBram Moolenaar endtry 99b544f3c8SBram Moolenaar Xpath 'G' 100b544f3c8SBram Moolenaar 101b544f3c8SBram Moolenaar call assert_equal('abcFhijxG', g:Xpath) 102b544f3c8SBram Moolenaarendfunc 103b544f3c8SBram Moolenaar 104b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 105b544f3c8SBram Moolenaar" Test 2: :endwhile in script {{{1 106b544f3c8SBram Moolenaar" 107b544f3c8SBram Moolenaar" Detect if a broken loop is (incorrectly) reactivated by the 108b544f3c8SBram Moolenaar" :endwhile. Use a :finish to prevent an endless loop, and place 109b544f3c8SBram Moolenaar" this test before others that might hang to get a meaningful result 110b544f3c8SBram Moolenaar" on an error. 111b544f3c8SBram Moolenaar" 112b544f3c8SBram Moolenaar" This test executes the bodies of the functions T1_F and T1_G from 113b544f3c8SBram Moolenaar" the previous test as script files (:return replaced by :finish). 114b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 115b544f3c8SBram Moolenaar 116b544f3c8SBram Moolenaarfunc Test_endwhile_script() 117b544f3c8SBram Moolenaar XpathINIT 118b544f3c8SBram Moolenaar ExecAsScript T1_F 119b544f3c8SBram Moolenaar Xpath 'F' 120b544f3c8SBram Moolenaar call DeleteTheScript() 121b544f3c8SBram Moolenaar 122b544f3c8SBram Moolenaar try 123b544f3c8SBram Moolenaar ExecAsScript T1_G 124b544f3c8SBram Moolenaar catch 125b544f3c8SBram Moolenaar " Catch missing :endif 126b544f3c8SBram Moolenaar call assert_true(v:exception =~ 'E171') 127b544f3c8SBram Moolenaar Xpath 'x' 128b544f3c8SBram Moolenaar endtry 129b544f3c8SBram Moolenaar Xpath 'G' 130b544f3c8SBram Moolenaar call DeleteTheScript() 131b544f3c8SBram Moolenaar 132b544f3c8SBram Moolenaar call assert_equal('abcFhijxG', g:Xpath) 133b544f3c8SBram Moolenaarendfunc 134b544f3c8SBram Moolenaar 135b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 136b544f3c8SBram Moolenaar" Test 3: :if, :elseif, :while, :continue, :break {{{1 137b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 138b544f3c8SBram Moolenaar 139a6296200SBram Moolenaarfunc Test_if_while() 140b544f3c8SBram Moolenaar XpathINIT 141b544f3c8SBram Moolenaar if 1 142b544f3c8SBram Moolenaar Xpath 'a' 143b544f3c8SBram Moolenaar let loops = 3 144b544f3c8SBram Moolenaar while loops > -1 " main loop: loops == 3, 2, 1 (which breaks) 145b544f3c8SBram Moolenaar if loops <= 0 146b544f3c8SBram Moolenaar let break_err = 1 147b544f3c8SBram Moolenaar let loops = -1 148b544f3c8SBram Moolenaar else 149b544f3c8SBram Moolenaar Xpath 'b' . loops 150b544f3c8SBram Moolenaar endif 151b544f3c8SBram Moolenaar if (loops == 2) 152b544f3c8SBram Moolenaar while loops == 2 " dummy loop 153b544f3c8SBram Moolenaar Xpath 'c' . loops 154b544f3c8SBram Moolenaar let loops = loops - 1 155b544f3c8SBram Moolenaar continue " stop dummy loop 156b544f3c8SBram Moolenaar Xpath 'd' . loops 157b544f3c8SBram Moolenaar endwhile 158b544f3c8SBram Moolenaar continue " continue main loop 159b544f3c8SBram Moolenaar Xpath 'e' . loops 160b544f3c8SBram Moolenaar elseif (loops == 1) 161b544f3c8SBram Moolenaar let p = 1 162b544f3c8SBram Moolenaar while p " dummy loop 163b544f3c8SBram Moolenaar Xpath 'f' . loops 164b544f3c8SBram Moolenaar let p = 0 165b544f3c8SBram Moolenaar break " break dummy loop 166b544f3c8SBram Moolenaar Xpath 'g' . loops 167b544f3c8SBram Moolenaar endwhile 168b544f3c8SBram Moolenaar Xpath 'h' . loops 169b544f3c8SBram Moolenaar unlet p 170b544f3c8SBram Moolenaar break " break main loop 171b544f3c8SBram Moolenaar Xpath 'i' . loops 172b544f3c8SBram Moolenaar endif 173b544f3c8SBram Moolenaar if (loops > 0) 174b544f3c8SBram Moolenaar Xpath 'j' . loops 175b544f3c8SBram Moolenaar endif 176b544f3c8SBram Moolenaar while loops == 3 " dummy loop 177b544f3c8SBram Moolenaar let loops = loops - 1 178b544f3c8SBram Moolenaar endwhile " end dummy loop 179b544f3c8SBram Moolenaar endwhile " end main loop 180b544f3c8SBram Moolenaar Xpath 'k' 181b544f3c8SBram Moolenaar else 182b544f3c8SBram Moolenaar Xpath 'l' 183b544f3c8SBram Moolenaar endif 184b544f3c8SBram Moolenaar Xpath 'm' 185b544f3c8SBram Moolenaar if exists("break_err") 186b544f3c8SBram Moolenaar Xpath 'm' 187b544f3c8SBram Moolenaar unlet break_err 188b544f3c8SBram Moolenaar endif 189b544f3c8SBram Moolenaar 190b544f3c8SBram Moolenaar unlet loops 191b544f3c8SBram Moolenaar 192b544f3c8SBram Moolenaar call assert_equal('ab3j3b2c2b1f1h1km', g:Xpath) 193b544f3c8SBram Moolenaarendfunc 194b544f3c8SBram Moolenaar 195b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 196b544f3c8SBram Moolenaar" Test 4: :return {{{1 197b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 198b544f3c8SBram Moolenaar 199a6296200SBram Moolenaarfunc T4_F() 200b544f3c8SBram Moolenaar if 1 201b544f3c8SBram Moolenaar Xpath 'a' 202b544f3c8SBram Moolenaar let loops = 3 203b544f3c8SBram Moolenaar while loops > 0 " 3: 2: 1: 204b544f3c8SBram Moolenaar Xpath 'b' . loops 205b544f3c8SBram Moolenaar if (loops == 2) 206b544f3c8SBram Moolenaar Xpath 'c' . loops 207b544f3c8SBram Moolenaar return 208b544f3c8SBram Moolenaar Xpath 'd' . loops 209b544f3c8SBram Moolenaar endif 210b544f3c8SBram Moolenaar Xpath 'e' . loops 211b544f3c8SBram Moolenaar let loops = loops - 1 212b544f3c8SBram Moolenaar endwhile 213b544f3c8SBram Moolenaar Xpath 'f' 214b544f3c8SBram Moolenaar else 215b544f3c8SBram Moolenaar Xpath 'g' 216b544f3c8SBram Moolenaar endif 217a6296200SBram Moolenaarendfunc 218b544f3c8SBram Moolenaar 219a6296200SBram Moolenaarfunc Test_return() 220b544f3c8SBram Moolenaar XpathINIT 221b544f3c8SBram Moolenaar call T4_F() 222b544f3c8SBram Moolenaar Xpath '4' 223b544f3c8SBram Moolenaar 224b544f3c8SBram Moolenaar call assert_equal('ab3e3b2c24', g:Xpath) 225a6296200SBram Moolenaarendfunc 226b544f3c8SBram Moolenaar 227b544f3c8SBram Moolenaar 228b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 229b544f3c8SBram Moolenaar" Test 5: :finish {{{1 230b544f3c8SBram Moolenaar" 231b544f3c8SBram Moolenaar" This test executes the body of the function T4_F from the previous 232b544f3c8SBram Moolenaar" test as a script file (:return replaced by :finish). 233b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 234b544f3c8SBram Moolenaar 235a6296200SBram Moolenaarfunc Test_finish() 236b544f3c8SBram Moolenaar XpathINIT 237b544f3c8SBram Moolenaar ExecAsScript T4_F 238b544f3c8SBram Moolenaar Xpath '5' 239b544f3c8SBram Moolenaar call DeleteTheScript() 240b544f3c8SBram Moolenaar 241b544f3c8SBram Moolenaar call assert_equal('ab3e3b2c25', g:Xpath) 242a6296200SBram Moolenaarendfunc 243b544f3c8SBram Moolenaar 244b544f3c8SBram Moolenaar 245b544f3c8SBram Moolenaar 246b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 247b544f3c8SBram Moolenaar" Test 6: Defining functions in :while loops {{{1 248b544f3c8SBram Moolenaar" 249b544f3c8SBram Moolenaar" Functions can be defined inside other functions. An inner function 250b544f3c8SBram Moolenaar" gets defined when the outer function is executed. Functions may 251b544f3c8SBram Moolenaar" also be defined inside while loops. Expressions in braces for 252b544f3c8SBram Moolenaar" defining the function name are allowed. 253b544f3c8SBram Moolenaar" 254b544f3c8SBram Moolenaar" The functions are defined when sourcing the script, only the 255b544f3c8SBram Moolenaar" resulting path is checked in the test function. 256b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 257b544f3c8SBram Moolenaar 258b544f3c8SBram MoolenaarXpathINIT 259b544f3c8SBram Moolenaar 260b544f3c8SBram Moolenaar" The command CALL collects the argument of all its invocations in "calls" 261b544f3c8SBram Moolenaar" when used from a function (that is, when the global variable "calls" needs 262b544f3c8SBram Moolenaar" the "g:" prefix). This is to check that the function code is skipped when 263b544f3c8SBram Moolenaar" the function is defined. For inner functions, do so only if the outer 264b544f3c8SBram Moolenaar" function is not being executed. 265b544f3c8SBram Moolenaar" 266b544f3c8SBram Moolenaarlet calls = "" 267b544f3c8SBram Moolenaarcom! -nargs=1 CALL 268b544f3c8SBram Moolenaar \ if !exists("calls") && !exists("outer") | 269b544f3c8SBram Moolenaar \ let g:calls = g:calls . <args> | 270b544f3c8SBram Moolenaar \ endif 271b544f3c8SBram Moolenaar 272b544f3c8SBram Moolenaarlet i = 0 273b544f3c8SBram Moolenaarwhile i < 3 274b544f3c8SBram Moolenaar let i = i + 1 275b544f3c8SBram Moolenaar if i == 1 276b544f3c8SBram Moolenaar Xpath 'a' 277b544f3c8SBram Moolenaar function! F1(arg) 278b544f3c8SBram Moolenaar CALL a:arg 279b544f3c8SBram Moolenaar let outer = 1 280b544f3c8SBram Moolenaar 281b544f3c8SBram Moolenaar let j = 0 282b544f3c8SBram Moolenaar while j < 1 283b544f3c8SBram Moolenaar Xpath 'b' 284b544f3c8SBram Moolenaar let j = j + 1 285b544f3c8SBram Moolenaar function! G1(arg) 286b544f3c8SBram Moolenaar CALL a:arg 287b544f3c8SBram Moolenaar endfunction 288b544f3c8SBram Moolenaar Xpath 'c' 289b544f3c8SBram Moolenaar endwhile 290b544f3c8SBram Moolenaar endfunction 291b544f3c8SBram Moolenaar Xpath 'd' 292b544f3c8SBram Moolenaar 293b544f3c8SBram Moolenaar continue 294b544f3c8SBram Moolenaar endif 295b544f3c8SBram Moolenaar 296b544f3c8SBram Moolenaar Xpath 'e' . i 297b544f3c8SBram Moolenaar function! F{i}(i, arg) 298b544f3c8SBram Moolenaar CALL a:arg 299b544f3c8SBram Moolenaar let outer = 1 300b544f3c8SBram Moolenaar 301b544f3c8SBram Moolenaar if a:i == 3 302b544f3c8SBram Moolenaar Xpath 'f' 303b544f3c8SBram Moolenaar endif 304b544f3c8SBram Moolenaar let k = 0 305b544f3c8SBram Moolenaar while k < 3 306b544f3c8SBram Moolenaar Xpath 'g' . k 307b544f3c8SBram Moolenaar let k = k + 1 308b544f3c8SBram Moolenaar function! G{a:i}{k}(arg) 309b544f3c8SBram Moolenaar CALL a:arg 310b544f3c8SBram Moolenaar endfunction 311b544f3c8SBram Moolenaar Xpath 'h' . k 312b544f3c8SBram Moolenaar endwhile 313b544f3c8SBram Moolenaar endfunction 314b544f3c8SBram Moolenaar Xpath 'i' 315b544f3c8SBram Moolenaar 316b544f3c8SBram Moolenaarendwhile 317b544f3c8SBram Moolenaar 318b544f3c8SBram Moolenaarif exists("*G1") 319b544f3c8SBram Moolenaar Xpath 'j' 320b544f3c8SBram Moolenaarendif 321b544f3c8SBram Moolenaarif exists("*F1") 322b544f3c8SBram Moolenaar call F1("F1") 323b544f3c8SBram Moolenaar if exists("*G1") 324b544f3c8SBram Moolenaar call G1("G1") 325b544f3c8SBram Moolenaar endif 326b544f3c8SBram Moolenaarendif 327b544f3c8SBram Moolenaar 328b544f3c8SBram Moolenaarif exists("G21") || exists("G22") || exists("G23") 329b544f3c8SBram Moolenaar Xpath 'k' 330b544f3c8SBram Moolenaarendif 331b544f3c8SBram Moolenaarif exists("*F2") 332b544f3c8SBram Moolenaar call F2(2, "F2") 333b544f3c8SBram Moolenaar if exists("*G21") 334b544f3c8SBram Moolenaar call G21("G21") 335b544f3c8SBram Moolenaar endif 336b544f3c8SBram Moolenaar if exists("*G22") 337b544f3c8SBram Moolenaar call G22("G22") 338b544f3c8SBram Moolenaar endif 339b544f3c8SBram Moolenaar if exists("*G23") 340b544f3c8SBram Moolenaar call G23("G23") 341b544f3c8SBram Moolenaar endif 342b544f3c8SBram Moolenaarendif 343b544f3c8SBram Moolenaar 344b544f3c8SBram Moolenaarif exists("G31") || exists("G32") || exists("G33") 345b544f3c8SBram Moolenaar Xpath 'l' 346b544f3c8SBram Moolenaarendif 347b544f3c8SBram Moolenaarif exists("*F3") 348b544f3c8SBram Moolenaar call F3(3, "F3") 349b544f3c8SBram Moolenaar if exists("*G31") 350b544f3c8SBram Moolenaar call G31("G31") 351b544f3c8SBram Moolenaar endif 352b544f3c8SBram Moolenaar if exists("*G32") 353b544f3c8SBram Moolenaar call G32("G32") 354b544f3c8SBram Moolenaar endif 355b544f3c8SBram Moolenaar if exists("*G33") 356b544f3c8SBram Moolenaar call G33("G33") 357b544f3c8SBram Moolenaar endif 358b544f3c8SBram Moolenaarendif 359b544f3c8SBram Moolenaar 360b544f3c8SBram MoolenaarXpath 'm' 361b544f3c8SBram Moolenaar 362b544f3c8SBram Moolenaarlet g:test6_result = g:Xpath 363b544f3c8SBram Moolenaarlet g:test6_calls = calls 364b544f3c8SBram Moolenaar 365b544f3c8SBram Moolenaarunlet calls 366b544f3c8SBram Moolenaardelfunction F1 367b544f3c8SBram Moolenaardelfunction G1 368b544f3c8SBram Moolenaardelfunction F2 369b544f3c8SBram Moolenaardelfunction G21 370b544f3c8SBram Moolenaardelfunction G22 371b544f3c8SBram Moolenaardelfunction G23 372b544f3c8SBram Moolenaardelfunction G31 373b544f3c8SBram Moolenaardelfunction G32 374b544f3c8SBram Moolenaardelfunction G33 375b544f3c8SBram Moolenaar 376a6296200SBram Moolenaarfunc Test_defining_functions() 377b544f3c8SBram Moolenaar call assert_equal('ade2ie3ibcg0h1g1h2g2h3fg0h1g1h2g2h3m', g:test6_result) 378b544f3c8SBram Moolenaar call assert_equal('F1G1F2G21G22G23F3G31G32G33', g:test6_calls) 379b544f3c8SBram Moolenaarendfunc 380b544f3c8SBram Moolenaar 381b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 382b544f3c8SBram Moolenaar" Test 7: Continuing on errors outside functions {{{1 383b544f3c8SBram Moolenaar" 384b544f3c8SBram Moolenaar" On an error outside a function, the script processing continues 385b544f3c8SBram Moolenaar" at the line following the outermost :endif or :endwhile. When not 386b544f3c8SBram Moolenaar" inside an :if or :while, the script processing continues at the next 387b544f3c8SBram Moolenaar" line. 388b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 389b544f3c8SBram Moolenaar 390b544f3c8SBram MoolenaarXpathINIT 391b544f3c8SBram Moolenaar 392b544f3c8SBram Moolenaarif 1 393b544f3c8SBram Moolenaar Xpath 'a' 394b544f3c8SBram Moolenaar while 1 395b544f3c8SBram Moolenaar Xpath 'b' 396b544f3c8SBram Moolenaar asdf 397b544f3c8SBram Moolenaar Xpath 'c' 398b544f3c8SBram Moolenaar break 399b544f3c8SBram Moolenaar endwhile | Xpath 'd' 400b544f3c8SBram Moolenaar Xpath 'e' 401b544f3c8SBram Moolenaarendif | Xpath 'f' 402b544f3c8SBram MoolenaarXpath 'g' 403b544f3c8SBram Moolenaar 404b544f3c8SBram Moolenaarwhile 1 405b544f3c8SBram Moolenaar Xpath 'h' 406b544f3c8SBram Moolenaar if 1 407b544f3c8SBram Moolenaar Xpath 'i' 408b544f3c8SBram Moolenaar asdf 409b544f3c8SBram Moolenaar Xpath 'j' 410b544f3c8SBram Moolenaar endif | Xpath 'k' 411b544f3c8SBram Moolenaar Xpath 'l' 412b544f3c8SBram Moolenaar break 413b544f3c8SBram Moolenaarendwhile | Xpath 'm' 414b544f3c8SBram MoolenaarXpath 'n' 415b544f3c8SBram Moolenaar 416b544f3c8SBram Moolenaarasdf 417b544f3c8SBram MoolenaarXpath 'o' 418b544f3c8SBram Moolenaar 419b544f3c8SBram Moolenaarasdf | Xpath 'p' 420b544f3c8SBram MoolenaarXpath 'q' 421b544f3c8SBram Moolenaar 422b544f3c8SBram Moolenaarlet g:test7_result = g:Xpath 423b544f3c8SBram Moolenaar 424b544f3c8SBram Moolenaarfunc Test_error_in_script() 425b544f3c8SBram Moolenaar call assert_equal('abghinoq', g:test7_result) 426b544f3c8SBram Moolenaarendfunc 427b544f3c8SBram Moolenaar 428b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 429b544f3c8SBram Moolenaar" Test 8: Aborting and continuing on errors inside functions {{{1 430b544f3c8SBram Moolenaar" 431b544f3c8SBram Moolenaar" On an error inside a function without the "abort" attribute, the 432b544f3c8SBram Moolenaar" script processing continues at the next line (unless the error was 433b544f3c8SBram Moolenaar" in a :return command). On an error inside a function with the 434b544f3c8SBram Moolenaar" "abort" attribute, the function is aborted and the script processing 435b544f3c8SBram Moolenaar" continues after the function call; the value -1 is returned then. 436b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 437b544f3c8SBram Moolenaar 438b544f3c8SBram MoolenaarXpathINIT 439b544f3c8SBram Moolenaar 440a6296200SBram Moolenaarfunc T8_F() 441b544f3c8SBram Moolenaar if 1 442b544f3c8SBram Moolenaar Xpath 'a' 443b544f3c8SBram Moolenaar while 1 444b544f3c8SBram Moolenaar Xpath 'b' 445b544f3c8SBram Moolenaar asdf 446b544f3c8SBram Moolenaar Xpath 'c' 447b544f3c8SBram Moolenaar asdf | Xpath 'd' 448b544f3c8SBram Moolenaar Xpath 'e' 449b544f3c8SBram Moolenaar break 450b544f3c8SBram Moolenaar endwhile 451b544f3c8SBram Moolenaar Xpath 'f' 452b544f3c8SBram Moolenaar endif | Xpath 'g' 453b544f3c8SBram Moolenaar Xpath 'h' 454b544f3c8SBram Moolenaar 455b544f3c8SBram Moolenaar while 1 456b544f3c8SBram Moolenaar Xpath 'i' 457b544f3c8SBram Moolenaar if 1 458b544f3c8SBram Moolenaar Xpath 'j' 459b544f3c8SBram Moolenaar asdf 460b544f3c8SBram Moolenaar Xpath 'k' 461b544f3c8SBram Moolenaar asdf | Xpath 'l' 462b544f3c8SBram Moolenaar Xpath 'm' 463b544f3c8SBram Moolenaar endif 464b544f3c8SBram Moolenaar Xpath 'n' 465b544f3c8SBram Moolenaar break 466b544f3c8SBram Moolenaar endwhile | Xpath 'o' 467b544f3c8SBram Moolenaar Xpath 'p' 468b544f3c8SBram Moolenaar 469b544f3c8SBram Moolenaar return novar " returns (default return value 0) 470b544f3c8SBram Moolenaar Xpath 'q' 471b544f3c8SBram Moolenaar return 1 " not reached 472a6296200SBram Moolenaarendfunc 473b544f3c8SBram Moolenaar 474a6296200SBram Moolenaarfunc T8_G() abort 475b544f3c8SBram Moolenaar if 1 476b544f3c8SBram Moolenaar Xpath 'r' 477b544f3c8SBram Moolenaar while 1 478b544f3c8SBram Moolenaar Xpath 's' 479b544f3c8SBram Moolenaar asdf " returns -1 480b544f3c8SBram Moolenaar Xpath 't' 481b544f3c8SBram Moolenaar break 482b544f3c8SBram Moolenaar endwhile 483b544f3c8SBram Moolenaar Xpath 'v' 484b544f3c8SBram Moolenaar endif | Xpath 'w' 485b544f3c8SBram Moolenaar Xpath 'x' 486b544f3c8SBram Moolenaar 487b544f3c8SBram Moolenaar return -4 " not reached 488a6296200SBram Moolenaarendfunc 489b544f3c8SBram Moolenaar 490a6296200SBram Moolenaarfunc T8_H() abort 491b544f3c8SBram Moolenaar while 1 492b544f3c8SBram Moolenaar Xpath 'A' 493b544f3c8SBram Moolenaar if 1 494b544f3c8SBram Moolenaar Xpath 'B' 495b544f3c8SBram Moolenaar asdf " returns -1 496b544f3c8SBram Moolenaar Xpath 'C' 497b544f3c8SBram Moolenaar endif 498b544f3c8SBram Moolenaar Xpath 'D' 499b544f3c8SBram Moolenaar break 500b544f3c8SBram Moolenaar endwhile | Xpath 'E' 501b544f3c8SBram Moolenaar Xpath 'F' 502b544f3c8SBram Moolenaar 503b544f3c8SBram Moolenaar return -4 " not reached 504a6296200SBram Moolenaarendfunc 505b544f3c8SBram Moolenaar 506b544f3c8SBram Moolenaar" Aborted functions (T8_G and T8_H) return -1. 507b544f3c8SBram Moolenaarlet g:test8_sum = (T8_F() + 1) - 4 * T8_G() - 8 * T8_H() 508b544f3c8SBram MoolenaarXpath 'X' 509b544f3c8SBram Moolenaarlet g:test8_result = g:Xpath 510b544f3c8SBram Moolenaar 511b544f3c8SBram Moolenaarfunc Test_error_in_function() 512b544f3c8SBram Moolenaar call assert_equal(13, g:test8_sum) 513b544f3c8SBram Moolenaar call assert_equal('abcefghijkmnoprsABX', g:test8_result) 514b544f3c8SBram Moolenaar 515b544f3c8SBram Moolenaar delfunction T8_F 516b544f3c8SBram Moolenaar delfunction T8_G 517b544f3c8SBram Moolenaar delfunction T8_H 518b544f3c8SBram Moolenaarendfunc 519b544f3c8SBram Moolenaar 520b544f3c8SBram Moolenaar 521b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 522b544f3c8SBram Moolenaar" Test 9: Continuing after aborted functions {{{1 523b544f3c8SBram Moolenaar" 524b544f3c8SBram Moolenaar" When a function with the "abort" attribute is aborted due to an 525b544f3c8SBram Moolenaar" error, the next function back in the call hierarchy without an 526b544f3c8SBram Moolenaar" "abort" attribute continues; the value -1 is returned then. 527b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 528b544f3c8SBram Moolenaar 529b544f3c8SBram MoolenaarXpathINIT 530b544f3c8SBram Moolenaar 531a6296200SBram Moolenaarfunc F() abort 532b544f3c8SBram Moolenaar Xpath 'a' 533b544f3c8SBram Moolenaar let result = G() " not aborted 534b544f3c8SBram Moolenaar Xpath 'b' 535b544f3c8SBram Moolenaar if result != 2 536b544f3c8SBram Moolenaar Xpath 'c' 537b544f3c8SBram Moolenaar endif 538b544f3c8SBram Moolenaar return 1 539a6296200SBram Moolenaarendfunc 540b544f3c8SBram Moolenaar 541a6296200SBram Moolenaarfunc G() " no abort attribute 542b544f3c8SBram Moolenaar Xpath 'd' 543b544f3c8SBram Moolenaar if H() != -1 " aborted 544b544f3c8SBram Moolenaar Xpath 'e' 545b544f3c8SBram Moolenaar endif 546b544f3c8SBram Moolenaar Xpath 'f' 547b544f3c8SBram Moolenaar return 2 548a6296200SBram Moolenaarendfunc 549b544f3c8SBram Moolenaar 550a6296200SBram Moolenaarfunc H() abort 551b544f3c8SBram Moolenaar Xpath 'g' 552b544f3c8SBram Moolenaar call I() " aborted 553b544f3c8SBram Moolenaar Xpath 'h' 554b544f3c8SBram Moolenaar return 4 555a6296200SBram Moolenaarendfunc 556b544f3c8SBram Moolenaar 557a6296200SBram Moolenaarfunc I() abort 558b544f3c8SBram Moolenaar Xpath 'i' 559b544f3c8SBram Moolenaar asdf " error 560b544f3c8SBram Moolenaar Xpath 'j' 561b544f3c8SBram Moolenaar return 8 562a6296200SBram Moolenaarendfunc 563b544f3c8SBram Moolenaar 564b544f3c8SBram Moolenaarif F() != 1 565b544f3c8SBram Moolenaar Xpath 'k' 566b544f3c8SBram Moolenaarendif 567b544f3c8SBram Moolenaar 568b544f3c8SBram Moolenaarlet g:test9_result = g:Xpath 569b544f3c8SBram Moolenaar 570b544f3c8SBram Moolenaardelfunction F 571b544f3c8SBram Moolenaardelfunction G 572b544f3c8SBram Moolenaardelfunction H 573b544f3c8SBram Moolenaardelfunction I 574b544f3c8SBram Moolenaar 575b544f3c8SBram Moolenaarfunc Test_func_abort() 576b544f3c8SBram Moolenaar call assert_equal('adgifb', g:test9_result) 577b544f3c8SBram Moolenaarendfunc 578b544f3c8SBram Moolenaar 579b544f3c8SBram Moolenaar 580b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 581b544f3c8SBram Moolenaar" Test 10: :if, :elseif, :while argument parsing {{{1 582b544f3c8SBram Moolenaar" 583b544f3c8SBram Moolenaar" A '"' or '|' in an argument expression must not be mixed up with 584b544f3c8SBram Moolenaar" a comment or a next command after a bar. Parsing errors should 585b544f3c8SBram Moolenaar" be recognized. 586b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 587b544f3c8SBram Moolenaar 588b544f3c8SBram MoolenaarXpathINIT 589b544f3c8SBram Moolenaar 590a6296200SBram Moolenaarfunc MSG(enr, emsg) 591b544f3c8SBram Moolenaar let english = v:lang == "C" || v:lang =~ '^[Ee]n' 592b544f3c8SBram Moolenaar if a:enr == "" 593b544f3c8SBram Moolenaar Xout "TODO: Add message number for:" a:emsg 594b544f3c8SBram Moolenaar let v:errmsg = ":" . v:errmsg 595b544f3c8SBram Moolenaar endif 596b544f3c8SBram Moolenaar let match = 1 597b544f3c8SBram Moolenaar if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg) 598b544f3c8SBram Moolenaar let match = 0 599b544f3c8SBram Moolenaar if v:errmsg == "" 600b544f3c8SBram Moolenaar Xout "Message missing." 601b544f3c8SBram Moolenaar else 602a4208966SBram Moolenaar let v:errmsg = v:errmsg->escape('"') 603b544f3c8SBram Moolenaar Xout "Unexpected message:" v:errmsg 604b544f3c8SBram Moolenaar endif 605b544f3c8SBram Moolenaar endif 606b544f3c8SBram Moolenaar return match 6071e115360SBram Moolenaarendfunc 608b544f3c8SBram Moolenaar 609b544f3c8SBram Moolenaarif 1 || strlen("\"") | Xpath 'a' 610b544f3c8SBram Moolenaar Xpath 'b' 611b544f3c8SBram Moolenaarendif 612b544f3c8SBram MoolenaarXpath 'c' 613b544f3c8SBram Moolenaar 614b544f3c8SBram Moolenaarif 0 615b544f3c8SBram Moolenaarelseif 1 || strlen("\"") | Xpath 'd' 616b544f3c8SBram Moolenaar Xpath 'e' 617b544f3c8SBram Moolenaarendif 618b544f3c8SBram MoolenaarXpath 'f' 619b544f3c8SBram Moolenaar 620b544f3c8SBram Moolenaarwhile 1 || strlen("\"") | Xpath 'g' 621b544f3c8SBram Moolenaar Xpath 'h' 622b544f3c8SBram Moolenaar break 623b544f3c8SBram Moolenaarendwhile 624b544f3c8SBram MoolenaarXpath 'i' 625b544f3c8SBram Moolenaar 626b544f3c8SBram Moolenaarlet v:errmsg = "" 627b544f3c8SBram Moolenaarif 1 ||| strlen("\"") | Xpath 'j' 628b544f3c8SBram Moolenaar Xpath 'k' 629b544f3c8SBram Moolenaarendif 630b544f3c8SBram MoolenaarXpath 'l' 631b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 632b544f3c8SBram Moolenaar Xpath 'm' 633b544f3c8SBram Moolenaarendif 634b544f3c8SBram Moolenaar 635b544f3c8SBram Moolenaarlet v:errmsg = "" 636b544f3c8SBram Moolenaarif 0 637b544f3c8SBram Moolenaarelseif 1 ||| strlen("\"") | Xpath 'n' 638b544f3c8SBram Moolenaar Xpath 'o' 639b544f3c8SBram Moolenaarendif 640b544f3c8SBram MoolenaarXpath 'p' 641b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 642b544f3c8SBram Moolenaar Xpath 'q' 643b544f3c8SBram Moolenaarendif 644b544f3c8SBram Moolenaar 645b544f3c8SBram Moolenaarlet v:errmsg = "" 646b544f3c8SBram Moolenaarwhile 1 ||| strlen("\"") | Xpath 'r' 647b544f3c8SBram Moolenaar Xpath 's' 648b544f3c8SBram Moolenaar break 649b544f3c8SBram Moolenaarendwhile 650b544f3c8SBram MoolenaarXpath 't' 651b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 652b544f3c8SBram Moolenaar Xpath 'u' 653b544f3c8SBram Moolenaarendif 654b544f3c8SBram Moolenaar 655b544f3c8SBram Moolenaarlet g:test10_result = g:Xpath 656b544f3c8SBram Moolenaardelfunction MSG 657b544f3c8SBram Moolenaar 658b544f3c8SBram Moolenaarfunc Test_expr_parsing() 659b544f3c8SBram Moolenaar call assert_equal('abcdefghilpt', g:test10_result) 660b544f3c8SBram Moolenaarendfunc 661b544f3c8SBram Moolenaar 662b544f3c8SBram Moolenaar 663b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 664b544f3c8SBram Moolenaar" Test 11: :if, :elseif, :while argument evaluation after abort {{{1 665b544f3c8SBram Moolenaar" 666b544f3c8SBram Moolenaar" When code is skipped over due to an error, the boolean argument to 667b544f3c8SBram Moolenaar" an :if, :elseif, or :while must not be evaluated. 668b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 669b544f3c8SBram Moolenaar 670b544f3c8SBram MoolenaarXpathINIT 671b544f3c8SBram Moolenaar 672b544f3c8SBram Moolenaarlet calls = 0 673b544f3c8SBram Moolenaar 674a6296200SBram Moolenaarfunc P(num) 675b544f3c8SBram Moolenaar let g:calls = g:calls + a:num " side effect on call 676b544f3c8SBram Moolenaar return 0 677a6296200SBram Moolenaarendfunc 678b544f3c8SBram Moolenaar 679b544f3c8SBram Moolenaarif 1 680b544f3c8SBram Moolenaar Xpath 'a' 681b544f3c8SBram Moolenaar asdf " error 682b544f3c8SBram Moolenaar Xpath 'b' 683b544f3c8SBram Moolenaar if P(1) " should not be called 684b544f3c8SBram Moolenaar Xpath 'c' 685b544f3c8SBram Moolenaar elseif !P(2) " should not be called 686b544f3c8SBram Moolenaar Xpath 'd' 687b544f3c8SBram Moolenaar else 688b544f3c8SBram Moolenaar Xpath 'e' 689b544f3c8SBram Moolenaar endif 690b544f3c8SBram Moolenaar Xpath 'f' 691b544f3c8SBram Moolenaar while P(4) " should not be called 692b544f3c8SBram Moolenaar Xpath 'g' 693b544f3c8SBram Moolenaar endwhile 694b544f3c8SBram Moolenaar Xpath 'h' 695b544f3c8SBram Moolenaarendif 696b544f3c8SBram MoolenaarXpath 'x' 697b544f3c8SBram Moolenaar 698b544f3c8SBram Moolenaarlet g:test11_calls = calls 699b544f3c8SBram Moolenaarlet g:test11_result = g:Xpath 700b544f3c8SBram Moolenaar 701b544f3c8SBram Moolenaarunlet calls 702b544f3c8SBram Moolenaardelfunction P 703b544f3c8SBram Moolenaar 704b544f3c8SBram Moolenaarfunc Test_arg_abort() 705b544f3c8SBram Moolenaar call assert_equal(0, g:test11_calls) 706b544f3c8SBram Moolenaar call assert_equal('ax', g:test11_result) 707b544f3c8SBram Moolenaarendfunc 708b544f3c8SBram Moolenaar 709b544f3c8SBram Moolenaar 710b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 711b544f3c8SBram Moolenaar" Test 12: Expressions in braces in skipped code {{{1 712b544f3c8SBram Moolenaar" 713b544f3c8SBram Moolenaar" In code skipped over due to an error or inactive conditional, 714b544f3c8SBram Moolenaar" an expression in braces as part of a variable or function name 715b544f3c8SBram Moolenaar" should not be evaluated. 716b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 717b544f3c8SBram Moolenaar 718b544f3c8SBram MoolenaarXpathINIT 719b544f3c8SBram Moolenaar 720b544f3c8SBram Moolenaarfunction! NULL() 721b544f3c8SBram Moolenaar Xpath 'a' 722b544f3c8SBram Moolenaar return 0 723b544f3c8SBram Moolenaarendfunction 724b544f3c8SBram Moolenaar 725b544f3c8SBram Moolenaarfunction! ZERO() 726b544f3c8SBram Moolenaar Xpath 'b' 727b544f3c8SBram Moolenaar return 0 728b544f3c8SBram Moolenaarendfunction 729b544f3c8SBram Moolenaar 730b544f3c8SBram Moolenaarfunction! F0() 731b544f3c8SBram Moolenaar Xpath 'c' 732b544f3c8SBram Moolenaarendfunction 733b544f3c8SBram Moolenaar 734b544f3c8SBram Moolenaarfunction! F1(arg) 735b544f3c8SBram Moolenaar Xpath 'e' 736b544f3c8SBram Moolenaarendfunction 737b544f3c8SBram Moolenaar 738b544f3c8SBram Moolenaarlet V0 = 1 739b544f3c8SBram Moolenaar 740b544f3c8SBram MoolenaarXpath 'f' 741b544f3c8SBram Moolenaarecho 0 ? F{NULL() + V{ZERO()}}() : 1 742b544f3c8SBram Moolenaar 743b544f3c8SBram MoolenaarXpath 'g' 744b544f3c8SBram Moolenaarif 0 745b544f3c8SBram Moolenaar Xpath 'h' 746b544f3c8SBram Moolenaar call F{NULL() + V{ZERO()}}() 747b544f3c8SBram Moolenaarendif 748b544f3c8SBram Moolenaar 749b544f3c8SBram MoolenaarXpath 'i' 750b544f3c8SBram Moolenaarif 1 751b544f3c8SBram Moolenaar asdf " error 752b544f3c8SBram Moolenaar Xpath 'j' 753b544f3c8SBram Moolenaar call F1(F{NULL() + V{ZERO()}}()) 754b544f3c8SBram Moolenaarendif 755b544f3c8SBram Moolenaar 756b544f3c8SBram MoolenaarXpath 'k' 757b544f3c8SBram Moolenaarif 1 758b544f3c8SBram Moolenaar asdf " error 759b544f3c8SBram Moolenaar Xpath 'l' 760b544f3c8SBram Moolenaar call F{NULL() + V{ZERO()}}() 761b544f3c8SBram Moolenaarendif 762b544f3c8SBram Moolenaar 763b544f3c8SBram Moolenaarlet g:test12_result = g:Xpath 764b544f3c8SBram Moolenaar 765b544f3c8SBram Moolenaarfunc Test_braces_skipped() 766b544f3c8SBram Moolenaar call assert_equal('fgik', g:test12_result) 767b544f3c8SBram Moolenaarendfunc 768b544f3c8SBram Moolenaar 769b544f3c8SBram Moolenaar 770b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 771b544f3c8SBram Moolenaar" Test 13: Failure in argument evaluation for :while {{{1 772b544f3c8SBram Moolenaar" 773b544f3c8SBram Moolenaar" A failure in the expression evaluation for the condition of a :while 774b544f3c8SBram Moolenaar" causes the whole :while loop until the matching :endwhile being 775b544f3c8SBram Moolenaar" ignored. Continuation is at the next following line. 776b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 777b544f3c8SBram Moolenaar 778b544f3c8SBram MoolenaarXpathINIT 779b544f3c8SBram Moolenaar 780b544f3c8SBram MoolenaarXpath 'a' 781b544f3c8SBram Moolenaarwhile asdf 782b544f3c8SBram Moolenaar Xpath 'b' 783b544f3c8SBram Moolenaar while 1 784b544f3c8SBram Moolenaar Xpath 'c' 785b544f3c8SBram Moolenaar break 786b544f3c8SBram Moolenaar endwhile 787b544f3c8SBram Moolenaar Xpath 'd' 788b544f3c8SBram Moolenaar break 789b544f3c8SBram Moolenaarendwhile 790b544f3c8SBram MoolenaarXpath 'e' 791b544f3c8SBram Moolenaar 792b544f3c8SBram Moolenaarwhile asdf | Xpath 'f' | endwhile | Xpath 'g' 793b544f3c8SBram MoolenaarXpath 'h' 794b544f3c8SBram Moolenaarlet g:test13_result = g:Xpath 795b544f3c8SBram Moolenaar 796b544f3c8SBram Moolenaarfunc Test_while_fail() 797b544f3c8SBram Moolenaar call assert_equal('aeh', g:test13_result) 798b544f3c8SBram Moolenaarendfunc 799b544f3c8SBram Moolenaar 800b544f3c8SBram Moolenaar 801b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 802b544f3c8SBram Moolenaar" Test 14: Failure in argument evaluation for :if {{{1 803b544f3c8SBram Moolenaar" 804b544f3c8SBram Moolenaar" A failure in the expression evaluation for the condition of an :if 805b544f3c8SBram Moolenaar" does not cause the corresponding :else or :endif being matched to 806b544f3c8SBram Moolenaar" a previous :if/:elseif. Neither of both branches of the failed :if 807b544f3c8SBram Moolenaar" are executed. 808b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 809b544f3c8SBram Moolenaar 810b544f3c8SBram MoolenaarXpathINIT 811b544f3c8SBram Moolenaar 812b544f3c8SBram Moolenaarfunction! F() 813b544f3c8SBram Moolenaar Xpath 'a' 814b544f3c8SBram Moolenaar let x = 0 815b544f3c8SBram Moolenaar if x " false 816b544f3c8SBram Moolenaar Xpath 'b' 817b544f3c8SBram Moolenaar elseif !x " always true 818b544f3c8SBram Moolenaar Xpath 'c' 819b544f3c8SBram Moolenaar let x = 1 820b544f3c8SBram Moolenaar if g:boolvar " possibly undefined 821b544f3c8SBram Moolenaar Xpath 'd' 822b544f3c8SBram Moolenaar else 823b544f3c8SBram Moolenaar Xpath 'e' 824b544f3c8SBram Moolenaar endif 825b544f3c8SBram Moolenaar Xpath 'f' 826b544f3c8SBram Moolenaar elseif x " never executed 827b544f3c8SBram Moolenaar Xpath 'g' 828b544f3c8SBram Moolenaar endif 829b544f3c8SBram Moolenaar Xpath 'h' 830b544f3c8SBram Moolenaarendfunction 831b544f3c8SBram Moolenaar 832b544f3c8SBram Moolenaarlet boolvar = 1 833b544f3c8SBram Moolenaarcall F() 834b544f3c8SBram MoolenaarXpath '-' 835b544f3c8SBram Moolenaar 836b544f3c8SBram Moolenaarunlet boolvar 837b544f3c8SBram Moolenaarcall F() 838b544f3c8SBram Moolenaarlet g:test14_result = g:Xpath 839b544f3c8SBram Moolenaar 840b544f3c8SBram Moolenaardelfunction F 841b544f3c8SBram Moolenaar 842b544f3c8SBram Moolenaarfunc Test_if_fail() 843b544f3c8SBram Moolenaar call assert_equal('acdfh-acfh', g:test14_result) 844b544f3c8SBram Moolenaarendfunc 845b544f3c8SBram Moolenaar 846b544f3c8SBram Moolenaar 847b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 848b544f3c8SBram Moolenaar" Test 15: Failure in argument evaluation for :if (bar) {{{1 849b544f3c8SBram Moolenaar" 850b544f3c8SBram Moolenaar" Like previous test, except that the failing :if ... | ... | :endif 851b544f3c8SBram Moolenaar" is in a single line. 852b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 853b544f3c8SBram Moolenaar 854b544f3c8SBram MoolenaarXpathINIT 855b544f3c8SBram Moolenaar 856b544f3c8SBram Moolenaarfunction! F() 857b544f3c8SBram Moolenaar Xpath 'a' 858b544f3c8SBram Moolenaar let x = 0 859b544f3c8SBram Moolenaar if x " false 860b544f3c8SBram Moolenaar Xpath 'b' 861b544f3c8SBram Moolenaar elseif !x " always true 862b544f3c8SBram Moolenaar Xpath 'c' 863b544f3c8SBram Moolenaar let x = 1 864b544f3c8SBram Moolenaar if g:boolvar | Xpath 'd' | else | Xpath 'e' | endif 865b544f3c8SBram Moolenaar Xpath 'f' 866b544f3c8SBram Moolenaar elseif x " never executed 867b544f3c8SBram Moolenaar Xpath 'g' 868b544f3c8SBram Moolenaar endif 869b544f3c8SBram Moolenaar Xpath 'h' 870b544f3c8SBram Moolenaarendfunction 871b544f3c8SBram Moolenaar 872b544f3c8SBram Moolenaarlet boolvar = 1 873b544f3c8SBram Moolenaarcall F() 874b544f3c8SBram MoolenaarXpath '-' 875b544f3c8SBram Moolenaar 876b544f3c8SBram Moolenaarunlet boolvar 877b544f3c8SBram Moolenaarcall F() 878b544f3c8SBram Moolenaarlet g:test15_result = g:Xpath 879b544f3c8SBram Moolenaar 880b544f3c8SBram Moolenaardelfunction F 881b544f3c8SBram Moolenaar 882b544f3c8SBram Moolenaarfunc Test_if_bar_fail() 883b544f3c8SBram Moolenaar call assert_equal('acdfh-acfh', g:test15_result) 884b544f3c8SBram Moolenaarendfunc 885b544f3c8SBram Moolenaar 886b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 8871f068233SBram Moolenaar" Test 16: Double :else or :elseif after :else {{{1 8881f068233SBram Moolenaar" 8891f068233SBram Moolenaar" Multiple :elses or an :elseif after an :else are forbidden. 8901f068233SBram Moolenaar"------------------------------------------------------------------------------- 8911f068233SBram Moolenaar 8921f068233SBram Moolenaarfunc T16_F() abort 8931f068233SBram Moolenaar if 0 8941f068233SBram Moolenaar Xpath 'a' 8951f068233SBram Moolenaar else 8961f068233SBram Moolenaar Xpath 'b' 8971f068233SBram Moolenaar else " aborts function 8981f068233SBram Moolenaar Xpath 'c' 8991f068233SBram Moolenaar endif 9001f068233SBram Moolenaar Xpath 'd' 9011f068233SBram Moolenaarendfunc 9021f068233SBram Moolenaar 9031f068233SBram Moolenaarfunc T16_G() abort 9041f068233SBram Moolenaar if 0 9051f068233SBram Moolenaar Xpath 'a' 9061f068233SBram Moolenaar else 9071f068233SBram Moolenaar Xpath 'b' 9081f068233SBram Moolenaar elseif 1 " aborts function 9091f068233SBram Moolenaar Xpath 'c' 9101f068233SBram Moolenaar else 9111f068233SBram Moolenaar Xpath 'd' 9121f068233SBram Moolenaar endif 9131f068233SBram Moolenaar Xpath 'e' 9141f068233SBram Moolenaarendfunc 9151f068233SBram Moolenaar 9161f068233SBram Moolenaarfunc T16_H() abort 9171f068233SBram Moolenaar if 0 9181f068233SBram Moolenaar Xpath 'a' 9191f068233SBram Moolenaar elseif 0 9201f068233SBram Moolenaar Xpath 'b' 9211f068233SBram Moolenaar else 9221f068233SBram Moolenaar Xpath 'c' 9231f068233SBram Moolenaar else " aborts function 9241f068233SBram Moolenaar Xpath 'd' 9251f068233SBram Moolenaar endif 9261f068233SBram Moolenaar Xpath 'e' 9271f068233SBram Moolenaarendfunc 9281f068233SBram Moolenaar 9291f068233SBram Moolenaarfunc T16_I() abort 9301f068233SBram Moolenaar if 0 9311f068233SBram Moolenaar Xpath 'a' 9321f068233SBram Moolenaar elseif 0 9331f068233SBram Moolenaar Xpath 'b' 9341f068233SBram Moolenaar else 9351f068233SBram Moolenaar Xpath 'c' 9361f068233SBram Moolenaar elseif 1 " aborts function 9371f068233SBram Moolenaar Xpath 'd' 9381f068233SBram Moolenaar else 9391f068233SBram Moolenaar Xpath 'e' 9401f068233SBram Moolenaar endif 9411f068233SBram Moolenaar Xpath 'f' 9421f068233SBram Moolenaarendfunc 9431f068233SBram Moolenaar 9441f068233SBram Moolenaarfunc Test_Multi_Else() 9451f068233SBram Moolenaar XpathINIT 9461f068233SBram Moolenaar try 9471f068233SBram Moolenaar call T16_F() 9481f068233SBram Moolenaar catch /E583:/ 9491f068233SBram Moolenaar Xpath 'e' 9501f068233SBram Moolenaar endtry 9511f068233SBram Moolenaar call assert_equal('be', g:Xpath) 9521f068233SBram Moolenaar 9531f068233SBram Moolenaar XpathINIT 9541f068233SBram Moolenaar try 9551f068233SBram Moolenaar call T16_G() 9561f068233SBram Moolenaar catch /E584:/ 9571f068233SBram Moolenaar Xpath 'f' 9581f068233SBram Moolenaar endtry 9591f068233SBram Moolenaar call assert_equal('bf', g:Xpath) 9601f068233SBram Moolenaar 9611f068233SBram Moolenaar XpathINIT 9621f068233SBram Moolenaar try 9631f068233SBram Moolenaar call T16_H() 9641f068233SBram Moolenaar catch /E583:/ 9651f068233SBram Moolenaar Xpath 'f' 9661f068233SBram Moolenaar endtry 9671f068233SBram Moolenaar call assert_equal('cf', g:Xpath) 9681f068233SBram Moolenaar 9691f068233SBram Moolenaar XpathINIT 9701f068233SBram Moolenaar try 9711f068233SBram Moolenaar call T16_I() 9721f068233SBram Moolenaar catch /E584:/ 9731f068233SBram Moolenaar Xpath 'g' 9741f068233SBram Moolenaar endtry 9751f068233SBram Moolenaar call assert_equal('cg', g:Xpath) 9761f068233SBram Moolenaarendfunc 9771f068233SBram Moolenaar 9781f068233SBram Moolenaar"------------------------------------------------------------------------------- 9791f068233SBram Moolenaar" Test 17: Nesting of unmatched :if or :endif inside a :while {{{1 9801f068233SBram Moolenaar" 9811f068233SBram Moolenaar" The :while/:endwhile takes precedence in nesting over an unclosed 9821f068233SBram Moolenaar" :if or an unopened :endif. 9831f068233SBram Moolenaar"------------------------------------------------------------------------------- 9841f068233SBram Moolenaar 9851f068233SBram Moolenaar" While loops inside a function are continued on error. 9861f068233SBram Moolenaarfunc T17_F() 9871f068233SBram Moolenaar let loops = 3 9881f068233SBram Moolenaar while loops > 0 9891f068233SBram Moolenaar let loops -= 1 9901f068233SBram Moolenaar Xpath 'a' . loops 9911f068233SBram Moolenaar if (loops == 1) 9921f068233SBram Moolenaar Xpath 'b' . loops 9931f068233SBram Moolenaar continue 9941f068233SBram Moolenaar elseif (loops == 0) 9951f068233SBram Moolenaar Xpath 'c' . loops 9961f068233SBram Moolenaar break 9971f068233SBram Moolenaar elseif 1 9981f068233SBram Moolenaar Xpath 'd' . loops 9991f068233SBram Moolenaar " endif missing! 10001f068233SBram Moolenaar endwhile " :endwhile after :if 1 10011f068233SBram Moolenaar Xpath 'e' 10021f068233SBram Moolenaarendfunc 10031f068233SBram Moolenaar 10041f068233SBram Moolenaarfunc T17_G() 10051f068233SBram Moolenaar let loops = 2 10061f068233SBram Moolenaar while loops > 0 10071f068233SBram Moolenaar let loops -= 1 10081f068233SBram Moolenaar Xpath 'a' . loops 10091f068233SBram Moolenaar if 0 10101f068233SBram Moolenaar Xpath 'b' . loops 10111f068233SBram Moolenaar " endif missing 10121f068233SBram Moolenaar endwhile " :endwhile after :if 0 10131f068233SBram Moolenaarendfunc 10141f068233SBram Moolenaar 10151f068233SBram Moolenaarfunc T17_H() 10161f068233SBram Moolenaar let loops = 2 10171f068233SBram Moolenaar while loops > 0 10181f068233SBram Moolenaar let loops -= 1 10191f068233SBram Moolenaar Xpath 'a' . loops 10201f068233SBram Moolenaar " if missing! 10211f068233SBram Moolenaar endif " :endif without :if in while 10221f068233SBram Moolenaar Xpath 'b' . loops 10231f068233SBram Moolenaar endwhile 10241f068233SBram Moolenaarendfunc 10251f068233SBram Moolenaar 10261f068233SBram Moolenaar" Error continuation outside a function is at the outermost :endwhile or :endif. 10271f068233SBram MoolenaarXpathINIT 10281f068233SBram Moolenaarlet v:errmsg = '' 10291f068233SBram Moolenaarlet loops = 2 10301f068233SBram Moolenaarwhile loops > 0 10311f068233SBram Moolenaar let loops -= 1 10321f068233SBram Moolenaar Xpath 'a' . loops 10331f068233SBram Moolenaar if 0 10341f068233SBram Moolenaar Xpath 'b' . loops 10351f068233SBram Moolenaar " endif missing! Following :endwhile fails. 10361f068233SBram Moolenaarendwhile | Xpath 'c' 10371f068233SBram MoolenaarXpath 'd' 10381f068233SBram Moolenaarcall assert_match('E171:', v:errmsg) 10391f068233SBram Moolenaarcall assert_equal('a1d', g:Xpath) 10401f068233SBram Moolenaar 10411f068233SBram Moolenaarfunc Test_unmatched_if_in_while() 10421f068233SBram Moolenaar XpathINIT 10431f068233SBram Moolenaar call assert_fails('call T17_F()', 'E171:') 10441f068233SBram Moolenaar call assert_equal('a2d2a1b1a0c0e', g:Xpath) 10451f068233SBram Moolenaar 10461f068233SBram Moolenaar XpathINIT 10471f068233SBram Moolenaar call assert_fails('call T17_G()', 'E171:') 10481f068233SBram Moolenaar call assert_equal('a1a0', g:Xpath) 10491f068233SBram Moolenaar 10501f068233SBram Moolenaar XpathINIT 10511f068233SBram Moolenaar call assert_fails('call T17_H()', 'E580:') 10521f068233SBram Moolenaar call assert_equal('a1b1a0b0', g:Xpath) 10531f068233SBram Moolenaarendfunc 10541f068233SBram Moolenaar 10551f068233SBram Moolenaar"------------------------------------------------------------------------------- 1056a6296200SBram Moolenaar" Test 18: Interrupt (Ctrl-C pressed) {{{1 1057a6296200SBram Moolenaar" 1058a6296200SBram Moolenaar" On an interrupt, the script processing is terminated immediately. 10591f068233SBram Moolenaar"------------------------------------------------------------------------------- 1060a6296200SBram Moolenaar 1061a6296200SBram Moolenaarfunc Test_interrupt_while_if() 1062a6296200SBram Moolenaar let test =<< trim [CODE] 1063a6296200SBram Moolenaar try 1064a6296200SBram Moolenaar if 1 1065a6296200SBram Moolenaar Xpath 'a' 1066a6296200SBram Moolenaar while 1 1067a6296200SBram Moolenaar Xpath 'b' 1068a6296200SBram Moolenaar if 1 1069a6296200SBram Moolenaar Xpath 'c' 1070a6296200SBram Moolenaar call interrupt() 1071a6296200SBram Moolenaar call assert_report('should not get here') 1072a6296200SBram Moolenaar break 1073a6296200SBram Moolenaar finish 1074a6296200SBram Moolenaar endif | call assert_report('should not get here') 1075a6296200SBram Moolenaar call assert_report('should not get here') 1076a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1077a6296200SBram Moolenaar call assert_report('should not get here') 1078a6296200SBram Moolenaar endif | call assert_report('should not get here') 1079a6296200SBram Moolenaar call assert_report('should not get here') 1080a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1081a6296200SBram Moolenaar Xpath 'd' 1082a6296200SBram Moolenaar endtry | Xpath 'e' 1083a6296200SBram Moolenaar Xpath 'f' 1084a6296200SBram Moolenaar [CODE] 1085a6296200SBram Moolenaar let verify =<< trim [CODE] 1086a6296200SBram Moolenaar call assert_equal('abcdef', g:Xpath) 1087a6296200SBram Moolenaar [CODE] 1088a6296200SBram Moolenaar call RunInNewVim(test, verify) 1089a6296200SBram Moolenaarendfunc 1090a6296200SBram Moolenaar 1091a6296200SBram Moolenaarfunc Test_interrupt_try() 1092a6296200SBram Moolenaar let test =<< trim [CODE] 1093a6296200SBram Moolenaar try 1094a6296200SBram Moolenaar try 1095a6296200SBram Moolenaar Xpath 'a' 1096a6296200SBram Moolenaar call interrupt() 1097a6296200SBram Moolenaar call assert_report('should not get here') 1098a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1099a6296200SBram Moolenaar call assert_report('should not get here') 1100a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1101a6296200SBram Moolenaar Xpath 'b' 1102a6296200SBram Moolenaar endtry | Xpath 'c' 1103a6296200SBram Moolenaar Xpath 'd' 1104a6296200SBram Moolenaar [CODE] 1105a6296200SBram Moolenaar let verify =<< trim [CODE] 1106a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1107a6296200SBram Moolenaar [CODE] 1108a6296200SBram Moolenaar call RunInNewVim(test, verify) 1109a6296200SBram Moolenaarendfunc 1110a6296200SBram Moolenaar 1111a6296200SBram Moolenaarfunc Test_interrupt_func_while_if() 1112a6296200SBram Moolenaar let test =<< trim [CODE] 1113a6296200SBram Moolenaar func F() 1114a6296200SBram Moolenaar if 1 1115a6296200SBram Moolenaar Xpath 'a' 1116a6296200SBram Moolenaar while 1 1117a6296200SBram Moolenaar Xpath 'b' 1118a6296200SBram Moolenaar if 1 1119a6296200SBram Moolenaar Xpath 'c' 1120a6296200SBram Moolenaar call interrupt() 1121a6296200SBram Moolenaar call assert_report('should not get here') 1122a6296200SBram Moolenaar break 1123a6296200SBram Moolenaar return 1124a6296200SBram Moolenaar endif | call assert_report('should not get here') 1125a6296200SBram Moolenaar call assert_report('should not get here') 1126a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1127a6296200SBram Moolenaar call assert_report('should not get here') 1128a6296200SBram Moolenaar endif | call assert_report('should not get here') 1129a6296200SBram Moolenaar call assert_report('should not get here') 1130a6296200SBram Moolenaar endfunc 1131a6296200SBram Moolenaar 1132a6296200SBram Moolenaar Xpath 'd' 1133a6296200SBram Moolenaar try 1134a6296200SBram Moolenaar call F() | call assert_report('should not get here') 1135a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1136a6296200SBram Moolenaar Xpath 'e' 1137a6296200SBram Moolenaar endtry | Xpath 'f' 1138a6296200SBram Moolenaar Xpath 'g' 1139a6296200SBram Moolenaar [CODE] 1140a6296200SBram Moolenaar let verify =<< trim [CODE] 1141a6296200SBram Moolenaar call assert_equal('dabcefg', g:Xpath) 1142a6296200SBram Moolenaar [CODE] 1143a6296200SBram Moolenaar call RunInNewVim(test, verify) 1144a6296200SBram Moolenaarendfunc 1145a6296200SBram Moolenaar 1146a6296200SBram Moolenaarfunc Test_interrupt_func_try() 1147a6296200SBram Moolenaar let test =<< trim [CODE] 1148a6296200SBram Moolenaar func G() 1149a6296200SBram Moolenaar try 1150a6296200SBram Moolenaar Xpath 'a' 1151a6296200SBram Moolenaar call interrupt() 1152a6296200SBram Moolenaar call assert_report('should not get here') 1153a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1154a6296200SBram Moolenaar call assert_report('should not get here') 1155a6296200SBram Moolenaar endfunc 1156a6296200SBram Moolenaar 1157a6296200SBram Moolenaar Xpath 'b' 1158a6296200SBram Moolenaar try 1159a6296200SBram Moolenaar call G() | call assert_report('should not get here') 1160a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1161a6296200SBram Moolenaar Xpath 'c' 1162a6296200SBram Moolenaar endtry | Xpath 'd' 1163a6296200SBram Moolenaar Xpath 'e' 1164a6296200SBram Moolenaar [CODE] 1165a6296200SBram Moolenaar let verify =<< trim [CODE] 1166a6296200SBram Moolenaar call assert_equal('bacde', g:Xpath) 1167a6296200SBram Moolenaar [CODE] 1168a6296200SBram Moolenaar call RunInNewVim(test, verify) 1169a6296200SBram Moolenaarendfunc 1170a6296200SBram Moolenaar 1171a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1172a6296200SBram Moolenaar" Test 19: Aborting on errors inside :try/:endtry {{{1 1173a6296200SBram Moolenaar" 1174a6296200SBram Moolenaar" An error in a command dynamically enclosed in a :try/:endtry region 1175a6296200SBram Moolenaar" aborts script processing immediately. It does not matter whether 1176a6296200SBram Moolenaar" the failing command is outside or inside a function and whether a 1177a6296200SBram Moolenaar" function has an "abort" attribute. 1178a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1179a6296200SBram Moolenaar 1180a6296200SBram Moolenaarfunc Test_try_error_abort_1() 1181a6296200SBram Moolenaar let test =<< trim [CODE] 1182a6296200SBram Moolenaar func F() abort 1183a6296200SBram Moolenaar Xpath 'a' 1184a6296200SBram Moolenaar asdf 1185a6296200SBram Moolenaar call assert_report('should not get here') 1186a6296200SBram Moolenaar endfunc 1187a6296200SBram Moolenaar 1188a6296200SBram Moolenaar try 1189a6296200SBram Moolenaar Xpath 'b' 1190a6296200SBram Moolenaar call F() 1191a6296200SBram Moolenaar call assert_report('should not get here') 1192a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1193a6296200SBram Moolenaar call assert_report('should not get here') 1194a6296200SBram Moolenaar [CODE] 1195a6296200SBram Moolenaar let verify =<< trim [CODE] 1196a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1197a6296200SBram Moolenaar [CODE] 1198a6296200SBram Moolenaar call RunInNewVim(test, verify) 1199a6296200SBram Moolenaarendfunc 1200a6296200SBram Moolenaar 1201a6296200SBram Moolenaarfunc Test_try_error_abort_2() 1202a6296200SBram Moolenaar let test =<< trim [CODE] 1203a6296200SBram Moolenaar func G() 1204a6296200SBram Moolenaar Xpath 'a' 1205a6296200SBram Moolenaar asdf 1206a6296200SBram Moolenaar call assert_report('should not get here') 1207a6296200SBram Moolenaar endfunc 1208a6296200SBram Moolenaar 1209a6296200SBram Moolenaar try 1210a6296200SBram Moolenaar Xpath 'b' 1211a6296200SBram Moolenaar call G() 1212a6296200SBram Moolenaar call assert_report('should not get here') 1213a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1214a6296200SBram Moolenaar call assert_report('should not get here') 1215a6296200SBram Moolenaar [CODE] 1216a6296200SBram Moolenaar let verify =<< trim [CODE] 1217a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1218a6296200SBram Moolenaar [CODE] 1219a6296200SBram Moolenaar call RunInNewVim(test, verify) 1220a6296200SBram Moolenaarendfunc 1221a6296200SBram Moolenaar 1222a6296200SBram Moolenaarfunc Test_try_error_abort_3() 1223a6296200SBram Moolenaar let test =<< trim [CODE] 1224a6296200SBram Moolenaar try 1225a6296200SBram Moolenaar Xpath 'a' 1226a6296200SBram Moolenaar asdf 1227a6296200SBram Moolenaar call assert_report('should not get here') 1228a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1229a6296200SBram Moolenaar call assert_report('should not get here') 1230a6296200SBram Moolenaar [CODE] 1231a6296200SBram Moolenaar let verify =<< trim [CODE] 1232a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1233a6296200SBram Moolenaar [CODE] 1234a6296200SBram Moolenaar call RunInNewVim(test, verify) 1235a6296200SBram Moolenaarendfunc 1236a6296200SBram Moolenaar 1237a6296200SBram Moolenaarfunc Test_try_error_abort_4() 1238a6296200SBram Moolenaar let test =<< trim [CODE] 1239a6296200SBram Moolenaar if 1 1240a6296200SBram Moolenaar try 1241a6296200SBram Moolenaar Xpath 'a' 1242a6296200SBram Moolenaar asdf 1243a6296200SBram Moolenaar call assert_report('should not get here') 1244a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1245a6296200SBram Moolenaar endif | call assert_report('should not get here') 1246a6296200SBram Moolenaar call assert_report('should not get here') 1247a6296200SBram Moolenaar [CODE] 1248a6296200SBram Moolenaar let verify =<< trim [CODE] 1249a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1250a6296200SBram Moolenaar [CODE] 1251a6296200SBram Moolenaar call RunInNewVim(test, verify) 1252a6296200SBram Moolenaarendfunc 1253a6296200SBram Moolenaar 1254a6296200SBram Moolenaarfunc Test_try_error_abort_5() 1255a6296200SBram Moolenaar let test =<< trim [CODE] 1256a6296200SBram Moolenaar let p = 1 1257a6296200SBram Moolenaar while p 1258a6296200SBram Moolenaar let p = 0 1259a6296200SBram Moolenaar try 1260a6296200SBram Moolenaar Xpath 'a' 1261a6296200SBram Moolenaar asdf 1262a6296200SBram Moolenaar call assert_report('should not get here') 1263a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1264a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1265a6296200SBram Moolenaar call assert_report('should not get here') 1266a6296200SBram Moolenaar [CODE] 1267a6296200SBram Moolenaar let verify =<< trim [CODE] 1268a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1269a6296200SBram Moolenaar [CODE] 1270a6296200SBram Moolenaar call RunInNewVim(test, verify) 1271a6296200SBram Moolenaarendfunc 1272a6296200SBram Moolenaar 1273a6296200SBram Moolenaarfunc Test_try_error_abort_6() 1274a6296200SBram Moolenaar let test =<< trim [CODE] 1275a6296200SBram Moolenaar let p = 1 1276a6296200SBram Moolenaar Xpath 'a' 1277a6296200SBram Moolenaar while p 1278a6296200SBram Moolenaar Xpath 'b' 1279a6296200SBram Moolenaar let p = 0 1280a6296200SBram Moolenaar try 1281a6296200SBram Moolenaar Xpath 'c' 1282a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1283a6296200SBram Moolenaar call assert_report('should not get here') 1284a6296200SBram Moolenaar [CODE] 1285a6296200SBram Moolenaar let verify =<< trim [CODE] 1286a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1287a6296200SBram Moolenaar [CODE] 1288a6296200SBram Moolenaar call RunInNewVim(test, verify) 1289a6296200SBram Moolenaarendfunc 1290a6296200SBram Moolenaar 1291a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1292a6296200SBram Moolenaar" Test 20: Aborting on errors after :try/:endtry {{{1 1293a6296200SBram Moolenaar" 1294a6296200SBram Moolenaar" When an error occurs after the last active :try/:endtry region has 1295a6296200SBram Moolenaar" been left, termination behavior is as if no :try/:endtry has been 1296a6296200SBram Moolenaar" seen. 1297a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1298a6296200SBram Moolenaar 1299a6296200SBram Moolenaarfunc Test_error_after_try_1() 1300a6296200SBram Moolenaar let test =<< trim [CODE] 1301a6296200SBram Moolenaar let p = 1 1302a6296200SBram Moolenaar while p 1303a6296200SBram Moolenaar let p = 0 1304a6296200SBram Moolenaar Xpath 'a' 1305a6296200SBram Moolenaar try 1306a6296200SBram Moolenaar Xpath 'b' 1307a6296200SBram Moolenaar endtry 1308a6296200SBram Moolenaar asdf 1309a6296200SBram Moolenaar call assert_report('should not get here') 1310a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1311a6296200SBram Moolenaar Xpath 'c' 1312a6296200SBram Moolenaar [CODE] 1313a6296200SBram Moolenaar let verify =<< trim [CODE] 1314a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1315a6296200SBram Moolenaar [CODE] 1316a6296200SBram Moolenaar call RunInNewVim(test, verify) 1317a6296200SBram Moolenaarendfunc 1318a6296200SBram Moolenaar 1319a6296200SBram Moolenaarfunc Test_error_after_try_2() 1320a6296200SBram Moolenaar let test =<< trim [CODE] 1321a6296200SBram Moolenaar while 1 1322a6296200SBram Moolenaar try 1323a6296200SBram Moolenaar Xpath 'a' 1324a6296200SBram Moolenaar break 1325a6296200SBram Moolenaar call assert_report('should not get here') 1326a6296200SBram Moolenaar endtry 1327a6296200SBram Moolenaar endwhile 1328a6296200SBram Moolenaar Xpath 'b' 1329a6296200SBram Moolenaar asdf 1330a6296200SBram Moolenaar Xpath 'c' 1331a6296200SBram Moolenaar [CODE] 1332a6296200SBram Moolenaar let verify =<< trim [CODE] 1333a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1334a6296200SBram Moolenaar [CODE] 1335a6296200SBram Moolenaar call RunInNewVim(test, verify) 1336a6296200SBram Moolenaarendfunc 1337a6296200SBram Moolenaar 1338a6296200SBram Moolenaarfunc Test_error_after_try_3() 1339a6296200SBram Moolenaar let test =<< trim [CODE] 1340a6296200SBram Moolenaar while 1 1341a6296200SBram Moolenaar try 1342a6296200SBram Moolenaar Xpath 'a' 1343a6296200SBram Moolenaar break 1344a6296200SBram Moolenaar call assert_report('should not get here') 1345a6296200SBram Moolenaar finally 1346a6296200SBram Moolenaar Xpath 'b' 1347a6296200SBram Moolenaar endtry 1348a6296200SBram Moolenaar endwhile 1349a6296200SBram Moolenaar Xpath 'c' 1350a6296200SBram Moolenaar asdf 1351a6296200SBram Moolenaar Xpath 'd' 1352a6296200SBram Moolenaar [CODE] 1353a6296200SBram Moolenaar let verify =<< trim [CODE] 1354a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1355a6296200SBram Moolenaar [CODE] 1356a6296200SBram Moolenaar call RunInNewVim(test, verify) 1357a6296200SBram Moolenaarendfunc 1358a6296200SBram Moolenaar 1359a6296200SBram Moolenaarfunc Test_error_after_try_4() 1360a6296200SBram Moolenaar let test =<< trim [CODE] 1361a6296200SBram Moolenaar while 1 1362a6296200SBram Moolenaar try 1363a6296200SBram Moolenaar Xpath 'a' 1364a6296200SBram Moolenaar finally 1365a6296200SBram Moolenaar Xpath 'b' 1366a6296200SBram Moolenaar break 1367a6296200SBram Moolenaar call assert_report('should not get here') 1368a6296200SBram Moolenaar endtry 1369a6296200SBram Moolenaar endwhile 1370a6296200SBram Moolenaar Xpath 'c' 1371a6296200SBram Moolenaar asdf 1372a6296200SBram Moolenaar Xpath 'd' 1373a6296200SBram Moolenaar [CODE] 1374a6296200SBram Moolenaar let verify =<< trim [CODE] 1375a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1376a6296200SBram Moolenaar [CODE] 1377a6296200SBram Moolenaar call RunInNewVim(test, verify) 1378a6296200SBram Moolenaarendfunc 1379a6296200SBram Moolenaar 1380a6296200SBram Moolenaarfunc Test_error_after_try_5() 1381a6296200SBram Moolenaar let test =<< trim [CODE] 1382a6296200SBram Moolenaar let p = 1 1383a6296200SBram Moolenaar while p 1384a6296200SBram Moolenaar let p = 0 1385a6296200SBram Moolenaar try 1386a6296200SBram Moolenaar Xpath 'a' 1387a6296200SBram Moolenaar continue 1388a6296200SBram Moolenaar call assert_report('should not get here') 1389a6296200SBram Moolenaar endtry 1390a6296200SBram Moolenaar endwhile 1391a6296200SBram Moolenaar Xpath 'b' 1392a6296200SBram Moolenaar asdf 1393a6296200SBram Moolenaar Xpath 'c' 1394a6296200SBram Moolenaar [CODE] 1395a6296200SBram Moolenaar let verify =<< trim [CODE] 1396a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1397a6296200SBram Moolenaar [CODE] 1398a6296200SBram Moolenaar call RunInNewVim(test, verify) 1399a6296200SBram Moolenaarendfunc 1400a6296200SBram Moolenaar 1401a6296200SBram Moolenaarfunc Test_error_after_try_6() 1402a6296200SBram Moolenaar let test =<< trim [CODE] 1403a6296200SBram Moolenaar let p = 1 1404a6296200SBram Moolenaar while p 1405a6296200SBram Moolenaar let p = 0 1406a6296200SBram Moolenaar try 1407a6296200SBram Moolenaar Xpath 'a' 1408a6296200SBram Moolenaar continue 1409a6296200SBram Moolenaar call assert_report('should not get here') 1410a6296200SBram Moolenaar finally 1411a6296200SBram Moolenaar Xpath 'b' 1412a6296200SBram Moolenaar endtry 1413a6296200SBram Moolenaar endwhile 1414a6296200SBram Moolenaar Xpath 'c' 1415a6296200SBram Moolenaar asdf 1416a6296200SBram Moolenaar Xpath 'd' 1417a6296200SBram Moolenaar [CODE] 1418a6296200SBram Moolenaar let verify =<< trim [CODE] 1419a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1420a6296200SBram Moolenaar [CODE] 1421a6296200SBram Moolenaar call RunInNewVim(test, verify) 1422a6296200SBram Moolenaarendfunc 1423a6296200SBram Moolenaar 1424a6296200SBram Moolenaarfunc Test_error_after_try_7() 1425a6296200SBram Moolenaar let test =<< trim [CODE] 1426a6296200SBram Moolenaar let p = 1 1427a6296200SBram Moolenaar while p 1428a6296200SBram Moolenaar let p = 0 1429a6296200SBram Moolenaar try 1430a6296200SBram Moolenaar Xpath 'a' 1431a6296200SBram Moolenaar finally 1432a6296200SBram Moolenaar Xpath 'b' 1433a6296200SBram Moolenaar continue 1434a6296200SBram Moolenaar call assert_report('should not get here') 1435a6296200SBram Moolenaar endtry 1436a6296200SBram Moolenaar endwhile 1437a6296200SBram Moolenaar Xpath 'c' 1438a6296200SBram Moolenaar asdf 1439a6296200SBram Moolenaar Xpath 'd' 1440a6296200SBram Moolenaar [CODE] 1441a6296200SBram Moolenaar let verify =<< trim [CODE] 1442a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1443a6296200SBram Moolenaar [CODE] 1444a6296200SBram Moolenaar call RunInNewVim(test, verify) 1445a6296200SBram Moolenaarendfunc 1446a6296200SBram Moolenaar 1447a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1448a6296200SBram Moolenaar" Test 21: :finally for :try after :continue/:break/:return/:finish {{{1 1449a6296200SBram Moolenaar" 1450a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :continue, 1451a6296200SBram Moolenaar" :break, :return, or :finish, its :finally clause should not be 1452a6296200SBram Moolenaar" executed. 1453a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1454a6296200SBram Moolenaar 1455a6296200SBram Moolenaarfunc Test_finally_after_loop_ctrl_statement() 1456a6296200SBram Moolenaar let test =<< trim [CODE] 1457a6296200SBram Moolenaar func F() 1458a6296200SBram Moolenaar let loops = 2 1459a6296200SBram Moolenaar while loops > 0 1460a6296200SBram Moolenaar XloopNEXT 1461a6296200SBram Moolenaar let loops = loops - 1 1462a6296200SBram Moolenaar try 1463a6296200SBram Moolenaar if loops == 1 1464a6296200SBram Moolenaar Xloop 'a' 1465a6296200SBram Moolenaar continue 1466a6296200SBram Moolenaar call assert_report('should not get here') 1467a6296200SBram Moolenaar elseif loops == 0 1468a6296200SBram Moolenaar Xloop 'b' 1469a6296200SBram Moolenaar break 1470a6296200SBram Moolenaar call assert_report('should not get here') 1471a6296200SBram Moolenaar endif 1472a6296200SBram Moolenaar 1473a6296200SBram Moolenaar try " inactive 1474a6296200SBram Moolenaar call assert_report('should not get here') 1475a6296200SBram Moolenaar finally 1476a6296200SBram Moolenaar call assert_report('should not get here') 1477a6296200SBram Moolenaar endtry 1478a6296200SBram Moolenaar finally 1479a6296200SBram Moolenaar Xloop 'c' 1480a6296200SBram Moolenaar endtry 1481a6296200SBram Moolenaar call assert_report('should not get here') 1482a6296200SBram Moolenaar endwhile 1483a6296200SBram Moolenaar 1484a6296200SBram Moolenaar try 1485a6296200SBram Moolenaar Xpath 'd' 1486a6296200SBram Moolenaar return 1487a6296200SBram Moolenaar call assert_report('should not get here') 1488a6296200SBram Moolenaar try " inactive 1489a6296200SBram Moolenaar call assert_report('should not get here') 1490a6296200SBram Moolenaar finally 1491a6296200SBram Moolenaar call assert_report('should not get here') 1492a6296200SBram Moolenaar endtry 1493a6296200SBram Moolenaar finally 1494a6296200SBram Moolenaar Xpath 'e' 1495a6296200SBram Moolenaar endtry 1496a6296200SBram Moolenaar call assert_report('should not get here') 1497a6296200SBram Moolenaar endfunc 1498a6296200SBram Moolenaar 1499a6296200SBram Moolenaar try 1500a6296200SBram Moolenaar Xpath 'f' 1501a6296200SBram Moolenaar call F() 1502a6296200SBram Moolenaar Xpath 'g' 1503a6296200SBram Moolenaar finish 1504a6296200SBram Moolenaar call assert_report('should not get here') 1505a6296200SBram Moolenaar try " inactive 1506a6296200SBram Moolenaar call assert_report('should not get here') 1507a6296200SBram Moolenaar finally 1508a6296200SBram Moolenaar call assert_report('should not get here') 1509a6296200SBram Moolenaar endtry 1510a6296200SBram Moolenaar finally 1511a6296200SBram Moolenaar Xpath 'h' 1512a6296200SBram Moolenaar endtry 1513a6296200SBram Moolenaar call assert_report('should not get here') 1514a6296200SBram Moolenaar [CODE] 1515a6296200SBram Moolenaar let verify =<< trim [CODE] 1516a6296200SBram Moolenaar call assert_equal('fa2c2b3c3degh', g:Xpath) 1517a6296200SBram Moolenaar [CODE] 1518a6296200SBram Moolenaar call RunInNewVim(test, verify) 1519a6296200SBram Moolenaarendfunc 1520a6296200SBram Moolenaar 1521a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1522a6296200SBram Moolenaar" Test 22: :finally for a :try after an error/interrupt/:throw {{{1 1523a6296200SBram Moolenaar" 1524a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding error or 1525a6296200SBram Moolenaar" interrupt or :throw, its :finally clause should not be executed. 1526a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1527a6296200SBram Moolenaar 1528a6296200SBram Moolenaarfunc Test_finally_after_error_in_func() 1529a6296200SBram Moolenaar let test =<< trim [CODE] 1530a6296200SBram Moolenaar func Error() 1531a6296200SBram Moolenaar try 1532a6296200SBram Moolenaar Xpath 'b' 1533a6296200SBram Moolenaar asdf " aborting error, triggering error exception 1534a6296200SBram Moolenaar call assert_report('should not get here') 1535a6296200SBram Moolenaar endtry 1536a6296200SBram Moolenaar call assert_report('should not get here') 1537a6296200SBram Moolenaar endfunc 1538a6296200SBram Moolenaar 1539a6296200SBram Moolenaar Xpath 'a' 1540a6296200SBram Moolenaar call Error() 1541a6296200SBram Moolenaar call assert_report('should not get here') 1542a6296200SBram Moolenaar 1543a6296200SBram Moolenaar if 1 " not active due to error 1544a6296200SBram Moolenaar try " not active since :if inactive 1545a6296200SBram Moolenaar call assert_report('should not get here') 1546a6296200SBram Moolenaar finally 1547a6296200SBram Moolenaar call assert_report('should not get here') 1548a6296200SBram Moolenaar endtry 1549a6296200SBram Moolenaar endif 1550a6296200SBram Moolenaar 1551a6296200SBram Moolenaar try " not active due to error 1552a6296200SBram Moolenaar call assert_report('should not get here') 1553a6296200SBram Moolenaar finally 1554a6296200SBram Moolenaar call assert_report('should not get here') 1555a6296200SBram Moolenaar endtry 1556a6296200SBram Moolenaar [CODE] 1557a6296200SBram Moolenaar let verify =<< trim [CODE] 1558a6296200SBram Moolenaar call assert_equal('ab', g:Xpath) 1559a6296200SBram Moolenaar [CODE] 1560a6296200SBram Moolenaar call RunInNewVim(test, verify) 1561a6296200SBram Moolenaarendfunc 1562a6296200SBram Moolenaar 1563a6296200SBram Moolenaarfunc Test_finally_after_interrupt() 1564a6296200SBram Moolenaar let test =<< trim [CODE] 1565a6296200SBram Moolenaar func Interrupt() 1566a6296200SBram Moolenaar try 1567a6296200SBram Moolenaar Xpath 'a' 1568a6296200SBram Moolenaar call interrupt() " triggering interrupt exception 1569a6296200SBram Moolenaar call assert_report('should not get here') 1570a6296200SBram Moolenaar endtry 1571a6296200SBram Moolenaar endfunc 1572a6296200SBram Moolenaar 1573a6296200SBram Moolenaar Xpath 'b' 1574a6296200SBram Moolenaar try 1575a6296200SBram Moolenaar call Interrupt() 1576a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1577a6296200SBram Moolenaar Xpath 'c' 1578a6296200SBram Moolenaar finish 1579a6296200SBram Moolenaar endtry 1580a6296200SBram Moolenaar call assert_report('should not get here') 1581a6296200SBram Moolenaar 1582a6296200SBram Moolenaar if 1 " not active due to interrupt 1583a6296200SBram Moolenaar try " not active since :if inactive 1584a6296200SBram Moolenaar call assert_report('should not get here') 1585a6296200SBram Moolenaar finally 1586a6296200SBram Moolenaar call assert_report('should not get here') 1587a6296200SBram Moolenaar endtry 1588a6296200SBram Moolenaar endif 1589a6296200SBram Moolenaar 1590a6296200SBram Moolenaar try " not active due to interrupt 1591a6296200SBram Moolenaar call assert_report('should not get here') 1592a6296200SBram Moolenaar finally 1593a6296200SBram Moolenaar call assert_report('should not get here') 1594a6296200SBram Moolenaar endtry 1595a6296200SBram Moolenaar [CODE] 1596a6296200SBram Moolenaar let verify =<< trim [CODE] 1597a6296200SBram Moolenaar call assert_equal('bac', g:Xpath) 1598a6296200SBram Moolenaar [CODE] 1599a6296200SBram Moolenaar call RunInNewVim(test, verify) 1600a6296200SBram Moolenaarendfunc 1601a6296200SBram Moolenaar 1602a6296200SBram Moolenaarfunc Test_finally_after_throw() 1603a6296200SBram Moolenaar let test =<< trim [CODE] 1604a6296200SBram Moolenaar func Throw() 1605a6296200SBram Moolenaar Xpath 'a' 1606a6296200SBram Moolenaar throw 'xyz' 1607a6296200SBram Moolenaar endfunc 1608a6296200SBram Moolenaar 1609a6296200SBram Moolenaar Xpath 'b' 1610a6296200SBram Moolenaar call Throw() 1611a6296200SBram Moolenaar call assert_report('should not get here') 1612a6296200SBram Moolenaar 1613a6296200SBram Moolenaar if 1 " not active due to :throw 1614a6296200SBram Moolenaar try " not active since :if inactive 1615a6296200SBram Moolenaar call assert_report('should not get here') 1616a6296200SBram Moolenaar finally 1617a6296200SBram Moolenaar call assert_report('should not get here') 1618a6296200SBram Moolenaar endtry 1619a6296200SBram Moolenaar endif 1620a6296200SBram Moolenaar 1621a6296200SBram Moolenaar try " not active due to :throw 1622a6296200SBram Moolenaar call assert_report('should not get here') 1623a6296200SBram Moolenaar finally 1624a6296200SBram Moolenaar call assert_report('should not get here') 1625a6296200SBram Moolenaar endtry 1626a6296200SBram Moolenaar [CODE] 1627a6296200SBram Moolenaar let verify =<< trim [CODE] 1628a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1629a6296200SBram Moolenaar [CODE] 1630a6296200SBram Moolenaar call RunInNewVim(test, verify) 1631a6296200SBram Moolenaarendfunc 1632a6296200SBram Moolenaar 1633a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1634a6296200SBram Moolenaar" Test 23: :catch clauses for a :try after a :throw {{{1 1635a6296200SBram Moolenaar" 1636a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :throw, 1637a6296200SBram Moolenaar" none of its :catch clauses should be executed. 1638a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1639a6296200SBram Moolenaar 1640a6296200SBram Moolenaarfunc Test_catch_after_throw() 1641a6296200SBram Moolenaar let test =<< trim [CODE] 1642a6296200SBram Moolenaar try 1643a6296200SBram Moolenaar Xpath 'a' 1644a6296200SBram Moolenaar throw "xyz" 1645a6296200SBram Moolenaar call assert_report('should not get here') 1646a6296200SBram Moolenaar 1647a6296200SBram Moolenaar if 1 " not active due to :throw 1648a6296200SBram Moolenaar try " not active since :if inactive 1649a6296200SBram Moolenaar call assert_report('should not get here') 1650a6296200SBram Moolenaar catch /xyz/ 1651a6296200SBram Moolenaar call assert_report('should not get here') 1652a6296200SBram Moolenaar endtry 1653a6296200SBram Moolenaar endif 1654a6296200SBram Moolenaar catch /xyz/ 1655a6296200SBram Moolenaar Xpath 'b' 1656a6296200SBram Moolenaar endtry 1657a6296200SBram Moolenaar 1658a6296200SBram Moolenaar Xpath 'c' 1659a6296200SBram Moolenaar throw "abc" 1660a6296200SBram Moolenaar call assert_report('should not get here') 1661a6296200SBram Moolenaar 1662a6296200SBram Moolenaar try " not active due to :throw 1663a6296200SBram Moolenaar call assert_report('should not get here') 1664a6296200SBram Moolenaar catch /abc/ 1665a6296200SBram Moolenaar call assert_report('should not get here') 1666a6296200SBram Moolenaar endtry 1667a6296200SBram Moolenaar [CODE] 1668a6296200SBram Moolenaar let verify =<< trim [CODE] 1669a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1670a6296200SBram Moolenaar [CODE] 1671a6296200SBram Moolenaar call RunInNewVim(test, verify) 1672a6296200SBram Moolenaarendfunc 1673a6296200SBram Moolenaar 1674a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1675a6296200SBram Moolenaar" Test 24: :endtry for a :try after a :throw {{{1 1676a6296200SBram Moolenaar" 1677a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :throw, 1678a6296200SBram Moolenaar" its :endtry should not rethrow the exception to the next surrounding 1679a6296200SBram Moolenaar" active :try conditional. 1680a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1681a6296200SBram Moolenaar 1682a6296200SBram Moolenaarfunc Test_endtry_after_throw() 1683a6296200SBram Moolenaar let test =<< trim [CODE] 1684a6296200SBram Moolenaar try " try 1 1685a6296200SBram Moolenaar try " try 2 1686a6296200SBram Moolenaar Xpath 'a' 1687a6296200SBram Moolenaar throw "xyz" " makes try 2 inactive 1688a6296200SBram Moolenaar call assert_report('should not get here') 1689a6296200SBram Moolenaar 1690a6296200SBram Moolenaar try " try 3 1691a6296200SBram Moolenaar call assert_report('should not get here') 1692a6296200SBram Moolenaar endtry " no rethrow to try 1 1693a6296200SBram Moolenaar catch /xyz/ " should catch although try 2 inactive 1694a6296200SBram Moolenaar Xpath 'b' 1695a6296200SBram Moolenaar endtry 1696a6296200SBram Moolenaar catch /xyz/ " try 1 active, but exception already caught 1697a6296200SBram Moolenaar call assert_report('should not get here') 1698a6296200SBram Moolenaar endtry 1699a6296200SBram Moolenaar Xpath 'c' 1700a6296200SBram Moolenaar [CODE] 1701a6296200SBram Moolenaar let verify =<< trim [CODE] 1702a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1703a6296200SBram Moolenaar [CODE] 1704a6296200SBram Moolenaar call RunInNewVim(test, verify) 1705a6296200SBram Moolenaarendfunc 1706a6296200SBram Moolenaar 1707a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1708a6296200SBram Moolenaar" Test 27: Executing :finally clauses after :return {{{1 1709a6296200SBram Moolenaar" 1710a6296200SBram Moolenaar" For a :return command dynamically enclosed in a :try/:endtry region, 1711a6296200SBram Moolenaar" :finally clauses are executed and the called function is ended. 1712a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1713a6296200SBram Moolenaar 1714a6296200SBram Moolenaarfunc T27_F() 1715a6296200SBram Moolenaar try 1716a6296200SBram Moolenaar Xpath 'a' 1717a6296200SBram Moolenaar try 1718a6296200SBram Moolenaar Xpath 'b' 1719a6296200SBram Moolenaar return 1720a6296200SBram Moolenaar call assert_report('should not get here') 1721a6296200SBram Moolenaar finally 1722a6296200SBram Moolenaar Xpath 'c' 1723a6296200SBram Moolenaar endtry 1724a6296200SBram Moolenaar Xpath 'd' 1725a6296200SBram Moolenaar finally 1726a6296200SBram Moolenaar Xpath 'e' 1727a6296200SBram Moolenaar endtry 1728a6296200SBram Moolenaar call assert_report('should not get here') 1729a6296200SBram Moolenaarendfunc 1730a6296200SBram Moolenaar 1731a6296200SBram Moolenaarfunc T27_G() 1732a6296200SBram Moolenaar try 1733a6296200SBram Moolenaar Xpath 'f' 1734a6296200SBram Moolenaar return 1735a6296200SBram Moolenaar call assert_report('should not get here') 1736a6296200SBram Moolenaar finally 1737a6296200SBram Moolenaar Xpath 'g' 1738a6296200SBram Moolenaar call T27_F() 1739a6296200SBram Moolenaar Xpath 'h' 1740a6296200SBram Moolenaar endtry 1741a6296200SBram Moolenaar call assert_report('should not get here') 1742a6296200SBram Moolenaarendfunc 1743a6296200SBram Moolenaar 1744a6296200SBram Moolenaarfunc T27_H() 1745a6296200SBram Moolenaar try 1746a6296200SBram Moolenaar Xpath 'i' 1747a6296200SBram Moolenaar call T27_G() 1748a6296200SBram Moolenaar Xpath 'j' 1749a6296200SBram Moolenaar finally 1750a6296200SBram Moolenaar Xpath 'k' 1751a6296200SBram Moolenaar return 1752a6296200SBram Moolenaar call assert_report('should not get here') 1753a6296200SBram Moolenaar endtry 1754a6296200SBram Moolenaar call assert_report('should not get here') 1755a6296200SBram Moolenaarendfunction 1756a6296200SBram Moolenaar 1757a6296200SBram Moolenaarfunc Test_finally_after_return() 1758a6296200SBram Moolenaar XpathINIT 1759a6296200SBram Moolenaar try 1760a6296200SBram Moolenaar Xpath 'l' 1761a6296200SBram Moolenaar call T27_H() 1762a6296200SBram Moolenaar Xpath 'm' 1763a6296200SBram Moolenaar finally 1764a6296200SBram Moolenaar Xpath 'n' 1765a6296200SBram Moolenaar endtry 1766a6296200SBram Moolenaar call assert_equal('lifgabcehjkmn', g:Xpath) 1767a6296200SBram Moolenaarendfunc 1768a6296200SBram Moolenaar 1769a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1770a6296200SBram Moolenaar" Test 28: Executing :finally clauses after :finish {{{1 1771a6296200SBram Moolenaar" 1772a6296200SBram Moolenaar" For a :finish command dynamically enclosed in a :try/:endtry region, 1773a6296200SBram Moolenaar" :finally clauses are executed and the sourced file is finished. 1774a6296200SBram Moolenaar" 1775a6296200SBram Moolenaar" This test executes the bodies of the functions F, G, and H from the 1776a6296200SBram Moolenaar" previous test as script files (:return replaced by :finish). 1777a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1778a6296200SBram Moolenaar 1779a6296200SBram Moolenaarfunc Test_finally_after_finish() 1780a6296200SBram Moolenaar XpathINIT 1781a6296200SBram Moolenaar 1782a6296200SBram Moolenaar let scriptF = MakeScript("T27_F") 1783a6296200SBram Moolenaar let scriptG = MakeScript("T27_G", scriptF) 1784a6296200SBram Moolenaar let scriptH = MakeScript("T27_H", scriptG) 1785a6296200SBram Moolenaar 1786a6296200SBram Moolenaar try 1787a6296200SBram Moolenaar Xpath 'A' 1788a6296200SBram Moolenaar exec "source" scriptH 1789a6296200SBram Moolenaar Xpath 'B' 1790a6296200SBram Moolenaar finally 1791a6296200SBram Moolenaar Xpath 'C' 1792a6296200SBram Moolenaar endtry 1793a6296200SBram Moolenaar Xpath 'D' 1794a6296200SBram Moolenaar call assert_equal('AifgabcehjkBCD', g:Xpath) 1795a6296200SBram Moolenaar call delete(scriptF) 1796a6296200SBram Moolenaar call delete(scriptG) 1797a6296200SBram Moolenaar call delete(scriptH) 1798a6296200SBram Moolenaarendfunc 1799a6296200SBram Moolenaar 1800a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1801a6296200SBram Moolenaar" Test 29: Executing :finally clauses on errors {{{1 1802a6296200SBram Moolenaar" 1803a6296200SBram Moolenaar" After an error in a command dynamically enclosed in a :try/:endtry 1804a6296200SBram Moolenaar" region, :finally clauses are executed and the script processing is 1805a6296200SBram Moolenaar" terminated. 1806a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1807a6296200SBram Moolenaar 1808a6296200SBram Moolenaarfunc Test_finally_after_error_1() 1809a6296200SBram Moolenaar let test =<< trim [CODE] 1810a6296200SBram Moolenaar func F() 1811a6296200SBram Moolenaar while 1 1812a6296200SBram Moolenaar try 1813a6296200SBram Moolenaar Xpath 'a' 1814a6296200SBram Moolenaar while 1 1815a6296200SBram Moolenaar try 1816a6296200SBram Moolenaar Xpath 'b' 1817a6296200SBram Moolenaar asdf " error 1818a6296200SBram Moolenaar call assert_report('should not get here') 1819a6296200SBram Moolenaar finally 1820a6296200SBram Moolenaar Xpath 'c' 1821a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1822a6296200SBram Moolenaar call assert_report('should not get here') 1823a6296200SBram Moolenaar break 1824a6296200SBram Moolenaar endwhile 1825a6296200SBram Moolenaar call assert_report('should not get here') 1826a6296200SBram Moolenaar finally 1827a6296200SBram Moolenaar Xpath 'd' 1828a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1829a6296200SBram Moolenaar call assert_report('should not get here') 1830a6296200SBram Moolenaar break 1831a6296200SBram Moolenaar endwhile 1832a6296200SBram Moolenaar call assert_report('should not get here') 1833a6296200SBram Moolenaar endfunc 1834a6296200SBram Moolenaar 1835a6296200SBram Moolenaar while 1 1836a6296200SBram Moolenaar try 1837a6296200SBram Moolenaar Xpath 'e' 1838a6296200SBram Moolenaar while 1 1839a6296200SBram Moolenaar call F() 1840a6296200SBram Moolenaar call assert_report('should not get here') 1841a6296200SBram Moolenaar break 1842a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1843a6296200SBram Moolenaar call assert_report('should not get here') 1844a6296200SBram Moolenaar finally 1845a6296200SBram Moolenaar Xpath 'f' 1846a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1847a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1848a6296200SBram Moolenaar call assert_report('should not get here') 1849a6296200SBram Moolenaar [CODE] 1850a6296200SBram Moolenaar let verify =<< trim [CODE] 1851a6296200SBram Moolenaar call assert_equal('eabcdf', g:Xpath) 1852a6296200SBram Moolenaar [CODE] 1853a6296200SBram Moolenaar call RunInNewVim(test, verify) 1854a6296200SBram Moolenaarendfunc 1855a6296200SBram Moolenaar 1856a6296200SBram Moolenaarfunc Test_finally_after_error_2() 1857a6296200SBram Moolenaar let test =<< trim [CODE] 1858a6296200SBram Moolenaar func G() abort 1859a6296200SBram Moolenaar if 1 1860a6296200SBram Moolenaar try 1861a6296200SBram Moolenaar Xpath 'a' 1862a6296200SBram Moolenaar asdf " error 1863a6296200SBram Moolenaar call assert_report('should not get here') 1864a6296200SBram Moolenaar finally 1865a6296200SBram Moolenaar Xpath 'b' 1866a6296200SBram Moolenaar endtry | Xpath 'c' 1867a6296200SBram Moolenaar endif | Xpath 'd' 1868a6296200SBram Moolenaar call assert_report('should not get here') 1869a6296200SBram Moolenaar endfunc 1870a6296200SBram Moolenaar 1871a6296200SBram Moolenaar if 1 1872a6296200SBram Moolenaar try 1873a6296200SBram Moolenaar Xpath 'e' 1874a6296200SBram Moolenaar call G() 1875a6296200SBram Moolenaar call assert_report('should not get here') 1876a6296200SBram Moolenaar finally 1877a6296200SBram Moolenaar Xpath 'f' 1878a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1879a6296200SBram Moolenaar endif | call assert_report('should not get here') 1880a6296200SBram Moolenaar call assert_report('should not get here') 1881a6296200SBram Moolenaar [CODE] 1882a6296200SBram Moolenaar let verify =<< trim [CODE] 1883a6296200SBram Moolenaar call assert_equal('eabf', g:Xpath) 1884a6296200SBram Moolenaar [CODE] 1885a6296200SBram Moolenaar call RunInNewVim(test, verify) 1886a6296200SBram Moolenaarendfunc 1887a6296200SBram Moolenaar 1888a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1889a6296200SBram Moolenaar" Test 30: Executing :finally clauses on interrupt {{{1 1890a6296200SBram Moolenaar" 1891a6296200SBram Moolenaar" After an interrupt in a command dynamically enclosed in 1892a6296200SBram Moolenaar" a :try/:endtry region, :finally clauses are executed and the 1893a6296200SBram Moolenaar" script processing is terminated. 1894a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1895a6296200SBram Moolenaar 1896a6296200SBram Moolenaarfunc Test_finally_on_interrupt() 1897a6296200SBram Moolenaar let test =<< trim [CODE] 1898a6296200SBram Moolenaar func F() 1899a6296200SBram Moolenaar try 1900a6296200SBram Moolenaar Xloop 'a' 1901a6296200SBram Moolenaar call interrupt() 1902a6296200SBram Moolenaar call assert_report('should not get here') 1903a6296200SBram Moolenaar finally 1904a6296200SBram Moolenaar Xloop 'b' 1905a6296200SBram Moolenaar endtry 1906a6296200SBram Moolenaar call assert_report('should not get here') 1907a6296200SBram Moolenaar endfunc 1908a6296200SBram Moolenaar 1909a6296200SBram Moolenaar try 1910a6296200SBram Moolenaar try 1911a6296200SBram Moolenaar Xpath 'c' 1912a6296200SBram Moolenaar try 1913a6296200SBram Moolenaar Xpath 'd' 1914a6296200SBram Moolenaar call interrupt() 1915a6296200SBram Moolenaar call assert_report('should not get here') 1916a6296200SBram Moolenaar finally 1917a6296200SBram Moolenaar Xpath 'e' 1918a6296200SBram Moolenaar try 1919a6296200SBram Moolenaar Xpath 'f' 1920a6296200SBram Moolenaar try 1921a6296200SBram Moolenaar Xpath 'g' 1922a6296200SBram Moolenaar finally 1923a6296200SBram Moolenaar Xpath 'h' 1924a6296200SBram Moolenaar try 1925a6296200SBram Moolenaar Xpath 'i' 1926a6296200SBram Moolenaar call interrupt() 1927a6296200SBram Moolenaar call assert_report('should not get here') 1928a6296200SBram Moolenaar endtry 1929a6296200SBram Moolenaar call assert_report('should not get here') 1930a6296200SBram Moolenaar endtry 1931a6296200SBram Moolenaar call assert_report('should not get here') 1932a6296200SBram Moolenaar endtry 1933a6296200SBram Moolenaar call assert_report('should not get here') 1934a6296200SBram Moolenaar endtry 1935a6296200SBram Moolenaar call assert_report('should not get here') 1936a6296200SBram Moolenaar finally 1937a6296200SBram Moolenaar Xpath 'j' 1938a6296200SBram Moolenaar try 1939a6296200SBram Moolenaar Xpath 'k' 1940a6296200SBram Moolenaar call F() 1941a6296200SBram Moolenaar call assert_report('should not get here') 1942a6296200SBram Moolenaar finally 1943a6296200SBram Moolenaar Xpath 'l' 1944a6296200SBram Moolenaar try 1945a6296200SBram Moolenaar Xpath 'm' 1946a6296200SBram Moolenaar XloopNEXT 1947a6296200SBram Moolenaar ExecAsScript F 1948a6296200SBram Moolenaar call assert_report('should not get here') 1949a6296200SBram Moolenaar finally 1950a6296200SBram Moolenaar Xpath 'n' 1951a6296200SBram Moolenaar endtry 1952a6296200SBram Moolenaar call assert_report('should not get here') 1953a6296200SBram Moolenaar endtry 1954a6296200SBram Moolenaar call assert_report('should not get here') 1955a6296200SBram Moolenaar endtry 1956a6296200SBram Moolenaar call assert_report('should not get here') 1957a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1958a6296200SBram Moolenaar Xpath 'o' 1959a6296200SBram Moolenaar endtry 1960a6296200SBram Moolenaar [CODE] 1961a6296200SBram Moolenaar let verify =<< trim [CODE] 1962a6296200SBram Moolenaar call assert_equal('cdefghijka1b1lma2b2no', g:Xpath) 1963a6296200SBram Moolenaar [CODE] 1964a6296200SBram Moolenaar call RunInNewVim(test, verify) 1965a6296200SBram Moolenaarendfunc 1966a6296200SBram Moolenaar 1967a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1968a6296200SBram Moolenaar" Test 31: Executing :finally clauses after :throw {{{1 1969a6296200SBram Moolenaar" 1970a6296200SBram Moolenaar" After a :throw dynamically enclosed in a :try/:endtry region, 1971a6296200SBram Moolenaar" :finally clauses are executed and the script processing is 1972a6296200SBram Moolenaar" terminated. 1973a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1974a6296200SBram Moolenaar 1975a6296200SBram Moolenaarfunc Test_finally_after_throw_2() 1976a6296200SBram Moolenaar let test =<< trim [CODE] 1977a6296200SBram Moolenaar func F() 1978a6296200SBram Moolenaar try 1979a6296200SBram Moolenaar Xloop 'a' 1980a6296200SBram Moolenaar throw "exception" 1981a6296200SBram Moolenaar call assert_report('should not get here') 1982a6296200SBram Moolenaar finally 1983a6296200SBram Moolenaar Xloop 'b' 1984a6296200SBram Moolenaar endtry 1985a6296200SBram Moolenaar call assert_report('should not get here') 1986a6296200SBram Moolenaar endfunc 1987a6296200SBram Moolenaar 1988a6296200SBram Moolenaar try 1989a6296200SBram Moolenaar Xpath 'c' 1990a6296200SBram Moolenaar try 1991a6296200SBram Moolenaar Xpath 'd' 1992a6296200SBram Moolenaar throw "exception" 1993a6296200SBram Moolenaar call assert_report('should not get here') 1994a6296200SBram Moolenaar finally 1995a6296200SBram Moolenaar Xpath 'e' 1996a6296200SBram Moolenaar try 1997a6296200SBram Moolenaar Xpath 'f' 1998a6296200SBram Moolenaar try 1999a6296200SBram Moolenaar Xpath 'g' 2000a6296200SBram Moolenaar finally 2001a6296200SBram Moolenaar Xpath 'h' 2002a6296200SBram Moolenaar try 2003a6296200SBram Moolenaar Xpath 'i' 2004a6296200SBram Moolenaar throw "exception" 2005a6296200SBram Moolenaar call assert_report('should not get here') 2006a6296200SBram Moolenaar endtry 2007a6296200SBram Moolenaar call assert_report('should not get here') 2008a6296200SBram Moolenaar endtry 2009a6296200SBram Moolenaar call assert_report('should not get here') 2010a6296200SBram Moolenaar endtry 2011a6296200SBram Moolenaar call assert_report('should not get here') 2012a6296200SBram Moolenaar endtry 2013a6296200SBram Moolenaar call assert_report('should not get here') 2014a6296200SBram Moolenaar finally 2015a6296200SBram Moolenaar Xpath 'j' 2016a6296200SBram Moolenaar try 2017a6296200SBram Moolenaar Xpath 'k' 2018a6296200SBram Moolenaar call F() 2019a6296200SBram Moolenaar call assert_report('should not get here') 2020a6296200SBram Moolenaar finally 2021a6296200SBram Moolenaar Xpath 'l' 2022a6296200SBram Moolenaar try 2023a6296200SBram Moolenaar Xpath 'm' 2024a6296200SBram Moolenaar XloopNEXT 2025a6296200SBram Moolenaar ExecAsScript F 2026a6296200SBram Moolenaar call assert_report('should not get here') 2027a6296200SBram Moolenaar finally 2028a6296200SBram Moolenaar Xpath 'n' 2029a6296200SBram Moolenaar endtry 2030a6296200SBram Moolenaar call assert_report('should not get here') 2031a6296200SBram Moolenaar endtry 2032a6296200SBram Moolenaar call assert_report('should not get here') 2033a6296200SBram Moolenaar endtry 2034a6296200SBram Moolenaar call assert_report('should not get here') 2035a6296200SBram Moolenaar [CODE] 2036a6296200SBram Moolenaar let verify =<< trim [CODE] 2037a6296200SBram Moolenaar call assert_equal('cdefghijka1b1lma2b2n', g:Xpath) 2038a6296200SBram Moolenaar [CODE] 2039a6296200SBram Moolenaar call RunInNewVim(test, verify) 2040a6296200SBram Moolenaarendfunc 2041a6296200SBram Moolenaar 2042a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2043a6296200SBram Moolenaar" Test 34: :finally reason discarded by :continue {{{1 2044a6296200SBram Moolenaar" 2045a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2046a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2047a6296200SBram Moolenaar" discarded by a :continue in the finally clause. 2048a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2049a6296200SBram Moolenaar 2050a6296200SBram Moolenaarfunc Test_finally_after_continue() 2051a6296200SBram Moolenaar let test =<< trim [CODE] 2052a6296200SBram Moolenaar func C(jump) 2053a6296200SBram Moolenaar XloopNEXT 2054a6296200SBram Moolenaar let loop = 0 2055a6296200SBram Moolenaar while loop < 2 2056a6296200SBram Moolenaar let loop = loop + 1 2057a6296200SBram Moolenaar if loop == 1 2058a6296200SBram Moolenaar try 2059a6296200SBram Moolenaar if a:jump == "continue" 2060a6296200SBram Moolenaar continue 2061a6296200SBram Moolenaar elseif a:jump == "break" 2062a6296200SBram Moolenaar break 2063a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2064a6296200SBram Moolenaar return 2065a6296200SBram Moolenaar elseif a:jump == "error" 2066a6296200SBram Moolenaar asdf 2067a6296200SBram Moolenaar elseif a:jump == "interrupt" 2068a6296200SBram Moolenaar call interrupt() 2069a6296200SBram Moolenaar let dummy = 0 2070a6296200SBram Moolenaar elseif a:jump == "throw" 2071a6296200SBram Moolenaar throw "abc" 2072a6296200SBram Moolenaar endif 2073a6296200SBram Moolenaar finally 2074a6296200SBram Moolenaar continue " discards jump that caused the :finally 2075a6296200SBram Moolenaar call assert_report('should not get here') 2076a6296200SBram Moolenaar endtry 2077a6296200SBram Moolenaar call assert_report('should not get here') 2078a6296200SBram Moolenaar elseif loop == 2 2079a6296200SBram Moolenaar Xloop 'a' 2080a6296200SBram Moolenaar endif 2081a6296200SBram Moolenaar endwhile 2082a6296200SBram Moolenaar endfunc 2083a6296200SBram Moolenaar 2084a6296200SBram Moolenaar call C("continue") 2085a6296200SBram Moolenaar Xpath 'b' 2086a6296200SBram Moolenaar call C("break") 2087a6296200SBram Moolenaar Xpath 'c' 2088a6296200SBram Moolenaar call C("return") 2089a6296200SBram Moolenaar Xpath 'd' 2090a6296200SBram Moolenaar let g:jump = "finish" 2091a6296200SBram Moolenaar ExecAsScript C 2092a6296200SBram Moolenaar unlet g:jump 2093a6296200SBram Moolenaar Xpath 'e' 2094a6296200SBram Moolenaar try 2095a6296200SBram Moolenaar call C("error") 2096a6296200SBram Moolenaar Xpath 'f' 2097a6296200SBram Moolenaar finally 2098a6296200SBram Moolenaar Xpath 'g' 2099a6296200SBram Moolenaar try 2100a6296200SBram Moolenaar call C("interrupt") 2101a6296200SBram Moolenaar Xpath 'h' 2102a6296200SBram Moolenaar finally 2103a6296200SBram Moolenaar Xpath 'i' 2104a6296200SBram Moolenaar call C("throw") 2105a6296200SBram Moolenaar Xpath 'j' 2106a6296200SBram Moolenaar endtry 2107a6296200SBram Moolenaar endtry 2108a6296200SBram Moolenaar Xpath 'k' 2109a6296200SBram Moolenaar [CODE] 2110a6296200SBram Moolenaar let verify =<< trim [CODE] 2111a6296200SBram Moolenaar call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath) 2112a6296200SBram Moolenaar [CODE] 2113a6296200SBram Moolenaar call RunInNewVim(test, verify) 2114a6296200SBram Moolenaarendfunc 2115a6296200SBram Moolenaar 2116a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2117a6296200SBram Moolenaar" Test 35: :finally reason discarded by :break {{{1 2118a6296200SBram Moolenaar" 2119a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2120a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2121a6296200SBram Moolenaar" discarded by a :break in the finally clause. 2122a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2123a6296200SBram Moolenaar 2124a6296200SBram Moolenaarfunc Test_finally_discard_by_break() 2125a6296200SBram Moolenaar let test =<< trim [CODE] 2126a6296200SBram Moolenaar func B(jump) 2127a6296200SBram Moolenaar XloopNEXT 2128a6296200SBram Moolenaar let loop = 0 2129a6296200SBram Moolenaar while loop < 2 2130a6296200SBram Moolenaar let loop = loop + 1 2131a6296200SBram Moolenaar if loop == 1 2132a6296200SBram Moolenaar try 2133a6296200SBram Moolenaar if a:jump == "continue" 2134a6296200SBram Moolenaar continue 2135a6296200SBram Moolenaar elseif a:jump == "break" 2136a6296200SBram Moolenaar break 2137a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2138a6296200SBram Moolenaar return 2139a6296200SBram Moolenaar elseif a:jump == "error" 2140a6296200SBram Moolenaar asdf 2141a6296200SBram Moolenaar elseif a:jump == "interrupt" 2142a6296200SBram Moolenaar call interrupt() 2143a6296200SBram Moolenaar let dummy = 0 2144a6296200SBram Moolenaar elseif a:jump == "throw" 2145a6296200SBram Moolenaar throw "abc" 2146a6296200SBram Moolenaar endif 2147a6296200SBram Moolenaar finally 2148a6296200SBram Moolenaar break " discards jump that caused the :finally 2149a6296200SBram Moolenaar call assert_report('should not get here') 2150a6296200SBram Moolenaar endtry 2151a6296200SBram Moolenaar elseif loop == 2 2152a6296200SBram Moolenaar call assert_report('should not get here') 2153a6296200SBram Moolenaar endif 2154a6296200SBram Moolenaar endwhile 2155a6296200SBram Moolenaar Xloop 'a' 2156a6296200SBram Moolenaar endfunc 2157a6296200SBram Moolenaar 2158a6296200SBram Moolenaar call B("continue") 2159a6296200SBram Moolenaar Xpath 'b' 2160a6296200SBram Moolenaar call B("break") 2161a6296200SBram Moolenaar Xpath 'c' 2162a6296200SBram Moolenaar call B("return") 2163a6296200SBram Moolenaar Xpath 'd' 2164a6296200SBram Moolenaar let g:jump = "finish" 2165a6296200SBram Moolenaar ExecAsScript B 2166a6296200SBram Moolenaar unlet g:jump 2167a6296200SBram Moolenaar Xpath 'e' 2168a6296200SBram Moolenaar try 2169a6296200SBram Moolenaar call B("error") 2170a6296200SBram Moolenaar Xpath 'f' 2171a6296200SBram Moolenaar finally 2172a6296200SBram Moolenaar Xpath 'g' 2173a6296200SBram Moolenaar try 2174a6296200SBram Moolenaar call B("interrupt") 2175a6296200SBram Moolenaar Xpath 'h' 2176a6296200SBram Moolenaar finally 2177a6296200SBram Moolenaar Xpath 'i' 2178a6296200SBram Moolenaar call B("throw") 2179a6296200SBram Moolenaar Xpath 'j' 2180a6296200SBram Moolenaar endtry 2181a6296200SBram Moolenaar endtry 2182a6296200SBram Moolenaar Xpath 'k' 2183a6296200SBram Moolenaar [CODE] 2184a6296200SBram Moolenaar let verify =<< trim [CODE] 2185a6296200SBram Moolenaar call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath) 2186a6296200SBram Moolenaar [CODE] 2187a6296200SBram Moolenaar call RunInNewVim(test, verify) 2188a6296200SBram Moolenaarendfunc 2189a6296200SBram Moolenaar 2190a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2191a6296200SBram Moolenaar" Test 36: :finally reason discarded by :return {{{1 2192a6296200SBram Moolenaar" 2193a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2194a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2195a6296200SBram Moolenaar" discarded by a :return in the finally clause. 2196a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2197a6296200SBram Moolenaar 2198a6296200SBram Moolenaarfunc Test_finally_discard_by_return() 2199a6296200SBram Moolenaar let test =<< trim [CODE] 2200a6296200SBram Moolenaar func R(jump, retval) abort 2201a6296200SBram Moolenaar let loop = 0 2202a6296200SBram Moolenaar while loop < 2 2203a6296200SBram Moolenaar let loop = loop + 1 2204a6296200SBram Moolenaar if loop == 1 2205a6296200SBram Moolenaar try 2206a6296200SBram Moolenaar if a:jump == "continue" 2207a6296200SBram Moolenaar continue 2208a6296200SBram Moolenaar elseif a:jump == "break" 2209a6296200SBram Moolenaar break 2210a6296200SBram Moolenaar elseif a:jump == "return" 2211a6296200SBram Moolenaar return 2212a6296200SBram Moolenaar elseif a:jump == "error" 2213a6296200SBram Moolenaar asdf 2214a6296200SBram Moolenaar elseif a:jump == "interrupt" 2215a6296200SBram Moolenaar call interrupt() 2216a6296200SBram Moolenaar let dummy = 0 2217a6296200SBram Moolenaar elseif a:jump == "throw" 2218a6296200SBram Moolenaar throw "abc" 2219a6296200SBram Moolenaar endif 2220a6296200SBram Moolenaar finally 2221a6296200SBram Moolenaar return a:retval " discards jump that caused the :finally 2222a6296200SBram Moolenaar call assert_report('should not get here') 2223a6296200SBram Moolenaar endtry 2224a6296200SBram Moolenaar elseif loop == 2 2225a6296200SBram Moolenaar call assert_report('should not get here') 2226a6296200SBram Moolenaar endif 2227a6296200SBram Moolenaar endwhile 2228a6296200SBram Moolenaar call assert_report('should not get here') 2229a6296200SBram Moolenaar endfunc 2230a6296200SBram Moolenaar 2231a6296200SBram Moolenaar let sum = -R("continue", -8) 2232a6296200SBram Moolenaar Xpath 'a' 2233a6296200SBram Moolenaar let sum = sum - R("break", -16) 2234a6296200SBram Moolenaar Xpath 'b' 2235a6296200SBram Moolenaar let sum = sum - R("return", -32) 2236a6296200SBram Moolenaar Xpath 'c' 2237a6296200SBram Moolenaar try 2238a6296200SBram Moolenaar let sum = sum - R("error", -64) 2239a6296200SBram Moolenaar Xpath 'd' 2240a6296200SBram Moolenaar finally 2241a6296200SBram Moolenaar Xpath 'e' 2242a6296200SBram Moolenaar try 2243a6296200SBram Moolenaar let sum = sum - R("interrupt", -128) 2244a6296200SBram Moolenaar Xpath 'f' 2245a6296200SBram Moolenaar finally 2246a6296200SBram Moolenaar Xpath 'g' 2247a6296200SBram Moolenaar let sum = sum - R("throw", -256) 2248a6296200SBram Moolenaar Xpath 'h' 2249a6296200SBram Moolenaar endtry 2250a6296200SBram Moolenaar endtry 2251a6296200SBram Moolenaar Xpath 'i' 2252a6296200SBram Moolenaar 2253a6296200SBram Moolenaar let expected = 8 + 16 + 32 + 64 + 128 + 256 2254a6296200SBram Moolenaar call assert_equal(sum, expected) 2255a6296200SBram Moolenaar [CODE] 2256a6296200SBram Moolenaar let verify =<< trim [CODE] 2257a6296200SBram Moolenaar call assert_equal('abcdefghi', g:Xpath) 2258a6296200SBram Moolenaar [CODE] 2259a6296200SBram Moolenaar call RunInNewVim(test, verify) 2260a6296200SBram Moolenaarendfunc 2261a6296200SBram Moolenaar 2262a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2263a6296200SBram Moolenaar" Test 37: :finally reason discarded by :finish {{{1 2264a6296200SBram Moolenaar" 2265a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2266a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2267a6296200SBram Moolenaar" discarded by a :finish in the finally clause. 2268a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2269a6296200SBram Moolenaar 2270a6296200SBram Moolenaarfunc Test_finally_discard_by_finish() 2271a6296200SBram Moolenaar let test =<< trim [CODE] 2272a6296200SBram Moolenaar func F(jump) " not executed as function, transformed to a script 2273a6296200SBram Moolenaar let loop = 0 2274a6296200SBram Moolenaar while loop < 2 2275a6296200SBram Moolenaar let loop = loop + 1 2276a6296200SBram Moolenaar if loop == 1 2277a6296200SBram Moolenaar try 2278a6296200SBram Moolenaar if a:jump == "continue" 2279a6296200SBram Moolenaar continue 2280a6296200SBram Moolenaar elseif a:jump == "break" 2281a6296200SBram Moolenaar break 2282a6296200SBram Moolenaar elseif a:jump == "finish" 2283a6296200SBram Moolenaar finish 2284a6296200SBram Moolenaar elseif a:jump == "error" 2285a6296200SBram Moolenaar asdf 2286a6296200SBram Moolenaar elseif a:jump == "interrupt" 2287a6296200SBram Moolenaar call interrupt() 2288a6296200SBram Moolenaar let dummy = 0 2289a6296200SBram Moolenaar elseif a:jump == "throw" 2290a6296200SBram Moolenaar throw "abc" 2291a6296200SBram Moolenaar endif 2292a6296200SBram Moolenaar finally 2293a6296200SBram Moolenaar finish " discards jump that caused the :finally 2294a6296200SBram Moolenaar call assert_report('should not get here') 2295a6296200SBram Moolenaar endtry 2296a6296200SBram Moolenaar elseif loop == 2 2297a6296200SBram Moolenaar call assert_report('should not get here') 2298a6296200SBram Moolenaar endif 2299a6296200SBram Moolenaar endwhile 2300a6296200SBram Moolenaar call assert_report('should not get here') 2301a6296200SBram Moolenaar endfunc 2302a6296200SBram Moolenaar 2303a6296200SBram Moolenaar let scriptF = MakeScript("F") 2304a6296200SBram Moolenaar delfunction F 2305a6296200SBram Moolenaar 2306a6296200SBram Moolenaar let g:jump = "continue" 2307a6296200SBram Moolenaar exec "source" scriptF 2308a6296200SBram Moolenaar Xpath 'a' 2309a6296200SBram Moolenaar let g:jump = "break" 2310a6296200SBram Moolenaar exec "source" scriptF 2311a6296200SBram Moolenaar Xpath 'b' 2312a6296200SBram Moolenaar let g:jump = "finish" 2313a6296200SBram Moolenaar exec "source" scriptF 2314a6296200SBram Moolenaar Xpath 'c' 2315a6296200SBram Moolenaar try 2316a6296200SBram Moolenaar let g:jump = "error" 2317a6296200SBram Moolenaar exec "source" scriptF 2318a6296200SBram Moolenaar Xpath 'd' 2319a6296200SBram Moolenaar finally 2320a6296200SBram Moolenaar Xpath 'e' 2321a6296200SBram Moolenaar try 2322a6296200SBram Moolenaar let g:jump = "interrupt" 2323a6296200SBram Moolenaar exec "source" scriptF 2324a6296200SBram Moolenaar Xpath 'f' 2325a6296200SBram Moolenaar finally 2326a6296200SBram Moolenaar Xpath 'g' 2327a6296200SBram Moolenaar try 2328a6296200SBram Moolenaar let g:jump = "throw" 2329a6296200SBram Moolenaar exec "source" scriptF 2330a6296200SBram Moolenaar Xpath 'h' 2331a6296200SBram Moolenaar finally 2332a6296200SBram Moolenaar Xpath 'i' 2333a6296200SBram Moolenaar endtry 2334a6296200SBram Moolenaar endtry 2335a6296200SBram Moolenaar endtry 2336a6296200SBram Moolenaar unlet g:jump 2337a6296200SBram Moolenaar call delete(scriptF) 2338a6296200SBram Moolenaar [CODE] 2339a6296200SBram Moolenaar let verify =<< trim [CODE] 2340a6296200SBram Moolenaar call assert_equal('abcdefghi', g:Xpath) 2341a6296200SBram Moolenaar [CODE] 2342a6296200SBram Moolenaar call RunInNewVim(test, verify) 2343a6296200SBram Moolenaarendfunc 2344a6296200SBram Moolenaar 2345a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2346a6296200SBram Moolenaar" Test 38: :finally reason discarded by an error {{{1 2347a6296200SBram Moolenaar" 2348a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2349a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2350a6296200SBram Moolenaar" discarded by an error in the finally clause. 2351a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2352a6296200SBram Moolenaar 2353a6296200SBram Moolenaarfunc Test_finally_discard_by_error() 2354a6296200SBram Moolenaar let test =<< trim [CODE] 2355a6296200SBram Moolenaar func E(jump) 2356a6296200SBram Moolenaar let loop = 0 2357a6296200SBram Moolenaar while loop < 2 2358a6296200SBram Moolenaar let loop = loop + 1 2359a6296200SBram Moolenaar if loop == 1 2360a6296200SBram Moolenaar try 2361a6296200SBram Moolenaar if a:jump == "continue" 2362a6296200SBram Moolenaar continue 2363a6296200SBram Moolenaar elseif a:jump == "break" 2364a6296200SBram Moolenaar break 2365a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2366a6296200SBram Moolenaar return 2367a6296200SBram Moolenaar elseif a:jump == "error" 2368a6296200SBram Moolenaar asdf 2369a6296200SBram Moolenaar elseif a:jump == "interrupt" 2370a6296200SBram Moolenaar call interrupt() 2371a6296200SBram Moolenaar let dummy = 0 2372a6296200SBram Moolenaar elseif a:jump == "throw" 2373a6296200SBram Moolenaar throw "abc" 2374a6296200SBram Moolenaar endif 2375a6296200SBram Moolenaar finally 2376a6296200SBram Moolenaar asdf " error; discards jump that caused the :finally 2377a6296200SBram Moolenaar endtry 2378a6296200SBram Moolenaar elseif loop == 2 2379a6296200SBram Moolenaar call assert_report('should not get here') 2380a6296200SBram Moolenaar endif 2381a6296200SBram Moolenaar endwhile 2382a6296200SBram Moolenaar call assert_report('should not get here') 2383a6296200SBram Moolenaar endfunc 2384a6296200SBram Moolenaar 2385a6296200SBram Moolenaar try 2386a6296200SBram Moolenaar Xpath 'a' 2387a6296200SBram Moolenaar call E("continue") 2388a6296200SBram Moolenaar call assert_report('should not get here') 2389a6296200SBram Moolenaar finally 2390a6296200SBram Moolenaar try 2391a6296200SBram Moolenaar Xpath 'b' 2392a6296200SBram Moolenaar call E("break") 2393a6296200SBram Moolenaar call assert_report('should not get here') 2394a6296200SBram Moolenaar finally 2395a6296200SBram Moolenaar try 2396a6296200SBram Moolenaar Xpath 'c' 2397a6296200SBram Moolenaar call E("return") 2398a6296200SBram Moolenaar call assert_report('should not get here') 2399a6296200SBram Moolenaar finally 2400a6296200SBram Moolenaar try 2401a6296200SBram Moolenaar Xpath 'd' 2402a6296200SBram Moolenaar let g:jump = "finish" 2403a6296200SBram Moolenaar ExecAsScript E 2404a6296200SBram Moolenaar call assert_report('should not get here') 2405a6296200SBram Moolenaar finally 2406a6296200SBram Moolenaar unlet g:jump 2407a6296200SBram Moolenaar try 2408a6296200SBram Moolenaar Xpath 'e' 2409a6296200SBram Moolenaar call E("error") 2410a6296200SBram Moolenaar call assert_report('should not get here') 2411a6296200SBram Moolenaar finally 2412a6296200SBram Moolenaar try 2413a6296200SBram Moolenaar Xpath 'f' 2414a6296200SBram Moolenaar call E("interrupt") 2415a6296200SBram Moolenaar call assert_report('should not get here') 2416a6296200SBram Moolenaar finally 2417a6296200SBram Moolenaar try 2418a6296200SBram Moolenaar Xpath 'g' 2419a6296200SBram Moolenaar call E("throw") 2420a6296200SBram Moolenaar call assert_report('should not get here') 2421a6296200SBram Moolenaar finally 2422a6296200SBram Moolenaar Xpath 'h' 2423a6296200SBram Moolenaar delfunction E 2424a6296200SBram Moolenaar endtry 2425a6296200SBram Moolenaar endtry 2426a6296200SBram Moolenaar endtry 2427a6296200SBram Moolenaar endtry 2428a6296200SBram Moolenaar endtry 2429a6296200SBram Moolenaar endtry 2430a6296200SBram Moolenaar endtry 2431a6296200SBram Moolenaar call assert_report('should not get here') 2432a6296200SBram Moolenaar [CODE] 2433a6296200SBram Moolenaar let verify =<< trim [CODE] 2434a6296200SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 2435a6296200SBram Moolenaar [CODE] 2436a6296200SBram Moolenaar call RunInNewVim(test, verify) 2437a6296200SBram Moolenaarendfunc 2438a6296200SBram Moolenaar 2439a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2440a6296200SBram Moolenaar" Test 39: :finally reason discarded by an interrupt {{{1 2441a6296200SBram Moolenaar" 2442a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2443a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2444a6296200SBram Moolenaar" discarded by an interrupt in the finally clause. 2445a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2446a6296200SBram Moolenaar 2447a6296200SBram Moolenaarfunc Test_finally_discarded_by_interrupt() 2448a6296200SBram Moolenaar let test =<< trim [CODE] 2449a6296200SBram Moolenaar func I(jump) 2450a6296200SBram Moolenaar let loop = 0 2451a6296200SBram Moolenaar while loop < 2 2452a6296200SBram Moolenaar let loop = loop + 1 2453a6296200SBram Moolenaar if loop == 1 2454a6296200SBram Moolenaar try 2455a6296200SBram Moolenaar if a:jump == "continue" 2456a6296200SBram Moolenaar continue 2457a6296200SBram Moolenaar elseif a:jump == "break" 2458a6296200SBram Moolenaar break 2459a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2460a6296200SBram Moolenaar return 2461a6296200SBram Moolenaar elseif a:jump == "error" 2462a6296200SBram Moolenaar asdf 2463a6296200SBram Moolenaar elseif a:jump == "interrupt" 2464a6296200SBram Moolenaar call interrupt() 2465a6296200SBram Moolenaar let dummy = 0 2466a6296200SBram Moolenaar elseif a:jump == "throw" 2467a6296200SBram Moolenaar throw "abc" 2468a6296200SBram Moolenaar endif 2469a6296200SBram Moolenaar finally 2470a6296200SBram Moolenaar call interrupt() 2471a6296200SBram Moolenaar let dummy = 0 2472a6296200SBram Moolenaar endtry 2473a6296200SBram Moolenaar elseif loop == 2 2474a6296200SBram Moolenaar call assert_report('should not get here') 2475a6296200SBram Moolenaar endif 2476a6296200SBram Moolenaar endwhile 2477a6296200SBram Moolenaar call assert_report('should not get here') 2478a6296200SBram Moolenaar endfunc 2479a6296200SBram Moolenaar 2480a6296200SBram Moolenaar try 2481a6296200SBram Moolenaar try 2482a6296200SBram Moolenaar Xpath 'a' 2483a6296200SBram Moolenaar call I("continue") 2484a6296200SBram Moolenaar call assert_report('should not get here') 2485a6296200SBram Moolenaar finally 2486a6296200SBram Moolenaar try 2487a6296200SBram Moolenaar Xpath 'b' 2488a6296200SBram Moolenaar call I("break") 2489a6296200SBram Moolenaar call assert_report('should not get here') 2490a6296200SBram Moolenaar finally 2491a6296200SBram Moolenaar try 2492a6296200SBram Moolenaar Xpath 'c' 2493a6296200SBram Moolenaar call I("return") 2494a6296200SBram Moolenaar call assert_report('should not get here') 2495a6296200SBram Moolenaar finally 2496a6296200SBram Moolenaar try 2497a6296200SBram Moolenaar Xpath 'd' 2498a6296200SBram Moolenaar let g:jump = "finish" 2499a6296200SBram Moolenaar ExecAsScript I 2500a6296200SBram Moolenaar call assert_report('should not get here') 2501a6296200SBram Moolenaar finally 2502a6296200SBram Moolenaar unlet g:jump 2503a6296200SBram Moolenaar try 2504a6296200SBram Moolenaar Xpath 'e' 2505a6296200SBram Moolenaar call I("error") 2506a6296200SBram Moolenaar call assert_report('should not get here') 2507a6296200SBram Moolenaar finally 2508a6296200SBram Moolenaar try 2509a6296200SBram Moolenaar Xpath 'f' 2510a6296200SBram Moolenaar call I("interrupt") 2511a6296200SBram Moolenaar call assert_report('should not get here') 2512a6296200SBram Moolenaar finally 2513a6296200SBram Moolenaar try 2514a6296200SBram Moolenaar Xpath 'g' 2515a6296200SBram Moolenaar call I("throw") 2516a6296200SBram Moolenaar call assert_report('should not get here') 2517a6296200SBram Moolenaar finally 2518a6296200SBram Moolenaar Xpath 'h' 2519a6296200SBram Moolenaar delfunction I 2520a6296200SBram Moolenaar endtry 2521a6296200SBram Moolenaar endtry 2522a6296200SBram Moolenaar endtry 2523a6296200SBram Moolenaar endtry 2524a6296200SBram Moolenaar endtry 2525a6296200SBram Moolenaar endtry 2526a6296200SBram Moolenaar endtry 2527a6296200SBram Moolenaar call assert_report('should not get here') 2528a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 2529a6296200SBram Moolenaar Xpath 'A' 2530a6296200SBram Moolenaar endtry 2531a6296200SBram Moolenaar [CODE] 2532a6296200SBram Moolenaar let verify =<< trim [CODE] 2533a6296200SBram Moolenaar call assert_equal('abcdefghA', g:Xpath) 2534a6296200SBram Moolenaar [CODE] 2535a6296200SBram Moolenaar call RunInNewVim(test, verify) 2536a6296200SBram Moolenaarendfunc 2537a6296200SBram Moolenaar 2538a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2539a6296200SBram Moolenaar" Test 40: :finally reason discarded by :throw {{{1 2540a6296200SBram Moolenaar" 2541a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2542a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2543a6296200SBram Moolenaar" discarded by a :throw in the finally clause. 2544a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2545a6296200SBram Moolenaar 2546a6296200SBram Moolenaarfunc Test_finally_discard_by_throw() 2547a6296200SBram Moolenaar let test =<< trim [CODE] 2548a6296200SBram Moolenaar func T(jump) 2549a6296200SBram Moolenaar let loop = 0 2550a6296200SBram Moolenaar while loop < 2 2551a6296200SBram Moolenaar let loop = loop + 1 2552a6296200SBram Moolenaar if loop == 1 2553a6296200SBram Moolenaar try 2554a6296200SBram Moolenaar if a:jump == "continue" 2555a6296200SBram Moolenaar continue 2556a6296200SBram Moolenaar elseif a:jump == "break" 2557a6296200SBram Moolenaar break 2558a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2559a6296200SBram Moolenaar return 2560a6296200SBram Moolenaar elseif a:jump == "error" 2561a6296200SBram Moolenaar asdf 2562a6296200SBram Moolenaar elseif a:jump == "interrupt" 2563a6296200SBram Moolenaar call interrupt() 2564a6296200SBram Moolenaar let dummy = 0 2565a6296200SBram Moolenaar elseif a:jump == "throw" 2566a6296200SBram Moolenaar throw "abc" 2567a6296200SBram Moolenaar endif 2568a6296200SBram Moolenaar finally 2569a6296200SBram Moolenaar throw "xyz" " discards jump that caused the :finally 2570a6296200SBram Moolenaar endtry 2571a6296200SBram Moolenaar elseif loop == 2 2572a6296200SBram Moolenaar call assert_report('should not get here') 2573a6296200SBram Moolenaar endif 2574a6296200SBram Moolenaar endwhile 2575a6296200SBram Moolenaar call assert_report('should not get here') 2576a6296200SBram Moolenaar endfunc 2577a6296200SBram Moolenaar 2578a6296200SBram Moolenaar try 2579a6296200SBram Moolenaar Xpath 'a' 2580a6296200SBram Moolenaar call T("continue") 2581a6296200SBram Moolenaar call assert_report('should not get here') 2582a6296200SBram Moolenaar finally 2583a6296200SBram Moolenaar try 2584a6296200SBram Moolenaar Xpath 'b' 2585a6296200SBram Moolenaar call T("break") 2586a6296200SBram Moolenaar call assert_report('should not get here') 2587a6296200SBram Moolenaar finally 2588a6296200SBram Moolenaar try 2589a6296200SBram Moolenaar Xpath 'c' 2590a6296200SBram Moolenaar call T("return") 2591a6296200SBram Moolenaar call assert_report('should not get here') 2592a6296200SBram Moolenaar finally 2593a6296200SBram Moolenaar try 2594a6296200SBram Moolenaar Xpath 'd' 2595a6296200SBram Moolenaar let g:jump = "finish" 2596a6296200SBram Moolenaar ExecAsScript T 2597a6296200SBram Moolenaar call assert_report('should not get here') 2598a6296200SBram Moolenaar finally 2599a6296200SBram Moolenaar unlet g:jump 2600a6296200SBram Moolenaar try 2601a6296200SBram Moolenaar Xpath 'e' 2602a6296200SBram Moolenaar call T("error") 2603a6296200SBram Moolenaar call assert_report('should not get here') 2604a6296200SBram Moolenaar finally 2605a6296200SBram Moolenaar try 2606a6296200SBram Moolenaar Xpath 'f' 2607a6296200SBram Moolenaar call T("interrupt") 2608a6296200SBram Moolenaar call assert_report('should not get here') 2609a6296200SBram Moolenaar finally 2610a6296200SBram Moolenaar try 2611a6296200SBram Moolenaar Xpath 'g' 2612a6296200SBram Moolenaar call T("throw") 2613a6296200SBram Moolenaar call assert_report('should not get here') 2614a6296200SBram Moolenaar finally 2615a6296200SBram Moolenaar Xpath 'h' 2616a6296200SBram Moolenaar delfunction T 2617a6296200SBram Moolenaar endtry 2618a6296200SBram Moolenaar endtry 2619a6296200SBram Moolenaar endtry 2620a6296200SBram Moolenaar endtry 2621a6296200SBram Moolenaar endtry 2622a6296200SBram Moolenaar endtry 2623a6296200SBram Moolenaar endtry 2624a6296200SBram Moolenaar call assert_report('should not get here') 2625a6296200SBram Moolenaar [CODE] 2626a6296200SBram Moolenaar let verify =<< trim [CODE] 2627a6296200SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 2628a6296200SBram Moolenaar [CODE] 2629a6296200SBram Moolenaar call RunInNewVim(test, verify) 2630a6296200SBram Moolenaarendfunc 2631a6296200SBram Moolenaar 2632a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2633a6296200SBram Moolenaar" Test 49: Throwing exceptions across functions {{{1 2634a6296200SBram Moolenaar" 2635a6296200SBram Moolenaar" When an exception is thrown but not caught inside a function, the 2636a6296200SBram Moolenaar" caller is checked for a matching :catch clause. 2637a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2638a6296200SBram Moolenaar 2639a6296200SBram Moolenaarfunc T49_C() 2640a6296200SBram Moolenaar try 2641a6296200SBram Moolenaar Xpath 'a' 2642a6296200SBram Moolenaar throw "arrgh" 2643a6296200SBram Moolenaar call assert_report('should not get here') 2644a6296200SBram Moolenaar catch /arrgh/ 2645a6296200SBram Moolenaar Xpath 'b' 2646a6296200SBram Moolenaar endtry 2647a6296200SBram Moolenaar Xpath 'c' 2648a6296200SBram Moolenaarendfunc 2649a6296200SBram Moolenaar 2650a6296200SBram Moolenaarfunc T49_T1() 2651a6296200SBram Moolenaar XloopNEXT 2652a6296200SBram Moolenaar try 2653a6296200SBram Moolenaar Xloop 'd' 2654a6296200SBram Moolenaar throw "arrgh" 2655a6296200SBram Moolenaar call assert_report('should not get here') 2656a6296200SBram Moolenaar finally 2657a6296200SBram Moolenaar Xloop 'e' 2658a6296200SBram Moolenaar endtry 2659a6296200SBram Moolenaar Xloop 'f' 2660a6296200SBram Moolenaarendfunc 2661a6296200SBram Moolenaar 2662a6296200SBram Moolenaarfunc T49_T2() 2663a6296200SBram Moolenaar try 2664a6296200SBram Moolenaar Xpath 'g' 2665a6296200SBram Moolenaar call T49_T1() 2666a6296200SBram Moolenaar call assert_report('should not get here') 2667a6296200SBram Moolenaar finally 2668a6296200SBram Moolenaar Xpath 'h' 2669a6296200SBram Moolenaar endtry 2670a6296200SBram Moolenaar call assert_report('should not get here') 2671a6296200SBram Moolenaarendfunc 2672a6296200SBram Moolenaar 2673a6296200SBram Moolenaarfunc Test_throw_exception_across_funcs() 2674a6296200SBram Moolenaar XpathINIT 2675a6296200SBram Moolenaar XloopINIT 2676a6296200SBram Moolenaar try 2677a6296200SBram Moolenaar Xpath 'i' 2678a6296200SBram Moolenaar call T49_C() " throw and catch 2679a6296200SBram Moolenaar Xpath 'j' 2680a6296200SBram Moolenaar catch /.*/ 2681a6296200SBram Moolenaar call assert_report('should not get here') 2682a6296200SBram Moolenaar endtry 2683a6296200SBram Moolenaar 2684a6296200SBram Moolenaar try 2685a6296200SBram Moolenaar Xpath 'k' 2686a6296200SBram Moolenaar call T49_T1() " throw, one level 2687a6296200SBram Moolenaar call assert_report('should not get here') 2688a6296200SBram Moolenaar catch /arrgh/ 2689a6296200SBram Moolenaar Xpath 'l' 2690a6296200SBram Moolenaar catch /.*/ 2691a6296200SBram Moolenaar call assert_report('should not get here') 2692a6296200SBram Moolenaar endtry 2693a6296200SBram Moolenaar 2694a6296200SBram Moolenaar try 2695a6296200SBram Moolenaar Xpath 'm' 2696a6296200SBram Moolenaar call T49_T2() " throw, two levels 2697a6296200SBram Moolenaar call assert_report('should not get here') 2698a6296200SBram Moolenaar catch /arrgh/ 2699a6296200SBram Moolenaar Xpath 'n' 2700a6296200SBram Moolenaar catch /.*/ 2701a6296200SBram Moolenaar call assert_report('should not get here') 2702a6296200SBram Moolenaar endtry 2703a6296200SBram Moolenaar Xpath 'o' 2704a6296200SBram Moolenaar 2705a6296200SBram Moolenaar call assert_equal('iabcjkd2e2lmgd3e3hno', g:Xpath) 2706a6296200SBram Moolenaarendfunc 2707a6296200SBram Moolenaar 2708a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2709a6296200SBram Moolenaar" Test 50: Throwing exceptions across script files {{{1 2710a6296200SBram Moolenaar" 2711a6296200SBram Moolenaar" When an exception is thrown but not caught inside a script file, 2712a6296200SBram Moolenaar" the sourcing script or function is checked for a matching :catch 2713a6296200SBram Moolenaar" clause. 2714a6296200SBram Moolenaar" 2715a6296200SBram Moolenaar" This test executes the bodies of the functions C, T1, and T2 from 2716a6296200SBram Moolenaar" the previous test as script files (:return replaced by :finish). 2717a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2718a6296200SBram Moolenaar 2719a6296200SBram Moolenaarfunc T50_F() 2720a6296200SBram Moolenaar try 2721a6296200SBram Moolenaar Xpath 'A' 2722a6296200SBram Moolenaar exec "source" g:scriptC 2723a6296200SBram Moolenaar Xpath 'B' 2724a6296200SBram Moolenaar catch /.*/ 2725a6296200SBram Moolenaar call assert_report('should not get here') 2726a6296200SBram Moolenaar endtry 2727a6296200SBram Moolenaar 2728a6296200SBram Moolenaar try 2729a6296200SBram Moolenaar Xpath 'C' 2730a6296200SBram Moolenaar exec "source" g:scriptT1 2731a6296200SBram Moolenaar call assert_report('should not get here') 2732a6296200SBram Moolenaar catch /arrgh/ 2733a6296200SBram Moolenaar Xpath 'D' 2734a6296200SBram Moolenaar catch /.*/ 2735a6296200SBram Moolenaar call assert_report('should not get here') 2736a6296200SBram Moolenaar endtry 2737a6296200SBram Moolenaarendfunc 2738a6296200SBram Moolenaar 2739a6296200SBram Moolenaarfunc Test_throw_across_script() 2740a6296200SBram Moolenaar XpathINIT 2741a6296200SBram Moolenaar XloopINIT 2742a6296200SBram Moolenaar let g:scriptC = MakeScript("T49_C") 2743a6296200SBram Moolenaar let g:scriptT1 = MakeScript("T49_T1") 2744a6296200SBram Moolenaar let scriptT2 = MakeScript("T49_T2", g:scriptT1) 2745a6296200SBram Moolenaar 2746a6296200SBram Moolenaar try 2747a6296200SBram Moolenaar Xpath 'E' 2748a6296200SBram Moolenaar call T50_F() 2749a6296200SBram Moolenaar Xpath 'F' 2750a6296200SBram Moolenaar exec "source" scriptT2 2751a6296200SBram Moolenaar call assert_report('should not get here') 2752a6296200SBram Moolenaar catch /arrgh/ 2753a6296200SBram Moolenaar Xpath 'G' 2754a6296200SBram Moolenaar catch /.*/ 2755a6296200SBram Moolenaar call assert_report('should not get here') 2756a6296200SBram Moolenaar endtry 2757a6296200SBram Moolenaar Xpath 'H' 2758a6296200SBram Moolenaar call assert_equal('EAabcBCd2e2DFgd3e3hGH', g:Xpath) 2759a6296200SBram Moolenaar 2760a6296200SBram Moolenaar call delete(g:scriptC) 2761a6296200SBram Moolenaar call delete(g:scriptT1) 2762a6296200SBram Moolenaar call delete(scriptT2) 2763a6296200SBram Moolenaar unlet g:scriptC g:scriptT1 scriptT2 2764a6296200SBram Moolenaarendfunc 2765a6296200SBram Moolenaar 27661f068233SBram Moolenaar"------------------------------------------------------------------------------- 2767*9470a4d8SBram Moolenaar" Test 52: Uncaught exceptions {{{1 2768*9470a4d8SBram Moolenaar" 2769*9470a4d8SBram Moolenaar" When an exception is thrown but not caught, an error message is 2770*9470a4d8SBram Moolenaar" displayed when the script is terminated. In case of an interrupt 2771*9470a4d8SBram Moolenaar" or error exception, the normal interrupt or error message(s) are 2772*9470a4d8SBram Moolenaar" displayed. 2773*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 2774*9470a4d8SBram Moolenaar 2775*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_1() 2776*9470a4d8SBram Moolenaar CheckEnglish 2777*9470a4d8SBram Moolenaar 2778*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2779*9470a4d8SBram Moolenaar Xpath 'a' 2780*9470a4d8SBram Moolenaar throw "arrgh" 2781*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2782*9470a4d8SBram Moolenaar [CODE] 2783*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2784*9470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: arrgh', v:errmsg) 2785*9470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 2786*9470a4d8SBram Moolenaar [CODE] 2787*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2788*9470a4d8SBram Moolenaarendfunc 2789*9470a4d8SBram Moolenaar 2790*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_2() 2791*9470a4d8SBram Moolenaar CheckEnglish 2792*9470a4d8SBram Moolenaar 2793*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2794*9470a4d8SBram Moolenaar try 2795*9470a4d8SBram Moolenaar Xpath 'a' 2796*9470a4d8SBram Moolenaar throw "oops" 2797*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2798*9470a4d8SBram Moolenaar catch /arrgh/ 2799*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2800*9470a4d8SBram Moolenaar endtry 2801*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2802*9470a4d8SBram Moolenaar [CODE] 2803*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2804*9470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: oops', v:errmsg) 2805*9470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 2806*9470a4d8SBram Moolenaar [CODE] 2807*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2808*9470a4d8SBram Moolenaarendfunc 2809*9470a4d8SBram Moolenaar 2810*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_3() 2811*9470a4d8SBram Moolenaar CheckEnglish 2812*9470a4d8SBram Moolenaar 2813*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2814*9470a4d8SBram Moolenaar func T() 2815*9470a4d8SBram Moolenaar Xpath 'c' 2816*9470a4d8SBram Moolenaar throw "brrr" 2817*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2818*9470a4d8SBram Moolenaar endfunc 2819*9470a4d8SBram Moolenaar 2820*9470a4d8SBram Moolenaar try 2821*9470a4d8SBram Moolenaar Xpath 'a' 2822*9470a4d8SBram Moolenaar throw "arrgh" 2823*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2824*9470a4d8SBram Moolenaar catch /.*/ 2825*9470a4d8SBram Moolenaar Xpath 'b' 2826*9470a4d8SBram Moolenaar call T() 2827*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2828*9470a4d8SBram Moolenaar endtry 2829*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2830*9470a4d8SBram Moolenaar [CODE] 2831*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2832*9470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: brrr', v:errmsg) 2833*9470a4d8SBram Moolenaar call assert_equal('abc', g:Xpath) 2834*9470a4d8SBram Moolenaar [CODE] 2835*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2836*9470a4d8SBram Moolenaarendfunc 2837*9470a4d8SBram Moolenaar 2838*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_4() 2839*9470a4d8SBram Moolenaar CheckEnglish 2840*9470a4d8SBram Moolenaar 2841*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2842*9470a4d8SBram Moolenaar try 2843*9470a4d8SBram Moolenaar Xpath 'a' 2844*9470a4d8SBram Moolenaar throw "arrgh" 2845*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2846*9470a4d8SBram Moolenaar finally 2847*9470a4d8SBram Moolenaar Xpath 'b' 2848*9470a4d8SBram Moolenaar throw "brrr" 2849*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2850*9470a4d8SBram Moolenaar endtry 2851*9470a4d8SBram Moolenaar call assert_report('should not get here')` 2852*9470a4d8SBram Moolenaar [CODE] 2853*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2854*9470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: brrr', v:errmsg) 2855*9470a4d8SBram Moolenaar call assert_equal('ab', g:Xpath) 2856*9470a4d8SBram Moolenaar [CODE] 2857*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2858*9470a4d8SBram Moolenaarendfunc 2859*9470a4d8SBram Moolenaar 2860*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_5() 2861*9470a4d8SBram Moolenaar CheckEnglish 2862*9470a4d8SBram Moolenaar 2863*9470a4d8SBram Moolenaar " Need to catch and handle interrupt, otherwise the test will wait for the 2864*9470a4d8SBram Moolenaar " user to press <Enter> to continue 2865*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2866*9470a4d8SBram Moolenaar try 2867*9470a4d8SBram Moolenaar try 2868*9470a4d8SBram Moolenaar Xpath 'a' 2869*9470a4d8SBram Moolenaar call interrupt() 2870*9470a4d8SBram Moolenaar call assert_report('should not get here') 2871*9470a4d8SBram Moolenaar endtry 2872*9470a4d8SBram Moolenaar call assert_report('should not get here') 2873*9470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 2874*9470a4d8SBram Moolenaar Xpath 'b' 2875*9470a4d8SBram Moolenaar endtry 2876*9470a4d8SBram Moolenaar [CODE] 2877*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2878*9470a4d8SBram Moolenaar call assert_equal('ab', g:Xpath) 2879*9470a4d8SBram Moolenaar [CODE] 2880*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2881*9470a4d8SBram Moolenaarendfunc 2882*9470a4d8SBram Moolenaar 2883*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_6() 2884*9470a4d8SBram Moolenaar CheckEnglish 2885*9470a4d8SBram Moolenaar 2886*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2887*9470a4d8SBram Moolenaar try 2888*9470a4d8SBram Moolenaar Xpath 'a' 2889*9470a4d8SBram Moolenaar let x = novar " error E121; exception: E121 2890*9470a4d8SBram Moolenaar catch /E15:/ " should not catch 2891*9470a4d8SBram Moolenaar call assert_report('should not get here') 2892*9470a4d8SBram Moolenaar endtry 2893*9470a4d8SBram Moolenaar call assert_report('should not get here') 2894*9470a4d8SBram Moolenaar [CODE] 2895*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2896*9470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 2897*9470a4d8SBram Moolenaar call assert_equal('E121: Undefined variable: novar', v:errmsg) 2898*9470a4d8SBram Moolenaar [CODE] 2899*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2900*9470a4d8SBram Moolenaarendfunc 2901*9470a4d8SBram Moolenaar 2902*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_7() 2903*9470a4d8SBram Moolenaar CheckEnglish 2904*9470a4d8SBram Moolenaar 2905*9470a4d8SBram Moolenaar let test =<< trim [CODE] 2906*9470a4d8SBram Moolenaar try 2907*9470a4d8SBram Moolenaar Xpath 'a' 2908*9470a4d8SBram Moolenaar " error E108/E488; exception: E488 2909*9470a4d8SBram Moolenaar unlet novar # 2910*9470a4d8SBram Moolenaar catch /E108:/ " should not catch 2911*9470a4d8SBram Moolenaar call assert_report('should not get here') 2912*9470a4d8SBram Moolenaar endtry 2913*9470a4d8SBram Moolenaar call assert_report('should not get here') 2914*9470a4d8SBram Moolenaar [CODE] 2915*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 2916*9470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 2917*9470a4d8SBram Moolenaar call assert_equal('E488: Trailing characters: #', v:errmsg) 2918*9470a4d8SBram Moolenaar [CODE] 2919*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 2920*9470a4d8SBram Moolenaarendfunc 2921*9470a4d8SBram Moolenaar 2922*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 2923*9470a4d8SBram Moolenaar" Test 53: Nesting errors: :endif/:else/:elseif {{{1 2924*9470a4d8SBram Moolenaar" 2925*9470a4d8SBram Moolenaar" For nesting errors of :if conditionals the correct error messages 2926*9470a4d8SBram Moolenaar" should be given. 2927*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 2928*9470a4d8SBram Moolenaar 2929*9470a4d8SBram Moolenaarfunc Test_nested_if_else_errors() 2930*9470a4d8SBram Moolenaar CheckEnglish 2931*9470a4d8SBram Moolenaar 2932*9470a4d8SBram Moolenaar " :endif without :if 2933*9470a4d8SBram Moolenaar let code =<< trim END 2934*9470a4d8SBram Moolenaar endif 2935*9470a4d8SBram Moolenaar END 2936*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2937*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 2938*9470a4d8SBram Moolenaar 2939*9470a4d8SBram Moolenaar " :endif without :if 2940*9470a4d8SBram Moolenaar let code =<< trim END 2941*9470a4d8SBram Moolenaar while 1 2942*9470a4d8SBram Moolenaar endif 2943*9470a4d8SBram Moolenaar endwhile 2944*9470a4d8SBram Moolenaar END 2945*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2946*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 2947*9470a4d8SBram Moolenaar 2948*9470a4d8SBram Moolenaar " :endif without :if 2949*9470a4d8SBram Moolenaar let code =<< trim END 2950*9470a4d8SBram Moolenaar try 2951*9470a4d8SBram Moolenaar finally 2952*9470a4d8SBram Moolenaar endif 2953*9470a4d8SBram Moolenaar endtry 2954*9470a4d8SBram Moolenaar END 2955*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2956*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 2957*9470a4d8SBram Moolenaar 2958*9470a4d8SBram Moolenaar " :endif without :if 2959*9470a4d8SBram Moolenaar let code =<< trim END 2960*9470a4d8SBram Moolenaar try 2961*9470a4d8SBram Moolenaar endif 2962*9470a4d8SBram Moolenaar endtry 2963*9470a4d8SBram Moolenaar END 2964*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2965*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 2966*9470a4d8SBram Moolenaar 2967*9470a4d8SBram Moolenaar " :endif without :if 2968*9470a4d8SBram Moolenaar let code =<< trim END 2969*9470a4d8SBram Moolenaar try 2970*9470a4d8SBram Moolenaar throw "a" 2971*9470a4d8SBram Moolenaar catch /a/ 2972*9470a4d8SBram Moolenaar endif 2973*9470a4d8SBram Moolenaar endtry 2974*9470a4d8SBram Moolenaar END 2975*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2976*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 2977*9470a4d8SBram Moolenaar 2978*9470a4d8SBram Moolenaar " :else without :if 2979*9470a4d8SBram Moolenaar let code =<< trim END 2980*9470a4d8SBram Moolenaar else 2981*9470a4d8SBram Moolenaar END 2982*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2983*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 2984*9470a4d8SBram Moolenaar 2985*9470a4d8SBram Moolenaar " :else without :if 2986*9470a4d8SBram Moolenaar let code =<< trim END 2987*9470a4d8SBram Moolenaar while 1 2988*9470a4d8SBram Moolenaar else 2989*9470a4d8SBram Moolenaar endwhile 2990*9470a4d8SBram Moolenaar END 2991*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 2992*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 2993*9470a4d8SBram Moolenaar 2994*9470a4d8SBram Moolenaar " :else without :if 2995*9470a4d8SBram Moolenaar let code =<< trim END 2996*9470a4d8SBram Moolenaar try 2997*9470a4d8SBram Moolenaar finally 2998*9470a4d8SBram Moolenaar else 2999*9470a4d8SBram Moolenaar endtry 3000*9470a4d8SBram Moolenaar END 3001*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3002*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 3003*9470a4d8SBram Moolenaar 3004*9470a4d8SBram Moolenaar " :else without :if 3005*9470a4d8SBram Moolenaar let code =<< trim END 3006*9470a4d8SBram Moolenaar try 3007*9470a4d8SBram Moolenaar else 3008*9470a4d8SBram Moolenaar endtry 3009*9470a4d8SBram Moolenaar END 3010*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3011*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 3012*9470a4d8SBram Moolenaar 3013*9470a4d8SBram Moolenaar " :else without :if 3014*9470a4d8SBram Moolenaar let code =<< trim END 3015*9470a4d8SBram Moolenaar try 3016*9470a4d8SBram Moolenaar throw "a" 3017*9470a4d8SBram Moolenaar catch /a/ 3018*9470a4d8SBram Moolenaar else 3019*9470a4d8SBram Moolenaar endtry 3020*9470a4d8SBram Moolenaar END 3021*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3022*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 3023*9470a4d8SBram Moolenaar 3024*9470a4d8SBram Moolenaar " :elseif without :if 3025*9470a4d8SBram Moolenaar let code =<< trim END 3026*9470a4d8SBram Moolenaar elseif 3027*9470a4d8SBram Moolenaar END 3028*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3029*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 3030*9470a4d8SBram Moolenaar 3031*9470a4d8SBram Moolenaar " :elseif without :if 3032*9470a4d8SBram Moolenaar let code =<< trim END 3033*9470a4d8SBram Moolenaar while 1 3034*9470a4d8SBram Moolenaar elseif 3035*9470a4d8SBram Moolenaar endwhile 3036*9470a4d8SBram Moolenaar END 3037*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3038*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 3039*9470a4d8SBram Moolenaar 3040*9470a4d8SBram Moolenaar " :elseif without :if 3041*9470a4d8SBram Moolenaar let code =<< trim END 3042*9470a4d8SBram Moolenaar try 3043*9470a4d8SBram Moolenaar finally 3044*9470a4d8SBram Moolenaar elseif 3045*9470a4d8SBram Moolenaar endtry 3046*9470a4d8SBram Moolenaar END 3047*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3048*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 3049*9470a4d8SBram Moolenaar 3050*9470a4d8SBram Moolenaar " :elseif without :if 3051*9470a4d8SBram Moolenaar let code =<< trim END 3052*9470a4d8SBram Moolenaar try 3053*9470a4d8SBram Moolenaar elseif 3054*9470a4d8SBram Moolenaar endtry 3055*9470a4d8SBram Moolenaar END 3056*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3057*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 3058*9470a4d8SBram Moolenaar 3059*9470a4d8SBram Moolenaar " :elseif without :if 3060*9470a4d8SBram Moolenaar let code =<< trim END 3061*9470a4d8SBram Moolenaar try 3062*9470a4d8SBram Moolenaar throw "a" 3063*9470a4d8SBram Moolenaar catch /a/ 3064*9470a4d8SBram Moolenaar elseif 3065*9470a4d8SBram Moolenaar endtry 3066*9470a4d8SBram Moolenaar END 3067*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3068*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 3069*9470a4d8SBram Moolenaar 3070*9470a4d8SBram Moolenaar " multiple :else 3071*9470a4d8SBram Moolenaar let code =<< trim END 3072*9470a4d8SBram Moolenaar if 1 3073*9470a4d8SBram Moolenaar else 3074*9470a4d8SBram Moolenaar else 3075*9470a4d8SBram Moolenaar endif 3076*9470a4d8SBram Moolenaar END 3077*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3078*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E583: multiple :else') 3079*9470a4d8SBram Moolenaar 3080*9470a4d8SBram Moolenaar " :elseif after :else 3081*9470a4d8SBram Moolenaar let code =<< trim END 3082*9470a4d8SBram Moolenaar if 1 3083*9470a4d8SBram Moolenaar else 3084*9470a4d8SBram Moolenaar elseif 1 3085*9470a4d8SBram Moolenaar endif 3086*9470a4d8SBram Moolenaar END 3087*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3088*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E584: :elseif after :else') 3089*9470a4d8SBram Moolenaar 3090*9470a4d8SBram Moolenaar call delete('Xtest') 3091*9470a4d8SBram Moolenaarendfunc 3092*9470a4d8SBram Moolenaar 3093*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3094*9470a4d8SBram Moolenaar" Test 54: Nesting errors: :while/:endwhile {{{1 3095*9470a4d8SBram Moolenaar" 3096*9470a4d8SBram Moolenaar" For nesting errors of :while conditionals the correct error messages 3097*9470a4d8SBram Moolenaar" should be given. 3098*9470a4d8SBram Moolenaar" 3099*9470a4d8SBram Moolenaar" This test reuses the function MESSAGES() from the previous test. 3100*9470a4d8SBram Moolenaar" This functions checks the messages in g:msgfile. 3101*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3102*9470a4d8SBram Moolenaar 3103*9470a4d8SBram Moolenaarfunc Test_nested_while_error() 3104*9470a4d8SBram Moolenaar CheckEnglish 3105*9470a4d8SBram Moolenaar 3106*9470a4d8SBram Moolenaar " :endwhile without :while 3107*9470a4d8SBram Moolenaar let code =<< trim END 3108*9470a4d8SBram Moolenaar endwhile 3109*9470a4d8SBram Moolenaar END 3110*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3111*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3112*9470a4d8SBram Moolenaar 3113*9470a4d8SBram Moolenaar " :endwhile without :while 3114*9470a4d8SBram Moolenaar let code =<< trim END 3115*9470a4d8SBram Moolenaar if 1 3116*9470a4d8SBram Moolenaar endwhile 3117*9470a4d8SBram Moolenaar endif 3118*9470a4d8SBram Moolenaar END 3119*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3120*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3121*9470a4d8SBram Moolenaar 3122*9470a4d8SBram Moolenaar " Missing :endif 3123*9470a4d8SBram Moolenaar let code =<< trim END 3124*9470a4d8SBram Moolenaar while 1 3125*9470a4d8SBram Moolenaar if 1 3126*9470a4d8SBram Moolenaar endwhile 3127*9470a4d8SBram Moolenaar END 3128*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3129*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif') 3130*9470a4d8SBram Moolenaar 3131*9470a4d8SBram Moolenaar " :endwhile without :while 3132*9470a4d8SBram Moolenaar let code =<< trim END 3133*9470a4d8SBram Moolenaar try 3134*9470a4d8SBram Moolenaar finally 3135*9470a4d8SBram Moolenaar endwhile 3136*9470a4d8SBram Moolenaar endtry 3137*9470a4d8SBram Moolenaar END 3138*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3139*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3140*9470a4d8SBram Moolenaar 3141*9470a4d8SBram Moolenaar " Missing :endtry 3142*9470a4d8SBram Moolenaar let code =<< trim END 3143*9470a4d8SBram Moolenaar while 1 3144*9470a4d8SBram Moolenaar try 3145*9470a4d8SBram Moolenaar finally 3146*9470a4d8SBram Moolenaar endwhile 3147*9470a4d8SBram Moolenaar END 3148*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3149*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry') 3150*9470a4d8SBram Moolenaar 3151*9470a4d8SBram Moolenaar " Missing :endtry 3152*9470a4d8SBram Moolenaar let code =<< trim END 3153*9470a4d8SBram Moolenaar while 1 3154*9470a4d8SBram Moolenaar if 1 3155*9470a4d8SBram Moolenaar try 3156*9470a4d8SBram Moolenaar finally 3157*9470a4d8SBram Moolenaar endwhile 3158*9470a4d8SBram Moolenaar END 3159*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3160*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry') 3161*9470a4d8SBram Moolenaar 3162*9470a4d8SBram Moolenaar " Missing :endif 3163*9470a4d8SBram Moolenaar let code =<< trim END 3164*9470a4d8SBram Moolenaar while 1 3165*9470a4d8SBram Moolenaar try 3166*9470a4d8SBram Moolenaar finally 3167*9470a4d8SBram Moolenaar if 1 3168*9470a4d8SBram Moolenaar endwhile 3169*9470a4d8SBram Moolenaar END 3170*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3171*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif') 3172*9470a4d8SBram Moolenaar 3173*9470a4d8SBram Moolenaar " :endwhile without :while 3174*9470a4d8SBram Moolenaar let code =<< trim END 3175*9470a4d8SBram Moolenaar try 3176*9470a4d8SBram Moolenaar endwhile 3177*9470a4d8SBram Moolenaar endtry 3178*9470a4d8SBram Moolenaar END 3179*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3180*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3181*9470a4d8SBram Moolenaar 3182*9470a4d8SBram Moolenaar " :endwhile without :while 3183*9470a4d8SBram Moolenaar let code =<< trim END 3184*9470a4d8SBram Moolenaar while 1 3185*9470a4d8SBram Moolenaar try 3186*9470a4d8SBram Moolenaar endwhile 3187*9470a4d8SBram Moolenaar endtry 3188*9470a4d8SBram Moolenaar endwhile 3189*9470a4d8SBram Moolenaar END 3190*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3191*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3192*9470a4d8SBram Moolenaar 3193*9470a4d8SBram Moolenaar " :endwhile without :while 3194*9470a4d8SBram Moolenaar let code =<< trim END 3195*9470a4d8SBram Moolenaar try 3196*9470a4d8SBram Moolenaar throw "a" 3197*9470a4d8SBram Moolenaar catch /a/ 3198*9470a4d8SBram Moolenaar endwhile 3199*9470a4d8SBram Moolenaar endtry 3200*9470a4d8SBram Moolenaar END 3201*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3202*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3203*9470a4d8SBram Moolenaar 3204*9470a4d8SBram Moolenaar " :endwhile without :while 3205*9470a4d8SBram Moolenaar let code =<< trim END 3206*9470a4d8SBram Moolenaar while 1 3207*9470a4d8SBram Moolenaar try 3208*9470a4d8SBram Moolenaar throw "a" 3209*9470a4d8SBram Moolenaar catch /a/ 3210*9470a4d8SBram Moolenaar endwhile 3211*9470a4d8SBram Moolenaar endtry 3212*9470a4d8SBram Moolenaar endwhile 3213*9470a4d8SBram Moolenaar END 3214*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3215*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 3216*9470a4d8SBram Moolenaar 3217*9470a4d8SBram Moolenaar call delete('Xtest') 3218*9470a4d8SBram Moolenaarendfunc 3219*9470a4d8SBram Moolenaar 3220*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3221*9470a4d8SBram Moolenaar" Test 55: Nesting errors: :continue/:break {{{1 3222*9470a4d8SBram Moolenaar" 3223*9470a4d8SBram Moolenaar" For nesting errors of :continue and :break commands the correct 3224*9470a4d8SBram Moolenaar" error messages should be given. 3225*9470a4d8SBram Moolenaar" 3226*9470a4d8SBram Moolenaar" This test reuses the function MESSAGES() from the previous test. 3227*9470a4d8SBram Moolenaar" This functions checks the messages in g:msgfile. 3228*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3229*9470a4d8SBram Moolenaar 3230*9470a4d8SBram Moolenaarfunc Test_nested_cont_break_error() 3231*9470a4d8SBram Moolenaar CheckEnglish 3232*9470a4d8SBram Moolenaar 3233*9470a4d8SBram Moolenaar " :continue without :while 3234*9470a4d8SBram Moolenaar let code =<< trim END 3235*9470a4d8SBram Moolenaar continue 3236*9470a4d8SBram Moolenaar END 3237*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3238*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 3239*9470a4d8SBram Moolenaar 3240*9470a4d8SBram Moolenaar " :continue without :while 3241*9470a4d8SBram Moolenaar let code =<< trim END 3242*9470a4d8SBram Moolenaar if 1 3243*9470a4d8SBram Moolenaar continue 3244*9470a4d8SBram Moolenaar endif 3245*9470a4d8SBram Moolenaar END 3246*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3247*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 3248*9470a4d8SBram Moolenaar 3249*9470a4d8SBram Moolenaar " :continue without :while 3250*9470a4d8SBram Moolenaar let code =<< trim END 3251*9470a4d8SBram Moolenaar try 3252*9470a4d8SBram Moolenaar finally 3253*9470a4d8SBram Moolenaar continue 3254*9470a4d8SBram Moolenaar endtry 3255*9470a4d8SBram Moolenaar END 3256*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3257*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 3258*9470a4d8SBram Moolenaar 3259*9470a4d8SBram Moolenaar " :continue without :while 3260*9470a4d8SBram Moolenaar let code =<< trim END 3261*9470a4d8SBram Moolenaar try 3262*9470a4d8SBram Moolenaar continue 3263*9470a4d8SBram Moolenaar endtry 3264*9470a4d8SBram Moolenaar END 3265*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3266*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 3267*9470a4d8SBram Moolenaar 3268*9470a4d8SBram Moolenaar " :continue without :while 3269*9470a4d8SBram Moolenaar let code =<< trim END 3270*9470a4d8SBram Moolenaar try 3271*9470a4d8SBram Moolenaar throw "a" 3272*9470a4d8SBram Moolenaar catch /a/ 3273*9470a4d8SBram Moolenaar continue 3274*9470a4d8SBram Moolenaar endtry 3275*9470a4d8SBram Moolenaar END 3276*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3277*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 3278*9470a4d8SBram Moolenaar 3279*9470a4d8SBram Moolenaar " :break without :while 3280*9470a4d8SBram Moolenaar let code =<< trim END 3281*9470a4d8SBram Moolenaar break 3282*9470a4d8SBram Moolenaar END 3283*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3284*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 3285*9470a4d8SBram Moolenaar 3286*9470a4d8SBram Moolenaar " :break without :while 3287*9470a4d8SBram Moolenaar let code =<< trim END 3288*9470a4d8SBram Moolenaar if 1 3289*9470a4d8SBram Moolenaar break 3290*9470a4d8SBram Moolenaar endif 3291*9470a4d8SBram Moolenaar END 3292*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3293*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 3294*9470a4d8SBram Moolenaar 3295*9470a4d8SBram Moolenaar " :break without :while 3296*9470a4d8SBram Moolenaar let code =<< trim END 3297*9470a4d8SBram Moolenaar try 3298*9470a4d8SBram Moolenaar finally 3299*9470a4d8SBram Moolenaar break 3300*9470a4d8SBram Moolenaar endtry 3301*9470a4d8SBram Moolenaar END 3302*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3303*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 3304*9470a4d8SBram Moolenaar 3305*9470a4d8SBram Moolenaar " :break without :while 3306*9470a4d8SBram Moolenaar let code =<< trim END 3307*9470a4d8SBram Moolenaar try 3308*9470a4d8SBram Moolenaar break 3309*9470a4d8SBram Moolenaar endtry 3310*9470a4d8SBram Moolenaar END 3311*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3312*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 3313*9470a4d8SBram Moolenaar 3314*9470a4d8SBram Moolenaar " :break without :while 3315*9470a4d8SBram Moolenaar let code =<< trim END 3316*9470a4d8SBram Moolenaar try 3317*9470a4d8SBram Moolenaar throw "a" 3318*9470a4d8SBram Moolenaar catch /a/ 3319*9470a4d8SBram Moolenaar break 3320*9470a4d8SBram Moolenaar endtry 3321*9470a4d8SBram Moolenaar END 3322*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3323*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 3324*9470a4d8SBram Moolenaar 3325*9470a4d8SBram Moolenaar call delete('Xtest') 3326*9470a4d8SBram Moolenaarendfunc 3327*9470a4d8SBram Moolenaar 3328*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3329*9470a4d8SBram Moolenaar" Test 56: Nesting errors: :endtry {{{1 3330*9470a4d8SBram Moolenaar" 3331*9470a4d8SBram Moolenaar" For nesting errors of :try conditionals the correct error messages 3332*9470a4d8SBram Moolenaar" should be given. 3333*9470a4d8SBram Moolenaar" 3334*9470a4d8SBram Moolenaar" This test reuses the function MESSAGES() from the previous test. 3335*9470a4d8SBram Moolenaar" This functions checks the messages in g:msgfile. 3336*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3337*9470a4d8SBram Moolenaar 3338*9470a4d8SBram Moolenaarfunc Test_nested_endtry_error() 3339*9470a4d8SBram Moolenaar CheckEnglish 3340*9470a4d8SBram Moolenaar 3341*9470a4d8SBram Moolenaar " :endtry without :try 3342*9470a4d8SBram Moolenaar let code =<< trim END 3343*9470a4d8SBram Moolenaar endtry 3344*9470a4d8SBram Moolenaar END 3345*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3346*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try') 3347*9470a4d8SBram Moolenaar 3348*9470a4d8SBram Moolenaar " :endtry without :try 3349*9470a4d8SBram Moolenaar let code =<< trim END 3350*9470a4d8SBram Moolenaar if 1 3351*9470a4d8SBram Moolenaar endtry 3352*9470a4d8SBram Moolenaar endif 3353*9470a4d8SBram Moolenaar END 3354*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3355*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try') 3356*9470a4d8SBram Moolenaar 3357*9470a4d8SBram Moolenaar " :endtry without :try 3358*9470a4d8SBram Moolenaar let code =<< trim END 3359*9470a4d8SBram Moolenaar while 1 3360*9470a4d8SBram Moolenaar endtry 3361*9470a4d8SBram Moolenaar endwhile 3362*9470a4d8SBram Moolenaar END 3363*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3364*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try') 3365*9470a4d8SBram Moolenaar 3366*9470a4d8SBram Moolenaar " Missing :endif 3367*9470a4d8SBram Moolenaar let code =<< trim END 3368*9470a4d8SBram Moolenaar try 3369*9470a4d8SBram Moolenaar if 1 3370*9470a4d8SBram Moolenaar endtry 3371*9470a4d8SBram Moolenaar END 3372*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3373*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif') 3374*9470a4d8SBram Moolenaar 3375*9470a4d8SBram Moolenaar " Missing :endwhile 3376*9470a4d8SBram Moolenaar let code =<< trim END 3377*9470a4d8SBram Moolenaar try 3378*9470a4d8SBram Moolenaar while 1 3379*9470a4d8SBram Moolenaar endtry 3380*9470a4d8SBram Moolenaar END 3381*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3382*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile') 3383*9470a4d8SBram Moolenaar 3384*9470a4d8SBram Moolenaar " Missing :endif 3385*9470a4d8SBram Moolenaar let code =<< trim END 3386*9470a4d8SBram Moolenaar try 3387*9470a4d8SBram Moolenaar finally 3388*9470a4d8SBram Moolenaar if 1 3389*9470a4d8SBram Moolenaar endtry 3390*9470a4d8SBram Moolenaar END 3391*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3392*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif') 3393*9470a4d8SBram Moolenaar 3394*9470a4d8SBram Moolenaar " Missing :endwhile 3395*9470a4d8SBram Moolenaar let code =<< trim END 3396*9470a4d8SBram Moolenaar try 3397*9470a4d8SBram Moolenaar finally 3398*9470a4d8SBram Moolenaar while 1 3399*9470a4d8SBram Moolenaar endtry 3400*9470a4d8SBram Moolenaar END 3401*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3402*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile') 3403*9470a4d8SBram Moolenaar 3404*9470a4d8SBram Moolenaar " Missing :endif 3405*9470a4d8SBram Moolenaar let code =<< trim END 3406*9470a4d8SBram Moolenaar try 3407*9470a4d8SBram Moolenaar throw "a" 3408*9470a4d8SBram Moolenaar catch /a/ 3409*9470a4d8SBram Moolenaar if 1 3410*9470a4d8SBram Moolenaar endtry 3411*9470a4d8SBram Moolenaar END 3412*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3413*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif') 3414*9470a4d8SBram Moolenaar 3415*9470a4d8SBram Moolenaar " Missing :endwhile 3416*9470a4d8SBram Moolenaar let code =<< trim END 3417*9470a4d8SBram Moolenaar try 3418*9470a4d8SBram Moolenaar throw "a" 3419*9470a4d8SBram Moolenaar catch /a/ 3420*9470a4d8SBram Moolenaar while 1 3421*9470a4d8SBram Moolenaar endtry 3422*9470a4d8SBram Moolenaar END 3423*9470a4d8SBram Moolenaar call writefile(code, 'Xtest') 3424*9470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile') 3425*9470a4d8SBram Moolenaar 3426*9470a4d8SBram Moolenaar call delete('Xtest') 3427*9470a4d8SBram Moolenaarendfunc 3428*9470a4d8SBram Moolenaar 3429*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3430*9470a4d8SBram Moolenaar" Test 57: v:exception and v:throwpoint for user exceptions {{{1 3431*9470a4d8SBram Moolenaar" 3432*9470a4d8SBram Moolenaar" v:exception evaluates to the value of the exception that was caught 3433*9470a4d8SBram Moolenaar" most recently and is not finished. (A caught exception is finished 3434*9470a4d8SBram Moolenaar" when the next ":catch", ":finally", or ":endtry" is reached.) 3435*9470a4d8SBram Moolenaar" v:throwpoint evaluates to the script/function name and line number 3436*9470a4d8SBram Moolenaar" where that exception has been thrown. 3437*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3438*9470a4d8SBram Moolenaar 3439*9470a4d8SBram Moolenaarfunc Test_user_exception_info() 3440*9470a4d8SBram Moolenaar CheckEnglish 3441*9470a4d8SBram Moolenaar 3442*9470a4d8SBram Moolenaar XpathINIT 3443*9470a4d8SBram Moolenaar XloopINIT 3444*9470a4d8SBram Moolenaar 3445*9470a4d8SBram Moolenaar func FuncException() 3446*9470a4d8SBram Moolenaar let g:exception = v:exception 3447*9470a4d8SBram Moolenaar endfunc 3448*9470a4d8SBram Moolenaar 3449*9470a4d8SBram Moolenaar func FuncThrowpoint() 3450*9470a4d8SBram Moolenaar let g:throwpoint = v:throwpoint 3451*9470a4d8SBram Moolenaar endfunc 3452*9470a4d8SBram Moolenaar 3453*9470a4d8SBram Moolenaar let scriptException = MakeScript("FuncException") 3454*9470a4d8SBram Moolenaar let scriptThrowPoint = MakeScript("FuncThrowpoint") 3455*9470a4d8SBram Moolenaar 3456*9470a4d8SBram Moolenaar command! CmdException let g:exception = v:exception 3457*9470a4d8SBram Moolenaar command! CmdThrowpoint let g:throwpoint = v:throwpoint 3458*9470a4d8SBram Moolenaar 3459*9470a4d8SBram Moolenaar func T(arg, line) 3460*9470a4d8SBram Moolenaar if a:line == 2 3461*9470a4d8SBram Moolenaar throw a:arg " in line 2 3462*9470a4d8SBram Moolenaar elseif a:line == 4 3463*9470a4d8SBram Moolenaar throw a:arg " in line 4 3464*9470a4d8SBram Moolenaar elseif a:line == 6 3465*9470a4d8SBram Moolenaar throw a:arg " in line 6 3466*9470a4d8SBram Moolenaar elseif a:line == 8 3467*9470a4d8SBram Moolenaar throw a:arg " in line 8 3468*9470a4d8SBram Moolenaar endif 3469*9470a4d8SBram Moolenaar endfunc 3470*9470a4d8SBram Moolenaar 3471*9470a4d8SBram Moolenaar func G(arg, line) 3472*9470a4d8SBram Moolenaar call T(a:arg, a:line) 3473*9470a4d8SBram Moolenaar endfunc 3474*9470a4d8SBram Moolenaar 3475*9470a4d8SBram Moolenaar func F(arg, line) 3476*9470a4d8SBram Moolenaar call G(a:arg, a:line) 3477*9470a4d8SBram Moolenaar endfunc 3478*9470a4d8SBram Moolenaar 3479*9470a4d8SBram Moolenaar let scriptT = MakeScript("T") 3480*9470a4d8SBram Moolenaar let scriptG = MakeScript("G", scriptT) 3481*9470a4d8SBram Moolenaar let scriptF = MakeScript("F", scriptG) 3482*9470a4d8SBram Moolenaar 3483*9470a4d8SBram Moolenaar try 3484*9470a4d8SBram Moolenaar Xpath 'a' 3485*9470a4d8SBram Moolenaar call F("oops", 2) 3486*9470a4d8SBram Moolenaar catch /.*/ 3487*9470a4d8SBram Moolenaar Xpath 'b' 3488*9470a4d8SBram Moolenaar let exception = v:exception 3489*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3490*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3491*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3492*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3493*9470a4d8SBram Moolenaar 3494*9470a4d8SBram Moolenaar exec "let exception = v:exception" 3495*9470a4d8SBram Moolenaar exec "let throwpoint = v:throwpoint" 3496*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3497*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3498*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3499*9470a4d8SBram Moolenaar 3500*9470a4d8SBram Moolenaar CmdException 3501*9470a4d8SBram Moolenaar CmdThrowpoint 3502*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3503*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3504*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3505*9470a4d8SBram Moolenaar 3506*9470a4d8SBram Moolenaar call FuncException() 3507*9470a4d8SBram Moolenaar call FuncThrowpoint() 3508*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3509*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3510*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3511*9470a4d8SBram Moolenaar 3512*9470a4d8SBram Moolenaar exec "source" scriptException 3513*9470a4d8SBram Moolenaar exec "source" scriptThrowPoint 3514*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3515*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3516*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3517*9470a4d8SBram Moolenaar 3518*9470a4d8SBram Moolenaar try 3519*9470a4d8SBram Moolenaar Xpath 'c' 3520*9470a4d8SBram Moolenaar call G("arrgh", 4) 3521*9470a4d8SBram Moolenaar catch /.*/ 3522*9470a4d8SBram Moolenaar Xpath 'd' 3523*9470a4d8SBram Moolenaar let exception = v:exception 3524*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3525*9470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 3526*9470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 3527*9470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 3528*9470a4d8SBram Moolenaar 3529*9470a4d8SBram Moolenaar try 3530*9470a4d8SBram Moolenaar Xpath 'e' 3531*9470a4d8SBram Moolenaar let g:arg = "autsch" 3532*9470a4d8SBram Moolenaar let g:line = 6 3533*9470a4d8SBram Moolenaar exec "source" scriptF 3534*9470a4d8SBram Moolenaar catch /.*/ 3535*9470a4d8SBram Moolenaar Xpath 'f' 3536*9470a4d8SBram Moolenaar let exception = v:exception 3537*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3538*9470a4d8SBram Moolenaar call assert_equal("autsch", v:exception) 3539*9470a4d8SBram Moolenaar call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint) 3540*9470a4d8SBram Moolenaar call assert_match('\<6\>', v:throwpoint) 3541*9470a4d8SBram Moolenaar finally 3542*9470a4d8SBram Moolenaar Xpath 'g' 3543*9470a4d8SBram Moolenaar let exception = v:exception 3544*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3545*9470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 3546*9470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 3547*9470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 3548*9470a4d8SBram Moolenaar try 3549*9470a4d8SBram Moolenaar Xpath 'h' 3550*9470a4d8SBram Moolenaar let g:arg = "brrrr" 3551*9470a4d8SBram Moolenaar let g:line = 8 3552*9470a4d8SBram Moolenaar exec "source" scriptG 3553*9470a4d8SBram Moolenaar catch /.*/ 3554*9470a4d8SBram Moolenaar Xpath 'i' 3555*9470a4d8SBram Moolenaar let exception = v:exception 3556*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3557*9470a4d8SBram Moolenaar " Resolve scriptT for matching it against v:throwpoint. 3558*9470a4d8SBram Moolenaar call assert_equal("brrrr", v:exception) 3559*9470a4d8SBram Moolenaar call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint) 3560*9470a4d8SBram Moolenaar call assert_match('\<8\>', v:throwpoint) 3561*9470a4d8SBram Moolenaar finally 3562*9470a4d8SBram Moolenaar Xpath 'j' 3563*9470a4d8SBram Moolenaar let exception = v:exception 3564*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3565*9470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 3566*9470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 3567*9470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 3568*9470a4d8SBram Moolenaar endtry 3569*9470a4d8SBram Moolenaar Xpath 'k' 3570*9470a4d8SBram Moolenaar let exception = v:exception 3571*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3572*9470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 3573*9470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 3574*9470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 3575*9470a4d8SBram Moolenaar endtry 3576*9470a4d8SBram Moolenaar Xpath 'l' 3577*9470a4d8SBram Moolenaar let exception = v:exception 3578*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3579*9470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 3580*9470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 3581*9470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 3582*9470a4d8SBram Moolenaar finally 3583*9470a4d8SBram Moolenaar Xpath 'm' 3584*9470a4d8SBram Moolenaar let exception = v:exception 3585*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3586*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3587*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3588*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3589*9470a4d8SBram Moolenaar endtry 3590*9470a4d8SBram Moolenaar Xpath 'n' 3591*9470a4d8SBram Moolenaar let exception = v:exception 3592*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3593*9470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 3594*9470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 3595*9470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 3596*9470a4d8SBram Moolenaar finally 3597*9470a4d8SBram Moolenaar Xpath 'o' 3598*9470a4d8SBram Moolenaar let exception = v:exception 3599*9470a4d8SBram Moolenaar let throwpoint = v:throwpoint 3600*9470a4d8SBram Moolenaar call assert_equal("", v:exception) 3601*9470a4d8SBram Moolenaar call assert_match('^$', v:throwpoint) 3602*9470a4d8SBram Moolenaar call assert_match('^$', v:throwpoint) 3603*9470a4d8SBram Moolenaar endtry 3604*9470a4d8SBram Moolenaar 3605*9470a4d8SBram Moolenaar call assert_equal('abcdefghijklmno', g:Xpath) 3606*9470a4d8SBram Moolenaar 3607*9470a4d8SBram Moolenaar unlet exception throwpoint 3608*9470a4d8SBram Moolenaar delfunction FuncException 3609*9470a4d8SBram Moolenaar delfunction FuncThrowpoint 3610*9470a4d8SBram Moolenaar call delete(scriptException) 3611*9470a4d8SBram Moolenaar call delete(scriptThrowPoint) 3612*9470a4d8SBram Moolenaar unlet scriptException scriptThrowPoint 3613*9470a4d8SBram Moolenaar delcommand CmdException 3614*9470a4d8SBram Moolenaar delcommand CmdThrowpoint 3615*9470a4d8SBram Moolenaar delfunction T 3616*9470a4d8SBram Moolenaar delfunction G 3617*9470a4d8SBram Moolenaar delfunction F 3618*9470a4d8SBram Moolenaar call delete(scriptT) 3619*9470a4d8SBram Moolenaar call delete(scriptG) 3620*9470a4d8SBram Moolenaar call delete(scriptF) 3621*9470a4d8SBram Moolenaar unlet scriptT scriptG scriptF 3622*9470a4d8SBram Moolenaarendfunc 3623*9470a4d8SBram Moolenaar 3624*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3625*9470a4d8SBram Moolenaar" 3626*9470a4d8SBram Moolenaar" Test 58: v:exception and v:throwpoint for error/interrupt exceptions {{{1 3627*9470a4d8SBram Moolenaar" 3628*9470a4d8SBram Moolenaar" v:exception and v:throwpoint work also for error and interrupt 3629*9470a4d8SBram Moolenaar" exceptions. 3630*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3631*9470a4d8SBram Moolenaar 3632*9470a4d8SBram Moolenaarfunc Test_execption_info_for_error() 3633*9470a4d8SBram Moolenaar CheckEnglish 3634*9470a4d8SBram Moolenaar 3635*9470a4d8SBram Moolenaar let test =<< trim [CODE] 3636*9470a4d8SBram Moolenaar func T(line) 3637*9470a4d8SBram Moolenaar if a:line == 2 3638*9470a4d8SBram Moolenaar delfunction T " error (function in use) in line 2 3639*9470a4d8SBram Moolenaar elseif a:line == 4 3640*9470a4d8SBram Moolenaar call interrupt() 3641*9470a4d8SBram Moolenaar endif 3642*9470a4d8SBram Moolenaar endfunc 3643*9470a4d8SBram Moolenaar 3644*9470a4d8SBram Moolenaar while 1 3645*9470a4d8SBram Moolenaar try 3646*9470a4d8SBram Moolenaar Xpath 'a' 3647*9470a4d8SBram Moolenaar call T(2) 3648*9470a4d8SBram Moolenaar call assert_report('should not get here') 3649*9470a4d8SBram Moolenaar catch /.*/ 3650*9470a4d8SBram Moolenaar Xpath 'b' 3651*9470a4d8SBram Moolenaar if v:exception !~ 'Vim(delfunction):' 3652*9470a4d8SBram Moolenaar call assert_report('should not get here') 3653*9470a4d8SBram Moolenaar endif 3654*9470a4d8SBram Moolenaar if v:throwpoint !~ '\<T\>' 3655*9470a4d8SBram Moolenaar call assert_report('should not get here') 3656*9470a4d8SBram Moolenaar endif 3657*9470a4d8SBram Moolenaar if v:throwpoint !~ '\<2\>' 3658*9470a4d8SBram Moolenaar call assert_report('should not get here') 3659*9470a4d8SBram Moolenaar endif 3660*9470a4d8SBram Moolenaar finally 3661*9470a4d8SBram Moolenaar Xpath 'c' 3662*9470a4d8SBram Moolenaar if v:exception != "" 3663*9470a4d8SBram Moolenaar call assert_report('should not get here') 3664*9470a4d8SBram Moolenaar endif 3665*9470a4d8SBram Moolenaar if v:throwpoint != "" 3666*9470a4d8SBram Moolenaar call assert_report('should not get here') 3667*9470a4d8SBram Moolenaar endif 3668*9470a4d8SBram Moolenaar break 3669*9470a4d8SBram Moolenaar endtry 3670*9470a4d8SBram Moolenaar endwhile 3671*9470a4d8SBram Moolenaar 3672*9470a4d8SBram Moolenaar Xpath 'd' 3673*9470a4d8SBram Moolenaar if v:exception != "" 3674*9470a4d8SBram Moolenaar call assert_report('should not get here') 3675*9470a4d8SBram Moolenaar endif 3676*9470a4d8SBram Moolenaar if v:throwpoint != "" 3677*9470a4d8SBram Moolenaar call assert_report('should not get here') 3678*9470a4d8SBram Moolenaar endif 3679*9470a4d8SBram Moolenaar 3680*9470a4d8SBram Moolenaar while 1 3681*9470a4d8SBram Moolenaar try 3682*9470a4d8SBram Moolenaar Xpath 'e' 3683*9470a4d8SBram Moolenaar call T(4) 3684*9470a4d8SBram Moolenaar call assert_report('should not get here') 3685*9470a4d8SBram Moolenaar catch /.*/ 3686*9470a4d8SBram Moolenaar Xpath 'f' 3687*9470a4d8SBram Moolenaar if v:exception != 'Vim:Interrupt' 3688*9470a4d8SBram Moolenaar call assert_report('should not get here') 3689*9470a4d8SBram Moolenaar endif 3690*9470a4d8SBram Moolenaar if v:throwpoint !~ 'function T' 3691*9470a4d8SBram Moolenaar call assert_report('should not get here') 3692*9470a4d8SBram Moolenaar endif 3693*9470a4d8SBram Moolenaar if v:throwpoint !~ '\<4\>' 3694*9470a4d8SBram Moolenaar call assert_report('should not get here') 3695*9470a4d8SBram Moolenaar endif 3696*9470a4d8SBram Moolenaar finally 3697*9470a4d8SBram Moolenaar Xpath 'g' 3698*9470a4d8SBram Moolenaar if v:exception != "" 3699*9470a4d8SBram Moolenaar call assert_report('should not get here') 3700*9470a4d8SBram Moolenaar endif 3701*9470a4d8SBram Moolenaar if v:throwpoint != "" 3702*9470a4d8SBram Moolenaar call assert_report('should not get here') 3703*9470a4d8SBram Moolenaar endif 3704*9470a4d8SBram Moolenaar break 3705*9470a4d8SBram Moolenaar endtry 3706*9470a4d8SBram Moolenaar endwhile 3707*9470a4d8SBram Moolenaar 3708*9470a4d8SBram Moolenaar Xpath 'h' 3709*9470a4d8SBram Moolenaar if v:exception != "" 3710*9470a4d8SBram Moolenaar call assert_report('should not get here') 3711*9470a4d8SBram Moolenaar endif 3712*9470a4d8SBram Moolenaar if v:throwpoint != "" 3713*9470a4d8SBram Moolenaar call assert_report('should not get here') 3714*9470a4d8SBram Moolenaar endif 3715*9470a4d8SBram Moolenaar [CODE] 3716*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 3717*9470a4d8SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 3718*9470a4d8SBram Moolenaar [CODE] 3719*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 3720*9470a4d8SBram Moolenaarendfunc 3721*9470a4d8SBram Moolenaar 3722*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3723*9470a4d8SBram Moolenaar" Test 61: Catching interrupt exceptions {{{1 3724*9470a4d8SBram Moolenaar" 3725*9470a4d8SBram Moolenaar" When an interrupt occurs inside a :try/:endtry region, an 3726*9470a4d8SBram Moolenaar" interrupt exception is thrown and can be caught. Its value is 3727*9470a4d8SBram Moolenaar" "Vim:Interrupt". If the interrupt occurs after an error or a :throw 3728*9470a4d8SBram Moolenaar" but before a matching :catch is reached, all following :catches of 3729*9470a4d8SBram Moolenaar" that try block are ignored, but the interrupt exception can be 3730*9470a4d8SBram Moolenaar" caught by the next surrounding try conditional. An interrupt is 3731*9470a4d8SBram Moolenaar" ignored when there is a previous interrupt that has not been caught 3732*9470a4d8SBram Moolenaar" or causes a :finally clause to be executed. 3733*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3734*9470a4d8SBram Moolenaar 3735*9470a4d8SBram Moolenaarfunc Test_catch_intr_exception() 3736*9470a4d8SBram Moolenaar let test =<< trim [CODE] 3737*9470a4d8SBram Moolenaar while 1 3738*9470a4d8SBram Moolenaar try 3739*9470a4d8SBram Moolenaar try 3740*9470a4d8SBram Moolenaar Xpath 'a' 3741*9470a4d8SBram Moolenaar call interrupt() 3742*9470a4d8SBram Moolenaar call assert_report('should not get here') 3743*9470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 3744*9470a4d8SBram Moolenaar Xpath 'b' 3745*9470a4d8SBram Moolenaar finally 3746*9470a4d8SBram Moolenaar Xpath 'c' 3747*9470a4d8SBram Moolenaar endtry 3748*9470a4d8SBram Moolenaar catch /.*/ 3749*9470a4d8SBram Moolenaar call assert_report('should not get here') 3750*9470a4d8SBram Moolenaar finally 3751*9470a4d8SBram Moolenaar Xpath 'd' 3752*9470a4d8SBram Moolenaar break 3753*9470a4d8SBram Moolenaar endtry 3754*9470a4d8SBram Moolenaar endwhile 3755*9470a4d8SBram Moolenaar 3756*9470a4d8SBram Moolenaar while 1 3757*9470a4d8SBram Moolenaar try 3758*9470a4d8SBram Moolenaar try 3759*9470a4d8SBram Moolenaar try 3760*9470a4d8SBram Moolenaar Xpath 'e' 3761*9470a4d8SBram Moolenaar asdf 3762*9470a4d8SBram Moolenaar call assert_report('should not get here') 3763*9470a4d8SBram Moolenaar catch /do_not_catch/ 3764*9470a4d8SBram Moolenaar call assert_report('should not get here') 3765*9470a4d8SBram Moolenaar catch /.*/ 3766*9470a4d8SBram Moolenaar Xpath 'f' 3767*9470a4d8SBram Moolenaar call interrupt() 3768*9470a4d8SBram Moolenaar call assert_report('should not get here') 3769*9470a4d8SBram Moolenaar catch /.*/ 3770*9470a4d8SBram Moolenaar call assert_report('should not get here') 3771*9470a4d8SBram Moolenaar finally 3772*9470a4d8SBram Moolenaar Xpath 'g' 3773*9470a4d8SBram Moolenaar call interrupt() 3774*9470a4d8SBram Moolenaar call assert_report('should not get here') 3775*9470a4d8SBram Moolenaar endtry 3776*9470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 3777*9470a4d8SBram Moolenaar Xpath 'h' 3778*9470a4d8SBram Moolenaar finally 3779*9470a4d8SBram Moolenaar Xpath 'i' 3780*9470a4d8SBram Moolenaar endtry 3781*9470a4d8SBram Moolenaar catch /.*/ 3782*9470a4d8SBram Moolenaar call assert_report('should not get here') 3783*9470a4d8SBram Moolenaar finally 3784*9470a4d8SBram Moolenaar Xpath 'j' 3785*9470a4d8SBram Moolenaar break 3786*9470a4d8SBram Moolenaar endtry 3787*9470a4d8SBram Moolenaar endwhile 3788*9470a4d8SBram Moolenaar 3789*9470a4d8SBram Moolenaar while 1 3790*9470a4d8SBram Moolenaar try 3791*9470a4d8SBram Moolenaar try 3792*9470a4d8SBram Moolenaar try 3793*9470a4d8SBram Moolenaar Xpath 'k' 3794*9470a4d8SBram Moolenaar throw "x" 3795*9470a4d8SBram Moolenaar call assert_report('should not get here') 3796*9470a4d8SBram Moolenaar catch /do_not_catch/ 3797*9470a4d8SBram Moolenaar call assert_report('should not get here') 3798*9470a4d8SBram Moolenaar catch /x/ 3799*9470a4d8SBram Moolenaar Xpath 'l' 3800*9470a4d8SBram Moolenaar call interrupt() 3801*9470a4d8SBram Moolenaar call assert_report('should not get here') 3802*9470a4d8SBram Moolenaar catch /.*/ 3803*9470a4d8SBram Moolenaar call assert_report('should not get here') 3804*9470a4d8SBram Moolenaar endtry 3805*9470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 3806*9470a4d8SBram Moolenaar Xpath 'm' 3807*9470a4d8SBram Moolenaar finally 3808*9470a4d8SBram Moolenaar Xpath 'n' 3809*9470a4d8SBram Moolenaar endtry 3810*9470a4d8SBram Moolenaar catch /.*/ 3811*9470a4d8SBram Moolenaar call assert_report('should not get here') 3812*9470a4d8SBram Moolenaar finally 3813*9470a4d8SBram Moolenaar Xpath 'o' 3814*9470a4d8SBram Moolenaar break 3815*9470a4d8SBram Moolenaar endtry 3816*9470a4d8SBram Moolenaar endwhile 3817*9470a4d8SBram Moolenaar 3818*9470a4d8SBram Moolenaar while 1 3819*9470a4d8SBram Moolenaar try 3820*9470a4d8SBram Moolenaar try 3821*9470a4d8SBram Moolenaar Xpath 'p' 3822*9470a4d8SBram Moolenaar call interrupt() 3823*9470a4d8SBram Moolenaar call assert_report('should not get here') 3824*9470a4d8SBram Moolenaar catch /do_not_catch/ 3825*9470a4d8SBram Moolenaar call interrupt() 3826*9470a4d8SBram Moolenaar call assert_report('should not get here') 3827*9470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 3828*9470a4d8SBram Moolenaar Xpath 'q' 3829*9470a4d8SBram Moolenaar finally 3830*9470a4d8SBram Moolenaar Xpath 'r' 3831*9470a4d8SBram Moolenaar endtry 3832*9470a4d8SBram Moolenaar catch /.*/ 3833*9470a4d8SBram Moolenaar call assert_report('should not get here') 3834*9470a4d8SBram Moolenaar finally 3835*9470a4d8SBram Moolenaar Xpath 's' 3836*9470a4d8SBram Moolenaar break 3837*9470a4d8SBram Moolenaar endtry 3838*9470a4d8SBram Moolenaar endwhile 3839*9470a4d8SBram Moolenaar 3840*9470a4d8SBram Moolenaar Xpath 't' 3841*9470a4d8SBram Moolenaar [CODE] 3842*9470a4d8SBram Moolenaar let verify =<< trim [CODE] 3843*9470a4d8SBram Moolenaar call assert_equal('abcdefghijklmnopqrst', g:Xpath) 3844*9470a4d8SBram Moolenaar [CODE] 3845*9470a4d8SBram Moolenaar call RunInNewVim(test, verify) 3846*9470a4d8SBram Moolenaarendfunc 3847*9470a4d8SBram Moolenaar 3848*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3849*9470a4d8SBram Moolenaar" Test 65: Errors in the /pattern/ argument of a :catch {{{1 3850*9470a4d8SBram Moolenaar" 3851*9470a4d8SBram Moolenaar" On an error in the /pattern/ argument of a :catch, the :catch does 3852*9470a4d8SBram Moolenaar" not match. Any following :catches of the same :try/:endtry don't 3853*9470a4d8SBram Moolenaar" match either. Finally clauses are executed. 3854*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3855*9470a4d8SBram Moolenaar 3856*9470a4d8SBram Moolenaarfunc Test_catch_pattern_error() 3857*9470a4d8SBram Moolenaar CheckEnglish 3858*9470a4d8SBram Moolenaar XpathINIT 3859*9470a4d8SBram Moolenaar 3860*9470a4d8SBram Moolenaar try 3861*9470a4d8SBram Moolenaar try 3862*9470a4d8SBram Moolenaar Xpath 'a' 3863*9470a4d8SBram Moolenaar throw "oops" 3864*9470a4d8SBram Moolenaar catch /^oops$/ 3865*9470a4d8SBram Moolenaar Xpath 'b' 3866*9470a4d8SBram Moolenaar catch /\)/ " not checked; exception has already been caught 3867*9470a4d8SBram Moolenaar call assert_report('should not get here') 3868*9470a4d8SBram Moolenaar endtry 3869*9470a4d8SBram Moolenaar Xpath 'c' 3870*9470a4d8SBram Moolenaar catch /.*/ 3871*9470a4d8SBram Moolenaar call assert_report('should not get here') 3872*9470a4d8SBram Moolenaar endtry 3873*9470a4d8SBram Moolenaar call assert_equal('abc', g:Xpath) 3874*9470a4d8SBram Moolenaar 3875*9470a4d8SBram Moolenaar XpathINIT 3876*9470a4d8SBram Moolenaar func F() 3877*9470a4d8SBram Moolenaar try 3878*9470a4d8SBram Moolenaar try 3879*9470a4d8SBram Moolenaar try 3880*9470a4d8SBram Moolenaar Xpath 'a' 3881*9470a4d8SBram Moolenaar throw "ab" 3882*9470a4d8SBram Moolenaar catch /abc/ " does not catch 3883*9470a4d8SBram Moolenaar call assert_report('should not get here') 3884*9470a4d8SBram Moolenaar catch /\)/ " error; discards exception 3885*9470a4d8SBram Moolenaar call assert_report('should not get here') 3886*9470a4d8SBram Moolenaar catch /.*/ " not checked 3887*9470a4d8SBram Moolenaar call assert_report('should not get here') 3888*9470a4d8SBram Moolenaar finally 3889*9470a4d8SBram Moolenaar Xpath 'b' 3890*9470a4d8SBram Moolenaar endtry 3891*9470a4d8SBram Moolenaar call assert_report('should not get here') 3892*9470a4d8SBram Moolenaar catch /^ab$/ " checked, but original exception is discarded 3893*9470a4d8SBram Moolenaar call assert_report('should not get here') 3894*9470a4d8SBram Moolenaar catch /^Vim(catch):/ 3895*9470a4d8SBram Moolenaar Xpath 'c' 3896*9470a4d8SBram Moolenaar call assert_match('Vim(catch):E475: Invalid argument:', v:exception) 3897*9470a4d8SBram Moolenaar finally 3898*9470a4d8SBram Moolenaar Xpath 'd' 3899*9470a4d8SBram Moolenaar endtry 3900*9470a4d8SBram Moolenaar Xpath 'e' 3901*9470a4d8SBram Moolenaar catch /.*/ 3902*9470a4d8SBram Moolenaar call assert_report('should not get here') 3903*9470a4d8SBram Moolenaar endtry 3904*9470a4d8SBram Moolenaar Xpath 'f' 3905*9470a4d8SBram Moolenaar endfunc 3906*9470a4d8SBram Moolenaar 3907*9470a4d8SBram Moolenaar call F() 3908*9470a4d8SBram Moolenaar call assert_equal('abcdef', g:Xpath) 3909*9470a4d8SBram Moolenaar 3910*9470a4d8SBram Moolenaar delfunc F 3911*9470a4d8SBram Moolenaarendfunc 3912*9470a4d8SBram Moolenaar 3913*9470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 39141f068233SBram Moolenaar" Test 87 using (expr) ? funcref : funcref {{{1 39151f068233SBram Moolenaar" 39161f068233SBram Moolenaar" Vim needs to correctly parse the funcref and even when it does 39171f068233SBram Moolenaar" not execute the funcref, it needs to consume the trailing () 39181f068233SBram Moolenaar"------------------------------------------------------------------------------- 39191f068233SBram Moolenaar 39201f068233SBram Moolenaarfunc Add2(x1, x2) 39211f068233SBram Moolenaar return a:x1 + a:x2 39221f068233SBram Moolenaarendfu 39231f068233SBram Moolenaar 39241f068233SBram Moolenaarfunc GetStr() 39251f068233SBram Moolenaar return "abcdefghijklmnopqrstuvwxyp" 39261f068233SBram Moolenaarendfu 39271f068233SBram Moolenaar 39281f068233SBram Moolenaarfunc Test_funcref_with_condexpr() 39291f068233SBram Moolenaar call assert_equal(5, function('Add2')(2,3)) 39301f068233SBram Moolenaar 39311f068233SBram Moolenaar call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3)) 39321f068233SBram Moolenaar call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3)) 39331f068233SBram Moolenaar " Make sure, GetStr() still works. 39341f068233SBram Moolenaar call assert_equal('abcdefghijk', GetStr()[0:10]) 39351f068233SBram Moolenaarendfunc 39361f068233SBram Moolenaar 3937b544f3c8SBram Moolenaar" Test 90: Recognizing {} in variable name. {{{1 3938b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3939b544f3c8SBram Moolenaar 3940b544f3c8SBram Moolenaarfunc Test_curlies() 3941b544f3c8SBram Moolenaar let s:var = 66 3942b544f3c8SBram Moolenaar let ns = 's' 3943b544f3c8SBram Moolenaar call assert_equal(66, {ns}:var) 3944b544f3c8SBram Moolenaar 3945b544f3c8SBram Moolenaar let g:a = {} 3946b544f3c8SBram Moolenaar let g:b = 't' 3947b544f3c8SBram Moolenaar let g:a[g:b] = 77 3948b544f3c8SBram Moolenaar call assert_equal(77, g:a['t']) 3949b544f3c8SBram Moolenaarendfunc 3950b544f3c8SBram Moolenaar 3951b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3952b544f3c8SBram Moolenaar" Test 91: using type(). {{{1 3953b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3954b544f3c8SBram Moolenaar 3955b544f3c8SBram Moolenaarfunc Test_type() 3956b544f3c8SBram Moolenaar call assert_equal(0, type(0)) 3957b544f3c8SBram Moolenaar call assert_equal(1, type("")) 3958b544f3c8SBram Moolenaar call assert_equal(2, type(function("tr"))) 3959b544f3c8SBram Moolenaar call assert_equal(2, type(function("tr", [8]))) 3960b544f3c8SBram Moolenaar call assert_equal(3, type([])) 3961b544f3c8SBram Moolenaar call assert_equal(4, type({})) 39625feabe00SBram Moolenaar if has('float') 3963b544f3c8SBram Moolenaar call assert_equal(5, type(0.0)) 39645feabe00SBram Moolenaar endif 3965b544f3c8SBram Moolenaar call assert_equal(6, type(v:false)) 3966b544f3c8SBram Moolenaar call assert_equal(6, type(v:true)) 3967b544f3c8SBram Moolenaar call assert_equal(7, type(v:none)) 3968b544f3c8SBram Moolenaar call assert_equal(7, type(v:null)) 3969b544f3c8SBram Moolenaar call assert_equal(8, v:t_job) 3970b544f3c8SBram Moolenaar call assert_equal(9, v:t_channel) 3971b544f3c8SBram Moolenaar call assert_equal(v:t_number, type(0)) 3972b544f3c8SBram Moolenaar call assert_equal(v:t_string, type("")) 3973b544f3c8SBram Moolenaar call assert_equal(v:t_func, type(function("tr"))) 3974b544f3c8SBram Moolenaar call assert_equal(v:t_func, type(function("tr", [8]))) 3975b544f3c8SBram Moolenaar call assert_equal(v:t_list, type([])) 3976b544f3c8SBram Moolenaar call assert_equal(v:t_dict, type({})) 39775feabe00SBram Moolenaar if has('float') 3978b544f3c8SBram Moolenaar call assert_equal(v:t_float, type(0.0)) 39795feabe00SBram Moolenaar endif 3980b544f3c8SBram Moolenaar call assert_equal(v:t_bool, type(v:false)) 3981b544f3c8SBram Moolenaar call assert_equal(v:t_bool, type(v:true)) 3982b544f3c8SBram Moolenaar call assert_equal(v:t_none, type(v:none)) 3983b544f3c8SBram Moolenaar call assert_equal(v:t_none, type(v:null)) 398492b83ccfSBram Moolenaar call assert_equal(v:t_string, type(test_null_string())) 398592b83ccfSBram Moolenaar call assert_equal(v:t_func, type(test_null_function())) 398692b83ccfSBram Moolenaar call assert_equal(v:t_func, type(test_null_partial())) 398792b83ccfSBram Moolenaar call assert_equal(v:t_list, type(test_null_list())) 398892b83ccfSBram Moolenaar call assert_equal(v:t_dict, type(test_null_dict())) 398992b83ccfSBram Moolenaar if has('job') 399092b83ccfSBram Moolenaar call assert_equal(v:t_job, type(test_null_job())) 399192b83ccfSBram Moolenaar endif 399292b83ccfSBram Moolenaar if has('channel') 399392b83ccfSBram Moolenaar call assert_equal(v:t_channel, type(test_null_channel())) 399492b83ccfSBram Moolenaar endif 399592b83ccfSBram Moolenaar call assert_equal(v:t_blob, type(test_null_blob())) 3996b544f3c8SBram Moolenaar 39977c215c58SBram Moolenaar call assert_fails("call type(test_void())", 'E685:') 39987c215c58SBram Moolenaar call assert_fails("call type(test_unknown())", 'E685:') 3999b544f3c8SBram Moolenaar 4000b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:false) 4001b544f3c8SBram Moolenaar call assert_equal(1, 0 + v:true) 4002b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:none) 4003b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:null) 4004b544f3c8SBram Moolenaar 4005b544f3c8SBram Moolenaar call assert_equal('v:false', '' . v:false) 4006b544f3c8SBram Moolenaar call assert_equal('v:true', '' . v:true) 4007b544f3c8SBram Moolenaar call assert_equal('v:none', '' . v:none) 4008b544f3c8SBram Moolenaar call assert_equal('v:null', '' . v:null) 4009b544f3c8SBram Moolenaar 4010b544f3c8SBram Moolenaar call assert_true(v:false == 0) 4011b544f3c8SBram Moolenaar call assert_false(v:false != 0) 4012b544f3c8SBram Moolenaar call assert_true(v:true == 1) 4013b544f3c8SBram Moolenaar call assert_false(v:true != 1) 4014b544f3c8SBram Moolenaar call assert_false(v:true == v:false) 4015b544f3c8SBram Moolenaar call assert_true(v:true != v:false) 4016b544f3c8SBram Moolenaar 4017b544f3c8SBram Moolenaar call assert_true(v:null == 0) 4018b544f3c8SBram Moolenaar call assert_false(v:null != 0) 4019b544f3c8SBram Moolenaar call assert_true(v:none == 0) 4020b544f3c8SBram Moolenaar call assert_false(v:none != 0) 4021b544f3c8SBram Moolenaar 4022b544f3c8SBram Moolenaar call assert_true(v:false is v:false) 4023b544f3c8SBram Moolenaar call assert_true(v:true is v:true) 4024b544f3c8SBram Moolenaar call assert_true(v:none is v:none) 4025b544f3c8SBram Moolenaar call assert_true(v:null is v:null) 4026b544f3c8SBram Moolenaar 4027b544f3c8SBram Moolenaar call assert_false(v:false isnot v:false) 4028b544f3c8SBram Moolenaar call assert_false(v:true isnot v:true) 4029b544f3c8SBram Moolenaar call assert_false(v:none isnot v:none) 4030b544f3c8SBram Moolenaar call assert_false(v:null isnot v:null) 4031b544f3c8SBram Moolenaar 4032b544f3c8SBram Moolenaar call assert_false(v:false is 0) 4033b544f3c8SBram Moolenaar call assert_false(v:true is 1) 4034b544f3c8SBram Moolenaar call assert_false(v:true is v:false) 4035b544f3c8SBram Moolenaar call assert_false(v:none is 0) 4036b544f3c8SBram Moolenaar call assert_false(v:null is 0) 4037b544f3c8SBram Moolenaar call assert_false(v:null is v:none) 4038b544f3c8SBram Moolenaar 4039b544f3c8SBram Moolenaar call assert_true(v:false isnot 0) 4040b544f3c8SBram Moolenaar call assert_true(v:true isnot 1) 4041b544f3c8SBram Moolenaar call assert_true(v:true isnot v:false) 4042b544f3c8SBram Moolenaar call assert_true(v:none isnot 0) 4043b544f3c8SBram Moolenaar call assert_true(v:null isnot 0) 4044b544f3c8SBram Moolenaar call assert_true(v:null isnot v:none) 4045b544f3c8SBram Moolenaar 4046b544f3c8SBram Moolenaar call assert_equal(v:false, eval(string(v:false))) 4047b544f3c8SBram Moolenaar call assert_equal(v:true, eval(string(v:true))) 4048b544f3c8SBram Moolenaar call assert_equal(v:none, eval(string(v:none))) 4049b544f3c8SBram Moolenaar call assert_equal(v:null, eval(string(v:null))) 4050b544f3c8SBram Moolenaar 4051b544f3c8SBram Moolenaar call assert_equal(v:false, copy(v:false)) 4052b544f3c8SBram Moolenaar call assert_equal(v:true, copy(v:true)) 4053b544f3c8SBram Moolenaar call assert_equal(v:none, copy(v:none)) 4054b544f3c8SBram Moolenaar call assert_equal(v:null, copy(v:null)) 4055b544f3c8SBram Moolenaar 4056b544f3c8SBram Moolenaar call assert_equal([v:false], deepcopy([v:false])) 4057b544f3c8SBram Moolenaar call assert_equal([v:true], deepcopy([v:true])) 4058b544f3c8SBram Moolenaar call assert_equal([v:none], deepcopy([v:none])) 4059b544f3c8SBram Moolenaar call assert_equal([v:null], deepcopy([v:null])) 4060b544f3c8SBram Moolenaar 4061b544f3c8SBram Moolenaar call assert_true(empty(v:false)) 4062b544f3c8SBram Moolenaar call assert_false(empty(v:true)) 4063b544f3c8SBram Moolenaar call assert_true(empty(v:null)) 4064b544f3c8SBram Moolenaar call assert_true(empty(v:none)) 4065b544f3c8SBram Moolenaar 4066b544f3c8SBram Moolenaar func ChangeYourMind() 4067b544f3c8SBram Moolenaar try 4068b544f3c8SBram Moolenaar return v:true 4069b544f3c8SBram Moolenaar finally 4070b544f3c8SBram Moolenaar return 'something else' 4071b544f3c8SBram Moolenaar endtry 4072b544f3c8SBram Moolenaar endfunc 4073b544f3c8SBram Moolenaar 4074b544f3c8SBram Moolenaar call ChangeYourMind() 4075b544f3c8SBram Moolenaarendfunc 4076b544f3c8SBram Moolenaar 4077b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4078b544f3c8SBram Moolenaar" Test 92: skipping code {{{1 4079b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4080b544f3c8SBram Moolenaar 4081b544f3c8SBram Moolenaarfunc Test_skip() 4082b544f3c8SBram Moolenaar let Fn = function('Test_type') 4083b544f3c8SBram Moolenaar call assert_false(0 && Fn[1]) 4084b544f3c8SBram Moolenaar call assert_false(0 && string(Fn)) 4085b544f3c8SBram Moolenaar call assert_false(0 && len(Fn)) 4086b544f3c8SBram Moolenaar let l = [] 4087b544f3c8SBram Moolenaar call assert_false(0 && l[1]) 4088b544f3c8SBram Moolenaar call assert_false(0 && string(l)) 4089b544f3c8SBram Moolenaar call assert_false(0 && len(l)) 4090b544f3c8SBram Moolenaar let f = 1.0 4091b544f3c8SBram Moolenaar call assert_false(0 && f[1]) 4092b544f3c8SBram Moolenaar call assert_false(0 && string(f)) 4093b544f3c8SBram Moolenaar call assert_false(0 && len(f)) 4094b544f3c8SBram Moolenaar let sp = v:null 4095b544f3c8SBram Moolenaar call assert_false(0 && sp[1]) 4096b544f3c8SBram Moolenaar call assert_false(0 && string(sp)) 4097b544f3c8SBram Moolenaar call assert_false(0 && len(sp)) 4098b544f3c8SBram Moolenaar 4099b544f3c8SBram Moolenaarendfunc 4100b544f3c8SBram Moolenaar 4101b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4102b544f3c8SBram Moolenaar" Test 93: :echo and string() {{{1 4103b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4104b544f3c8SBram Moolenaar 4105b544f3c8SBram Moolenaarfunc Test_echo_and_string() 4106b544f3c8SBram Moolenaar " String 4107b544f3c8SBram Moolenaar let a = 'foo bar' 4108b544f3c8SBram Moolenaar redir => result 4109b544f3c8SBram Moolenaar echo a 4110b544f3c8SBram Moolenaar echo string(a) 4111b544f3c8SBram Moolenaar redir END 4112b544f3c8SBram Moolenaar let l = split(result, "\n") 4113b544f3c8SBram Moolenaar call assert_equal(["foo bar", 4114b544f3c8SBram Moolenaar \ "'foo bar'"], l) 4115b544f3c8SBram Moolenaar 4116b544f3c8SBram Moolenaar " Float 4117b544f3c8SBram Moolenaar if has('float') 4118b544f3c8SBram Moolenaar let a = -1.2e0 4119b544f3c8SBram Moolenaar redir => result 4120b544f3c8SBram Moolenaar echo a 4121b544f3c8SBram Moolenaar echo string(a) 4122b544f3c8SBram Moolenaar redir END 4123b544f3c8SBram Moolenaar let l = split(result, "\n") 4124b544f3c8SBram Moolenaar call assert_equal(["-1.2", 4125b544f3c8SBram Moolenaar \ "-1.2"], l) 4126b544f3c8SBram Moolenaar endif 4127b544f3c8SBram Moolenaar 4128b544f3c8SBram Moolenaar " Funcref 4129b544f3c8SBram Moolenaar redir => result 4130b544f3c8SBram Moolenaar echo function('string') 4131b544f3c8SBram Moolenaar echo string(function('string')) 4132b544f3c8SBram Moolenaar redir END 4133b544f3c8SBram Moolenaar let l = split(result, "\n") 4134b544f3c8SBram Moolenaar call assert_equal(["string", 4135b544f3c8SBram Moolenaar \ "function('string')"], l) 4136b544f3c8SBram Moolenaar 4137b544f3c8SBram Moolenaar " Recursive dictionary 4138b544f3c8SBram Moolenaar let a = {} 4139b544f3c8SBram Moolenaar let a["a"] = a 4140b544f3c8SBram Moolenaar redir => result 4141b544f3c8SBram Moolenaar echo a 4142b544f3c8SBram Moolenaar echo string(a) 4143b544f3c8SBram Moolenaar redir END 4144b544f3c8SBram Moolenaar let l = split(result, "\n") 4145b544f3c8SBram Moolenaar call assert_equal(["{'a': {...}}", 4146b544f3c8SBram Moolenaar \ "{'a': {...}}"], l) 4147b544f3c8SBram Moolenaar 4148b544f3c8SBram Moolenaar " Recursive list 4149b544f3c8SBram Moolenaar let a = [0] 4150b544f3c8SBram Moolenaar let a[0] = a 4151b544f3c8SBram Moolenaar redir => result 4152b544f3c8SBram Moolenaar echo a 4153b544f3c8SBram Moolenaar echo string(a) 4154b544f3c8SBram Moolenaar redir END 4155b544f3c8SBram Moolenaar let l = split(result, "\n") 4156b544f3c8SBram Moolenaar call assert_equal(["[[...]]", 4157b544f3c8SBram Moolenaar \ "[[...]]"], l) 4158b544f3c8SBram Moolenaar 4159b544f3c8SBram Moolenaar " Empty dictionaries in a list 4160b544f3c8SBram Moolenaar let a = {} 4161b544f3c8SBram Moolenaar redir => result 4162b544f3c8SBram Moolenaar echo [a, a, a] 4163b544f3c8SBram Moolenaar echo string([a, a, a]) 4164b544f3c8SBram Moolenaar redir END 4165b544f3c8SBram Moolenaar let l = split(result, "\n") 4166b544f3c8SBram Moolenaar call assert_equal(["[{}, {}, {}]", 4167b544f3c8SBram Moolenaar \ "[{}, {}, {}]"], l) 4168b544f3c8SBram Moolenaar 4169b544f3c8SBram Moolenaar " Empty dictionaries in a dictionary 4170b544f3c8SBram Moolenaar let a = {} 4171b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 4172b544f3c8SBram Moolenaar redir => result 4173b544f3c8SBram Moolenaar echo b 4174b544f3c8SBram Moolenaar echo string(b) 4175b544f3c8SBram Moolenaar redir END 4176b544f3c8SBram Moolenaar let l = split(result, "\n") 4177b544f3c8SBram Moolenaar call assert_equal(["{'a': {}, 'b': {}}", 4178b544f3c8SBram Moolenaar \ "{'a': {}, 'b': {}}"], l) 4179b544f3c8SBram Moolenaar 4180b544f3c8SBram Moolenaar " Empty lists in a list 4181b544f3c8SBram Moolenaar let a = [] 4182b544f3c8SBram Moolenaar redir => result 4183b544f3c8SBram Moolenaar echo [a, a, a] 4184b544f3c8SBram Moolenaar echo string([a, a, a]) 4185b544f3c8SBram Moolenaar redir END 4186b544f3c8SBram Moolenaar let l = split(result, "\n") 4187b544f3c8SBram Moolenaar call assert_equal(["[[], [], []]", 4188b544f3c8SBram Moolenaar \ "[[], [], []]"], l) 4189b544f3c8SBram Moolenaar 4190b544f3c8SBram Moolenaar " Empty lists in a dictionary 4191b544f3c8SBram Moolenaar let a = [] 4192b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 4193b544f3c8SBram Moolenaar redir => result 4194b544f3c8SBram Moolenaar echo b 4195b544f3c8SBram Moolenaar echo string(b) 4196b544f3c8SBram Moolenaar redir END 4197b544f3c8SBram Moolenaar let l = split(result, "\n") 4198b544f3c8SBram Moolenaar call assert_equal(["{'a': [], 'b': []}", 4199b544f3c8SBram Moolenaar \ "{'a': [], 'b': []}"], l) 4200b544f3c8SBram Moolenaar 4201b544f3c8SBram Moolenaar " Dictionaries in a list 4202b544f3c8SBram Moolenaar let a = {"one": "yes", "two": "yes", "three": "yes"} 4203b544f3c8SBram Moolenaar redir => result 4204b544f3c8SBram Moolenaar echo [a, a, a] 4205b544f3c8SBram Moolenaar echo string([a, a, a]) 4206b544f3c8SBram Moolenaar redir END 4207b544f3c8SBram Moolenaar let l = split(result, "\n") 4208b544f3c8SBram Moolenaar call assert_equal(["[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {...}, {...}]", 4209b544f3c8SBram Moolenaar \ "[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}]"], l) 4210b544f3c8SBram Moolenaar 4211b544f3c8SBram Moolenaar " Dictionaries in a dictionary 4212b544f3c8SBram Moolenaar let a = {"one": "yes", "two": "yes", "three": "yes"} 4213b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 4214b544f3c8SBram Moolenaar redir => result 4215b544f3c8SBram Moolenaar echo b 4216b544f3c8SBram Moolenaar echo string(b) 4217b544f3c8SBram Moolenaar redir END 4218b544f3c8SBram Moolenaar let l = split(result, "\n") 4219b544f3c8SBram Moolenaar call assert_equal(["{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {...}}", 4220b544f3c8SBram Moolenaar \ "{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {'one': 'yes', 'two': 'yes', 'three': 'yes'}}"], l) 4221b544f3c8SBram Moolenaar 4222b544f3c8SBram Moolenaar " Lists in a list 4223b544f3c8SBram Moolenaar let a = [1, 2, 3] 4224b544f3c8SBram Moolenaar redir => result 4225b544f3c8SBram Moolenaar echo [a, a, a] 4226b544f3c8SBram Moolenaar echo string([a, a, a]) 4227b544f3c8SBram Moolenaar redir END 4228b544f3c8SBram Moolenaar let l = split(result, "\n") 4229b544f3c8SBram Moolenaar call assert_equal(["[[1, 2, 3], [...], [...]]", 4230b544f3c8SBram Moolenaar \ "[[1, 2, 3], [1, 2, 3], [1, 2, 3]]"], l) 4231b544f3c8SBram Moolenaar 4232b544f3c8SBram Moolenaar " Lists in a dictionary 4233b544f3c8SBram Moolenaar let a = [1, 2, 3] 4234b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 4235b544f3c8SBram Moolenaar redir => result 4236b544f3c8SBram Moolenaar echo b 4237b544f3c8SBram Moolenaar echo string(b) 4238b544f3c8SBram Moolenaar redir END 4239b544f3c8SBram Moolenaar let l = split(result, "\n") 4240b544f3c8SBram Moolenaar call assert_equal(["{'a': [1, 2, 3], 'b': [...]}", 4241b544f3c8SBram Moolenaar \ "{'a': [1, 2, 3], 'b': [1, 2, 3]}"], l) 4242b544f3c8SBram Moolenaar 42431363a30cSBram Moolenaar call assert_fails('echo &:', 'E112:') 42441363a30cSBram Moolenaar call assert_fails('echo &g:', 'E112:') 42451363a30cSBram Moolenaar call assert_fails('echo &l:', 'E112:') 42461363a30cSBram Moolenaar 4247b544f3c8SBram Moolenaarendfunc 4248b544f3c8SBram Moolenaar 4249b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4250b544f3c8SBram Moolenaar" Test 94: 64-bit Numbers {{{1 4251b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4252b544f3c8SBram Moolenaar 4253b544f3c8SBram Moolenaarfunc Test_num64() 4254b544f3c8SBram Moolenaar call assert_notequal( 4294967296, 0) 4255b544f3c8SBram Moolenaar call assert_notequal(-4294967296, 0) 4256b544f3c8SBram Moolenaar call assert_equal( 4294967296, 0xFFFFffff + 1) 4257b544f3c8SBram Moolenaar call assert_equal(-4294967296, -0xFFFFffff - 1) 4258b544f3c8SBram Moolenaar 4259b544f3c8SBram Moolenaar call assert_equal( 9223372036854775807, 1 / 0) 4260b544f3c8SBram Moolenaar call assert_equal(-9223372036854775807, -1 / 0) 4261b544f3c8SBram Moolenaar call assert_equal(-9223372036854775807 - 1, 0 / 0) 4262b544f3c8SBram Moolenaar 42635feabe00SBram Moolenaar if has('float') 4264b544f3c8SBram Moolenaar call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150)) 4265b544f3c8SBram Moolenaar call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150)) 42665feabe00SBram Moolenaar endif 4267b544f3c8SBram Moolenaar 4268b544f3c8SBram Moolenaar let rng = range(0xFFFFffff, 0x100000001) 4269b544f3c8SBram Moolenaar call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng) 4270b544f3c8SBram Moolenaar call assert_equal(0x100000001, max(rng)) 4271b544f3c8SBram Moolenaar call assert_equal(0xFFFFffff, min(rng)) 4272b544f3c8SBram Moolenaar call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N')) 4273b544f3c8SBram Moolenaarendfunc 4274b544f3c8SBram Moolenaar 4275b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4276b544f3c8SBram Moolenaar" Test 95: lines of :append, :change, :insert {{{1 4277b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4278b544f3c8SBram Moolenaar 4279b544f3c8SBram Moolenaarfunction! DefineFunction(name, body) 4280b544f3c8SBram Moolenaar let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n") 4281b544f3c8SBram Moolenaar exec func 4282b544f3c8SBram Moolenaarendfunction 4283b544f3c8SBram Moolenaar 4284b544f3c8SBram Moolenaarfunc Test_script_lines() 4285b544f3c8SBram Moolenaar " :append 4286b544f3c8SBram Moolenaar try 4287b544f3c8SBram Moolenaar call DefineFunction('T_Append', [ 4288b544f3c8SBram Moolenaar \ 'append', 4289b544f3c8SBram Moolenaar \ 'py <<EOS', 4290b544f3c8SBram Moolenaar \ '.', 4291b544f3c8SBram Moolenaar \ ]) 4292b544f3c8SBram Moolenaar catch 429337175409SBram Moolenaar call assert_report("Can't define function") 4294b544f3c8SBram Moolenaar endtry 4295b544f3c8SBram Moolenaar try 4296b544f3c8SBram Moolenaar call DefineFunction('T_Append', [ 4297b544f3c8SBram Moolenaar \ 'append', 4298b544f3c8SBram Moolenaar \ 'abc', 4299b544f3c8SBram Moolenaar \ ]) 430037175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 4301b544f3c8SBram Moolenaar catch 4302b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 4303b544f3c8SBram Moolenaar endtry 4304b544f3c8SBram Moolenaar 4305b544f3c8SBram Moolenaar " :change 4306b544f3c8SBram Moolenaar try 4307b544f3c8SBram Moolenaar call DefineFunction('T_Change', [ 4308b544f3c8SBram Moolenaar \ 'change', 4309b544f3c8SBram Moolenaar \ 'py <<EOS', 4310b544f3c8SBram Moolenaar \ '.', 4311b544f3c8SBram Moolenaar \ ]) 4312b544f3c8SBram Moolenaar catch 431337175409SBram Moolenaar call assert_report("Can't define function") 4314b544f3c8SBram Moolenaar endtry 4315b544f3c8SBram Moolenaar try 4316b544f3c8SBram Moolenaar call DefineFunction('T_Change', [ 4317b544f3c8SBram Moolenaar \ 'change', 4318b544f3c8SBram Moolenaar \ 'abc', 4319b544f3c8SBram Moolenaar \ ]) 432037175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 4321b544f3c8SBram Moolenaar catch 4322b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 4323b544f3c8SBram Moolenaar endtry 4324b544f3c8SBram Moolenaar 4325b544f3c8SBram Moolenaar " :insert 4326b544f3c8SBram Moolenaar try 4327b544f3c8SBram Moolenaar call DefineFunction('T_Insert', [ 4328b544f3c8SBram Moolenaar \ 'insert', 4329b544f3c8SBram Moolenaar \ 'py <<EOS', 4330b544f3c8SBram Moolenaar \ '.', 4331b544f3c8SBram Moolenaar \ ]) 4332b544f3c8SBram Moolenaar catch 433337175409SBram Moolenaar call assert_report("Can't define function") 4334b544f3c8SBram Moolenaar endtry 4335b544f3c8SBram Moolenaar try 4336b544f3c8SBram Moolenaar call DefineFunction('T_Insert', [ 4337b544f3c8SBram Moolenaar \ 'insert', 4338b544f3c8SBram Moolenaar \ 'abc', 4339b544f3c8SBram Moolenaar \ ]) 434037175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 4341b544f3c8SBram Moolenaar catch 4342b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 4343b544f3c8SBram Moolenaar endtry 4344b544f3c8SBram Moolenaarendfunc 4345b544f3c8SBram Moolenaar 4346b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4347478af67dSBram Moolenaar" Test 96: line continuation {{{1 4348478af67dSBram Moolenaar" 4349478af67dSBram Moolenaar" Undefined behavior was detected by ubsan with line continuation 4350478af67dSBram Moolenaar" after an empty line. 4351478af67dSBram Moolenaar"------------------------------------------------------------------------------- 4352478af67dSBram Moolenaarfunc Test_script_emty_line_continuation() 4353478af67dSBram Moolenaar 4354478af67dSBram Moolenaar \ 4355478af67dSBram Moolenaarendfunc 4356478af67dSBram Moolenaar 4357478af67dSBram Moolenaar"------------------------------------------------------------------------------- 4358863e80b4SBram Moolenaar" Test 97: bitwise functions {{{1 4359863e80b4SBram Moolenaar"------------------------------------------------------------------------------- 4360863e80b4SBram Moolenaarfunc Test_bitwise_functions() 4361863e80b4SBram Moolenaar " and 4362863e80b4SBram Moolenaar call assert_equal(127, and(127, 127)) 4363863e80b4SBram Moolenaar call assert_equal(16, and(127, 16)) 4364073e4b92SBram Moolenaar eval 127->and(16)->assert_equal(16) 4365863e80b4SBram Moolenaar call assert_equal(0, and(127, 128)) 4366863e80b4SBram Moolenaar call assert_fails("call and([], 1)", 'E745:') 4367863e80b4SBram Moolenaar call assert_fails("call and({}, 1)", 'E728:') 43685feabe00SBram Moolenaar if has('float') 43695feabe00SBram Moolenaar call assert_fails("call and(1.0, 1)", 'E805:') 4370863e80b4SBram Moolenaar call assert_fails("call and(1, 1.0)", 'E805:') 43715feabe00SBram Moolenaar endif 4372863e80b4SBram Moolenaar call assert_fails("call and(1, [])", 'E745:') 4373863e80b4SBram Moolenaar call assert_fails("call and(1, {})", 'E728:') 4374863e80b4SBram Moolenaar " or 4375863e80b4SBram Moolenaar call assert_equal(23, or(16, 7)) 4376863e80b4SBram Moolenaar call assert_equal(15, or(8, 7)) 4377073e4b92SBram Moolenaar eval 8->or(7)->assert_equal(15) 4378863e80b4SBram Moolenaar call assert_equal(123, or(0, 123)) 4379863e80b4SBram Moolenaar call assert_fails("call or([], 1)", 'E745:') 4380863e80b4SBram Moolenaar call assert_fails("call or({}, 1)", 'E728:') 43815feabe00SBram Moolenaar if has('float') 43825feabe00SBram Moolenaar call assert_fails("call or(1.0, 1)", 'E805:') 4383863e80b4SBram Moolenaar call assert_fails("call or(1, 1.0)", 'E805:') 43845feabe00SBram Moolenaar endif 4385863e80b4SBram Moolenaar call assert_fails("call or(1, [])", 'E745:') 4386863e80b4SBram Moolenaar call assert_fails("call or(1, {})", 'E728:') 4387863e80b4SBram Moolenaar " xor 4388863e80b4SBram Moolenaar call assert_equal(0, xor(127, 127)) 4389863e80b4SBram Moolenaar call assert_equal(111, xor(127, 16)) 4390073e4b92SBram Moolenaar eval 127->xor(16)->assert_equal(111) 4391863e80b4SBram Moolenaar call assert_equal(255, xor(127, 128)) 43925feabe00SBram Moolenaar if has('float') 4393863e80b4SBram Moolenaar call assert_fails("call xor(1.0, 1)", 'E805:') 43945feabe00SBram Moolenaar call assert_fails("call xor(1, 1.0)", 'E805:') 43955feabe00SBram Moolenaar endif 4396863e80b4SBram Moolenaar call assert_fails("call xor([], 1)", 'E745:') 4397863e80b4SBram Moolenaar call assert_fails("call xor({}, 1)", 'E728:') 4398863e80b4SBram Moolenaar call assert_fails("call xor(1, [])", 'E745:') 4399863e80b4SBram Moolenaar call assert_fails("call xor(1, {})", 'E728:') 4400863e80b4SBram Moolenaar " invert 4401863e80b4SBram Moolenaar call assert_equal(65408, and(invert(127), 65535)) 4402073e4b92SBram Moolenaar eval 127->invert()->and(65535)->assert_equal(65408) 4403863e80b4SBram Moolenaar call assert_equal(65519, and(invert(16), 65535)) 4404863e80b4SBram Moolenaar call assert_equal(65407, and(invert(128), 65535)) 44055feabe00SBram Moolenaar if has('float') 4406863e80b4SBram Moolenaar call assert_fails("call invert(1.0)", 'E805:') 44075feabe00SBram Moolenaar endif 4408863e80b4SBram Moolenaar call assert_fails("call invert([])", 'E745:') 4409863e80b4SBram Moolenaar call assert_fails("call invert({})", 'E728:') 4410863e80b4SBram Moolenaarendfunc 4411863e80b4SBram Moolenaar 44126f9a476bSBram Moolenaar" Test using bang after user command {{{1 44136f9a476bSBram Moolenaarfunc Test_user_command_with_bang() 44146f9a476bSBram Moolenaar command -bang Nieuw let nieuw = 1 44156f9a476bSBram Moolenaar Ni! 44166f9a476bSBram Moolenaar call assert_equal(1, nieuw) 44176f9a476bSBram Moolenaar unlet nieuw 44186f9a476bSBram Moolenaar delcommand Nieuw 44196f9a476bSBram Moolenaarendfunc 44206f9a476bSBram Moolenaar 4421b9adef79SBram Moolenaarfunc Test_script_expand_sfile() 4422b9adef79SBram Moolenaar let lines =<< trim END 4423b9adef79SBram Moolenaar func s:snr() 4424b9adef79SBram Moolenaar return expand('<sfile>') 4425b9adef79SBram Moolenaar endfunc 4426b9adef79SBram Moolenaar let g:result = s:snr() 4427b9adef79SBram Moolenaar END 4428b9adef79SBram Moolenaar call writefile(lines, 'Xexpand') 4429b9adef79SBram Moolenaar source Xexpand 4430b9adef79SBram Moolenaar call assert_match('<SNR>\d\+_snr', g:result) 4431b9adef79SBram Moolenaar source Xexpand 4432b9adef79SBram Moolenaar call assert_match('<SNR>\d\+_snr', g:result) 4433b9adef79SBram Moolenaar 4434b9adef79SBram Moolenaar call delete('Xexpand') 4435b9adef79SBram Moolenaar unlet g:result 4436b9adef79SBram Moolenaarendfunc 4437b9adef79SBram Moolenaar 4438ff697e6cSBram Moolenaarfunc Test_compound_assignment_operators() 4439ff697e6cSBram Moolenaar " Test for number 4440ff697e6cSBram Moolenaar let x = 1 4441ff697e6cSBram Moolenaar let x += 10 4442ff697e6cSBram Moolenaar call assert_equal(11, x) 4443ff697e6cSBram Moolenaar let x -= 5 4444ff697e6cSBram Moolenaar call assert_equal(6, x) 4445ff697e6cSBram Moolenaar let x *= 4 4446ff697e6cSBram Moolenaar call assert_equal(24, x) 4447ff697e6cSBram Moolenaar let x /= 3 4448ff697e6cSBram Moolenaar call assert_equal(8, x) 4449ff697e6cSBram Moolenaar let x %= 3 4450ff697e6cSBram Moolenaar call assert_equal(2, x) 4451ff697e6cSBram Moolenaar let x .= 'n' 4452ff697e6cSBram Moolenaar call assert_equal('2n', x) 4453ff697e6cSBram Moolenaar 4454e21c1580SBram Moolenaar " Test special cases: division or modulus with 0. 4455e21c1580SBram Moolenaar let x = 1 4456e21c1580SBram Moolenaar let x /= 0 4457e21c1580SBram Moolenaar call assert_equal(0x7FFFFFFFFFFFFFFF, x) 4458e21c1580SBram Moolenaar 4459e21c1580SBram Moolenaar let x = -1 4460e21c1580SBram Moolenaar let x /= 0 4461e21c1580SBram Moolenaar call assert_equal(-0x7FFFFFFFFFFFFFFF, x) 4462e21c1580SBram Moolenaar 4463e21c1580SBram Moolenaar let x = 0 4464e21c1580SBram Moolenaar let x /= 0 4465e21c1580SBram Moolenaar call assert_equal(-0x7FFFFFFFFFFFFFFF - 1, x) 4466e21c1580SBram Moolenaar 4467e21c1580SBram Moolenaar let x = 1 4468e21c1580SBram Moolenaar let x %= 0 4469e21c1580SBram Moolenaar call assert_equal(0, x) 4470e21c1580SBram Moolenaar 4471e21c1580SBram Moolenaar let x = -1 4472e21c1580SBram Moolenaar let x %= 0 4473e21c1580SBram Moolenaar call assert_equal(0, x) 4474e21c1580SBram Moolenaar 4475e21c1580SBram Moolenaar let x = 0 4476e21c1580SBram Moolenaar let x %= 0 4477e21c1580SBram Moolenaar call assert_equal(0, x) 4478e21c1580SBram Moolenaar 4479ff697e6cSBram Moolenaar " Test for string 4480ff697e6cSBram Moolenaar let x = 'str' 4481ff697e6cSBram Moolenaar let x .= 'ing' 4482ff697e6cSBram Moolenaar call assert_equal('string', x) 4483ff697e6cSBram Moolenaar let x += 1 4484ff697e6cSBram Moolenaar call assert_equal(1, x) 4485ff697e6cSBram Moolenaar 4486ff697e6cSBram Moolenaar if has('float') 4487ff697e6cSBram Moolenaar " Test for float 44885feabe00SBram Moolenaar let x -= 1.5 44895feabe00SBram Moolenaar call assert_equal(-0.5, x) 4490ff697e6cSBram Moolenaar let x = 0.5 4491ff697e6cSBram Moolenaar let x += 4.5 4492ff697e6cSBram Moolenaar call assert_equal(5.0, x) 4493ff697e6cSBram Moolenaar let x -= 1.5 4494ff697e6cSBram Moolenaar call assert_equal(3.5, x) 4495ff697e6cSBram Moolenaar let x *= 3.0 4496ff697e6cSBram Moolenaar call assert_equal(10.5, x) 4497ff697e6cSBram Moolenaar let x /= 2.5 4498ff697e6cSBram Moolenaar call assert_equal(4.2, x) 4499ff697e6cSBram Moolenaar call assert_fails('let x %= 0.5', 'E734') 4500ff697e6cSBram Moolenaar call assert_fails('let x .= "f"', 'E734') 45018b633135SBram Moolenaar let x = !3.14 45028b633135SBram Moolenaar call assert_equal(0.0, x) 4503ea04a6e8SBram Moolenaar 4504ea04a6e8SBram Moolenaar " integer and float operations 4505ea04a6e8SBram Moolenaar let x = 1 4506ea04a6e8SBram Moolenaar let x *= 2.1 4507ea04a6e8SBram Moolenaar call assert_equal(2.1, x) 4508ea04a6e8SBram Moolenaar let x = 1 4509ea04a6e8SBram Moolenaar let x /= 0.25 4510ea04a6e8SBram Moolenaar call assert_equal(4.0, x) 4511ea04a6e8SBram Moolenaar let x = 1 4512ea04a6e8SBram Moolenaar call assert_fails('let x %= 0.25', 'E734:') 4513ea04a6e8SBram Moolenaar let x = 1 4514ea04a6e8SBram Moolenaar call assert_fails('let x .= 0.25', 'E734:') 4515ea04a6e8SBram Moolenaar let x = 1.0 4516ea04a6e8SBram Moolenaar call assert_fails('let x += [1.1]', 'E734:') 4517ff697e6cSBram Moolenaar endif 4518ff697e6cSBram Moolenaar 4519ff697e6cSBram Moolenaar " Test for environment variable 4520ff697e6cSBram Moolenaar let $FOO = 1 4521ff697e6cSBram Moolenaar call assert_fails('let $FOO += 1', 'E734') 4522ff697e6cSBram Moolenaar call assert_fails('let $FOO -= 1', 'E734') 4523ff697e6cSBram Moolenaar call assert_fails('let $FOO *= 1', 'E734') 4524ff697e6cSBram Moolenaar call assert_fails('let $FOO /= 1', 'E734') 4525ff697e6cSBram Moolenaar call assert_fails('let $FOO %= 1', 'E734') 4526ff697e6cSBram Moolenaar let $FOO .= 's' 4527ff697e6cSBram Moolenaar call assert_equal('1s', $FOO) 4528ff697e6cSBram Moolenaar unlet $FOO 4529ff697e6cSBram Moolenaar 4530ff697e6cSBram Moolenaar " Test for option variable (type: number) 4531ff697e6cSBram Moolenaar let &scrolljump = 1 4532ff697e6cSBram Moolenaar let &scrolljump += 5 4533ff697e6cSBram Moolenaar call assert_equal(6, &scrolljump) 4534ff697e6cSBram Moolenaar let &scrolljump -= 2 4535ff697e6cSBram Moolenaar call assert_equal(4, &scrolljump) 4536ff697e6cSBram Moolenaar let &scrolljump *= 3 4537ff697e6cSBram Moolenaar call assert_equal(12, &scrolljump) 4538ff697e6cSBram Moolenaar let &scrolljump /= 2 4539ff697e6cSBram Moolenaar call assert_equal(6, &scrolljump) 4540ff697e6cSBram Moolenaar let &scrolljump %= 5 4541ff697e6cSBram Moolenaar call assert_equal(1, &scrolljump) 4542ff697e6cSBram Moolenaar call assert_fails('let &scrolljump .= "j"', 'E734') 4543ff697e6cSBram Moolenaar set scrolljump&vim 4544ff697e6cSBram Moolenaar 4545ff697e6cSBram Moolenaar " Test for register 4546ff697e6cSBram Moolenaar let @/ = 1 4547ff697e6cSBram Moolenaar call assert_fails('let @/ += 1', 'E734') 4548ff697e6cSBram Moolenaar call assert_fails('let @/ -= 1', 'E734') 4549ff697e6cSBram Moolenaar call assert_fails('let @/ *= 1', 'E734') 4550ff697e6cSBram Moolenaar call assert_fails('let @/ /= 1', 'E734') 4551ff697e6cSBram Moolenaar call assert_fails('let @/ %= 1', 'E734') 4552ff697e6cSBram Moolenaar let @/ .= 's' 4553ff697e6cSBram Moolenaar call assert_equal('1s', @/) 4554ff697e6cSBram Moolenaar let @/ = '' 4555ff697e6cSBram Moolenaarendfunc 4556ff697e6cSBram Moolenaar 45577e0868efSBram Moolenaarfunc Test_unlet_env() 45587e0868efSBram Moolenaar let $TESTVAR = 'yes' 45597e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 45607e0868efSBram Moolenaar call assert_fails('lockvar $TESTVAR', 'E940') 45617e0868efSBram Moolenaar call assert_fails('unlockvar $TESTVAR', 'E940') 45627e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 45637e0868efSBram Moolenaar if 0 45647e0868efSBram Moolenaar unlet $TESTVAR 45657e0868efSBram Moolenaar endif 45667e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 45677e0868efSBram Moolenaar unlet $TESTVAR 45687e0868efSBram Moolenaar call assert_equal('', $TESTVAR) 45697e0868efSBram Moolenaarendfunc 45707e0868efSBram Moolenaar 4571c3e92c16SBram Moolenaarfunc Test_refcount() 4572c3e92c16SBram Moolenaar " Immediate values 4573c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(1)) 4574c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount('s')) 4575c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(v:true)) 4576c3e92c16SBram Moolenaar call assert_equal(0, test_refcount([])) 4577c3e92c16SBram Moolenaar call assert_equal(0, test_refcount({})) 4578c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(0zff)) 4579c3e92c16SBram Moolenaar call assert_equal(0, test_refcount({-> line('.')})) 4580c3e92c16SBram Moolenaar if has('float') 4581c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(0.1)) 4582c3e92c16SBram Moolenaar endif 4583c3e92c16SBram Moolenaar if has('job') 4584c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .']))) 4585c3e92c16SBram Moolenaar endif 4586c3e92c16SBram Moolenaar 4587c3e92c16SBram Moolenaar " No refcount types 4588c3e92c16SBram Moolenaar let x = 1 4589c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 4590c3e92c16SBram Moolenaar let x = 's' 4591c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 4592c3e92c16SBram Moolenaar let x = v:true 4593c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 4594c3e92c16SBram Moolenaar if has('float') 4595c3e92c16SBram Moolenaar let x = 0.1 4596c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 4597c3e92c16SBram Moolenaar endif 4598c3e92c16SBram Moolenaar 4599c3e92c16SBram Moolenaar " Check refcount 4600c3e92c16SBram Moolenaar let x = [] 4601c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(x)) 4602c3e92c16SBram Moolenaar 4603c3e92c16SBram Moolenaar let x = {} 4604ce90e36fSBram Moolenaar call assert_equal(1, x->test_refcount()) 4605c3e92c16SBram Moolenaar 4606c3e92c16SBram Moolenaar let x = 0zff 4607c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(x)) 4608c3e92c16SBram Moolenaar 4609c3e92c16SBram Moolenaar let X = {-> line('.')} 4610c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(X)) 4611c3e92c16SBram Moolenaar let Y = X 4612c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 4613c3e92c16SBram Moolenaar 4614c3e92c16SBram Moolenaar if has('job') 4615c3e92c16SBram Moolenaar let job = job_start([&shell, &shellcmdflag, 'echo .']) 4616c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job)) 4617c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job_getchannel(job))) 4618c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job)) 4619c3e92c16SBram Moolenaar endif 4620c3e92c16SBram Moolenaar 4621c3e92c16SBram Moolenaar " Function arguments, copying and unassigning 4622c3e92c16SBram Moolenaar func ExprCheck(x, i) 4623c3e92c16SBram Moolenaar let i = a:i + 1 4624c3e92c16SBram Moolenaar call assert_equal(i, test_refcount(a:x)) 4625c3e92c16SBram Moolenaar let Y = a:x 4626c3e92c16SBram Moolenaar call assert_equal(i + 1, test_refcount(a:x)) 4627c3e92c16SBram Moolenaar call assert_equal(test_refcount(a:x), test_refcount(Y)) 4628c3e92c16SBram Moolenaar let Y = 0 4629c3e92c16SBram Moolenaar call assert_equal(i, test_refcount(a:x)) 4630c3e92c16SBram Moolenaar endfunc 4631c3e92c16SBram Moolenaar call ExprCheck([], 0) 4632c3e92c16SBram Moolenaar call ExprCheck({}, 0) 4633c3e92c16SBram Moolenaar call ExprCheck(0zff, 0) 4634c3e92c16SBram Moolenaar call ExprCheck({-> line('.')}, 0) 4635c3e92c16SBram Moolenaar if has('job') 4636c3e92c16SBram Moolenaar call ExprCheck(job, 1) 4637c3e92c16SBram Moolenaar call ExprCheck(job_getchannel(job), 1) 4638c3e92c16SBram Moolenaar call job_stop(job) 4639c3e92c16SBram Moolenaar endif 4640c3e92c16SBram Moolenaar delfunc ExprCheck 4641c3e92c16SBram Moolenaar 4642c3e92c16SBram Moolenaar " Regarding function 4643c3e92c16SBram Moolenaar func Func(x) abort 4644c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(function('Func'))) 4645c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func'))) 4646c3e92c16SBram Moolenaar endfunc 4647c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(function('Func'))) 4648c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(function('Func', [1]))) 4649c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func'))) 4650c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func', [1]))) 4651c3e92c16SBram Moolenaar let X = function('Func') 4652c3e92c16SBram Moolenaar let Y = X 4653c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(X)) 4654c3e92c16SBram Moolenaar let X = function('Func', [1]) 4655c3e92c16SBram Moolenaar let Y = X 4656c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 4657c3e92c16SBram Moolenaar let X = funcref('Func') 4658c3e92c16SBram Moolenaar let Y = X 4659c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 4660c3e92c16SBram Moolenaar let X = funcref('Func', [1]) 4661c3e92c16SBram Moolenaar let Y = X 4662c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 4663c3e92c16SBram Moolenaar unlet X 4664c3e92c16SBram Moolenaar unlet Y 4665c3e92c16SBram Moolenaar call Func(1) 4666c3e92c16SBram Moolenaar delfunc Func 4667c3e92c16SBram Moolenaar 4668c3e92c16SBram Moolenaar " Function with dict 4669c3e92c16SBram Moolenaar func DictFunc() dict 4670c3e92c16SBram Moolenaar call assert_equal(3, test_refcount(self)) 4671c3e92c16SBram Moolenaar endfunc 4672c3e92c16SBram Moolenaar let d = {'Func': function('DictFunc')} 4673c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(d)) 4674c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(d.Func)) 4675c3e92c16SBram Moolenaar call d.Func() 4676c3e92c16SBram Moolenaar unlet d 4677c3e92c16SBram Moolenaar delfunc DictFunc 4678c3e92c16SBram Moolenaarendfunc 4679c3e92c16SBram Moolenaar 46809f6277bdSBram Moolenaar" Test for missing :endif, :endfor, :endwhile and :endtry {{{1 46819f6277bdSBram Moolenaarfunc Test_missing_end() 46829f6277bdSBram Moolenaar call writefile(['if 2 > 1', 'echo ">"'], 'Xscript') 46839f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E171:') 46849f6277bdSBram Moolenaar call writefile(['for i in range(5)', 'echo i'], 'Xscript') 46859f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E170:') 46869f6277bdSBram Moolenaar call writefile(['while v:true', 'echo "."'], 'Xscript') 46879f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E170:') 46889f6277bdSBram Moolenaar call writefile(['try', 'echo "."'], 'Xscript') 46899f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E600:') 46909f6277bdSBram Moolenaar call delete('Xscript') 4691818fc9adSBram Moolenaar 4692818fc9adSBram Moolenaar " Using endfor with :while 4693818fc9adSBram Moolenaar let caught_e732 = 0 4694818fc9adSBram Moolenaar try 4695818fc9adSBram Moolenaar while v:true 4696818fc9adSBram Moolenaar endfor 4697818fc9adSBram Moolenaar catch /E732:/ 4698818fc9adSBram Moolenaar let caught_e732 = 1 4699818fc9adSBram Moolenaar endtry 4700818fc9adSBram Moolenaar call assert_equal(1, caught_e732) 4701818fc9adSBram Moolenaar 4702818fc9adSBram Moolenaar " Using endwhile with :for 4703818fc9adSBram Moolenaar let caught_e733 = 0 4704818fc9adSBram Moolenaar try 4705818fc9adSBram Moolenaar for i in range(1) 4706818fc9adSBram Moolenaar endwhile 4707818fc9adSBram Moolenaar catch /E733:/ 4708818fc9adSBram Moolenaar let caught_e733 = 1 4709818fc9adSBram Moolenaar endtry 4710818fc9adSBram Moolenaar call assert_equal(1, caught_e733) 4711818fc9adSBram Moolenaar 4712ee4e0c1eSBram Moolenaar " Using endfunc with :if 4713ee4e0c1eSBram Moolenaar call assert_fails('exe "if 1 | endfunc | endif"', 'E193:') 4714ee4e0c1eSBram Moolenaar 4715818fc9adSBram Moolenaar " Missing 'in' in a :for statement 4716818fc9adSBram Moolenaar call assert_fails('for i range(1) | endfor', 'E690:') 4717ea04a6e8SBram Moolenaar 4718ea04a6e8SBram Moolenaar " Incorrect number of variables in for 4719ea04a6e8SBram Moolenaar call assert_fails('for [i,] in range(3) | endfor', 'E475:') 47209f6277bdSBram Moolenaarendfunc 47219f6277bdSBram Moolenaar 47229f6277bdSBram Moolenaar" Test for deep nesting of if/for/while/try statements {{{1 47239f6277bdSBram Moolenaarfunc Test_deep_nest() 4724494e9069SBram Moolenaar CheckRunVimInTerminal 47259f6277bdSBram Moolenaar 47269f6277bdSBram Moolenaar let lines =<< trim [SCRIPT] 47279f6277bdSBram Moolenaar " Deep nesting of if ... endif 47289f6277bdSBram Moolenaar func Test1() 47299f6277bdSBram Moolenaar let @a = join(repeat(['if v:true'], 51), "\n") 47309f6277bdSBram Moolenaar let @a ..= "\n" 47319f6277bdSBram Moolenaar let @a ..= join(repeat(['endif'], 51), "\n") 47329f6277bdSBram Moolenaar @a 47339f6277bdSBram Moolenaar let @a = '' 47349f6277bdSBram Moolenaar endfunc 47359f6277bdSBram Moolenaar 47369f6277bdSBram Moolenaar " Deep nesting of for ... endfor 47379f6277bdSBram Moolenaar func Test2() 47389f6277bdSBram Moolenaar let @a = join(repeat(['for i in [1]'], 51), "\n") 47399f6277bdSBram Moolenaar let @a ..= "\n" 47409f6277bdSBram Moolenaar let @a ..= join(repeat(['endfor'], 51), "\n") 47419f6277bdSBram Moolenaar @a 47429f6277bdSBram Moolenaar let @a = '' 47439f6277bdSBram Moolenaar endfunc 47449f6277bdSBram Moolenaar 47459f6277bdSBram Moolenaar " Deep nesting of while ... endwhile 47469f6277bdSBram Moolenaar func Test3() 47479f6277bdSBram Moolenaar let @a = join(repeat(['while v:true'], 51), "\n") 47489f6277bdSBram Moolenaar let @a ..= "\n" 47499f6277bdSBram Moolenaar let @a ..= join(repeat(['endwhile'], 51), "\n") 47509f6277bdSBram Moolenaar @a 47519f6277bdSBram Moolenaar let @a = '' 47529f6277bdSBram Moolenaar endfunc 47539f6277bdSBram Moolenaar 47549f6277bdSBram Moolenaar " Deep nesting of try ... endtry 47559f6277bdSBram Moolenaar func Test4() 47569f6277bdSBram Moolenaar let @a = join(repeat(['try'], 51), "\n") 47579f6277bdSBram Moolenaar let @a ..= "\necho v:true\n" 47589f6277bdSBram Moolenaar let @a ..= join(repeat(['endtry'], 51), "\n") 47599f6277bdSBram Moolenaar @a 47609f6277bdSBram Moolenaar let @a = '' 47619f6277bdSBram Moolenaar endfunc 4762ee4e0c1eSBram Moolenaar 4763ee4e0c1eSBram Moolenaar " Deep nesting of function ... endfunction 4764ee4e0c1eSBram Moolenaar func Test5() 4765ee4e0c1eSBram Moolenaar let @a = join(repeat(['function X()'], 51), "\n") 4766ee4e0c1eSBram Moolenaar let @a ..= "\necho v:true\n" 4767ee4e0c1eSBram Moolenaar let @a ..= join(repeat(['endfunction'], 51), "\n") 4768ee4e0c1eSBram Moolenaar @a 4769ee4e0c1eSBram Moolenaar let @a = '' 4770ee4e0c1eSBram Moolenaar endfunc 47719f6277bdSBram Moolenaar [SCRIPT] 47729f6277bdSBram Moolenaar call writefile(lines, 'Xscript') 47739f6277bdSBram Moolenaar 47749f6277bdSBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'rows': 6}) 47759f6277bdSBram Moolenaar 47769f6277bdSBram Moolenaar " Deep nesting of if ... endif 47779f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test1()\n") 47786a2c5a7dSBram Moolenaar call TermWait(buf) 47799f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E579:', term_getline(buf, 5))}) 47809f6277bdSBram Moolenaar 47819f6277bdSBram Moolenaar " Deep nesting of for ... endfor 47829f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test2()\n") 47836a2c5a7dSBram Moolenaar call TermWait(buf) 47849f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))}) 47859f6277bdSBram Moolenaar 47869f6277bdSBram Moolenaar " Deep nesting of while ... endwhile 47879f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test3()\n") 47886a2c5a7dSBram Moolenaar call TermWait(buf) 47899f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))}) 47909f6277bdSBram Moolenaar 47919f6277bdSBram Moolenaar " Deep nesting of try ... endtry 47929f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test4()\n") 47936a2c5a7dSBram Moolenaar call TermWait(buf) 47949f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E601:', term_getline(buf, 5))}) 47959f6277bdSBram Moolenaar 4796ee4e0c1eSBram Moolenaar " Deep nesting of function ... endfunction 4797ee4e0c1eSBram Moolenaar call term_sendkeys(buf, ":call Test5()\n") 47986a2c5a7dSBram Moolenaar call TermWait(buf) 4799ee4e0c1eSBram Moolenaar call WaitForAssert({-> assert_match('^E1058:', term_getline(buf, 4))}) 4800ee4e0c1eSBram Moolenaar call term_sendkeys(buf, "\<C-C>\n") 48016a2c5a7dSBram Moolenaar call TermWait(buf) 4802ee4e0c1eSBram Moolenaar 48039f6277bdSBram Moolenaar "let l = '' 48049f6277bdSBram Moolenaar "for i in range(1, 6) 48059f6277bdSBram Moolenaar " let l ..= term_getline(buf, i) . "\n" 48069f6277bdSBram Moolenaar "endfor 48079f6277bdSBram Moolenaar "call assert_report(l) 48089f6277bdSBram Moolenaar 48099f6277bdSBram Moolenaar call StopVimInTerminal(buf) 48109f6277bdSBram Moolenaar call delete('Xscript') 48119f6277bdSBram Moolenaarendfunc 48129f6277bdSBram Moolenaar 48138b633135SBram Moolenaar" Test for errors in converting to float from various types {{{1 48148b633135SBram Moolenaarfunc Test_float_conversion_errors() 48158b633135SBram Moolenaar if has('float') 48168b633135SBram Moolenaar call assert_fails('let x = 4.0 % 2.0', 'E804') 48178b633135SBram Moolenaar call assert_fails('echo 1.1[0]', 'E806') 48188b633135SBram Moolenaar call assert_fails('echo sort([function("min"), 1], "f")', 'E891:') 48198b633135SBram Moolenaar call assert_fails('echo 3.2 == "vim"', 'E892:') 48208b633135SBram Moolenaar call assert_fails('echo sort([[], 1], "f")', 'E893:') 48218b633135SBram Moolenaar call assert_fails('echo sort([{}, 1], "f")', 'E894:') 48228b633135SBram Moolenaar call assert_fails('echo 3.2 == v:true', 'E362:') 48238b633135SBram Moolenaar call assert_fails('echo 3.2 == v:none', 'E907:') 48248b633135SBram Moolenaar endif 48258b633135SBram Moolenaarendfunc 48268b633135SBram Moolenaar 48278e6cbb72SBram Moolenaar" invalid function names {{{1 482808f4157cSBram Moolenaarfunc Test_invalid_function_names() 482908f4157cSBram Moolenaar " function name not starting with capital 483008f4157cSBram Moolenaar let caught_e128 = 0 483108f4157cSBram Moolenaar try 483208f4157cSBram Moolenaar func! g:test() 483308f4157cSBram Moolenaar echo "test" 483408f4157cSBram Moolenaar endfunc 483508f4157cSBram Moolenaar catch /E128:/ 483608f4157cSBram Moolenaar let caught_e128 = 1 483708f4157cSBram Moolenaar endtry 483808f4157cSBram Moolenaar call assert_equal(1, caught_e128) 483908f4157cSBram Moolenaar 484008f4157cSBram Moolenaar " function name includes a colon 484108f4157cSBram Moolenaar let caught_e884 = 0 484208f4157cSBram Moolenaar try 484308f4157cSBram Moolenaar func! b:test() 484408f4157cSBram Moolenaar echo "test" 484508f4157cSBram Moolenaar endfunc 484608f4157cSBram Moolenaar catch /E884:/ 484708f4157cSBram Moolenaar let caught_e884 = 1 484808f4157cSBram Moolenaar endtry 484908f4157cSBram Moolenaar call assert_equal(1, caught_e884) 485008f4157cSBram Moolenaar 485108f4157cSBram Moolenaar " function name folowed by # 485208f4157cSBram Moolenaar let caught_e128 = 0 485308f4157cSBram Moolenaar try 485408f4157cSBram Moolenaar func! test2() "# 485508f4157cSBram Moolenaar echo "test2" 485608f4157cSBram Moolenaar endfunc 485708f4157cSBram Moolenaar catch /E128:/ 485808f4157cSBram Moolenaar let caught_e128 = 1 485908f4157cSBram Moolenaar endtry 486008f4157cSBram Moolenaar call assert_equal(1, caught_e128) 486108f4157cSBram Moolenaar 486208f4157cSBram Moolenaar " function name starting with/without "g:", buffer-local funcref. 486308f4157cSBram Moolenaar function! g:Foo(n) 486408f4157cSBram Moolenaar return 'called Foo(' . a:n . ')' 486508f4157cSBram Moolenaar endfunction 486608f4157cSBram Moolenaar let b:my_func = function('Foo') 486708f4157cSBram Moolenaar call assert_equal('called Foo(1)', b:my_func(1)) 486808f4157cSBram Moolenaar call assert_equal('called Foo(2)', g:Foo(2)) 486908f4157cSBram Moolenaar call assert_equal('called Foo(3)', Foo(3)) 487008f4157cSBram Moolenaar delfunc g:Foo 487108f4157cSBram Moolenaar 487208f4157cSBram Moolenaar " script-local function used in Funcref must exist. 487308f4157cSBram Moolenaar let lines =<< trim END 487408f4157cSBram Moolenaar func s:Testje() 487508f4157cSBram Moolenaar return "foo" 487608f4157cSBram Moolenaar endfunc 487708f4157cSBram Moolenaar let Bar = function('s:Testje') 487808f4157cSBram Moolenaar call assert_equal(0, exists('s:Testje')) 487908f4157cSBram Moolenaar call assert_equal(1, exists('*s:Testje')) 488008f4157cSBram Moolenaar call assert_equal(1, exists('Bar')) 488108f4157cSBram Moolenaar call assert_equal(1, exists('*Bar')) 488208f4157cSBram Moolenaar END 488308f4157cSBram Moolenaar call writefile(lines, 'Xscript') 488408f4157cSBram Moolenaar source Xscript 488508f4157cSBram Moolenaar call delete('Xscript') 488608f4157cSBram Moolenaarendfunc 488708f4157cSBram Moolenaar 48888e6cbb72SBram Moolenaar" substring and variable name {{{1 488908f4157cSBram Moolenaarfunc Test_substring_var() 489008f4157cSBram Moolenaar let str = 'abcdef' 489108f4157cSBram Moolenaar let n = 3 489208f4157cSBram Moolenaar call assert_equal('def', str[n:]) 489308f4157cSBram Moolenaar call assert_equal('abcd', str[:n]) 489408f4157cSBram Moolenaar call assert_equal('d', str[n:n]) 489508f4157cSBram Moolenaar unlet n 489608f4157cSBram Moolenaar let nn = 3 489708f4157cSBram Moolenaar call assert_equal('def', str[nn:]) 489808f4157cSBram Moolenaar call assert_equal('abcd', str[:nn]) 489908f4157cSBram Moolenaar call assert_equal('d', str[nn:nn]) 490008f4157cSBram Moolenaar unlet nn 490108f4157cSBram Moolenaar let b:nn = 4 490208f4157cSBram Moolenaar call assert_equal('ef', str[b:nn:]) 490308f4157cSBram Moolenaar call assert_equal('abcde', str[:b:nn]) 490408f4157cSBram Moolenaar call assert_equal('e', str[b:nn:b:nn]) 490508f4157cSBram Moolenaar unlet b:nn 490608f4157cSBram Moolenaarendfunc 490708f4157cSBram Moolenaar 49088e6cbb72SBram Moolenaar" Test using s: with a typed command {{{1 49098e6cbb72SBram Moolenaarfunc Test_typed_script_var() 49108e6cbb72SBram Moolenaar CheckRunVimInTerminal 49118e6cbb72SBram Moolenaar 49128e6cbb72SBram Moolenaar let buf = RunVimInTerminal('', {'rows': 6}) 49138e6cbb72SBram Moolenaar 49148e6cbb72SBram Moolenaar " Deep nesting of if ... endif 49158e6cbb72SBram Moolenaar call term_sendkeys(buf, ":echo get(s:, 'foo', 'x')\n") 49168e6cbb72SBram Moolenaar call TermWait(buf) 49178e6cbb72SBram Moolenaar call WaitForAssert({-> assert_match('^E116:', term_getline(buf, 5))}) 49188e6cbb72SBram Moolenaar 49198e6cbb72SBram Moolenaar call StopVimInTerminal(buf) 49208e6cbb72SBram Moolenaarendfunc 49218e6cbb72SBram Moolenaar 4922863e80b4SBram Moolenaar"------------------------------------------------------------------------------- 4923b544f3c8SBram Moolenaar" Modelines {{{1 49241f068233SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4925b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 4926