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 26*efb64829SBram Moolenaar set cpo-=C " support line-continuation in sourced script 27a6296200SBram Moolenaar source script_util.vim 28a6296200SBram Moolenaar XpathINIT 29a6296200SBram Moolenaar XloopINIT 30a6296200SBram Moolenaar END 31a6296200SBram Moolenaar let cleanup =<< trim END 32a6296200SBram Moolenaar call writefile(v:errors, 'Xtest.out') 33a6296200SBram Moolenaar qall 34a6296200SBram Moolenaar END 35a6296200SBram Moolenaar call writefile(init, 'Xtest.vim') 36a6296200SBram Moolenaar call writefile(a:test, 'Xtest.vim', 'a') 37a6296200SBram Moolenaar call writefile(a:verify, 'Xverify.vim') 38a6296200SBram Moolenaar call writefile(cleanup, 'Xverify.vim', 'a') 39a6296200SBram Moolenaar call RunVim([], [], "-S Xtest.vim -S Xverify.vim") 40a6296200SBram Moolenaar call assert_equal([], readfile('Xtest.out')) 41a6296200SBram Moolenaar call delete('Xtest.out') 42a6296200SBram Moolenaar call delete('Xtest.vim') 43a6296200SBram Moolenaar call delete('Xverify.vim') 441e115360SBram Moolenaarendfunc 45b544f3c8SBram Moolenaar 46b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 47b544f3c8SBram Moolenaar" Test 1: :endwhile in function {{{1 48b544f3c8SBram Moolenaar" 49b544f3c8SBram Moolenaar" Detect if a broken loop is (incorrectly) reactivated by the 50b544f3c8SBram Moolenaar" :endwhile. Use a :return to prevent an endless loop, and make 51b544f3c8SBram Moolenaar" this test first to get a meaningful result on an error before other 52b544f3c8SBram Moolenaar" tests will hang. 53b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 54b544f3c8SBram Moolenaar 55a6296200SBram Moolenaarfunc T1_F() 56b544f3c8SBram Moolenaar Xpath 'a' 57b544f3c8SBram Moolenaar let first = 1 58b544f3c8SBram Moolenaar while 1 59b544f3c8SBram Moolenaar Xpath 'b' 60b544f3c8SBram Moolenaar if first 61b544f3c8SBram Moolenaar Xpath 'c' 62b544f3c8SBram Moolenaar let first = 0 63b544f3c8SBram Moolenaar break 64b544f3c8SBram Moolenaar else 65b544f3c8SBram Moolenaar Xpath 'd' 66b544f3c8SBram Moolenaar return 67b544f3c8SBram Moolenaar endif 68b544f3c8SBram Moolenaar endwhile 69a6296200SBram Moolenaarendfunc 70b544f3c8SBram Moolenaar 71a6296200SBram Moolenaarfunc T1_G() 72b544f3c8SBram Moolenaar Xpath 'h' 73b544f3c8SBram Moolenaar let first = 1 74b544f3c8SBram Moolenaar while 1 75b544f3c8SBram Moolenaar Xpath 'i' 76b544f3c8SBram Moolenaar if first 77b544f3c8SBram Moolenaar Xpath 'j' 78b544f3c8SBram Moolenaar let first = 0 79b544f3c8SBram Moolenaar break 80b544f3c8SBram Moolenaar else 81b544f3c8SBram Moolenaar Xpath 'k' 82b544f3c8SBram Moolenaar return 83b544f3c8SBram Moolenaar endif 84b544f3c8SBram Moolenaar if 1 " unmatched :if 85b544f3c8SBram Moolenaar endwhile 86a6296200SBram Moolenaarendfunc 87b544f3c8SBram Moolenaar 88b544f3c8SBram Moolenaarfunc Test_endwhile_function() 89b544f3c8SBram Moolenaar XpathINIT 90b544f3c8SBram Moolenaar call T1_F() 91b544f3c8SBram Moolenaar Xpath 'F' 92b544f3c8SBram Moolenaar 93b544f3c8SBram Moolenaar try 94b544f3c8SBram Moolenaar call T1_G() 95b544f3c8SBram Moolenaar catch 96b544f3c8SBram Moolenaar " Catch missing :endif 97b544f3c8SBram Moolenaar call assert_true(v:exception =~ 'E171') 98b544f3c8SBram Moolenaar Xpath 'x' 99b544f3c8SBram Moolenaar endtry 100b544f3c8SBram Moolenaar Xpath 'G' 101b544f3c8SBram Moolenaar 102b544f3c8SBram Moolenaar call assert_equal('abcFhijxG', g:Xpath) 103b544f3c8SBram Moolenaarendfunc 104b544f3c8SBram Moolenaar 105b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 106b544f3c8SBram Moolenaar" Test 2: :endwhile in script {{{1 107b544f3c8SBram Moolenaar" 108b544f3c8SBram Moolenaar" Detect if a broken loop is (incorrectly) reactivated by the 109b544f3c8SBram Moolenaar" :endwhile. Use a :finish to prevent an endless loop, and place 110b544f3c8SBram Moolenaar" this test before others that might hang to get a meaningful result 111b544f3c8SBram Moolenaar" on an error. 112b544f3c8SBram Moolenaar" 113b544f3c8SBram Moolenaar" This test executes the bodies of the functions T1_F and T1_G from 114b544f3c8SBram Moolenaar" the previous test as script files (:return replaced by :finish). 115b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 116b544f3c8SBram Moolenaar 117b544f3c8SBram Moolenaarfunc Test_endwhile_script() 118b544f3c8SBram Moolenaar XpathINIT 119b544f3c8SBram Moolenaar ExecAsScript T1_F 120b544f3c8SBram Moolenaar Xpath 'F' 121b544f3c8SBram Moolenaar call DeleteTheScript() 122b544f3c8SBram Moolenaar 123b544f3c8SBram Moolenaar try 124b544f3c8SBram Moolenaar ExecAsScript T1_G 125b544f3c8SBram Moolenaar catch 126b544f3c8SBram Moolenaar " Catch missing :endif 127b544f3c8SBram Moolenaar call assert_true(v:exception =~ 'E171') 128b544f3c8SBram Moolenaar Xpath 'x' 129b544f3c8SBram Moolenaar endtry 130b544f3c8SBram Moolenaar Xpath 'G' 131b544f3c8SBram Moolenaar call DeleteTheScript() 132b544f3c8SBram Moolenaar 133b544f3c8SBram Moolenaar call assert_equal('abcFhijxG', g:Xpath) 134b544f3c8SBram Moolenaarendfunc 135b544f3c8SBram Moolenaar 136b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 137b544f3c8SBram Moolenaar" Test 3: :if, :elseif, :while, :continue, :break {{{1 138b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 139b544f3c8SBram Moolenaar 140a6296200SBram Moolenaarfunc Test_if_while() 141b544f3c8SBram Moolenaar XpathINIT 142b544f3c8SBram Moolenaar if 1 143b544f3c8SBram Moolenaar Xpath 'a' 144b544f3c8SBram Moolenaar let loops = 3 145b544f3c8SBram Moolenaar while loops > -1 " main loop: loops == 3, 2, 1 (which breaks) 146b544f3c8SBram Moolenaar if loops <= 0 147b544f3c8SBram Moolenaar let break_err = 1 148b544f3c8SBram Moolenaar let loops = -1 149b544f3c8SBram Moolenaar else 150b544f3c8SBram Moolenaar Xpath 'b' . loops 151b544f3c8SBram Moolenaar endif 152b544f3c8SBram Moolenaar if (loops == 2) 153b544f3c8SBram Moolenaar while loops == 2 " dummy loop 154b544f3c8SBram Moolenaar Xpath 'c' . loops 155b544f3c8SBram Moolenaar let loops = loops - 1 156b544f3c8SBram Moolenaar continue " stop dummy loop 157b544f3c8SBram Moolenaar Xpath 'd' . loops 158b544f3c8SBram Moolenaar endwhile 159b544f3c8SBram Moolenaar continue " continue main loop 160b544f3c8SBram Moolenaar Xpath 'e' . loops 161b544f3c8SBram Moolenaar elseif (loops == 1) 162b544f3c8SBram Moolenaar let p = 1 163b544f3c8SBram Moolenaar while p " dummy loop 164b544f3c8SBram Moolenaar Xpath 'f' . loops 165b544f3c8SBram Moolenaar let p = 0 166b544f3c8SBram Moolenaar break " break dummy loop 167b544f3c8SBram Moolenaar Xpath 'g' . loops 168b544f3c8SBram Moolenaar endwhile 169b544f3c8SBram Moolenaar Xpath 'h' . loops 170b544f3c8SBram Moolenaar unlet p 171b544f3c8SBram Moolenaar break " break main loop 172b544f3c8SBram Moolenaar Xpath 'i' . loops 173b544f3c8SBram Moolenaar endif 174b544f3c8SBram Moolenaar if (loops > 0) 175b544f3c8SBram Moolenaar Xpath 'j' . loops 176b544f3c8SBram Moolenaar endif 177b544f3c8SBram Moolenaar while loops == 3 " dummy loop 178b544f3c8SBram Moolenaar let loops = loops - 1 179b544f3c8SBram Moolenaar endwhile " end dummy loop 180b544f3c8SBram Moolenaar endwhile " end main loop 181b544f3c8SBram Moolenaar Xpath 'k' 182b544f3c8SBram Moolenaar else 183b544f3c8SBram Moolenaar Xpath 'l' 184b544f3c8SBram Moolenaar endif 185b544f3c8SBram Moolenaar Xpath 'm' 186b544f3c8SBram Moolenaar if exists("break_err") 187b544f3c8SBram Moolenaar Xpath 'm' 188b544f3c8SBram Moolenaar unlet break_err 189b544f3c8SBram Moolenaar endif 190b544f3c8SBram Moolenaar 191b544f3c8SBram Moolenaar unlet loops 192b544f3c8SBram Moolenaar 193b544f3c8SBram Moolenaar call assert_equal('ab3j3b2c2b1f1h1km', g:Xpath) 194b544f3c8SBram Moolenaarendfunc 195b544f3c8SBram Moolenaar 196b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 197b544f3c8SBram Moolenaar" Test 4: :return {{{1 198b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 199b544f3c8SBram Moolenaar 200a6296200SBram Moolenaarfunc T4_F() 201b544f3c8SBram Moolenaar if 1 202b544f3c8SBram Moolenaar Xpath 'a' 203b544f3c8SBram Moolenaar let loops = 3 204b544f3c8SBram Moolenaar while loops > 0 " 3: 2: 1: 205b544f3c8SBram Moolenaar Xpath 'b' . loops 206b544f3c8SBram Moolenaar if (loops == 2) 207b544f3c8SBram Moolenaar Xpath 'c' . loops 208b544f3c8SBram Moolenaar return 209b544f3c8SBram Moolenaar Xpath 'd' . loops 210b544f3c8SBram Moolenaar endif 211b544f3c8SBram Moolenaar Xpath 'e' . loops 212b544f3c8SBram Moolenaar let loops = loops - 1 213b544f3c8SBram Moolenaar endwhile 214b544f3c8SBram Moolenaar Xpath 'f' 215b544f3c8SBram Moolenaar else 216b544f3c8SBram Moolenaar Xpath 'g' 217b544f3c8SBram Moolenaar endif 218a6296200SBram Moolenaarendfunc 219b544f3c8SBram Moolenaar 220a6296200SBram Moolenaarfunc Test_return() 221b544f3c8SBram Moolenaar XpathINIT 222b544f3c8SBram Moolenaar call T4_F() 223b544f3c8SBram Moolenaar Xpath '4' 224b544f3c8SBram Moolenaar 225b544f3c8SBram Moolenaar call assert_equal('ab3e3b2c24', g:Xpath) 226a6296200SBram Moolenaarendfunc 227b544f3c8SBram Moolenaar 228b544f3c8SBram Moolenaar 229b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 230b544f3c8SBram Moolenaar" Test 5: :finish {{{1 231b544f3c8SBram Moolenaar" 232b544f3c8SBram Moolenaar" This test executes the body of the function T4_F from the previous 233b544f3c8SBram Moolenaar" test as a script file (:return replaced by :finish). 234b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 235b544f3c8SBram Moolenaar 236a6296200SBram Moolenaarfunc Test_finish() 237b544f3c8SBram Moolenaar XpathINIT 238b544f3c8SBram Moolenaar ExecAsScript T4_F 239b544f3c8SBram Moolenaar Xpath '5' 240b544f3c8SBram Moolenaar call DeleteTheScript() 241b544f3c8SBram Moolenaar 242b544f3c8SBram Moolenaar call assert_equal('ab3e3b2c25', g:Xpath) 243a6296200SBram Moolenaarendfunc 244b544f3c8SBram Moolenaar 245b544f3c8SBram Moolenaar 246b544f3c8SBram Moolenaar 247b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 248b544f3c8SBram Moolenaar" Test 6: Defining functions in :while loops {{{1 249b544f3c8SBram Moolenaar" 250b544f3c8SBram Moolenaar" Functions can be defined inside other functions. An inner function 251b544f3c8SBram Moolenaar" gets defined when the outer function is executed. Functions may 252b544f3c8SBram Moolenaar" also be defined inside while loops. Expressions in braces for 253b544f3c8SBram Moolenaar" defining the function name are allowed. 254b544f3c8SBram Moolenaar" 255b544f3c8SBram Moolenaar" The functions are defined when sourcing the script, only the 256b544f3c8SBram Moolenaar" resulting path is checked in the test function. 257b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 258b544f3c8SBram Moolenaar 259b544f3c8SBram MoolenaarXpathINIT 260b544f3c8SBram Moolenaar 261b544f3c8SBram Moolenaar" The command CALL collects the argument of all its invocations in "calls" 262b544f3c8SBram Moolenaar" when used from a function (that is, when the global variable "calls" needs 263b544f3c8SBram Moolenaar" the "g:" prefix). This is to check that the function code is skipped when 264b544f3c8SBram Moolenaar" the function is defined. For inner functions, do so only if the outer 265b544f3c8SBram Moolenaar" function is not being executed. 266b544f3c8SBram Moolenaar" 267b544f3c8SBram Moolenaarlet calls = "" 268b544f3c8SBram Moolenaarcom! -nargs=1 CALL 269b544f3c8SBram Moolenaar \ if !exists("calls") && !exists("outer") | 270b544f3c8SBram Moolenaar \ let g:calls = g:calls . <args> | 271b544f3c8SBram Moolenaar \ endif 272b544f3c8SBram Moolenaar 273b544f3c8SBram Moolenaarlet i = 0 274b544f3c8SBram Moolenaarwhile i < 3 275b544f3c8SBram Moolenaar let i = i + 1 276b544f3c8SBram Moolenaar if i == 1 277b544f3c8SBram Moolenaar Xpath 'a' 278b544f3c8SBram Moolenaar function! F1(arg) 279b544f3c8SBram Moolenaar CALL a:arg 280b544f3c8SBram Moolenaar let outer = 1 281b544f3c8SBram Moolenaar 282b544f3c8SBram Moolenaar let j = 0 283b544f3c8SBram Moolenaar while j < 1 284b544f3c8SBram Moolenaar Xpath 'b' 285b544f3c8SBram Moolenaar let j = j + 1 286b544f3c8SBram Moolenaar function! G1(arg) 287b544f3c8SBram Moolenaar CALL a:arg 288b544f3c8SBram Moolenaar endfunction 289b544f3c8SBram Moolenaar Xpath 'c' 290b544f3c8SBram Moolenaar endwhile 291b544f3c8SBram Moolenaar endfunction 292b544f3c8SBram Moolenaar Xpath 'd' 293b544f3c8SBram Moolenaar 294b544f3c8SBram Moolenaar continue 295b544f3c8SBram Moolenaar endif 296b544f3c8SBram Moolenaar 297b544f3c8SBram Moolenaar Xpath 'e' . i 298b544f3c8SBram Moolenaar function! F{i}(i, arg) 299b544f3c8SBram Moolenaar CALL a:arg 300b544f3c8SBram Moolenaar let outer = 1 301b544f3c8SBram Moolenaar 302b544f3c8SBram Moolenaar if a:i == 3 303b544f3c8SBram Moolenaar Xpath 'f' 304b544f3c8SBram Moolenaar endif 305b544f3c8SBram Moolenaar let k = 0 306b544f3c8SBram Moolenaar while k < 3 307b544f3c8SBram Moolenaar Xpath 'g' . k 308b544f3c8SBram Moolenaar let k = k + 1 309b544f3c8SBram Moolenaar function! G{a:i}{k}(arg) 310b544f3c8SBram Moolenaar CALL a:arg 311b544f3c8SBram Moolenaar endfunction 312b544f3c8SBram Moolenaar Xpath 'h' . k 313b544f3c8SBram Moolenaar endwhile 314b544f3c8SBram Moolenaar endfunction 315b544f3c8SBram Moolenaar Xpath 'i' 316b544f3c8SBram Moolenaar 317b544f3c8SBram Moolenaarendwhile 318b544f3c8SBram Moolenaar 319b544f3c8SBram Moolenaarif exists("*G1") 320b544f3c8SBram Moolenaar Xpath 'j' 321b544f3c8SBram Moolenaarendif 322b544f3c8SBram Moolenaarif exists("*F1") 323b544f3c8SBram Moolenaar call F1("F1") 324b544f3c8SBram Moolenaar if exists("*G1") 325b544f3c8SBram Moolenaar call G1("G1") 326b544f3c8SBram Moolenaar endif 327b544f3c8SBram Moolenaarendif 328b544f3c8SBram Moolenaar 329b544f3c8SBram Moolenaarif exists("G21") || exists("G22") || exists("G23") 330b544f3c8SBram Moolenaar Xpath 'k' 331b544f3c8SBram Moolenaarendif 332b544f3c8SBram Moolenaarif exists("*F2") 333b544f3c8SBram Moolenaar call F2(2, "F2") 334b544f3c8SBram Moolenaar if exists("*G21") 335b544f3c8SBram Moolenaar call G21("G21") 336b544f3c8SBram Moolenaar endif 337b544f3c8SBram Moolenaar if exists("*G22") 338b544f3c8SBram Moolenaar call G22("G22") 339b544f3c8SBram Moolenaar endif 340b544f3c8SBram Moolenaar if exists("*G23") 341b544f3c8SBram Moolenaar call G23("G23") 342b544f3c8SBram Moolenaar endif 343b544f3c8SBram Moolenaarendif 344b544f3c8SBram Moolenaar 345b544f3c8SBram Moolenaarif exists("G31") || exists("G32") || exists("G33") 346b544f3c8SBram Moolenaar Xpath 'l' 347b544f3c8SBram Moolenaarendif 348b544f3c8SBram Moolenaarif exists("*F3") 349b544f3c8SBram Moolenaar call F3(3, "F3") 350b544f3c8SBram Moolenaar if exists("*G31") 351b544f3c8SBram Moolenaar call G31("G31") 352b544f3c8SBram Moolenaar endif 353b544f3c8SBram Moolenaar if exists("*G32") 354b544f3c8SBram Moolenaar call G32("G32") 355b544f3c8SBram Moolenaar endif 356b544f3c8SBram Moolenaar if exists("*G33") 357b544f3c8SBram Moolenaar call G33("G33") 358b544f3c8SBram Moolenaar endif 359b544f3c8SBram Moolenaarendif 360b544f3c8SBram Moolenaar 361b544f3c8SBram MoolenaarXpath 'm' 362b544f3c8SBram Moolenaar 363b544f3c8SBram Moolenaarlet g:test6_result = g:Xpath 364b544f3c8SBram Moolenaarlet g:test6_calls = calls 365b544f3c8SBram Moolenaar 366b544f3c8SBram Moolenaarunlet calls 367b544f3c8SBram Moolenaardelfunction F1 368b544f3c8SBram Moolenaardelfunction G1 369b544f3c8SBram Moolenaardelfunction F2 370b544f3c8SBram Moolenaardelfunction G21 371b544f3c8SBram Moolenaardelfunction G22 372b544f3c8SBram Moolenaardelfunction G23 373b544f3c8SBram Moolenaardelfunction G31 374b544f3c8SBram Moolenaardelfunction G32 375b544f3c8SBram Moolenaardelfunction G33 376b544f3c8SBram Moolenaar 377a6296200SBram Moolenaarfunc Test_defining_functions() 378b544f3c8SBram Moolenaar call assert_equal('ade2ie3ibcg0h1g1h2g2h3fg0h1g1h2g2h3m', g:test6_result) 379b544f3c8SBram Moolenaar call assert_equal('F1G1F2G21G22G23F3G31G32G33', g:test6_calls) 380b544f3c8SBram Moolenaarendfunc 381b544f3c8SBram Moolenaar 382b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 383b544f3c8SBram Moolenaar" Test 7: Continuing on errors outside functions {{{1 384b544f3c8SBram Moolenaar" 385b544f3c8SBram Moolenaar" On an error outside a function, the script processing continues 386b544f3c8SBram Moolenaar" at the line following the outermost :endif or :endwhile. When not 387b544f3c8SBram Moolenaar" inside an :if or :while, the script processing continues at the next 388b544f3c8SBram Moolenaar" line. 389b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 390b544f3c8SBram Moolenaar 391b544f3c8SBram MoolenaarXpathINIT 392b544f3c8SBram Moolenaar 393b544f3c8SBram Moolenaarif 1 394b544f3c8SBram Moolenaar Xpath 'a' 395b544f3c8SBram Moolenaar while 1 396b544f3c8SBram Moolenaar Xpath 'b' 397b544f3c8SBram Moolenaar asdf 398b544f3c8SBram Moolenaar Xpath 'c' 399b544f3c8SBram Moolenaar break 400b544f3c8SBram Moolenaar endwhile | Xpath 'd' 401b544f3c8SBram Moolenaar Xpath 'e' 402b544f3c8SBram Moolenaarendif | Xpath 'f' 403b544f3c8SBram MoolenaarXpath 'g' 404b544f3c8SBram Moolenaar 405b544f3c8SBram Moolenaarwhile 1 406b544f3c8SBram Moolenaar Xpath 'h' 407b544f3c8SBram Moolenaar if 1 408b544f3c8SBram Moolenaar Xpath 'i' 409b544f3c8SBram Moolenaar asdf 410b544f3c8SBram Moolenaar Xpath 'j' 411b544f3c8SBram Moolenaar endif | Xpath 'k' 412b544f3c8SBram Moolenaar Xpath 'l' 413b544f3c8SBram Moolenaar break 414b544f3c8SBram Moolenaarendwhile | Xpath 'm' 415b544f3c8SBram MoolenaarXpath 'n' 416b544f3c8SBram Moolenaar 417b544f3c8SBram Moolenaarasdf 418b544f3c8SBram MoolenaarXpath 'o' 419b544f3c8SBram Moolenaar 420b544f3c8SBram Moolenaarasdf | Xpath 'p' 421b544f3c8SBram MoolenaarXpath 'q' 422b544f3c8SBram Moolenaar 423b544f3c8SBram Moolenaarlet g:test7_result = g:Xpath 424b544f3c8SBram Moolenaar 425b544f3c8SBram Moolenaarfunc Test_error_in_script() 426b544f3c8SBram Moolenaar call assert_equal('abghinoq', g:test7_result) 427b544f3c8SBram Moolenaarendfunc 428b544f3c8SBram Moolenaar 429b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 430b544f3c8SBram Moolenaar" Test 8: Aborting and continuing on errors inside functions {{{1 431b544f3c8SBram Moolenaar" 432b544f3c8SBram Moolenaar" On an error inside a function without the "abort" attribute, the 433b544f3c8SBram Moolenaar" script processing continues at the next line (unless the error was 434b544f3c8SBram Moolenaar" in a :return command). On an error inside a function with the 435b544f3c8SBram Moolenaar" "abort" attribute, the function is aborted and the script processing 436b544f3c8SBram Moolenaar" continues after the function call; the value -1 is returned then. 437b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 438b544f3c8SBram Moolenaar 439b544f3c8SBram MoolenaarXpathINIT 440b544f3c8SBram Moolenaar 441a6296200SBram Moolenaarfunc T8_F() 442b544f3c8SBram Moolenaar if 1 443b544f3c8SBram Moolenaar Xpath 'a' 444b544f3c8SBram Moolenaar while 1 445b544f3c8SBram Moolenaar Xpath 'b' 446b544f3c8SBram Moolenaar asdf 447b544f3c8SBram Moolenaar Xpath 'c' 448b544f3c8SBram Moolenaar asdf | Xpath 'd' 449b544f3c8SBram Moolenaar Xpath 'e' 450b544f3c8SBram Moolenaar break 451b544f3c8SBram Moolenaar endwhile 452b544f3c8SBram Moolenaar Xpath 'f' 453b544f3c8SBram Moolenaar endif | Xpath 'g' 454b544f3c8SBram Moolenaar Xpath 'h' 455b544f3c8SBram Moolenaar 456b544f3c8SBram Moolenaar while 1 457b544f3c8SBram Moolenaar Xpath 'i' 458b544f3c8SBram Moolenaar if 1 459b544f3c8SBram Moolenaar Xpath 'j' 460b544f3c8SBram Moolenaar asdf 461b544f3c8SBram Moolenaar Xpath 'k' 462b544f3c8SBram Moolenaar asdf | Xpath 'l' 463b544f3c8SBram Moolenaar Xpath 'm' 464b544f3c8SBram Moolenaar endif 465b544f3c8SBram Moolenaar Xpath 'n' 466b544f3c8SBram Moolenaar break 467b544f3c8SBram Moolenaar endwhile | Xpath 'o' 468b544f3c8SBram Moolenaar Xpath 'p' 469b544f3c8SBram Moolenaar 470b544f3c8SBram Moolenaar return novar " returns (default return value 0) 471b544f3c8SBram Moolenaar Xpath 'q' 472b544f3c8SBram Moolenaar return 1 " not reached 473a6296200SBram Moolenaarendfunc 474b544f3c8SBram Moolenaar 475a6296200SBram Moolenaarfunc T8_G() abort 476b544f3c8SBram Moolenaar if 1 477b544f3c8SBram Moolenaar Xpath 'r' 478b544f3c8SBram Moolenaar while 1 479b544f3c8SBram Moolenaar Xpath 's' 480b544f3c8SBram Moolenaar asdf " returns -1 481b544f3c8SBram Moolenaar Xpath 't' 482b544f3c8SBram Moolenaar break 483b544f3c8SBram Moolenaar endwhile 484b544f3c8SBram Moolenaar Xpath 'v' 485b544f3c8SBram Moolenaar endif | Xpath 'w' 486b544f3c8SBram Moolenaar Xpath 'x' 487b544f3c8SBram Moolenaar 488b544f3c8SBram Moolenaar return -4 " not reached 489a6296200SBram Moolenaarendfunc 490b544f3c8SBram Moolenaar 491a6296200SBram Moolenaarfunc T8_H() abort 492b544f3c8SBram Moolenaar while 1 493b544f3c8SBram Moolenaar Xpath 'A' 494b544f3c8SBram Moolenaar if 1 495b544f3c8SBram Moolenaar Xpath 'B' 496b544f3c8SBram Moolenaar asdf " returns -1 497b544f3c8SBram Moolenaar Xpath 'C' 498b544f3c8SBram Moolenaar endif 499b544f3c8SBram Moolenaar Xpath 'D' 500b544f3c8SBram Moolenaar break 501b544f3c8SBram Moolenaar endwhile | Xpath 'E' 502b544f3c8SBram Moolenaar Xpath 'F' 503b544f3c8SBram Moolenaar 504b544f3c8SBram Moolenaar return -4 " not reached 505a6296200SBram Moolenaarendfunc 506b544f3c8SBram Moolenaar 507b544f3c8SBram Moolenaar" Aborted functions (T8_G and T8_H) return -1. 508b544f3c8SBram Moolenaarlet g:test8_sum = (T8_F() + 1) - 4 * T8_G() - 8 * T8_H() 509b544f3c8SBram MoolenaarXpath 'X' 510b544f3c8SBram Moolenaarlet g:test8_result = g:Xpath 511b544f3c8SBram Moolenaar 512b544f3c8SBram Moolenaarfunc Test_error_in_function() 513b544f3c8SBram Moolenaar call assert_equal(13, g:test8_sum) 514b544f3c8SBram Moolenaar call assert_equal('abcefghijkmnoprsABX', g:test8_result) 515b544f3c8SBram Moolenaar 516b544f3c8SBram Moolenaar delfunction T8_F 517b544f3c8SBram Moolenaar delfunction T8_G 518b544f3c8SBram Moolenaar delfunction T8_H 519b544f3c8SBram Moolenaarendfunc 520b544f3c8SBram Moolenaar 521b544f3c8SBram Moolenaar 522b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 523b544f3c8SBram Moolenaar" Test 9: Continuing after aborted functions {{{1 524b544f3c8SBram Moolenaar" 525b544f3c8SBram Moolenaar" When a function with the "abort" attribute is aborted due to an 526b544f3c8SBram Moolenaar" error, the next function back in the call hierarchy without an 527b544f3c8SBram Moolenaar" "abort" attribute continues; the value -1 is returned then. 528b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 529b544f3c8SBram Moolenaar 530b544f3c8SBram MoolenaarXpathINIT 531b544f3c8SBram Moolenaar 532a6296200SBram Moolenaarfunc F() abort 533b544f3c8SBram Moolenaar Xpath 'a' 534b544f3c8SBram Moolenaar let result = G() " not aborted 535b544f3c8SBram Moolenaar Xpath 'b' 536b544f3c8SBram Moolenaar if result != 2 537b544f3c8SBram Moolenaar Xpath 'c' 538b544f3c8SBram Moolenaar endif 539b544f3c8SBram Moolenaar return 1 540a6296200SBram Moolenaarendfunc 541b544f3c8SBram Moolenaar 542a6296200SBram Moolenaarfunc G() " no abort attribute 543b544f3c8SBram Moolenaar Xpath 'd' 544b544f3c8SBram Moolenaar if H() != -1 " aborted 545b544f3c8SBram Moolenaar Xpath 'e' 546b544f3c8SBram Moolenaar endif 547b544f3c8SBram Moolenaar Xpath 'f' 548b544f3c8SBram Moolenaar return 2 549a6296200SBram Moolenaarendfunc 550b544f3c8SBram Moolenaar 551a6296200SBram Moolenaarfunc H() abort 552b544f3c8SBram Moolenaar Xpath 'g' 553b544f3c8SBram Moolenaar call I() " aborted 554b544f3c8SBram Moolenaar Xpath 'h' 555b544f3c8SBram Moolenaar return 4 556a6296200SBram Moolenaarendfunc 557b544f3c8SBram Moolenaar 558a6296200SBram Moolenaarfunc I() abort 559b544f3c8SBram Moolenaar Xpath 'i' 560b544f3c8SBram Moolenaar asdf " error 561b544f3c8SBram Moolenaar Xpath 'j' 562b544f3c8SBram Moolenaar return 8 563a6296200SBram Moolenaarendfunc 564b544f3c8SBram Moolenaar 565b544f3c8SBram Moolenaarif F() != 1 566b544f3c8SBram Moolenaar Xpath 'k' 567b544f3c8SBram Moolenaarendif 568b544f3c8SBram Moolenaar 569b544f3c8SBram Moolenaarlet g:test9_result = g:Xpath 570b544f3c8SBram Moolenaar 571b544f3c8SBram Moolenaardelfunction F 572b544f3c8SBram Moolenaardelfunction G 573b544f3c8SBram Moolenaardelfunction H 574b544f3c8SBram Moolenaardelfunction I 575b544f3c8SBram Moolenaar 576b544f3c8SBram Moolenaarfunc Test_func_abort() 577b544f3c8SBram Moolenaar call assert_equal('adgifb', g:test9_result) 578b544f3c8SBram Moolenaarendfunc 579b544f3c8SBram Moolenaar 580b544f3c8SBram Moolenaar 581b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 582b544f3c8SBram Moolenaar" Test 10: :if, :elseif, :while argument parsing {{{1 583b544f3c8SBram Moolenaar" 584b544f3c8SBram Moolenaar" A '"' or '|' in an argument expression must not be mixed up with 585b544f3c8SBram Moolenaar" a comment or a next command after a bar. Parsing errors should 586b544f3c8SBram Moolenaar" be recognized. 587b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 588b544f3c8SBram Moolenaar 589b544f3c8SBram MoolenaarXpathINIT 590b544f3c8SBram Moolenaar 591a6296200SBram Moolenaarfunc MSG(enr, emsg) 592b544f3c8SBram Moolenaar let english = v:lang == "C" || v:lang =~ '^[Ee]n' 593b544f3c8SBram Moolenaar if a:enr == "" 594b544f3c8SBram Moolenaar Xout "TODO: Add message number for:" a:emsg 595b544f3c8SBram Moolenaar let v:errmsg = ":" . v:errmsg 596b544f3c8SBram Moolenaar endif 597b544f3c8SBram Moolenaar let match = 1 598b544f3c8SBram Moolenaar if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg) 599b544f3c8SBram Moolenaar let match = 0 600b544f3c8SBram Moolenaar if v:errmsg == "" 601b544f3c8SBram Moolenaar Xout "Message missing." 602b544f3c8SBram Moolenaar else 603a4208966SBram Moolenaar let v:errmsg = v:errmsg->escape('"') 604b544f3c8SBram Moolenaar Xout "Unexpected message:" v:errmsg 605b544f3c8SBram Moolenaar endif 606b544f3c8SBram Moolenaar endif 607b544f3c8SBram Moolenaar return match 6081e115360SBram Moolenaarendfunc 609b544f3c8SBram Moolenaar 610b544f3c8SBram Moolenaarif 1 || strlen("\"") | Xpath 'a' 611b544f3c8SBram Moolenaar Xpath 'b' 612b544f3c8SBram Moolenaarendif 613b544f3c8SBram MoolenaarXpath 'c' 614b544f3c8SBram Moolenaar 615b544f3c8SBram Moolenaarif 0 616b544f3c8SBram Moolenaarelseif 1 || strlen("\"") | Xpath 'd' 617b544f3c8SBram Moolenaar Xpath 'e' 618b544f3c8SBram Moolenaarendif 619b544f3c8SBram MoolenaarXpath 'f' 620b544f3c8SBram Moolenaar 621b544f3c8SBram Moolenaarwhile 1 || strlen("\"") | Xpath 'g' 622b544f3c8SBram Moolenaar Xpath 'h' 623b544f3c8SBram Moolenaar break 624b544f3c8SBram Moolenaarendwhile 625b544f3c8SBram MoolenaarXpath 'i' 626b544f3c8SBram Moolenaar 627b544f3c8SBram Moolenaarlet v:errmsg = "" 628b544f3c8SBram Moolenaarif 1 ||| strlen("\"") | Xpath 'j' 629b544f3c8SBram Moolenaar Xpath 'k' 630b544f3c8SBram Moolenaarendif 631b544f3c8SBram MoolenaarXpath 'l' 632b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 633b544f3c8SBram Moolenaar Xpath 'm' 634b544f3c8SBram Moolenaarendif 635b544f3c8SBram Moolenaar 636b544f3c8SBram Moolenaarlet v:errmsg = "" 637b544f3c8SBram Moolenaarif 0 638b544f3c8SBram Moolenaarelseif 1 ||| strlen("\"") | Xpath 'n' 639b544f3c8SBram Moolenaar Xpath 'o' 640b544f3c8SBram Moolenaarendif 641b544f3c8SBram MoolenaarXpath 'p' 642b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 643b544f3c8SBram Moolenaar Xpath 'q' 644b544f3c8SBram Moolenaarendif 645b544f3c8SBram Moolenaar 646b544f3c8SBram Moolenaarlet v:errmsg = "" 647b544f3c8SBram Moolenaarwhile 1 ||| strlen("\"") | Xpath 'r' 648b544f3c8SBram Moolenaar Xpath 's' 649b544f3c8SBram Moolenaar break 650b544f3c8SBram Moolenaarendwhile 651b544f3c8SBram MoolenaarXpath 't' 652b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 653b544f3c8SBram Moolenaar Xpath 'u' 654b544f3c8SBram Moolenaarendif 655b544f3c8SBram Moolenaar 656b544f3c8SBram Moolenaarlet g:test10_result = g:Xpath 657b544f3c8SBram Moolenaardelfunction MSG 658b544f3c8SBram Moolenaar 659b544f3c8SBram Moolenaarfunc Test_expr_parsing() 660b544f3c8SBram Moolenaar call assert_equal('abcdefghilpt', g:test10_result) 661b544f3c8SBram Moolenaarendfunc 662b544f3c8SBram Moolenaar 663b544f3c8SBram Moolenaar 664b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 665b544f3c8SBram Moolenaar" Test 11: :if, :elseif, :while argument evaluation after abort {{{1 666b544f3c8SBram Moolenaar" 667b544f3c8SBram Moolenaar" When code is skipped over due to an error, the boolean argument to 668b544f3c8SBram Moolenaar" an :if, :elseif, or :while must not be evaluated. 669b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 670b544f3c8SBram Moolenaar 671b544f3c8SBram MoolenaarXpathINIT 672b544f3c8SBram Moolenaar 673b544f3c8SBram Moolenaarlet calls = 0 674b544f3c8SBram Moolenaar 675a6296200SBram Moolenaarfunc P(num) 676b544f3c8SBram Moolenaar let g:calls = g:calls + a:num " side effect on call 677b544f3c8SBram Moolenaar return 0 678a6296200SBram Moolenaarendfunc 679b544f3c8SBram Moolenaar 680b544f3c8SBram Moolenaarif 1 681b544f3c8SBram Moolenaar Xpath 'a' 682b544f3c8SBram Moolenaar asdf " error 683b544f3c8SBram Moolenaar Xpath 'b' 684b544f3c8SBram Moolenaar if P(1) " should not be called 685b544f3c8SBram Moolenaar Xpath 'c' 686b544f3c8SBram Moolenaar elseif !P(2) " should not be called 687b544f3c8SBram Moolenaar Xpath 'd' 688b544f3c8SBram Moolenaar else 689b544f3c8SBram Moolenaar Xpath 'e' 690b544f3c8SBram Moolenaar endif 691b544f3c8SBram Moolenaar Xpath 'f' 692b544f3c8SBram Moolenaar while P(4) " should not be called 693b544f3c8SBram Moolenaar Xpath 'g' 694b544f3c8SBram Moolenaar endwhile 695b544f3c8SBram Moolenaar Xpath 'h' 696b544f3c8SBram Moolenaarendif 697b544f3c8SBram MoolenaarXpath 'x' 698b544f3c8SBram Moolenaar 699b544f3c8SBram Moolenaarlet g:test11_calls = calls 700b544f3c8SBram Moolenaarlet g:test11_result = g:Xpath 701b544f3c8SBram Moolenaar 702b544f3c8SBram Moolenaarunlet calls 703b544f3c8SBram Moolenaardelfunction P 704b544f3c8SBram Moolenaar 705b544f3c8SBram Moolenaarfunc Test_arg_abort() 706b544f3c8SBram Moolenaar call assert_equal(0, g:test11_calls) 707b544f3c8SBram Moolenaar call assert_equal('ax', g:test11_result) 708b544f3c8SBram Moolenaarendfunc 709b544f3c8SBram Moolenaar 710b544f3c8SBram Moolenaar 711b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 712b544f3c8SBram Moolenaar" Test 12: Expressions in braces in skipped code {{{1 713b544f3c8SBram Moolenaar" 714b544f3c8SBram Moolenaar" In code skipped over due to an error or inactive conditional, 715b544f3c8SBram Moolenaar" an expression in braces as part of a variable or function name 716b544f3c8SBram Moolenaar" should not be evaluated. 717b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 718b544f3c8SBram Moolenaar 719b544f3c8SBram MoolenaarXpathINIT 720b544f3c8SBram Moolenaar 721b544f3c8SBram Moolenaarfunction! NULL() 722b544f3c8SBram Moolenaar Xpath 'a' 723b544f3c8SBram Moolenaar return 0 724b544f3c8SBram Moolenaarendfunction 725b544f3c8SBram Moolenaar 726b544f3c8SBram Moolenaarfunction! ZERO() 727b544f3c8SBram Moolenaar Xpath 'b' 728b544f3c8SBram Moolenaar return 0 729b544f3c8SBram Moolenaarendfunction 730b544f3c8SBram Moolenaar 731b544f3c8SBram Moolenaarfunction! F0() 732b544f3c8SBram Moolenaar Xpath 'c' 733b544f3c8SBram Moolenaarendfunction 734b544f3c8SBram Moolenaar 735b544f3c8SBram Moolenaarfunction! F1(arg) 736b544f3c8SBram Moolenaar Xpath 'e' 737b544f3c8SBram Moolenaarendfunction 738b544f3c8SBram Moolenaar 739b544f3c8SBram Moolenaarlet V0 = 1 740b544f3c8SBram Moolenaar 741b544f3c8SBram MoolenaarXpath 'f' 742b544f3c8SBram Moolenaarecho 0 ? F{NULL() + V{ZERO()}}() : 1 743b544f3c8SBram Moolenaar 744b544f3c8SBram MoolenaarXpath 'g' 745b544f3c8SBram Moolenaarif 0 746b544f3c8SBram Moolenaar Xpath 'h' 747b544f3c8SBram Moolenaar call F{NULL() + V{ZERO()}}() 748b544f3c8SBram Moolenaarendif 749b544f3c8SBram Moolenaar 750b544f3c8SBram MoolenaarXpath 'i' 751b544f3c8SBram Moolenaarif 1 752b544f3c8SBram Moolenaar asdf " error 753b544f3c8SBram Moolenaar Xpath 'j' 754b544f3c8SBram Moolenaar call F1(F{NULL() + V{ZERO()}}()) 755b544f3c8SBram Moolenaarendif 756b544f3c8SBram Moolenaar 757b544f3c8SBram MoolenaarXpath 'k' 758b544f3c8SBram Moolenaarif 1 759b544f3c8SBram Moolenaar asdf " error 760b544f3c8SBram Moolenaar Xpath 'l' 761b544f3c8SBram Moolenaar call F{NULL() + V{ZERO()}}() 762b544f3c8SBram Moolenaarendif 763b544f3c8SBram Moolenaar 764b544f3c8SBram Moolenaarlet g:test12_result = g:Xpath 765b544f3c8SBram Moolenaar 766b544f3c8SBram Moolenaarfunc Test_braces_skipped() 767b544f3c8SBram Moolenaar call assert_equal('fgik', g:test12_result) 768b544f3c8SBram Moolenaarendfunc 769b544f3c8SBram Moolenaar 770b544f3c8SBram Moolenaar 771b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 772b544f3c8SBram Moolenaar" Test 13: Failure in argument evaluation for :while {{{1 773b544f3c8SBram Moolenaar" 774b544f3c8SBram Moolenaar" A failure in the expression evaluation for the condition of a :while 775b544f3c8SBram Moolenaar" causes the whole :while loop until the matching :endwhile being 776b544f3c8SBram Moolenaar" ignored. Continuation is at the next following line. 777b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 778b544f3c8SBram Moolenaar 779b544f3c8SBram MoolenaarXpathINIT 780b544f3c8SBram Moolenaar 781b544f3c8SBram MoolenaarXpath 'a' 782b544f3c8SBram Moolenaarwhile asdf 783b544f3c8SBram Moolenaar Xpath 'b' 784b544f3c8SBram Moolenaar while 1 785b544f3c8SBram Moolenaar Xpath 'c' 786b544f3c8SBram Moolenaar break 787b544f3c8SBram Moolenaar endwhile 788b544f3c8SBram Moolenaar Xpath 'd' 789b544f3c8SBram Moolenaar break 790b544f3c8SBram Moolenaarendwhile 791b544f3c8SBram MoolenaarXpath 'e' 792b544f3c8SBram Moolenaar 793b544f3c8SBram Moolenaarwhile asdf | Xpath 'f' | endwhile | Xpath 'g' 794b544f3c8SBram MoolenaarXpath 'h' 795b544f3c8SBram Moolenaarlet g:test13_result = g:Xpath 796b544f3c8SBram Moolenaar 797b544f3c8SBram Moolenaarfunc Test_while_fail() 798b544f3c8SBram Moolenaar call assert_equal('aeh', g:test13_result) 799b544f3c8SBram Moolenaarendfunc 800b544f3c8SBram Moolenaar 801b544f3c8SBram Moolenaar 802b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 803b544f3c8SBram Moolenaar" Test 14: Failure in argument evaluation for :if {{{1 804b544f3c8SBram Moolenaar" 805b544f3c8SBram Moolenaar" A failure in the expression evaluation for the condition of an :if 806b544f3c8SBram Moolenaar" does not cause the corresponding :else or :endif being matched to 807b544f3c8SBram Moolenaar" a previous :if/:elseif. Neither of both branches of the failed :if 808b544f3c8SBram Moolenaar" are executed. 809b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 810b544f3c8SBram Moolenaar 811b544f3c8SBram MoolenaarXpathINIT 812b544f3c8SBram Moolenaar 813b544f3c8SBram Moolenaarfunction! F() 814b544f3c8SBram Moolenaar Xpath 'a' 815b544f3c8SBram Moolenaar let x = 0 816b544f3c8SBram Moolenaar if x " false 817b544f3c8SBram Moolenaar Xpath 'b' 818b544f3c8SBram Moolenaar elseif !x " always true 819b544f3c8SBram Moolenaar Xpath 'c' 820b544f3c8SBram Moolenaar let x = 1 821b544f3c8SBram Moolenaar if g:boolvar " possibly undefined 822b544f3c8SBram Moolenaar Xpath 'd' 823b544f3c8SBram Moolenaar else 824b544f3c8SBram Moolenaar Xpath 'e' 825b544f3c8SBram Moolenaar endif 826b544f3c8SBram Moolenaar Xpath 'f' 827b544f3c8SBram Moolenaar elseif x " never executed 828b544f3c8SBram Moolenaar Xpath 'g' 829b544f3c8SBram Moolenaar endif 830b544f3c8SBram Moolenaar Xpath 'h' 831b544f3c8SBram Moolenaarendfunction 832b544f3c8SBram Moolenaar 833b544f3c8SBram Moolenaarlet boolvar = 1 834b544f3c8SBram Moolenaarcall F() 835b544f3c8SBram MoolenaarXpath '-' 836b544f3c8SBram Moolenaar 837b544f3c8SBram Moolenaarunlet boolvar 838b544f3c8SBram Moolenaarcall F() 839b544f3c8SBram Moolenaarlet g:test14_result = g:Xpath 840b544f3c8SBram Moolenaar 841b544f3c8SBram Moolenaardelfunction F 842b544f3c8SBram Moolenaar 843b544f3c8SBram Moolenaarfunc Test_if_fail() 844b544f3c8SBram Moolenaar call assert_equal('acdfh-acfh', g:test14_result) 845b544f3c8SBram Moolenaarendfunc 846b544f3c8SBram Moolenaar 847b544f3c8SBram Moolenaar 848b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 849b544f3c8SBram Moolenaar" Test 15: Failure in argument evaluation for :if (bar) {{{1 850b544f3c8SBram Moolenaar" 851b544f3c8SBram Moolenaar" Like previous test, except that the failing :if ... | ... | :endif 852b544f3c8SBram Moolenaar" is in a single line. 853b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 854b544f3c8SBram Moolenaar 855b544f3c8SBram MoolenaarXpathINIT 856b544f3c8SBram Moolenaar 857b544f3c8SBram Moolenaarfunction! F() 858b544f3c8SBram Moolenaar Xpath 'a' 859b544f3c8SBram Moolenaar let x = 0 860b544f3c8SBram Moolenaar if x " false 861b544f3c8SBram Moolenaar Xpath 'b' 862b544f3c8SBram Moolenaar elseif !x " always true 863b544f3c8SBram Moolenaar Xpath 'c' 864b544f3c8SBram Moolenaar let x = 1 865b544f3c8SBram Moolenaar if g:boolvar | Xpath 'd' | else | Xpath 'e' | endif 866b544f3c8SBram Moolenaar Xpath 'f' 867b544f3c8SBram Moolenaar elseif x " never executed 868b544f3c8SBram Moolenaar Xpath 'g' 869b544f3c8SBram Moolenaar endif 870b544f3c8SBram Moolenaar Xpath 'h' 871b544f3c8SBram Moolenaarendfunction 872b544f3c8SBram Moolenaar 873b544f3c8SBram Moolenaarlet boolvar = 1 874b544f3c8SBram Moolenaarcall F() 875b544f3c8SBram MoolenaarXpath '-' 876b544f3c8SBram Moolenaar 877b544f3c8SBram Moolenaarunlet boolvar 878b544f3c8SBram Moolenaarcall F() 879b544f3c8SBram Moolenaarlet g:test15_result = g:Xpath 880b544f3c8SBram Moolenaar 881b544f3c8SBram Moolenaardelfunction F 882b544f3c8SBram Moolenaar 883b544f3c8SBram Moolenaarfunc Test_if_bar_fail() 884b544f3c8SBram Moolenaar call assert_equal('acdfh-acfh', g:test15_result) 885b544f3c8SBram Moolenaarendfunc 886b544f3c8SBram Moolenaar 887b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 8881f068233SBram Moolenaar" Test 16: Double :else or :elseif after :else {{{1 8891f068233SBram Moolenaar" 8901f068233SBram Moolenaar" Multiple :elses or an :elseif after an :else are forbidden. 8911f068233SBram Moolenaar"------------------------------------------------------------------------------- 8921f068233SBram Moolenaar 8931f068233SBram Moolenaarfunc T16_F() abort 8941f068233SBram Moolenaar if 0 8951f068233SBram Moolenaar Xpath 'a' 8961f068233SBram Moolenaar else 8971f068233SBram Moolenaar Xpath 'b' 8981f068233SBram Moolenaar else " aborts function 8991f068233SBram Moolenaar Xpath 'c' 9001f068233SBram Moolenaar endif 9011f068233SBram Moolenaar Xpath 'd' 9021f068233SBram Moolenaarendfunc 9031f068233SBram Moolenaar 9041f068233SBram Moolenaarfunc T16_G() abort 9051f068233SBram Moolenaar if 0 9061f068233SBram Moolenaar Xpath 'a' 9071f068233SBram Moolenaar else 9081f068233SBram Moolenaar Xpath 'b' 9091f068233SBram Moolenaar elseif 1 " aborts function 9101f068233SBram Moolenaar Xpath 'c' 9111f068233SBram Moolenaar else 9121f068233SBram Moolenaar Xpath 'd' 9131f068233SBram Moolenaar endif 9141f068233SBram Moolenaar Xpath 'e' 9151f068233SBram Moolenaarendfunc 9161f068233SBram Moolenaar 9171f068233SBram Moolenaarfunc T16_H() abort 9181f068233SBram Moolenaar if 0 9191f068233SBram Moolenaar Xpath 'a' 9201f068233SBram Moolenaar elseif 0 9211f068233SBram Moolenaar Xpath 'b' 9221f068233SBram Moolenaar else 9231f068233SBram Moolenaar Xpath 'c' 9241f068233SBram Moolenaar else " aborts function 9251f068233SBram Moolenaar Xpath 'd' 9261f068233SBram Moolenaar endif 9271f068233SBram Moolenaar Xpath 'e' 9281f068233SBram Moolenaarendfunc 9291f068233SBram Moolenaar 9301f068233SBram Moolenaarfunc T16_I() abort 9311f068233SBram Moolenaar if 0 9321f068233SBram Moolenaar Xpath 'a' 9331f068233SBram Moolenaar elseif 0 9341f068233SBram Moolenaar Xpath 'b' 9351f068233SBram Moolenaar else 9361f068233SBram Moolenaar Xpath 'c' 9371f068233SBram Moolenaar elseif 1 " aborts function 9381f068233SBram Moolenaar Xpath 'd' 9391f068233SBram Moolenaar else 9401f068233SBram Moolenaar Xpath 'e' 9411f068233SBram Moolenaar endif 9421f068233SBram Moolenaar Xpath 'f' 9431f068233SBram Moolenaarendfunc 9441f068233SBram Moolenaar 9451f068233SBram Moolenaarfunc Test_Multi_Else() 9461f068233SBram Moolenaar XpathINIT 9471f068233SBram Moolenaar try 9481f068233SBram Moolenaar call T16_F() 9491f068233SBram Moolenaar catch /E583:/ 9501f068233SBram Moolenaar Xpath 'e' 9511f068233SBram Moolenaar endtry 9521f068233SBram Moolenaar call assert_equal('be', g:Xpath) 9531f068233SBram Moolenaar 9541f068233SBram Moolenaar XpathINIT 9551f068233SBram Moolenaar try 9561f068233SBram Moolenaar call T16_G() 9571f068233SBram Moolenaar catch /E584:/ 9581f068233SBram Moolenaar Xpath 'f' 9591f068233SBram Moolenaar endtry 9601f068233SBram Moolenaar call assert_equal('bf', g:Xpath) 9611f068233SBram Moolenaar 9621f068233SBram Moolenaar XpathINIT 9631f068233SBram Moolenaar try 9641f068233SBram Moolenaar call T16_H() 9651f068233SBram Moolenaar catch /E583:/ 9661f068233SBram Moolenaar Xpath 'f' 9671f068233SBram Moolenaar endtry 9681f068233SBram Moolenaar call assert_equal('cf', g:Xpath) 9691f068233SBram Moolenaar 9701f068233SBram Moolenaar XpathINIT 9711f068233SBram Moolenaar try 9721f068233SBram Moolenaar call T16_I() 9731f068233SBram Moolenaar catch /E584:/ 9741f068233SBram Moolenaar Xpath 'g' 9751f068233SBram Moolenaar endtry 9761f068233SBram Moolenaar call assert_equal('cg', g:Xpath) 9771f068233SBram Moolenaarendfunc 9781f068233SBram Moolenaar 9791f068233SBram Moolenaar"------------------------------------------------------------------------------- 9801f068233SBram Moolenaar" Test 17: Nesting of unmatched :if or :endif inside a :while {{{1 9811f068233SBram Moolenaar" 9821f068233SBram Moolenaar" The :while/:endwhile takes precedence in nesting over an unclosed 9831f068233SBram Moolenaar" :if or an unopened :endif. 9841f068233SBram Moolenaar"------------------------------------------------------------------------------- 9851f068233SBram Moolenaar 9861f068233SBram Moolenaar" While loops inside a function are continued on error. 9871f068233SBram Moolenaarfunc T17_F() 9881f068233SBram Moolenaar let loops = 3 9891f068233SBram Moolenaar while loops > 0 9901f068233SBram Moolenaar let loops -= 1 9911f068233SBram Moolenaar Xpath 'a' . loops 9921f068233SBram Moolenaar if (loops == 1) 9931f068233SBram Moolenaar Xpath 'b' . loops 9941f068233SBram Moolenaar continue 9951f068233SBram Moolenaar elseif (loops == 0) 9961f068233SBram Moolenaar Xpath 'c' . loops 9971f068233SBram Moolenaar break 9981f068233SBram Moolenaar elseif 1 9991f068233SBram Moolenaar Xpath 'd' . loops 10001f068233SBram Moolenaar " endif missing! 10011f068233SBram Moolenaar endwhile " :endwhile after :if 1 10021f068233SBram Moolenaar Xpath 'e' 10031f068233SBram Moolenaarendfunc 10041f068233SBram Moolenaar 10051f068233SBram Moolenaarfunc T17_G() 10061f068233SBram Moolenaar let loops = 2 10071f068233SBram Moolenaar while loops > 0 10081f068233SBram Moolenaar let loops -= 1 10091f068233SBram Moolenaar Xpath 'a' . loops 10101f068233SBram Moolenaar if 0 10111f068233SBram Moolenaar Xpath 'b' . loops 10121f068233SBram Moolenaar " endif missing 10131f068233SBram Moolenaar endwhile " :endwhile after :if 0 10141f068233SBram Moolenaarendfunc 10151f068233SBram Moolenaar 10161f068233SBram Moolenaarfunc T17_H() 10171f068233SBram Moolenaar let loops = 2 10181f068233SBram Moolenaar while loops > 0 10191f068233SBram Moolenaar let loops -= 1 10201f068233SBram Moolenaar Xpath 'a' . loops 10211f068233SBram Moolenaar " if missing! 10221f068233SBram Moolenaar endif " :endif without :if in while 10231f068233SBram Moolenaar Xpath 'b' . loops 10241f068233SBram Moolenaar endwhile 10251f068233SBram Moolenaarendfunc 10261f068233SBram Moolenaar 10271f068233SBram Moolenaar" Error continuation outside a function is at the outermost :endwhile or :endif. 10281f068233SBram MoolenaarXpathINIT 10291f068233SBram Moolenaarlet v:errmsg = '' 10301f068233SBram Moolenaarlet loops = 2 10311f068233SBram Moolenaarwhile loops > 0 10321f068233SBram Moolenaar let loops -= 1 10331f068233SBram Moolenaar Xpath 'a' . loops 10341f068233SBram Moolenaar if 0 10351f068233SBram Moolenaar Xpath 'b' . loops 10361f068233SBram Moolenaar " endif missing! Following :endwhile fails. 10371f068233SBram Moolenaarendwhile | Xpath 'c' 10381f068233SBram MoolenaarXpath 'd' 10391f068233SBram Moolenaarcall assert_match('E171:', v:errmsg) 10401f068233SBram Moolenaarcall assert_equal('a1d', g:Xpath) 10411f068233SBram Moolenaar 10421f068233SBram Moolenaarfunc Test_unmatched_if_in_while() 10431f068233SBram Moolenaar XpathINIT 10441f068233SBram Moolenaar call assert_fails('call T17_F()', 'E171:') 10451f068233SBram Moolenaar call assert_equal('a2d2a1b1a0c0e', g:Xpath) 10461f068233SBram Moolenaar 10471f068233SBram Moolenaar XpathINIT 10481f068233SBram Moolenaar call assert_fails('call T17_G()', 'E171:') 10491f068233SBram Moolenaar call assert_equal('a1a0', g:Xpath) 10501f068233SBram Moolenaar 10511f068233SBram Moolenaar XpathINIT 10521f068233SBram Moolenaar call assert_fails('call T17_H()', 'E580:') 10531f068233SBram Moolenaar call assert_equal('a1b1a0b0', g:Xpath) 10541f068233SBram Moolenaarendfunc 10551f068233SBram Moolenaar 10561f068233SBram Moolenaar"------------------------------------------------------------------------------- 1057a6296200SBram Moolenaar" Test 18: Interrupt (Ctrl-C pressed) {{{1 1058a6296200SBram Moolenaar" 1059a6296200SBram Moolenaar" On an interrupt, the script processing is terminated immediately. 10601f068233SBram Moolenaar"------------------------------------------------------------------------------- 1061a6296200SBram Moolenaar 1062a6296200SBram Moolenaarfunc Test_interrupt_while_if() 1063a6296200SBram Moolenaar let test =<< trim [CODE] 1064a6296200SBram Moolenaar try 1065a6296200SBram Moolenaar if 1 1066a6296200SBram Moolenaar Xpath 'a' 1067a6296200SBram Moolenaar while 1 1068a6296200SBram Moolenaar Xpath 'b' 1069a6296200SBram Moolenaar if 1 1070a6296200SBram Moolenaar Xpath 'c' 1071a6296200SBram Moolenaar call interrupt() 1072a6296200SBram Moolenaar call assert_report('should not get here') 1073a6296200SBram Moolenaar break 1074a6296200SBram Moolenaar finish 1075a6296200SBram Moolenaar endif | call assert_report('should not get here') 1076a6296200SBram Moolenaar call assert_report('should not get here') 1077a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1078a6296200SBram Moolenaar call assert_report('should not get here') 1079a6296200SBram Moolenaar endif | call assert_report('should not get here') 1080a6296200SBram Moolenaar call assert_report('should not get here') 1081a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1082a6296200SBram Moolenaar Xpath 'd' 1083a6296200SBram Moolenaar endtry | Xpath 'e' 1084a6296200SBram Moolenaar Xpath 'f' 1085a6296200SBram Moolenaar [CODE] 1086a6296200SBram Moolenaar let verify =<< trim [CODE] 1087a6296200SBram Moolenaar call assert_equal('abcdef', g:Xpath) 1088a6296200SBram Moolenaar [CODE] 1089a6296200SBram Moolenaar call RunInNewVim(test, verify) 1090a6296200SBram Moolenaarendfunc 1091a6296200SBram Moolenaar 1092a6296200SBram Moolenaarfunc Test_interrupt_try() 1093a6296200SBram Moolenaar let test =<< trim [CODE] 1094a6296200SBram Moolenaar try 1095a6296200SBram Moolenaar try 1096a6296200SBram Moolenaar Xpath 'a' 1097a6296200SBram Moolenaar call interrupt() 1098a6296200SBram Moolenaar call assert_report('should not get here') 1099a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1100a6296200SBram Moolenaar call assert_report('should not get here') 1101a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1102a6296200SBram Moolenaar Xpath 'b' 1103a6296200SBram Moolenaar endtry | Xpath 'c' 1104a6296200SBram Moolenaar Xpath 'd' 1105a6296200SBram Moolenaar [CODE] 1106a6296200SBram Moolenaar let verify =<< trim [CODE] 1107a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1108a6296200SBram Moolenaar [CODE] 1109a6296200SBram Moolenaar call RunInNewVim(test, verify) 1110a6296200SBram Moolenaarendfunc 1111a6296200SBram Moolenaar 1112a6296200SBram Moolenaarfunc Test_interrupt_func_while_if() 1113a6296200SBram Moolenaar let test =<< trim [CODE] 1114a6296200SBram Moolenaar func F() 1115a6296200SBram Moolenaar if 1 1116a6296200SBram Moolenaar Xpath 'a' 1117a6296200SBram Moolenaar while 1 1118a6296200SBram Moolenaar Xpath 'b' 1119a6296200SBram Moolenaar if 1 1120a6296200SBram Moolenaar Xpath 'c' 1121a6296200SBram Moolenaar call interrupt() 1122a6296200SBram Moolenaar call assert_report('should not get here') 1123a6296200SBram Moolenaar break 1124a6296200SBram Moolenaar return 1125a6296200SBram Moolenaar endif | call assert_report('should not get here') 1126a6296200SBram Moolenaar call assert_report('should not get here') 1127a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1128a6296200SBram Moolenaar call assert_report('should not get here') 1129a6296200SBram Moolenaar endif | call assert_report('should not get here') 1130a6296200SBram Moolenaar call assert_report('should not get here') 1131a6296200SBram Moolenaar endfunc 1132a6296200SBram Moolenaar 1133a6296200SBram Moolenaar Xpath 'd' 1134a6296200SBram Moolenaar try 1135a6296200SBram Moolenaar call F() | call assert_report('should not get here') 1136a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1137a6296200SBram Moolenaar Xpath 'e' 1138a6296200SBram Moolenaar endtry | Xpath 'f' 1139a6296200SBram Moolenaar Xpath 'g' 1140a6296200SBram Moolenaar [CODE] 1141a6296200SBram Moolenaar let verify =<< trim [CODE] 1142a6296200SBram Moolenaar call assert_equal('dabcefg', g:Xpath) 1143a6296200SBram Moolenaar [CODE] 1144a6296200SBram Moolenaar call RunInNewVim(test, verify) 1145a6296200SBram Moolenaarendfunc 1146a6296200SBram Moolenaar 1147a6296200SBram Moolenaarfunc Test_interrupt_func_try() 1148a6296200SBram Moolenaar let test =<< trim [CODE] 1149a6296200SBram Moolenaar func G() 1150a6296200SBram Moolenaar try 1151a6296200SBram Moolenaar Xpath 'a' 1152a6296200SBram Moolenaar call interrupt() 1153a6296200SBram Moolenaar call assert_report('should not get here') 1154a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1155a6296200SBram Moolenaar call assert_report('should not get here') 1156a6296200SBram Moolenaar endfunc 1157a6296200SBram Moolenaar 1158a6296200SBram Moolenaar Xpath 'b' 1159a6296200SBram Moolenaar try 1160a6296200SBram Moolenaar call G() | call assert_report('should not get here') 1161a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1162a6296200SBram Moolenaar Xpath 'c' 1163a6296200SBram Moolenaar endtry | Xpath 'd' 1164a6296200SBram Moolenaar Xpath 'e' 1165a6296200SBram Moolenaar [CODE] 1166a6296200SBram Moolenaar let verify =<< trim [CODE] 1167a6296200SBram Moolenaar call assert_equal('bacde', g:Xpath) 1168a6296200SBram Moolenaar [CODE] 1169a6296200SBram Moolenaar call RunInNewVim(test, verify) 1170a6296200SBram Moolenaarendfunc 1171a6296200SBram Moolenaar 1172a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1173a6296200SBram Moolenaar" Test 19: Aborting on errors inside :try/:endtry {{{1 1174a6296200SBram Moolenaar" 1175a6296200SBram Moolenaar" An error in a command dynamically enclosed in a :try/:endtry region 1176a6296200SBram Moolenaar" aborts script processing immediately. It does not matter whether 1177a6296200SBram Moolenaar" the failing command is outside or inside a function and whether a 1178a6296200SBram Moolenaar" function has an "abort" attribute. 1179a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1180a6296200SBram Moolenaar 1181a6296200SBram Moolenaarfunc Test_try_error_abort_1() 1182a6296200SBram Moolenaar let test =<< trim [CODE] 1183a6296200SBram Moolenaar func F() abort 1184a6296200SBram Moolenaar Xpath 'a' 1185a6296200SBram Moolenaar asdf 1186a6296200SBram Moolenaar call assert_report('should not get here') 1187a6296200SBram Moolenaar endfunc 1188a6296200SBram Moolenaar 1189a6296200SBram Moolenaar try 1190a6296200SBram Moolenaar Xpath 'b' 1191a6296200SBram Moolenaar call F() 1192a6296200SBram Moolenaar call assert_report('should not get here') 1193a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1194a6296200SBram Moolenaar call assert_report('should not get here') 1195a6296200SBram Moolenaar [CODE] 1196a6296200SBram Moolenaar let verify =<< trim [CODE] 1197a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1198a6296200SBram Moolenaar [CODE] 1199a6296200SBram Moolenaar call RunInNewVim(test, verify) 1200a6296200SBram Moolenaarendfunc 1201a6296200SBram Moolenaar 1202a6296200SBram Moolenaarfunc Test_try_error_abort_2() 1203a6296200SBram Moolenaar let test =<< trim [CODE] 1204a6296200SBram Moolenaar func G() 1205a6296200SBram Moolenaar Xpath 'a' 1206a6296200SBram Moolenaar asdf 1207a6296200SBram Moolenaar call assert_report('should not get here') 1208a6296200SBram Moolenaar endfunc 1209a6296200SBram Moolenaar 1210a6296200SBram Moolenaar try 1211a6296200SBram Moolenaar Xpath 'b' 1212a6296200SBram Moolenaar call G() 1213a6296200SBram Moolenaar call assert_report('should not get here') 1214a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1215a6296200SBram Moolenaar call assert_report('should not get here') 1216a6296200SBram Moolenaar [CODE] 1217a6296200SBram Moolenaar let verify =<< trim [CODE] 1218a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1219a6296200SBram Moolenaar [CODE] 1220a6296200SBram Moolenaar call RunInNewVim(test, verify) 1221a6296200SBram Moolenaarendfunc 1222a6296200SBram Moolenaar 1223a6296200SBram Moolenaarfunc Test_try_error_abort_3() 1224a6296200SBram Moolenaar let test =<< trim [CODE] 1225a6296200SBram Moolenaar try 1226a6296200SBram Moolenaar Xpath 'a' 1227a6296200SBram Moolenaar asdf 1228a6296200SBram Moolenaar call assert_report('should not get here') 1229a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1230a6296200SBram Moolenaar call assert_report('should not get here') 1231a6296200SBram Moolenaar [CODE] 1232a6296200SBram Moolenaar let verify =<< trim [CODE] 1233a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1234a6296200SBram Moolenaar [CODE] 1235a6296200SBram Moolenaar call RunInNewVim(test, verify) 1236a6296200SBram Moolenaarendfunc 1237a6296200SBram Moolenaar 1238a6296200SBram Moolenaarfunc Test_try_error_abort_4() 1239a6296200SBram Moolenaar let test =<< trim [CODE] 1240a6296200SBram Moolenaar if 1 1241a6296200SBram Moolenaar try 1242a6296200SBram Moolenaar Xpath 'a' 1243a6296200SBram Moolenaar asdf 1244a6296200SBram Moolenaar call assert_report('should not get here') 1245a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1246a6296200SBram Moolenaar endif | call assert_report('should not get here') 1247a6296200SBram Moolenaar call assert_report('should not get here') 1248a6296200SBram Moolenaar [CODE] 1249a6296200SBram Moolenaar let verify =<< trim [CODE] 1250a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1251a6296200SBram Moolenaar [CODE] 1252a6296200SBram Moolenaar call RunInNewVim(test, verify) 1253a6296200SBram Moolenaarendfunc 1254a6296200SBram Moolenaar 1255a6296200SBram Moolenaarfunc Test_try_error_abort_5() 1256a6296200SBram Moolenaar let test =<< trim [CODE] 1257a6296200SBram Moolenaar let p = 1 1258a6296200SBram Moolenaar while p 1259a6296200SBram Moolenaar let p = 0 1260a6296200SBram Moolenaar try 1261a6296200SBram Moolenaar Xpath 'a' 1262a6296200SBram Moolenaar asdf 1263a6296200SBram Moolenaar call assert_report('should not get here') 1264a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1265a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1266a6296200SBram Moolenaar call assert_report('should not get here') 1267a6296200SBram Moolenaar [CODE] 1268a6296200SBram Moolenaar let verify =<< trim [CODE] 1269a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1270a6296200SBram Moolenaar [CODE] 1271a6296200SBram Moolenaar call RunInNewVim(test, verify) 1272a6296200SBram Moolenaarendfunc 1273a6296200SBram Moolenaar 1274a6296200SBram Moolenaarfunc Test_try_error_abort_6() 1275a6296200SBram Moolenaar let test =<< trim [CODE] 1276a6296200SBram Moolenaar let p = 1 1277a6296200SBram Moolenaar Xpath 'a' 1278a6296200SBram Moolenaar while p 1279a6296200SBram Moolenaar Xpath 'b' 1280a6296200SBram Moolenaar let p = 0 1281a6296200SBram Moolenaar try 1282a6296200SBram Moolenaar Xpath 'c' 1283a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1284a6296200SBram Moolenaar call assert_report('should not get here') 1285a6296200SBram Moolenaar [CODE] 1286a6296200SBram Moolenaar let verify =<< trim [CODE] 1287a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1288a6296200SBram Moolenaar [CODE] 1289a6296200SBram Moolenaar call RunInNewVim(test, verify) 1290a6296200SBram Moolenaarendfunc 1291a6296200SBram Moolenaar 1292a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1293a6296200SBram Moolenaar" Test 20: Aborting on errors after :try/:endtry {{{1 1294a6296200SBram Moolenaar" 1295a6296200SBram Moolenaar" When an error occurs after the last active :try/:endtry region has 1296a6296200SBram Moolenaar" been left, termination behavior is as if no :try/:endtry has been 1297a6296200SBram Moolenaar" seen. 1298a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1299a6296200SBram Moolenaar 1300a6296200SBram Moolenaarfunc Test_error_after_try_1() 1301a6296200SBram Moolenaar let test =<< trim [CODE] 1302a6296200SBram Moolenaar let p = 1 1303a6296200SBram Moolenaar while p 1304a6296200SBram Moolenaar let p = 0 1305a6296200SBram Moolenaar Xpath 'a' 1306a6296200SBram Moolenaar try 1307a6296200SBram Moolenaar Xpath 'b' 1308a6296200SBram Moolenaar endtry 1309a6296200SBram Moolenaar asdf 1310a6296200SBram Moolenaar call assert_report('should not get here') 1311a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1312a6296200SBram Moolenaar Xpath 'c' 1313a6296200SBram Moolenaar [CODE] 1314a6296200SBram Moolenaar let verify =<< trim [CODE] 1315a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1316a6296200SBram Moolenaar [CODE] 1317a6296200SBram Moolenaar call RunInNewVim(test, verify) 1318a6296200SBram Moolenaarendfunc 1319a6296200SBram Moolenaar 1320a6296200SBram Moolenaarfunc Test_error_after_try_2() 1321a6296200SBram Moolenaar let test =<< trim [CODE] 1322a6296200SBram Moolenaar while 1 1323a6296200SBram Moolenaar try 1324a6296200SBram Moolenaar Xpath 'a' 1325a6296200SBram Moolenaar break 1326a6296200SBram Moolenaar call assert_report('should not get here') 1327a6296200SBram Moolenaar endtry 1328a6296200SBram Moolenaar endwhile 1329a6296200SBram Moolenaar Xpath 'b' 1330a6296200SBram Moolenaar asdf 1331a6296200SBram Moolenaar Xpath 'c' 1332a6296200SBram Moolenaar [CODE] 1333a6296200SBram Moolenaar let verify =<< trim [CODE] 1334a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1335a6296200SBram Moolenaar [CODE] 1336a6296200SBram Moolenaar call RunInNewVim(test, verify) 1337a6296200SBram Moolenaarendfunc 1338a6296200SBram Moolenaar 1339a6296200SBram Moolenaarfunc Test_error_after_try_3() 1340a6296200SBram Moolenaar let test =<< trim [CODE] 1341a6296200SBram Moolenaar while 1 1342a6296200SBram Moolenaar try 1343a6296200SBram Moolenaar Xpath 'a' 1344a6296200SBram Moolenaar break 1345a6296200SBram Moolenaar call assert_report('should not get here') 1346a6296200SBram Moolenaar finally 1347a6296200SBram Moolenaar Xpath 'b' 1348a6296200SBram Moolenaar endtry 1349a6296200SBram Moolenaar endwhile 1350a6296200SBram Moolenaar Xpath 'c' 1351a6296200SBram Moolenaar asdf 1352a6296200SBram Moolenaar Xpath 'd' 1353a6296200SBram Moolenaar [CODE] 1354a6296200SBram Moolenaar let verify =<< trim [CODE] 1355a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1356a6296200SBram Moolenaar [CODE] 1357a6296200SBram Moolenaar call RunInNewVim(test, verify) 1358a6296200SBram Moolenaarendfunc 1359a6296200SBram Moolenaar 1360a6296200SBram Moolenaarfunc Test_error_after_try_4() 1361a6296200SBram Moolenaar let test =<< trim [CODE] 1362a6296200SBram Moolenaar while 1 1363a6296200SBram Moolenaar try 1364a6296200SBram Moolenaar Xpath 'a' 1365a6296200SBram Moolenaar finally 1366a6296200SBram Moolenaar Xpath 'b' 1367a6296200SBram Moolenaar break 1368a6296200SBram Moolenaar call assert_report('should not get here') 1369a6296200SBram Moolenaar endtry 1370a6296200SBram Moolenaar endwhile 1371a6296200SBram Moolenaar Xpath 'c' 1372a6296200SBram Moolenaar asdf 1373a6296200SBram Moolenaar Xpath 'd' 1374a6296200SBram Moolenaar [CODE] 1375a6296200SBram Moolenaar let verify =<< trim [CODE] 1376a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1377a6296200SBram Moolenaar [CODE] 1378a6296200SBram Moolenaar call RunInNewVim(test, verify) 1379a6296200SBram Moolenaarendfunc 1380a6296200SBram Moolenaar 1381a6296200SBram Moolenaarfunc Test_error_after_try_5() 1382a6296200SBram Moolenaar let test =<< trim [CODE] 1383a6296200SBram Moolenaar let p = 1 1384a6296200SBram Moolenaar while p 1385a6296200SBram Moolenaar let p = 0 1386a6296200SBram Moolenaar try 1387a6296200SBram Moolenaar Xpath 'a' 1388a6296200SBram Moolenaar continue 1389a6296200SBram Moolenaar call assert_report('should not get here') 1390a6296200SBram Moolenaar endtry 1391a6296200SBram Moolenaar endwhile 1392a6296200SBram Moolenaar Xpath 'b' 1393a6296200SBram Moolenaar asdf 1394a6296200SBram Moolenaar Xpath 'c' 1395a6296200SBram Moolenaar [CODE] 1396a6296200SBram Moolenaar let verify =<< trim [CODE] 1397a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1398a6296200SBram Moolenaar [CODE] 1399a6296200SBram Moolenaar call RunInNewVim(test, verify) 1400a6296200SBram Moolenaarendfunc 1401a6296200SBram Moolenaar 1402a6296200SBram Moolenaarfunc Test_error_after_try_6() 1403a6296200SBram Moolenaar let test =<< trim [CODE] 1404a6296200SBram Moolenaar let p = 1 1405a6296200SBram Moolenaar while p 1406a6296200SBram Moolenaar let p = 0 1407a6296200SBram Moolenaar try 1408a6296200SBram Moolenaar Xpath 'a' 1409a6296200SBram Moolenaar continue 1410a6296200SBram Moolenaar call assert_report('should not get here') 1411a6296200SBram Moolenaar finally 1412a6296200SBram Moolenaar Xpath 'b' 1413a6296200SBram Moolenaar endtry 1414a6296200SBram Moolenaar endwhile 1415a6296200SBram Moolenaar Xpath 'c' 1416a6296200SBram Moolenaar asdf 1417a6296200SBram Moolenaar Xpath 'd' 1418a6296200SBram Moolenaar [CODE] 1419a6296200SBram Moolenaar let verify =<< trim [CODE] 1420a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1421a6296200SBram Moolenaar [CODE] 1422a6296200SBram Moolenaar call RunInNewVim(test, verify) 1423a6296200SBram Moolenaarendfunc 1424a6296200SBram Moolenaar 1425a6296200SBram Moolenaarfunc Test_error_after_try_7() 1426a6296200SBram Moolenaar let test =<< trim [CODE] 1427a6296200SBram Moolenaar let p = 1 1428a6296200SBram Moolenaar while p 1429a6296200SBram Moolenaar let p = 0 1430a6296200SBram Moolenaar try 1431a6296200SBram Moolenaar Xpath 'a' 1432a6296200SBram Moolenaar finally 1433a6296200SBram Moolenaar Xpath 'b' 1434a6296200SBram Moolenaar continue 1435a6296200SBram Moolenaar call assert_report('should not get here') 1436a6296200SBram Moolenaar endtry 1437a6296200SBram Moolenaar endwhile 1438a6296200SBram Moolenaar Xpath 'c' 1439a6296200SBram Moolenaar asdf 1440a6296200SBram Moolenaar Xpath 'd' 1441a6296200SBram Moolenaar [CODE] 1442a6296200SBram Moolenaar let verify =<< trim [CODE] 1443a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1444a6296200SBram Moolenaar [CODE] 1445a6296200SBram Moolenaar call RunInNewVim(test, verify) 1446a6296200SBram Moolenaarendfunc 1447a6296200SBram Moolenaar 1448a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1449a6296200SBram Moolenaar" Test 21: :finally for :try after :continue/:break/:return/:finish {{{1 1450a6296200SBram Moolenaar" 1451a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :continue, 1452a6296200SBram Moolenaar" :break, :return, or :finish, its :finally clause should not be 1453a6296200SBram Moolenaar" executed. 1454a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1455a6296200SBram Moolenaar 1456a6296200SBram Moolenaarfunc Test_finally_after_loop_ctrl_statement() 1457a6296200SBram Moolenaar let test =<< trim [CODE] 1458a6296200SBram Moolenaar func F() 1459a6296200SBram Moolenaar let loops = 2 1460a6296200SBram Moolenaar while loops > 0 1461a6296200SBram Moolenaar XloopNEXT 1462a6296200SBram Moolenaar let loops = loops - 1 1463a6296200SBram Moolenaar try 1464a6296200SBram Moolenaar if loops == 1 1465a6296200SBram Moolenaar Xloop 'a' 1466a6296200SBram Moolenaar continue 1467a6296200SBram Moolenaar call assert_report('should not get here') 1468a6296200SBram Moolenaar elseif loops == 0 1469a6296200SBram Moolenaar Xloop 'b' 1470a6296200SBram Moolenaar break 1471a6296200SBram Moolenaar call assert_report('should not get here') 1472a6296200SBram Moolenaar endif 1473a6296200SBram Moolenaar 1474a6296200SBram Moolenaar try " inactive 1475a6296200SBram Moolenaar call assert_report('should not get here') 1476a6296200SBram Moolenaar finally 1477a6296200SBram Moolenaar call assert_report('should not get here') 1478a6296200SBram Moolenaar endtry 1479a6296200SBram Moolenaar finally 1480a6296200SBram Moolenaar Xloop 'c' 1481a6296200SBram Moolenaar endtry 1482a6296200SBram Moolenaar call assert_report('should not get here') 1483a6296200SBram Moolenaar endwhile 1484a6296200SBram Moolenaar 1485a6296200SBram Moolenaar try 1486a6296200SBram Moolenaar Xpath 'd' 1487a6296200SBram Moolenaar return 1488a6296200SBram Moolenaar call assert_report('should not get here') 1489a6296200SBram Moolenaar try " inactive 1490a6296200SBram Moolenaar call assert_report('should not get here') 1491a6296200SBram Moolenaar finally 1492a6296200SBram Moolenaar call assert_report('should not get here') 1493a6296200SBram Moolenaar endtry 1494a6296200SBram Moolenaar finally 1495a6296200SBram Moolenaar Xpath 'e' 1496a6296200SBram Moolenaar endtry 1497a6296200SBram Moolenaar call assert_report('should not get here') 1498a6296200SBram Moolenaar endfunc 1499a6296200SBram Moolenaar 1500a6296200SBram Moolenaar try 1501a6296200SBram Moolenaar Xpath 'f' 1502a6296200SBram Moolenaar call F() 1503a6296200SBram Moolenaar Xpath 'g' 1504a6296200SBram Moolenaar finish 1505a6296200SBram Moolenaar call assert_report('should not get here') 1506a6296200SBram Moolenaar try " inactive 1507a6296200SBram Moolenaar call assert_report('should not get here') 1508a6296200SBram Moolenaar finally 1509a6296200SBram Moolenaar call assert_report('should not get here') 1510a6296200SBram Moolenaar endtry 1511a6296200SBram Moolenaar finally 1512a6296200SBram Moolenaar Xpath 'h' 1513a6296200SBram Moolenaar endtry 1514a6296200SBram Moolenaar call assert_report('should not get here') 1515a6296200SBram Moolenaar [CODE] 1516a6296200SBram Moolenaar let verify =<< trim [CODE] 1517a6296200SBram Moolenaar call assert_equal('fa2c2b3c3degh', g:Xpath) 1518a6296200SBram Moolenaar [CODE] 1519a6296200SBram Moolenaar call RunInNewVim(test, verify) 1520a6296200SBram Moolenaarendfunc 1521a6296200SBram Moolenaar 1522a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1523a6296200SBram Moolenaar" Test 22: :finally for a :try after an error/interrupt/:throw {{{1 1524a6296200SBram Moolenaar" 1525a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding error or 1526a6296200SBram Moolenaar" interrupt or :throw, its :finally clause should not be executed. 1527a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1528a6296200SBram Moolenaar 1529a6296200SBram Moolenaarfunc Test_finally_after_error_in_func() 1530a6296200SBram Moolenaar let test =<< trim [CODE] 1531a6296200SBram Moolenaar func Error() 1532a6296200SBram Moolenaar try 1533a6296200SBram Moolenaar Xpath 'b' 1534a6296200SBram Moolenaar asdf " aborting error, triggering error exception 1535a6296200SBram Moolenaar call assert_report('should not get here') 1536a6296200SBram Moolenaar endtry 1537a6296200SBram Moolenaar call assert_report('should not get here') 1538a6296200SBram Moolenaar endfunc 1539a6296200SBram Moolenaar 1540a6296200SBram Moolenaar Xpath 'a' 1541a6296200SBram Moolenaar call Error() 1542a6296200SBram Moolenaar call assert_report('should not get here') 1543a6296200SBram Moolenaar 1544a6296200SBram Moolenaar if 1 " not active due to error 1545a6296200SBram Moolenaar try " not active since :if inactive 1546a6296200SBram Moolenaar call assert_report('should not get here') 1547a6296200SBram Moolenaar finally 1548a6296200SBram Moolenaar call assert_report('should not get here') 1549a6296200SBram Moolenaar endtry 1550a6296200SBram Moolenaar endif 1551a6296200SBram Moolenaar 1552a6296200SBram Moolenaar try " not active due to error 1553a6296200SBram Moolenaar call assert_report('should not get here') 1554a6296200SBram Moolenaar finally 1555a6296200SBram Moolenaar call assert_report('should not get here') 1556a6296200SBram Moolenaar endtry 1557a6296200SBram Moolenaar [CODE] 1558a6296200SBram Moolenaar let verify =<< trim [CODE] 1559a6296200SBram Moolenaar call assert_equal('ab', g:Xpath) 1560a6296200SBram Moolenaar [CODE] 1561a6296200SBram Moolenaar call RunInNewVim(test, verify) 1562a6296200SBram Moolenaarendfunc 1563a6296200SBram Moolenaar 1564a6296200SBram Moolenaarfunc Test_finally_after_interrupt() 1565a6296200SBram Moolenaar let test =<< trim [CODE] 1566a6296200SBram Moolenaar func Interrupt() 1567a6296200SBram Moolenaar try 1568a6296200SBram Moolenaar Xpath 'a' 1569a6296200SBram Moolenaar call interrupt() " triggering interrupt exception 1570a6296200SBram Moolenaar call assert_report('should not get here') 1571a6296200SBram Moolenaar endtry 1572a6296200SBram Moolenaar endfunc 1573a6296200SBram Moolenaar 1574a6296200SBram Moolenaar Xpath 'b' 1575a6296200SBram Moolenaar try 1576a6296200SBram Moolenaar call Interrupt() 1577a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1578a6296200SBram Moolenaar Xpath 'c' 1579a6296200SBram Moolenaar finish 1580a6296200SBram Moolenaar endtry 1581a6296200SBram Moolenaar call assert_report('should not get here') 1582a6296200SBram Moolenaar 1583a6296200SBram Moolenaar if 1 " not active due to interrupt 1584a6296200SBram Moolenaar try " not active since :if inactive 1585a6296200SBram Moolenaar call assert_report('should not get here') 1586a6296200SBram Moolenaar finally 1587a6296200SBram Moolenaar call assert_report('should not get here') 1588a6296200SBram Moolenaar endtry 1589a6296200SBram Moolenaar endif 1590a6296200SBram Moolenaar 1591a6296200SBram Moolenaar try " not active due to interrupt 1592a6296200SBram Moolenaar call assert_report('should not get here') 1593a6296200SBram Moolenaar finally 1594a6296200SBram Moolenaar call assert_report('should not get here') 1595a6296200SBram Moolenaar endtry 1596a6296200SBram Moolenaar [CODE] 1597a6296200SBram Moolenaar let verify =<< trim [CODE] 1598a6296200SBram Moolenaar call assert_equal('bac', g:Xpath) 1599a6296200SBram Moolenaar [CODE] 1600a6296200SBram Moolenaar call RunInNewVim(test, verify) 1601a6296200SBram Moolenaarendfunc 1602a6296200SBram Moolenaar 1603a6296200SBram Moolenaarfunc Test_finally_after_throw() 1604a6296200SBram Moolenaar let test =<< trim [CODE] 1605a6296200SBram Moolenaar func Throw() 1606a6296200SBram Moolenaar Xpath 'a' 1607a6296200SBram Moolenaar throw 'xyz' 1608a6296200SBram Moolenaar endfunc 1609a6296200SBram Moolenaar 1610a6296200SBram Moolenaar Xpath 'b' 1611a6296200SBram Moolenaar call Throw() 1612a6296200SBram Moolenaar call assert_report('should not get here') 1613a6296200SBram Moolenaar 1614a6296200SBram Moolenaar if 1 " not active due to :throw 1615a6296200SBram Moolenaar try " not active since :if inactive 1616a6296200SBram Moolenaar call assert_report('should not get here') 1617a6296200SBram Moolenaar finally 1618a6296200SBram Moolenaar call assert_report('should not get here') 1619a6296200SBram Moolenaar endtry 1620a6296200SBram Moolenaar endif 1621a6296200SBram Moolenaar 1622a6296200SBram Moolenaar try " not active due to :throw 1623a6296200SBram Moolenaar call assert_report('should not get here') 1624a6296200SBram Moolenaar finally 1625a6296200SBram Moolenaar call assert_report('should not get here') 1626a6296200SBram Moolenaar endtry 1627a6296200SBram Moolenaar [CODE] 1628a6296200SBram Moolenaar let verify =<< trim [CODE] 1629a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1630a6296200SBram Moolenaar [CODE] 1631a6296200SBram Moolenaar call RunInNewVim(test, verify) 1632a6296200SBram Moolenaarendfunc 1633a6296200SBram Moolenaar 1634a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1635a6296200SBram Moolenaar" Test 23: :catch clauses for a :try after a :throw {{{1 1636a6296200SBram Moolenaar" 1637a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :throw, 1638a6296200SBram Moolenaar" none of its :catch clauses should be executed. 1639a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1640a6296200SBram Moolenaar 1641a6296200SBram Moolenaarfunc Test_catch_after_throw() 1642a6296200SBram Moolenaar let test =<< trim [CODE] 1643a6296200SBram Moolenaar try 1644a6296200SBram Moolenaar Xpath 'a' 1645a6296200SBram Moolenaar throw "xyz" 1646a6296200SBram Moolenaar call assert_report('should not get here') 1647a6296200SBram Moolenaar 1648a6296200SBram Moolenaar if 1 " not active due to :throw 1649a6296200SBram Moolenaar try " not active since :if inactive 1650a6296200SBram Moolenaar call assert_report('should not get here') 1651a6296200SBram Moolenaar catch /xyz/ 1652a6296200SBram Moolenaar call assert_report('should not get here') 1653a6296200SBram Moolenaar endtry 1654a6296200SBram Moolenaar endif 1655a6296200SBram Moolenaar catch /xyz/ 1656a6296200SBram Moolenaar Xpath 'b' 1657a6296200SBram Moolenaar endtry 1658a6296200SBram Moolenaar 1659a6296200SBram Moolenaar Xpath 'c' 1660a6296200SBram Moolenaar throw "abc" 1661a6296200SBram Moolenaar call assert_report('should not get here') 1662a6296200SBram Moolenaar 1663a6296200SBram Moolenaar try " not active due to :throw 1664a6296200SBram Moolenaar call assert_report('should not get here') 1665a6296200SBram Moolenaar catch /abc/ 1666a6296200SBram Moolenaar call assert_report('should not get here') 1667a6296200SBram Moolenaar endtry 1668a6296200SBram Moolenaar [CODE] 1669a6296200SBram Moolenaar let verify =<< trim [CODE] 1670a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1671a6296200SBram Moolenaar [CODE] 1672a6296200SBram Moolenaar call RunInNewVim(test, verify) 1673a6296200SBram Moolenaarendfunc 1674a6296200SBram Moolenaar 1675a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1676a6296200SBram Moolenaar" Test 24: :endtry for a :try after a :throw {{{1 1677a6296200SBram Moolenaar" 1678a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :throw, 1679a6296200SBram Moolenaar" its :endtry should not rethrow the exception to the next surrounding 1680a6296200SBram Moolenaar" active :try conditional. 1681a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1682a6296200SBram Moolenaar 1683a6296200SBram Moolenaarfunc Test_endtry_after_throw() 1684a6296200SBram Moolenaar let test =<< trim [CODE] 1685a6296200SBram Moolenaar try " try 1 1686a6296200SBram Moolenaar try " try 2 1687a6296200SBram Moolenaar Xpath 'a' 1688a6296200SBram Moolenaar throw "xyz" " makes try 2 inactive 1689a6296200SBram Moolenaar call assert_report('should not get here') 1690a6296200SBram Moolenaar 1691a6296200SBram Moolenaar try " try 3 1692a6296200SBram Moolenaar call assert_report('should not get here') 1693a6296200SBram Moolenaar endtry " no rethrow to try 1 1694a6296200SBram Moolenaar catch /xyz/ " should catch although try 2 inactive 1695a6296200SBram Moolenaar Xpath 'b' 1696a6296200SBram Moolenaar endtry 1697a6296200SBram Moolenaar catch /xyz/ " try 1 active, but exception already caught 1698a6296200SBram Moolenaar call assert_report('should not get here') 1699a6296200SBram Moolenaar endtry 1700a6296200SBram Moolenaar Xpath 'c' 1701a6296200SBram Moolenaar [CODE] 1702a6296200SBram Moolenaar let verify =<< trim [CODE] 1703a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1704a6296200SBram Moolenaar [CODE] 1705a6296200SBram Moolenaar call RunInNewVim(test, verify) 1706a6296200SBram Moolenaarendfunc 1707a6296200SBram Moolenaar 1708a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1709a6296200SBram Moolenaar" Test 27: Executing :finally clauses after :return {{{1 1710a6296200SBram Moolenaar" 1711a6296200SBram Moolenaar" For a :return command dynamically enclosed in a :try/:endtry region, 1712a6296200SBram Moolenaar" :finally clauses are executed and the called function is ended. 1713a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1714a6296200SBram Moolenaar 1715a6296200SBram Moolenaarfunc T27_F() 1716a6296200SBram Moolenaar try 1717a6296200SBram Moolenaar Xpath 'a' 1718a6296200SBram Moolenaar try 1719a6296200SBram Moolenaar Xpath 'b' 1720a6296200SBram Moolenaar return 1721a6296200SBram Moolenaar call assert_report('should not get here') 1722a6296200SBram Moolenaar finally 1723a6296200SBram Moolenaar Xpath 'c' 1724a6296200SBram Moolenaar endtry 1725a6296200SBram Moolenaar Xpath 'd' 1726a6296200SBram Moolenaar finally 1727a6296200SBram Moolenaar Xpath 'e' 1728a6296200SBram Moolenaar endtry 1729a6296200SBram Moolenaar call assert_report('should not get here') 1730a6296200SBram Moolenaarendfunc 1731a6296200SBram Moolenaar 1732a6296200SBram Moolenaarfunc T27_G() 1733a6296200SBram Moolenaar try 1734a6296200SBram Moolenaar Xpath 'f' 1735a6296200SBram Moolenaar return 1736a6296200SBram Moolenaar call assert_report('should not get here') 1737a6296200SBram Moolenaar finally 1738a6296200SBram Moolenaar Xpath 'g' 1739a6296200SBram Moolenaar call T27_F() 1740a6296200SBram Moolenaar Xpath 'h' 1741a6296200SBram Moolenaar endtry 1742a6296200SBram Moolenaar call assert_report('should not get here') 1743a6296200SBram Moolenaarendfunc 1744a6296200SBram Moolenaar 1745a6296200SBram Moolenaarfunc T27_H() 1746a6296200SBram Moolenaar try 1747a6296200SBram Moolenaar Xpath 'i' 1748a6296200SBram Moolenaar call T27_G() 1749a6296200SBram Moolenaar Xpath 'j' 1750a6296200SBram Moolenaar finally 1751a6296200SBram Moolenaar Xpath 'k' 1752a6296200SBram Moolenaar return 1753a6296200SBram Moolenaar call assert_report('should not get here') 1754a6296200SBram Moolenaar endtry 1755a6296200SBram Moolenaar call assert_report('should not get here') 1756a6296200SBram Moolenaarendfunction 1757a6296200SBram Moolenaar 1758a6296200SBram Moolenaarfunc Test_finally_after_return() 1759a6296200SBram Moolenaar XpathINIT 1760a6296200SBram Moolenaar try 1761a6296200SBram Moolenaar Xpath 'l' 1762a6296200SBram Moolenaar call T27_H() 1763a6296200SBram Moolenaar Xpath 'm' 1764a6296200SBram Moolenaar finally 1765a6296200SBram Moolenaar Xpath 'n' 1766a6296200SBram Moolenaar endtry 1767a6296200SBram Moolenaar call assert_equal('lifgabcehjkmn', g:Xpath) 1768a6296200SBram Moolenaarendfunc 1769a6296200SBram Moolenaar 1770a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1771a6296200SBram Moolenaar" Test 28: Executing :finally clauses after :finish {{{1 1772a6296200SBram Moolenaar" 1773a6296200SBram Moolenaar" For a :finish command dynamically enclosed in a :try/:endtry region, 1774a6296200SBram Moolenaar" :finally clauses are executed and the sourced file is finished. 1775a6296200SBram Moolenaar" 1776a6296200SBram Moolenaar" This test executes the bodies of the functions F, G, and H from the 1777a6296200SBram Moolenaar" previous test as script files (:return replaced by :finish). 1778a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1779a6296200SBram Moolenaar 1780a6296200SBram Moolenaarfunc Test_finally_after_finish() 1781a6296200SBram Moolenaar XpathINIT 1782a6296200SBram Moolenaar 1783a6296200SBram Moolenaar let scriptF = MakeScript("T27_F") 1784a6296200SBram Moolenaar let scriptG = MakeScript("T27_G", scriptF) 1785a6296200SBram Moolenaar let scriptH = MakeScript("T27_H", scriptG) 1786a6296200SBram Moolenaar 1787a6296200SBram Moolenaar try 1788a6296200SBram Moolenaar Xpath 'A' 1789a6296200SBram Moolenaar exec "source" scriptH 1790a6296200SBram Moolenaar Xpath 'B' 1791a6296200SBram Moolenaar finally 1792a6296200SBram Moolenaar Xpath 'C' 1793a6296200SBram Moolenaar endtry 1794a6296200SBram Moolenaar Xpath 'D' 1795a6296200SBram Moolenaar call assert_equal('AifgabcehjkBCD', g:Xpath) 1796a6296200SBram Moolenaar call delete(scriptF) 1797a6296200SBram Moolenaar call delete(scriptG) 1798a6296200SBram Moolenaar call delete(scriptH) 1799a6296200SBram Moolenaarendfunc 1800a6296200SBram Moolenaar 1801a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1802a6296200SBram Moolenaar" Test 29: Executing :finally clauses on errors {{{1 1803a6296200SBram Moolenaar" 1804a6296200SBram Moolenaar" After an error in a command dynamically enclosed in a :try/:endtry 1805a6296200SBram Moolenaar" region, :finally clauses are executed and the script processing is 1806a6296200SBram Moolenaar" terminated. 1807a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1808a6296200SBram Moolenaar 1809a6296200SBram Moolenaarfunc Test_finally_after_error_1() 1810a6296200SBram Moolenaar let test =<< trim [CODE] 1811a6296200SBram Moolenaar func F() 1812a6296200SBram Moolenaar while 1 1813a6296200SBram Moolenaar try 1814a6296200SBram Moolenaar Xpath 'a' 1815a6296200SBram Moolenaar while 1 1816a6296200SBram Moolenaar try 1817a6296200SBram Moolenaar Xpath 'b' 1818a6296200SBram Moolenaar asdf " error 1819a6296200SBram Moolenaar call assert_report('should not get here') 1820a6296200SBram Moolenaar finally 1821a6296200SBram Moolenaar Xpath 'c' 1822a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1823a6296200SBram Moolenaar call assert_report('should not get here') 1824a6296200SBram Moolenaar break 1825a6296200SBram Moolenaar endwhile 1826a6296200SBram Moolenaar call assert_report('should not get here') 1827a6296200SBram Moolenaar finally 1828a6296200SBram Moolenaar Xpath 'd' 1829a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1830a6296200SBram Moolenaar call assert_report('should not get here') 1831a6296200SBram Moolenaar break 1832a6296200SBram Moolenaar endwhile 1833a6296200SBram Moolenaar call assert_report('should not get here') 1834a6296200SBram Moolenaar endfunc 1835a6296200SBram Moolenaar 1836a6296200SBram Moolenaar while 1 1837a6296200SBram Moolenaar try 1838a6296200SBram Moolenaar Xpath 'e' 1839a6296200SBram Moolenaar while 1 1840a6296200SBram Moolenaar call F() 1841a6296200SBram Moolenaar call assert_report('should not get here') 1842a6296200SBram Moolenaar break 1843a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1844a6296200SBram Moolenaar call assert_report('should not get here') 1845a6296200SBram Moolenaar finally 1846a6296200SBram Moolenaar Xpath 'f' 1847a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1848a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1849a6296200SBram Moolenaar call assert_report('should not get here') 1850a6296200SBram Moolenaar [CODE] 1851a6296200SBram Moolenaar let verify =<< trim [CODE] 1852a6296200SBram Moolenaar call assert_equal('eabcdf', g:Xpath) 1853a6296200SBram Moolenaar [CODE] 1854a6296200SBram Moolenaar call RunInNewVim(test, verify) 1855a6296200SBram Moolenaarendfunc 1856a6296200SBram Moolenaar 1857a6296200SBram Moolenaarfunc Test_finally_after_error_2() 1858a6296200SBram Moolenaar let test =<< trim [CODE] 1859a6296200SBram Moolenaar func G() abort 1860a6296200SBram Moolenaar if 1 1861a6296200SBram Moolenaar try 1862a6296200SBram Moolenaar Xpath 'a' 1863a6296200SBram Moolenaar asdf " error 1864a6296200SBram Moolenaar call assert_report('should not get here') 1865a6296200SBram Moolenaar finally 1866a6296200SBram Moolenaar Xpath 'b' 1867a6296200SBram Moolenaar endtry | Xpath 'c' 1868a6296200SBram Moolenaar endif | Xpath 'd' 1869a6296200SBram Moolenaar call assert_report('should not get here') 1870a6296200SBram Moolenaar endfunc 1871a6296200SBram Moolenaar 1872a6296200SBram Moolenaar if 1 1873a6296200SBram Moolenaar try 1874a6296200SBram Moolenaar Xpath 'e' 1875a6296200SBram Moolenaar call G() 1876a6296200SBram Moolenaar call assert_report('should not get here') 1877a6296200SBram Moolenaar finally 1878a6296200SBram Moolenaar Xpath 'f' 1879a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1880a6296200SBram Moolenaar endif | call assert_report('should not get here') 1881a6296200SBram Moolenaar call assert_report('should not get here') 1882a6296200SBram Moolenaar [CODE] 1883a6296200SBram Moolenaar let verify =<< trim [CODE] 1884a6296200SBram Moolenaar call assert_equal('eabf', g:Xpath) 1885a6296200SBram Moolenaar [CODE] 1886a6296200SBram Moolenaar call RunInNewVim(test, verify) 1887a6296200SBram Moolenaarendfunc 1888a6296200SBram Moolenaar 1889a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1890a6296200SBram Moolenaar" Test 30: Executing :finally clauses on interrupt {{{1 1891a6296200SBram Moolenaar" 1892a6296200SBram Moolenaar" After an interrupt in a command dynamically enclosed in 1893a6296200SBram Moolenaar" a :try/:endtry region, :finally clauses are executed and the 1894a6296200SBram Moolenaar" script processing is terminated. 1895a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1896a6296200SBram Moolenaar 1897a6296200SBram Moolenaarfunc Test_finally_on_interrupt() 1898a6296200SBram Moolenaar let test =<< trim [CODE] 1899a6296200SBram Moolenaar func F() 1900a6296200SBram Moolenaar try 1901a6296200SBram Moolenaar Xloop 'a' 1902a6296200SBram Moolenaar call interrupt() 1903a6296200SBram Moolenaar call assert_report('should not get here') 1904a6296200SBram Moolenaar finally 1905a6296200SBram Moolenaar Xloop 'b' 1906a6296200SBram Moolenaar endtry 1907a6296200SBram Moolenaar call assert_report('should not get here') 1908a6296200SBram Moolenaar endfunc 1909a6296200SBram Moolenaar 1910a6296200SBram Moolenaar try 1911a6296200SBram Moolenaar try 1912a6296200SBram Moolenaar Xpath 'c' 1913a6296200SBram Moolenaar try 1914a6296200SBram Moolenaar Xpath 'd' 1915a6296200SBram Moolenaar call interrupt() 1916a6296200SBram Moolenaar call assert_report('should not get here') 1917a6296200SBram Moolenaar finally 1918a6296200SBram Moolenaar Xpath 'e' 1919a6296200SBram Moolenaar try 1920a6296200SBram Moolenaar Xpath 'f' 1921a6296200SBram Moolenaar try 1922a6296200SBram Moolenaar Xpath 'g' 1923a6296200SBram Moolenaar finally 1924a6296200SBram Moolenaar Xpath 'h' 1925a6296200SBram Moolenaar try 1926a6296200SBram Moolenaar Xpath 'i' 1927a6296200SBram Moolenaar call interrupt() 1928a6296200SBram Moolenaar call assert_report('should not get here') 1929a6296200SBram Moolenaar endtry 1930a6296200SBram Moolenaar call assert_report('should not get here') 1931a6296200SBram Moolenaar endtry 1932a6296200SBram Moolenaar call assert_report('should not get here') 1933a6296200SBram Moolenaar endtry 1934a6296200SBram Moolenaar call assert_report('should not get here') 1935a6296200SBram Moolenaar endtry 1936a6296200SBram Moolenaar call assert_report('should not get here') 1937a6296200SBram Moolenaar finally 1938a6296200SBram Moolenaar Xpath 'j' 1939a6296200SBram Moolenaar try 1940a6296200SBram Moolenaar Xpath 'k' 1941a6296200SBram Moolenaar call F() 1942a6296200SBram Moolenaar call assert_report('should not get here') 1943a6296200SBram Moolenaar finally 1944a6296200SBram Moolenaar Xpath 'l' 1945a6296200SBram Moolenaar try 1946a6296200SBram Moolenaar Xpath 'm' 1947a6296200SBram Moolenaar XloopNEXT 1948a6296200SBram Moolenaar ExecAsScript F 1949a6296200SBram Moolenaar call assert_report('should not get here') 1950a6296200SBram Moolenaar finally 1951a6296200SBram Moolenaar Xpath 'n' 1952a6296200SBram Moolenaar endtry 1953a6296200SBram Moolenaar call assert_report('should not get here') 1954a6296200SBram Moolenaar endtry 1955a6296200SBram Moolenaar call assert_report('should not get here') 1956a6296200SBram Moolenaar endtry 1957a6296200SBram Moolenaar call assert_report('should not get here') 1958a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1959a6296200SBram Moolenaar Xpath 'o' 1960a6296200SBram Moolenaar endtry 1961a6296200SBram Moolenaar [CODE] 1962a6296200SBram Moolenaar let verify =<< trim [CODE] 1963a6296200SBram Moolenaar call assert_equal('cdefghijka1b1lma2b2no', g:Xpath) 1964a6296200SBram Moolenaar [CODE] 1965a6296200SBram Moolenaar call RunInNewVim(test, verify) 1966a6296200SBram Moolenaarendfunc 1967a6296200SBram Moolenaar 1968a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1969a6296200SBram Moolenaar" Test 31: Executing :finally clauses after :throw {{{1 1970a6296200SBram Moolenaar" 1971a6296200SBram Moolenaar" After a :throw dynamically enclosed in a :try/:endtry region, 1972a6296200SBram Moolenaar" :finally clauses are executed and the script processing is 1973a6296200SBram Moolenaar" terminated. 1974a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1975a6296200SBram Moolenaar 1976a6296200SBram Moolenaarfunc Test_finally_after_throw_2() 1977a6296200SBram Moolenaar let test =<< trim [CODE] 1978a6296200SBram Moolenaar func F() 1979a6296200SBram Moolenaar try 1980a6296200SBram Moolenaar Xloop 'a' 1981a6296200SBram Moolenaar throw "exception" 1982a6296200SBram Moolenaar call assert_report('should not get here') 1983a6296200SBram Moolenaar finally 1984a6296200SBram Moolenaar Xloop 'b' 1985a6296200SBram Moolenaar endtry 1986a6296200SBram Moolenaar call assert_report('should not get here') 1987a6296200SBram Moolenaar endfunc 1988a6296200SBram Moolenaar 1989a6296200SBram Moolenaar try 1990a6296200SBram Moolenaar Xpath 'c' 1991a6296200SBram Moolenaar try 1992a6296200SBram Moolenaar Xpath 'd' 1993a6296200SBram Moolenaar throw "exception" 1994a6296200SBram Moolenaar call assert_report('should not get here') 1995a6296200SBram Moolenaar finally 1996a6296200SBram Moolenaar Xpath 'e' 1997a6296200SBram Moolenaar try 1998a6296200SBram Moolenaar Xpath 'f' 1999a6296200SBram Moolenaar try 2000a6296200SBram Moolenaar Xpath 'g' 2001a6296200SBram Moolenaar finally 2002a6296200SBram Moolenaar Xpath 'h' 2003a6296200SBram Moolenaar try 2004a6296200SBram Moolenaar Xpath 'i' 2005a6296200SBram Moolenaar throw "exception" 2006a6296200SBram Moolenaar call assert_report('should not get here') 2007a6296200SBram Moolenaar endtry 2008a6296200SBram Moolenaar call assert_report('should not get here') 2009a6296200SBram Moolenaar endtry 2010a6296200SBram Moolenaar call assert_report('should not get here') 2011a6296200SBram Moolenaar endtry 2012a6296200SBram Moolenaar call assert_report('should not get here') 2013a6296200SBram Moolenaar endtry 2014a6296200SBram Moolenaar call assert_report('should not get here') 2015a6296200SBram Moolenaar finally 2016a6296200SBram Moolenaar Xpath 'j' 2017a6296200SBram Moolenaar try 2018a6296200SBram Moolenaar Xpath 'k' 2019a6296200SBram Moolenaar call F() 2020a6296200SBram Moolenaar call assert_report('should not get here') 2021a6296200SBram Moolenaar finally 2022a6296200SBram Moolenaar Xpath 'l' 2023a6296200SBram Moolenaar try 2024a6296200SBram Moolenaar Xpath 'm' 2025a6296200SBram Moolenaar XloopNEXT 2026a6296200SBram Moolenaar ExecAsScript F 2027a6296200SBram Moolenaar call assert_report('should not get here') 2028a6296200SBram Moolenaar finally 2029a6296200SBram Moolenaar Xpath 'n' 2030a6296200SBram Moolenaar endtry 2031a6296200SBram Moolenaar call assert_report('should not get here') 2032a6296200SBram Moolenaar endtry 2033a6296200SBram Moolenaar call assert_report('should not get here') 2034a6296200SBram Moolenaar endtry 2035a6296200SBram Moolenaar call assert_report('should not get here') 2036a6296200SBram Moolenaar [CODE] 2037a6296200SBram Moolenaar let verify =<< trim [CODE] 2038a6296200SBram Moolenaar call assert_equal('cdefghijka1b1lma2b2n', g:Xpath) 2039a6296200SBram Moolenaar [CODE] 2040a6296200SBram Moolenaar call RunInNewVim(test, verify) 2041a6296200SBram Moolenaarendfunc 2042a6296200SBram Moolenaar 2043a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2044a6296200SBram Moolenaar" Test 34: :finally reason discarded by :continue {{{1 2045a6296200SBram Moolenaar" 2046a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2047a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2048a6296200SBram Moolenaar" discarded by a :continue in the finally clause. 2049a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2050a6296200SBram Moolenaar 2051a6296200SBram Moolenaarfunc Test_finally_after_continue() 2052a6296200SBram Moolenaar let test =<< trim [CODE] 2053a6296200SBram Moolenaar func C(jump) 2054a6296200SBram Moolenaar XloopNEXT 2055a6296200SBram Moolenaar let loop = 0 2056a6296200SBram Moolenaar while loop < 2 2057a6296200SBram Moolenaar let loop = loop + 1 2058a6296200SBram Moolenaar if loop == 1 2059a6296200SBram Moolenaar try 2060a6296200SBram Moolenaar if a:jump == "continue" 2061a6296200SBram Moolenaar continue 2062a6296200SBram Moolenaar elseif a:jump == "break" 2063a6296200SBram Moolenaar break 2064a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2065a6296200SBram Moolenaar return 2066a6296200SBram Moolenaar elseif a:jump == "error" 2067a6296200SBram Moolenaar asdf 2068a6296200SBram Moolenaar elseif a:jump == "interrupt" 2069a6296200SBram Moolenaar call interrupt() 2070a6296200SBram Moolenaar let dummy = 0 2071a6296200SBram Moolenaar elseif a:jump == "throw" 2072a6296200SBram Moolenaar throw "abc" 2073a6296200SBram Moolenaar endif 2074a6296200SBram Moolenaar finally 2075a6296200SBram Moolenaar continue " discards jump that caused the :finally 2076a6296200SBram Moolenaar call assert_report('should not get here') 2077a6296200SBram Moolenaar endtry 2078a6296200SBram Moolenaar call assert_report('should not get here') 2079a6296200SBram Moolenaar elseif loop == 2 2080a6296200SBram Moolenaar Xloop 'a' 2081a6296200SBram Moolenaar endif 2082a6296200SBram Moolenaar endwhile 2083a6296200SBram Moolenaar endfunc 2084a6296200SBram Moolenaar 2085a6296200SBram Moolenaar call C("continue") 2086a6296200SBram Moolenaar Xpath 'b' 2087a6296200SBram Moolenaar call C("break") 2088a6296200SBram Moolenaar Xpath 'c' 2089a6296200SBram Moolenaar call C("return") 2090a6296200SBram Moolenaar Xpath 'd' 2091a6296200SBram Moolenaar let g:jump = "finish" 2092a6296200SBram Moolenaar ExecAsScript C 2093a6296200SBram Moolenaar unlet g:jump 2094a6296200SBram Moolenaar Xpath 'e' 2095a6296200SBram Moolenaar try 2096a6296200SBram Moolenaar call C("error") 2097a6296200SBram Moolenaar Xpath 'f' 2098a6296200SBram Moolenaar finally 2099a6296200SBram Moolenaar Xpath 'g' 2100a6296200SBram Moolenaar try 2101a6296200SBram Moolenaar call C("interrupt") 2102a6296200SBram Moolenaar Xpath 'h' 2103a6296200SBram Moolenaar finally 2104a6296200SBram Moolenaar Xpath 'i' 2105a6296200SBram Moolenaar call C("throw") 2106a6296200SBram Moolenaar Xpath 'j' 2107a6296200SBram Moolenaar endtry 2108a6296200SBram Moolenaar endtry 2109a6296200SBram Moolenaar Xpath 'k' 2110a6296200SBram Moolenaar [CODE] 2111a6296200SBram Moolenaar let verify =<< trim [CODE] 2112a6296200SBram Moolenaar call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath) 2113a6296200SBram Moolenaar [CODE] 2114a6296200SBram Moolenaar call RunInNewVim(test, verify) 2115a6296200SBram Moolenaarendfunc 2116a6296200SBram Moolenaar 2117a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2118a6296200SBram Moolenaar" Test 35: :finally reason discarded by :break {{{1 2119a6296200SBram Moolenaar" 2120a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2121a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2122a6296200SBram Moolenaar" discarded by a :break in the finally clause. 2123a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2124a6296200SBram Moolenaar 2125a6296200SBram Moolenaarfunc Test_finally_discard_by_break() 2126a6296200SBram Moolenaar let test =<< trim [CODE] 2127a6296200SBram Moolenaar func B(jump) 2128a6296200SBram Moolenaar XloopNEXT 2129a6296200SBram Moolenaar let loop = 0 2130a6296200SBram Moolenaar while loop < 2 2131a6296200SBram Moolenaar let loop = loop + 1 2132a6296200SBram Moolenaar if loop == 1 2133a6296200SBram Moolenaar try 2134a6296200SBram Moolenaar if a:jump == "continue" 2135a6296200SBram Moolenaar continue 2136a6296200SBram Moolenaar elseif a:jump == "break" 2137a6296200SBram Moolenaar break 2138a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2139a6296200SBram Moolenaar return 2140a6296200SBram Moolenaar elseif a:jump == "error" 2141a6296200SBram Moolenaar asdf 2142a6296200SBram Moolenaar elseif a:jump == "interrupt" 2143a6296200SBram Moolenaar call interrupt() 2144a6296200SBram Moolenaar let dummy = 0 2145a6296200SBram Moolenaar elseif a:jump == "throw" 2146a6296200SBram Moolenaar throw "abc" 2147a6296200SBram Moolenaar endif 2148a6296200SBram Moolenaar finally 2149a6296200SBram Moolenaar break " discards jump that caused the :finally 2150a6296200SBram Moolenaar call assert_report('should not get here') 2151a6296200SBram Moolenaar endtry 2152a6296200SBram Moolenaar elseif loop == 2 2153a6296200SBram Moolenaar call assert_report('should not get here') 2154a6296200SBram Moolenaar endif 2155a6296200SBram Moolenaar endwhile 2156a6296200SBram Moolenaar Xloop 'a' 2157a6296200SBram Moolenaar endfunc 2158a6296200SBram Moolenaar 2159a6296200SBram Moolenaar call B("continue") 2160a6296200SBram Moolenaar Xpath 'b' 2161a6296200SBram Moolenaar call B("break") 2162a6296200SBram Moolenaar Xpath 'c' 2163a6296200SBram Moolenaar call B("return") 2164a6296200SBram Moolenaar Xpath 'd' 2165a6296200SBram Moolenaar let g:jump = "finish" 2166a6296200SBram Moolenaar ExecAsScript B 2167a6296200SBram Moolenaar unlet g:jump 2168a6296200SBram Moolenaar Xpath 'e' 2169a6296200SBram Moolenaar try 2170a6296200SBram Moolenaar call B("error") 2171a6296200SBram Moolenaar Xpath 'f' 2172a6296200SBram Moolenaar finally 2173a6296200SBram Moolenaar Xpath 'g' 2174a6296200SBram Moolenaar try 2175a6296200SBram Moolenaar call B("interrupt") 2176a6296200SBram Moolenaar Xpath 'h' 2177a6296200SBram Moolenaar finally 2178a6296200SBram Moolenaar Xpath 'i' 2179a6296200SBram Moolenaar call B("throw") 2180a6296200SBram Moolenaar Xpath 'j' 2181a6296200SBram Moolenaar endtry 2182a6296200SBram Moolenaar endtry 2183a6296200SBram Moolenaar Xpath 'k' 2184a6296200SBram Moolenaar [CODE] 2185a6296200SBram Moolenaar let verify =<< trim [CODE] 2186a6296200SBram Moolenaar call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath) 2187a6296200SBram Moolenaar [CODE] 2188a6296200SBram Moolenaar call RunInNewVim(test, verify) 2189a6296200SBram Moolenaarendfunc 2190a6296200SBram Moolenaar 2191a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2192a6296200SBram Moolenaar" Test 36: :finally reason discarded by :return {{{1 2193a6296200SBram Moolenaar" 2194a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2195a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2196a6296200SBram Moolenaar" discarded by a :return in the finally clause. 2197a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2198a6296200SBram Moolenaar 2199a6296200SBram Moolenaarfunc Test_finally_discard_by_return() 2200a6296200SBram Moolenaar let test =<< trim [CODE] 2201a6296200SBram Moolenaar func R(jump, retval) abort 2202a6296200SBram Moolenaar let loop = 0 2203a6296200SBram Moolenaar while loop < 2 2204a6296200SBram Moolenaar let loop = loop + 1 2205a6296200SBram Moolenaar if loop == 1 2206a6296200SBram Moolenaar try 2207a6296200SBram Moolenaar if a:jump == "continue" 2208a6296200SBram Moolenaar continue 2209a6296200SBram Moolenaar elseif a:jump == "break" 2210a6296200SBram Moolenaar break 2211a6296200SBram Moolenaar elseif a:jump == "return" 2212a6296200SBram Moolenaar return 2213a6296200SBram Moolenaar elseif a:jump == "error" 2214a6296200SBram Moolenaar asdf 2215a6296200SBram Moolenaar elseif a:jump == "interrupt" 2216a6296200SBram Moolenaar call interrupt() 2217a6296200SBram Moolenaar let dummy = 0 2218a6296200SBram Moolenaar elseif a:jump == "throw" 2219a6296200SBram Moolenaar throw "abc" 2220a6296200SBram Moolenaar endif 2221a6296200SBram Moolenaar finally 2222a6296200SBram Moolenaar return a:retval " discards jump that caused the :finally 2223a6296200SBram Moolenaar call assert_report('should not get here') 2224a6296200SBram Moolenaar endtry 2225a6296200SBram Moolenaar elseif loop == 2 2226a6296200SBram Moolenaar call assert_report('should not get here') 2227a6296200SBram Moolenaar endif 2228a6296200SBram Moolenaar endwhile 2229a6296200SBram Moolenaar call assert_report('should not get here') 2230a6296200SBram Moolenaar endfunc 2231a6296200SBram Moolenaar 2232a6296200SBram Moolenaar let sum = -R("continue", -8) 2233a6296200SBram Moolenaar Xpath 'a' 2234a6296200SBram Moolenaar let sum = sum - R("break", -16) 2235a6296200SBram Moolenaar Xpath 'b' 2236a6296200SBram Moolenaar let sum = sum - R("return", -32) 2237a6296200SBram Moolenaar Xpath 'c' 2238a6296200SBram Moolenaar try 2239a6296200SBram Moolenaar let sum = sum - R("error", -64) 2240a6296200SBram Moolenaar Xpath 'd' 2241a6296200SBram Moolenaar finally 2242a6296200SBram Moolenaar Xpath 'e' 2243a6296200SBram Moolenaar try 2244a6296200SBram Moolenaar let sum = sum - R("interrupt", -128) 2245a6296200SBram Moolenaar Xpath 'f' 2246a6296200SBram Moolenaar finally 2247a6296200SBram Moolenaar Xpath 'g' 2248a6296200SBram Moolenaar let sum = sum - R("throw", -256) 2249a6296200SBram Moolenaar Xpath 'h' 2250a6296200SBram Moolenaar endtry 2251a6296200SBram Moolenaar endtry 2252a6296200SBram Moolenaar Xpath 'i' 2253a6296200SBram Moolenaar 2254a6296200SBram Moolenaar let expected = 8 + 16 + 32 + 64 + 128 + 256 2255a6296200SBram Moolenaar call assert_equal(sum, expected) 2256a6296200SBram Moolenaar [CODE] 2257a6296200SBram Moolenaar let verify =<< trim [CODE] 2258a6296200SBram Moolenaar call assert_equal('abcdefghi', g:Xpath) 2259a6296200SBram Moolenaar [CODE] 2260a6296200SBram Moolenaar call RunInNewVim(test, verify) 2261a6296200SBram Moolenaarendfunc 2262a6296200SBram Moolenaar 2263a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2264a6296200SBram Moolenaar" Test 37: :finally reason discarded by :finish {{{1 2265a6296200SBram Moolenaar" 2266a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2267a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2268a6296200SBram Moolenaar" discarded by a :finish in the finally clause. 2269a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2270a6296200SBram Moolenaar 2271a6296200SBram Moolenaarfunc Test_finally_discard_by_finish() 2272a6296200SBram Moolenaar let test =<< trim [CODE] 2273a6296200SBram Moolenaar func F(jump) " not executed as function, transformed to a script 2274a6296200SBram Moolenaar let loop = 0 2275a6296200SBram Moolenaar while loop < 2 2276a6296200SBram Moolenaar let loop = loop + 1 2277a6296200SBram Moolenaar if loop == 1 2278a6296200SBram Moolenaar try 2279a6296200SBram Moolenaar if a:jump == "continue" 2280a6296200SBram Moolenaar continue 2281a6296200SBram Moolenaar elseif a:jump == "break" 2282a6296200SBram Moolenaar break 2283a6296200SBram Moolenaar elseif a:jump == "finish" 2284a6296200SBram Moolenaar finish 2285a6296200SBram Moolenaar elseif a:jump == "error" 2286a6296200SBram Moolenaar asdf 2287a6296200SBram Moolenaar elseif a:jump == "interrupt" 2288a6296200SBram Moolenaar call interrupt() 2289a6296200SBram Moolenaar let dummy = 0 2290a6296200SBram Moolenaar elseif a:jump == "throw" 2291a6296200SBram Moolenaar throw "abc" 2292a6296200SBram Moolenaar endif 2293a6296200SBram Moolenaar finally 2294a6296200SBram Moolenaar finish " discards jump that caused the :finally 2295a6296200SBram Moolenaar call assert_report('should not get here') 2296a6296200SBram Moolenaar endtry 2297a6296200SBram Moolenaar elseif loop == 2 2298a6296200SBram Moolenaar call assert_report('should not get here') 2299a6296200SBram Moolenaar endif 2300a6296200SBram Moolenaar endwhile 2301a6296200SBram Moolenaar call assert_report('should not get here') 2302a6296200SBram Moolenaar endfunc 2303a6296200SBram Moolenaar 2304a6296200SBram Moolenaar let scriptF = MakeScript("F") 2305a6296200SBram Moolenaar delfunction F 2306a6296200SBram Moolenaar 2307a6296200SBram Moolenaar let g:jump = "continue" 2308a6296200SBram Moolenaar exec "source" scriptF 2309a6296200SBram Moolenaar Xpath 'a' 2310a6296200SBram Moolenaar let g:jump = "break" 2311a6296200SBram Moolenaar exec "source" scriptF 2312a6296200SBram Moolenaar Xpath 'b' 2313a6296200SBram Moolenaar let g:jump = "finish" 2314a6296200SBram Moolenaar exec "source" scriptF 2315a6296200SBram Moolenaar Xpath 'c' 2316a6296200SBram Moolenaar try 2317a6296200SBram Moolenaar let g:jump = "error" 2318a6296200SBram Moolenaar exec "source" scriptF 2319a6296200SBram Moolenaar Xpath 'd' 2320a6296200SBram Moolenaar finally 2321a6296200SBram Moolenaar Xpath 'e' 2322a6296200SBram Moolenaar try 2323a6296200SBram Moolenaar let g:jump = "interrupt" 2324a6296200SBram Moolenaar exec "source" scriptF 2325a6296200SBram Moolenaar Xpath 'f' 2326a6296200SBram Moolenaar finally 2327a6296200SBram Moolenaar Xpath 'g' 2328a6296200SBram Moolenaar try 2329a6296200SBram Moolenaar let g:jump = "throw" 2330a6296200SBram Moolenaar exec "source" scriptF 2331a6296200SBram Moolenaar Xpath 'h' 2332a6296200SBram Moolenaar finally 2333a6296200SBram Moolenaar Xpath 'i' 2334a6296200SBram Moolenaar endtry 2335a6296200SBram Moolenaar endtry 2336a6296200SBram Moolenaar endtry 2337a6296200SBram Moolenaar unlet g:jump 2338a6296200SBram Moolenaar call delete(scriptF) 2339a6296200SBram Moolenaar [CODE] 2340a6296200SBram Moolenaar let verify =<< trim [CODE] 2341a6296200SBram Moolenaar call assert_equal('abcdefghi', g:Xpath) 2342a6296200SBram Moolenaar [CODE] 2343a6296200SBram Moolenaar call RunInNewVim(test, verify) 2344a6296200SBram Moolenaarendfunc 2345a6296200SBram Moolenaar 2346a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2347a6296200SBram Moolenaar" Test 38: :finally reason discarded by an error {{{1 2348a6296200SBram Moolenaar" 2349a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2350a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2351a6296200SBram Moolenaar" discarded by an error in the finally clause. 2352a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2353a6296200SBram Moolenaar 2354a6296200SBram Moolenaarfunc Test_finally_discard_by_error() 2355a6296200SBram Moolenaar let test =<< trim [CODE] 2356a6296200SBram Moolenaar func E(jump) 2357a6296200SBram Moolenaar let loop = 0 2358a6296200SBram Moolenaar while loop < 2 2359a6296200SBram Moolenaar let loop = loop + 1 2360a6296200SBram Moolenaar if loop == 1 2361a6296200SBram Moolenaar try 2362a6296200SBram Moolenaar if a:jump == "continue" 2363a6296200SBram Moolenaar continue 2364a6296200SBram Moolenaar elseif a:jump == "break" 2365a6296200SBram Moolenaar break 2366a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2367a6296200SBram Moolenaar return 2368a6296200SBram Moolenaar elseif a:jump == "error" 2369a6296200SBram Moolenaar asdf 2370a6296200SBram Moolenaar elseif a:jump == "interrupt" 2371a6296200SBram Moolenaar call interrupt() 2372a6296200SBram Moolenaar let dummy = 0 2373a6296200SBram Moolenaar elseif a:jump == "throw" 2374a6296200SBram Moolenaar throw "abc" 2375a6296200SBram Moolenaar endif 2376a6296200SBram Moolenaar finally 2377a6296200SBram Moolenaar asdf " error; discards jump that caused the :finally 2378a6296200SBram Moolenaar endtry 2379a6296200SBram Moolenaar elseif loop == 2 2380a6296200SBram Moolenaar call assert_report('should not get here') 2381a6296200SBram Moolenaar endif 2382a6296200SBram Moolenaar endwhile 2383a6296200SBram Moolenaar call assert_report('should not get here') 2384a6296200SBram Moolenaar endfunc 2385a6296200SBram Moolenaar 2386a6296200SBram Moolenaar try 2387a6296200SBram Moolenaar Xpath 'a' 2388a6296200SBram Moolenaar call E("continue") 2389a6296200SBram Moolenaar call assert_report('should not get here') 2390a6296200SBram Moolenaar finally 2391a6296200SBram Moolenaar try 2392a6296200SBram Moolenaar Xpath 'b' 2393a6296200SBram Moolenaar call E("break") 2394a6296200SBram Moolenaar call assert_report('should not get here') 2395a6296200SBram Moolenaar finally 2396a6296200SBram Moolenaar try 2397a6296200SBram Moolenaar Xpath 'c' 2398a6296200SBram Moolenaar call E("return") 2399a6296200SBram Moolenaar call assert_report('should not get here') 2400a6296200SBram Moolenaar finally 2401a6296200SBram Moolenaar try 2402a6296200SBram Moolenaar Xpath 'd' 2403a6296200SBram Moolenaar let g:jump = "finish" 2404a6296200SBram Moolenaar ExecAsScript E 2405a6296200SBram Moolenaar call assert_report('should not get here') 2406a6296200SBram Moolenaar finally 2407a6296200SBram Moolenaar unlet g:jump 2408a6296200SBram Moolenaar try 2409a6296200SBram Moolenaar Xpath 'e' 2410a6296200SBram Moolenaar call E("error") 2411a6296200SBram Moolenaar call assert_report('should not get here') 2412a6296200SBram Moolenaar finally 2413a6296200SBram Moolenaar try 2414a6296200SBram Moolenaar Xpath 'f' 2415a6296200SBram Moolenaar call E("interrupt") 2416a6296200SBram Moolenaar call assert_report('should not get here') 2417a6296200SBram Moolenaar finally 2418a6296200SBram Moolenaar try 2419a6296200SBram Moolenaar Xpath 'g' 2420a6296200SBram Moolenaar call E("throw") 2421a6296200SBram Moolenaar call assert_report('should not get here') 2422a6296200SBram Moolenaar finally 2423a6296200SBram Moolenaar Xpath 'h' 2424a6296200SBram Moolenaar delfunction E 2425a6296200SBram Moolenaar endtry 2426a6296200SBram Moolenaar endtry 2427a6296200SBram Moolenaar endtry 2428a6296200SBram Moolenaar endtry 2429a6296200SBram Moolenaar endtry 2430a6296200SBram Moolenaar endtry 2431a6296200SBram Moolenaar endtry 2432a6296200SBram Moolenaar call assert_report('should not get here') 2433a6296200SBram Moolenaar [CODE] 2434a6296200SBram Moolenaar let verify =<< trim [CODE] 2435a6296200SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 2436a6296200SBram Moolenaar [CODE] 2437a6296200SBram Moolenaar call RunInNewVim(test, verify) 2438a6296200SBram Moolenaarendfunc 2439a6296200SBram Moolenaar 2440a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2441a6296200SBram Moolenaar" Test 39: :finally reason discarded by an interrupt {{{1 2442a6296200SBram Moolenaar" 2443a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2444a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2445a6296200SBram Moolenaar" discarded by an interrupt in the finally clause. 2446a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2447a6296200SBram Moolenaar 2448a6296200SBram Moolenaarfunc Test_finally_discarded_by_interrupt() 2449a6296200SBram Moolenaar let test =<< trim [CODE] 2450a6296200SBram Moolenaar func I(jump) 2451a6296200SBram Moolenaar let loop = 0 2452a6296200SBram Moolenaar while loop < 2 2453a6296200SBram Moolenaar let loop = loop + 1 2454a6296200SBram Moolenaar if loop == 1 2455a6296200SBram Moolenaar try 2456a6296200SBram Moolenaar if a:jump == "continue" 2457a6296200SBram Moolenaar continue 2458a6296200SBram Moolenaar elseif a:jump == "break" 2459a6296200SBram Moolenaar break 2460a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2461a6296200SBram Moolenaar return 2462a6296200SBram Moolenaar elseif a:jump == "error" 2463a6296200SBram Moolenaar asdf 2464a6296200SBram Moolenaar elseif a:jump == "interrupt" 2465a6296200SBram Moolenaar call interrupt() 2466a6296200SBram Moolenaar let dummy = 0 2467a6296200SBram Moolenaar elseif a:jump == "throw" 2468a6296200SBram Moolenaar throw "abc" 2469a6296200SBram Moolenaar endif 2470a6296200SBram Moolenaar finally 2471a6296200SBram Moolenaar call interrupt() 2472a6296200SBram Moolenaar let dummy = 0 2473a6296200SBram Moolenaar endtry 2474a6296200SBram Moolenaar elseif loop == 2 2475a6296200SBram Moolenaar call assert_report('should not get here') 2476a6296200SBram Moolenaar endif 2477a6296200SBram Moolenaar endwhile 2478a6296200SBram Moolenaar call assert_report('should not get here') 2479a6296200SBram Moolenaar endfunc 2480a6296200SBram Moolenaar 2481a6296200SBram Moolenaar try 2482a6296200SBram Moolenaar try 2483a6296200SBram Moolenaar Xpath 'a' 2484a6296200SBram Moolenaar call I("continue") 2485a6296200SBram Moolenaar call assert_report('should not get here') 2486a6296200SBram Moolenaar finally 2487a6296200SBram Moolenaar try 2488a6296200SBram Moolenaar Xpath 'b' 2489a6296200SBram Moolenaar call I("break") 2490a6296200SBram Moolenaar call assert_report('should not get here') 2491a6296200SBram Moolenaar finally 2492a6296200SBram Moolenaar try 2493a6296200SBram Moolenaar Xpath 'c' 2494a6296200SBram Moolenaar call I("return") 2495a6296200SBram Moolenaar call assert_report('should not get here') 2496a6296200SBram Moolenaar finally 2497a6296200SBram Moolenaar try 2498a6296200SBram Moolenaar Xpath 'd' 2499a6296200SBram Moolenaar let g:jump = "finish" 2500a6296200SBram Moolenaar ExecAsScript I 2501a6296200SBram Moolenaar call assert_report('should not get here') 2502a6296200SBram Moolenaar finally 2503a6296200SBram Moolenaar unlet g:jump 2504a6296200SBram Moolenaar try 2505a6296200SBram Moolenaar Xpath 'e' 2506a6296200SBram Moolenaar call I("error") 2507a6296200SBram Moolenaar call assert_report('should not get here') 2508a6296200SBram Moolenaar finally 2509a6296200SBram Moolenaar try 2510a6296200SBram Moolenaar Xpath 'f' 2511a6296200SBram Moolenaar call I("interrupt") 2512a6296200SBram Moolenaar call assert_report('should not get here') 2513a6296200SBram Moolenaar finally 2514a6296200SBram Moolenaar try 2515a6296200SBram Moolenaar Xpath 'g' 2516a6296200SBram Moolenaar call I("throw") 2517a6296200SBram Moolenaar call assert_report('should not get here') 2518a6296200SBram Moolenaar finally 2519a6296200SBram Moolenaar Xpath 'h' 2520a6296200SBram Moolenaar delfunction I 2521a6296200SBram Moolenaar endtry 2522a6296200SBram Moolenaar endtry 2523a6296200SBram Moolenaar endtry 2524a6296200SBram Moolenaar endtry 2525a6296200SBram Moolenaar endtry 2526a6296200SBram Moolenaar endtry 2527a6296200SBram Moolenaar endtry 2528a6296200SBram Moolenaar call assert_report('should not get here') 2529a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 2530a6296200SBram Moolenaar Xpath 'A' 2531a6296200SBram Moolenaar endtry 2532a6296200SBram Moolenaar [CODE] 2533a6296200SBram Moolenaar let verify =<< trim [CODE] 2534a6296200SBram Moolenaar call assert_equal('abcdefghA', g:Xpath) 2535a6296200SBram Moolenaar [CODE] 2536a6296200SBram Moolenaar call RunInNewVim(test, verify) 2537a6296200SBram Moolenaarendfunc 2538a6296200SBram Moolenaar 2539a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2540a6296200SBram Moolenaar" Test 40: :finally reason discarded by :throw {{{1 2541a6296200SBram Moolenaar" 2542a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2543a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2544a6296200SBram Moolenaar" discarded by a :throw in the finally clause. 2545a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2546a6296200SBram Moolenaar 2547a6296200SBram Moolenaarfunc Test_finally_discard_by_throw() 2548a6296200SBram Moolenaar let test =<< trim [CODE] 2549a6296200SBram Moolenaar func T(jump) 2550a6296200SBram Moolenaar let loop = 0 2551a6296200SBram Moolenaar while loop < 2 2552a6296200SBram Moolenaar let loop = loop + 1 2553a6296200SBram Moolenaar if loop == 1 2554a6296200SBram Moolenaar try 2555a6296200SBram Moolenaar if a:jump == "continue" 2556a6296200SBram Moolenaar continue 2557a6296200SBram Moolenaar elseif a:jump == "break" 2558a6296200SBram Moolenaar break 2559a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2560a6296200SBram Moolenaar return 2561a6296200SBram Moolenaar elseif a:jump == "error" 2562a6296200SBram Moolenaar asdf 2563a6296200SBram Moolenaar elseif a:jump == "interrupt" 2564a6296200SBram Moolenaar call interrupt() 2565a6296200SBram Moolenaar let dummy = 0 2566a6296200SBram Moolenaar elseif a:jump == "throw" 2567a6296200SBram Moolenaar throw "abc" 2568a6296200SBram Moolenaar endif 2569a6296200SBram Moolenaar finally 2570a6296200SBram Moolenaar throw "xyz" " discards jump that caused the :finally 2571a6296200SBram Moolenaar endtry 2572a6296200SBram Moolenaar elseif loop == 2 2573a6296200SBram Moolenaar call assert_report('should not get here') 2574a6296200SBram Moolenaar endif 2575a6296200SBram Moolenaar endwhile 2576a6296200SBram Moolenaar call assert_report('should not get here') 2577a6296200SBram Moolenaar endfunc 2578a6296200SBram Moolenaar 2579a6296200SBram Moolenaar try 2580a6296200SBram Moolenaar Xpath 'a' 2581a6296200SBram Moolenaar call T("continue") 2582a6296200SBram Moolenaar call assert_report('should not get here') 2583a6296200SBram Moolenaar finally 2584a6296200SBram Moolenaar try 2585a6296200SBram Moolenaar Xpath 'b' 2586a6296200SBram Moolenaar call T("break") 2587a6296200SBram Moolenaar call assert_report('should not get here') 2588a6296200SBram Moolenaar finally 2589a6296200SBram Moolenaar try 2590a6296200SBram Moolenaar Xpath 'c' 2591a6296200SBram Moolenaar call T("return") 2592a6296200SBram Moolenaar call assert_report('should not get here') 2593a6296200SBram Moolenaar finally 2594a6296200SBram Moolenaar try 2595a6296200SBram Moolenaar Xpath 'd' 2596a6296200SBram Moolenaar let g:jump = "finish" 2597a6296200SBram Moolenaar ExecAsScript T 2598a6296200SBram Moolenaar call assert_report('should not get here') 2599a6296200SBram Moolenaar finally 2600a6296200SBram Moolenaar unlet g:jump 2601a6296200SBram Moolenaar try 2602a6296200SBram Moolenaar Xpath 'e' 2603a6296200SBram Moolenaar call T("error") 2604a6296200SBram Moolenaar call assert_report('should not get here') 2605a6296200SBram Moolenaar finally 2606a6296200SBram Moolenaar try 2607a6296200SBram Moolenaar Xpath 'f' 2608a6296200SBram Moolenaar call T("interrupt") 2609a6296200SBram Moolenaar call assert_report('should not get here') 2610a6296200SBram Moolenaar finally 2611a6296200SBram Moolenaar try 2612a6296200SBram Moolenaar Xpath 'g' 2613a6296200SBram Moolenaar call T("throw") 2614a6296200SBram Moolenaar call assert_report('should not get here') 2615a6296200SBram Moolenaar finally 2616a6296200SBram Moolenaar Xpath 'h' 2617a6296200SBram Moolenaar delfunction T 2618a6296200SBram Moolenaar endtry 2619a6296200SBram Moolenaar endtry 2620a6296200SBram Moolenaar endtry 2621a6296200SBram Moolenaar endtry 2622a6296200SBram Moolenaar endtry 2623a6296200SBram Moolenaar endtry 2624a6296200SBram Moolenaar endtry 2625a6296200SBram Moolenaar call assert_report('should not get here') 2626a6296200SBram Moolenaar [CODE] 2627a6296200SBram Moolenaar let verify =<< trim [CODE] 2628a6296200SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 2629a6296200SBram Moolenaar [CODE] 2630a6296200SBram Moolenaar call RunInNewVim(test, verify) 2631a6296200SBram Moolenaarendfunc 2632a6296200SBram Moolenaar 2633a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2634a6296200SBram Moolenaar" Test 49: Throwing exceptions across functions {{{1 2635a6296200SBram Moolenaar" 2636a6296200SBram Moolenaar" When an exception is thrown but not caught inside a function, the 2637a6296200SBram Moolenaar" caller is checked for a matching :catch clause. 2638a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2639a6296200SBram Moolenaar 2640a6296200SBram Moolenaarfunc T49_C() 2641a6296200SBram Moolenaar try 2642a6296200SBram Moolenaar Xpath 'a' 2643a6296200SBram Moolenaar throw "arrgh" 2644a6296200SBram Moolenaar call assert_report('should not get here') 2645a6296200SBram Moolenaar catch /arrgh/ 2646a6296200SBram Moolenaar Xpath 'b' 2647a6296200SBram Moolenaar endtry 2648a6296200SBram Moolenaar Xpath 'c' 2649a6296200SBram Moolenaarendfunc 2650a6296200SBram Moolenaar 2651a6296200SBram Moolenaarfunc T49_T1() 2652a6296200SBram Moolenaar XloopNEXT 2653a6296200SBram Moolenaar try 2654a6296200SBram Moolenaar Xloop 'd' 2655a6296200SBram Moolenaar throw "arrgh" 2656a6296200SBram Moolenaar call assert_report('should not get here') 2657a6296200SBram Moolenaar finally 2658a6296200SBram Moolenaar Xloop 'e' 2659a6296200SBram Moolenaar endtry 2660a6296200SBram Moolenaar Xloop 'f' 2661a6296200SBram Moolenaarendfunc 2662a6296200SBram Moolenaar 2663a6296200SBram Moolenaarfunc T49_T2() 2664a6296200SBram Moolenaar try 2665a6296200SBram Moolenaar Xpath 'g' 2666a6296200SBram Moolenaar call T49_T1() 2667a6296200SBram Moolenaar call assert_report('should not get here') 2668a6296200SBram Moolenaar finally 2669a6296200SBram Moolenaar Xpath 'h' 2670a6296200SBram Moolenaar endtry 2671a6296200SBram Moolenaar call assert_report('should not get here') 2672a6296200SBram Moolenaarendfunc 2673a6296200SBram Moolenaar 2674a6296200SBram Moolenaarfunc Test_throw_exception_across_funcs() 2675a6296200SBram Moolenaar XpathINIT 2676a6296200SBram Moolenaar XloopINIT 2677a6296200SBram Moolenaar try 2678a6296200SBram Moolenaar Xpath 'i' 2679a6296200SBram Moolenaar call T49_C() " throw and catch 2680a6296200SBram Moolenaar Xpath 'j' 2681a6296200SBram Moolenaar catch /.*/ 2682a6296200SBram Moolenaar call assert_report('should not get here') 2683a6296200SBram Moolenaar endtry 2684a6296200SBram Moolenaar 2685a6296200SBram Moolenaar try 2686a6296200SBram Moolenaar Xpath 'k' 2687a6296200SBram Moolenaar call T49_T1() " throw, one level 2688a6296200SBram Moolenaar call assert_report('should not get here') 2689a6296200SBram Moolenaar catch /arrgh/ 2690a6296200SBram Moolenaar Xpath 'l' 2691a6296200SBram Moolenaar catch /.*/ 2692a6296200SBram Moolenaar call assert_report('should not get here') 2693a6296200SBram Moolenaar endtry 2694a6296200SBram Moolenaar 2695a6296200SBram Moolenaar try 2696a6296200SBram Moolenaar Xpath 'm' 2697a6296200SBram Moolenaar call T49_T2() " throw, two levels 2698a6296200SBram Moolenaar call assert_report('should not get here') 2699a6296200SBram Moolenaar catch /arrgh/ 2700a6296200SBram Moolenaar Xpath 'n' 2701a6296200SBram Moolenaar catch /.*/ 2702a6296200SBram Moolenaar call assert_report('should not get here') 2703a6296200SBram Moolenaar endtry 2704a6296200SBram Moolenaar Xpath 'o' 2705a6296200SBram Moolenaar 2706a6296200SBram Moolenaar call assert_equal('iabcjkd2e2lmgd3e3hno', g:Xpath) 2707a6296200SBram Moolenaarendfunc 2708a6296200SBram Moolenaar 2709a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2710a6296200SBram Moolenaar" Test 50: Throwing exceptions across script files {{{1 2711a6296200SBram Moolenaar" 2712a6296200SBram Moolenaar" When an exception is thrown but not caught inside a script file, 2713a6296200SBram Moolenaar" the sourcing script or function is checked for a matching :catch 2714a6296200SBram Moolenaar" clause. 2715a6296200SBram Moolenaar" 2716a6296200SBram Moolenaar" This test executes the bodies of the functions C, T1, and T2 from 2717a6296200SBram Moolenaar" the previous test as script files (:return replaced by :finish). 2718a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2719a6296200SBram Moolenaar 2720a6296200SBram Moolenaarfunc T50_F() 2721a6296200SBram Moolenaar try 2722a6296200SBram Moolenaar Xpath 'A' 2723a6296200SBram Moolenaar exec "source" g:scriptC 2724a6296200SBram Moolenaar Xpath 'B' 2725a6296200SBram Moolenaar catch /.*/ 2726a6296200SBram Moolenaar call assert_report('should not get here') 2727a6296200SBram Moolenaar endtry 2728a6296200SBram Moolenaar 2729a6296200SBram Moolenaar try 2730a6296200SBram Moolenaar Xpath 'C' 2731a6296200SBram Moolenaar exec "source" g:scriptT1 2732a6296200SBram Moolenaar call assert_report('should not get here') 2733a6296200SBram Moolenaar catch /arrgh/ 2734a6296200SBram Moolenaar Xpath 'D' 2735a6296200SBram Moolenaar catch /.*/ 2736a6296200SBram Moolenaar call assert_report('should not get here') 2737a6296200SBram Moolenaar endtry 2738a6296200SBram Moolenaarendfunc 2739a6296200SBram Moolenaar 2740a6296200SBram Moolenaarfunc Test_throw_across_script() 2741a6296200SBram Moolenaar XpathINIT 2742a6296200SBram Moolenaar XloopINIT 2743a6296200SBram Moolenaar let g:scriptC = MakeScript("T49_C") 2744a6296200SBram Moolenaar let g:scriptT1 = MakeScript("T49_T1") 2745a6296200SBram Moolenaar let scriptT2 = MakeScript("T49_T2", g:scriptT1) 2746a6296200SBram Moolenaar 2747a6296200SBram Moolenaar try 2748a6296200SBram Moolenaar Xpath 'E' 2749a6296200SBram Moolenaar call T50_F() 2750a6296200SBram Moolenaar Xpath 'F' 2751a6296200SBram Moolenaar exec "source" scriptT2 2752a6296200SBram Moolenaar call assert_report('should not get here') 2753a6296200SBram Moolenaar catch /arrgh/ 2754a6296200SBram Moolenaar Xpath 'G' 2755a6296200SBram Moolenaar catch /.*/ 2756a6296200SBram Moolenaar call assert_report('should not get here') 2757a6296200SBram Moolenaar endtry 2758a6296200SBram Moolenaar Xpath 'H' 2759a6296200SBram Moolenaar call assert_equal('EAabcBCd2e2DFgd3e3hGH', g:Xpath) 2760a6296200SBram Moolenaar 2761a6296200SBram Moolenaar call delete(g:scriptC) 2762a6296200SBram Moolenaar call delete(g:scriptT1) 2763a6296200SBram Moolenaar call delete(scriptT2) 2764a6296200SBram Moolenaar unlet g:scriptC g:scriptT1 scriptT2 2765a6296200SBram Moolenaarendfunc 2766a6296200SBram Moolenaar 27671f068233SBram Moolenaar"------------------------------------------------------------------------------- 27689470a4d8SBram Moolenaar" Test 52: Uncaught exceptions {{{1 27699470a4d8SBram Moolenaar" 27709470a4d8SBram Moolenaar" When an exception is thrown but not caught, an error message is 27719470a4d8SBram Moolenaar" displayed when the script is terminated. In case of an interrupt 27729470a4d8SBram Moolenaar" or error exception, the normal interrupt or error message(s) are 27739470a4d8SBram Moolenaar" displayed. 27749470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 27759470a4d8SBram Moolenaar 27769470a4d8SBram Moolenaarfunc Test_uncaught_exception_1() 27779470a4d8SBram Moolenaar CheckEnglish 27789470a4d8SBram Moolenaar 27799470a4d8SBram Moolenaar let test =<< trim [CODE] 27809470a4d8SBram Moolenaar Xpath 'a' 27819470a4d8SBram Moolenaar throw "arrgh" 27829470a4d8SBram Moolenaar call assert_report('should not get here')` 27839470a4d8SBram Moolenaar [CODE] 27849470a4d8SBram Moolenaar let verify =<< trim [CODE] 27859470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: arrgh', v:errmsg) 27869470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 27879470a4d8SBram Moolenaar [CODE] 27889470a4d8SBram Moolenaar call RunInNewVim(test, verify) 27899470a4d8SBram Moolenaarendfunc 27909470a4d8SBram Moolenaar 27919470a4d8SBram Moolenaarfunc Test_uncaught_exception_2() 27929470a4d8SBram Moolenaar CheckEnglish 27939470a4d8SBram Moolenaar 27949470a4d8SBram Moolenaar let test =<< trim [CODE] 27959470a4d8SBram Moolenaar try 27969470a4d8SBram Moolenaar Xpath 'a' 27979470a4d8SBram Moolenaar throw "oops" 27989470a4d8SBram Moolenaar call assert_report('should not get here')` 27999470a4d8SBram Moolenaar catch /arrgh/ 28009470a4d8SBram Moolenaar call assert_report('should not get here')` 28019470a4d8SBram Moolenaar endtry 28029470a4d8SBram Moolenaar call assert_report('should not get here')` 28039470a4d8SBram Moolenaar [CODE] 28049470a4d8SBram Moolenaar let verify =<< trim [CODE] 28059470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: oops', v:errmsg) 28069470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 28079470a4d8SBram Moolenaar [CODE] 28089470a4d8SBram Moolenaar call RunInNewVim(test, verify) 28099470a4d8SBram Moolenaarendfunc 28109470a4d8SBram Moolenaar 28119470a4d8SBram Moolenaarfunc Test_uncaught_exception_3() 28129470a4d8SBram Moolenaar CheckEnglish 28139470a4d8SBram Moolenaar 28149470a4d8SBram Moolenaar let test =<< trim [CODE] 28159470a4d8SBram Moolenaar func T() 28169470a4d8SBram Moolenaar Xpath 'c' 28179470a4d8SBram Moolenaar throw "brrr" 28189470a4d8SBram Moolenaar call assert_report('should not get here')` 28199470a4d8SBram Moolenaar endfunc 28209470a4d8SBram Moolenaar 28219470a4d8SBram Moolenaar try 28229470a4d8SBram Moolenaar Xpath 'a' 28239470a4d8SBram Moolenaar throw "arrgh" 28249470a4d8SBram Moolenaar call assert_report('should not get here')` 28259470a4d8SBram Moolenaar catch /.*/ 28269470a4d8SBram Moolenaar Xpath 'b' 28279470a4d8SBram Moolenaar call T() 28289470a4d8SBram Moolenaar call assert_report('should not get here')` 28299470a4d8SBram Moolenaar endtry 28309470a4d8SBram Moolenaar call assert_report('should not get here')` 28319470a4d8SBram Moolenaar [CODE] 28329470a4d8SBram Moolenaar let verify =<< trim [CODE] 28339470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: brrr', v:errmsg) 28349470a4d8SBram Moolenaar call assert_equal('abc', g:Xpath) 28359470a4d8SBram Moolenaar [CODE] 28369470a4d8SBram Moolenaar call RunInNewVim(test, verify) 28379470a4d8SBram Moolenaarendfunc 28389470a4d8SBram Moolenaar 28399470a4d8SBram Moolenaarfunc Test_uncaught_exception_4() 28409470a4d8SBram Moolenaar CheckEnglish 28419470a4d8SBram Moolenaar 28429470a4d8SBram Moolenaar let test =<< trim [CODE] 28439470a4d8SBram Moolenaar try 28449470a4d8SBram Moolenaar Xpath 'a' 28459470a4d8SBram Moolenaar throw "arrgh" 28469470a4d8SBram Moolenaar call assert_report('should not get here')` 28479470a4d8SBram Moolenaar finally 28489470a4d8SBram Moolenaar Xpath 'b' 28499470a4d8SBram Moolenaar throw "brrr" 28509470a4d8SBram Moolenaar call assert_report('should not get here')` 28519470a4d8SBram Moolenaar endtry 28529470a4d8SBram Moolenaar call assert_report('should not get here')` 28539470a4d8SBram Moolenaar [CODE] 28549470a4d8SBram Moolenaar let verify =<< trim [CODE] 28559470a4d8SBram Moolenaar call assert_equal('E605: Exception not caught: brrr', v:errmsg) 28569470a4d8SBram Moolenaar call assert_equal('ab', g:Xpath) 28579470a4d8SBram Moolenaar [CODE] 28589470a4d8SBram Moolenaar call RunInNewVim(test, verify) 28599470a4d8SBram Moolenaarendfunc 28609470a4d8SBram Moolenaar 28619470a4d8SBram Moolenaarfunc Test_uncaught_exception_5() 28629470a4d8SBram Moolenaar CheckEnglish 28639470a4d8SBram Moolenaar 28649470a4d8SBram Moolenaar " Need to catch and handle interrupt, otherwise the test will wait for the 28659470a4d8SBram Moolenaar " user to press <Enter> to continue 28669470a4d8SBram Moolenaar let test =<< trim [CODE] 28679470a4d8SBram Moolenaar try 28689470a4d8SBram Moolenaar try 28699470a4d8SBram Moolenaar Xpath 'a' 28709470a4d8SBram Moolenaar call interrupt() 28719470a4d8SBram Moolenaar call assert_report('should not get here') 28729470a4d8SBram Moolenaar endtry 28739470a4d8SBram Moolenaar call assert_report('should not get here') 28749470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 28759470a4d8SBram Moolenaar Xpath 'b' 28769470a4d8SBram Moolenaar endtry 28779470a4d8SBram Moolenaar [CODE] 28789470a4d8SBram Moolenaar let verify =<< trim [CODE] 28799470a4d8SBram Moolenaar call assert_equal('ab', g:Xpath) 28809470a4d8SBram Moolenaar [CODE] 28819470a4d8SBram Moolenaar call RunInNewVim(test, verify) 28829470a4d8SBram Moolenaarendfunc 28839470a4d8SBram Moolenaar 28849470a4d8SBram Moolenaarfunc Test_uncaught_exception_6() 28859470a4d8SBram Moolenaar CheckEnglish 28869470a4d8SBram Moolenaar 28879470a4d8SBram Moolenaar let test =<< trim [CODE] 28889470a4d8SBram Moolenaar try 28899470a4d8SBram Moolenaar Xpath 'a' 28909470a4d8SBram Moolenaar let x = novar " error E121; exception: E121 28919470a4d8SBram Moolenaar catch /E15:/ " should not catch 28929470a4d8SBram Moolenaar call assert_report('should not get here') 28939470a4d8SBram Moolenaar endtry 28949470a4d8SBram Moolenaar call assert_report('should not get here') 28959470a4d8SBram Moolenaar [CODE] 28969470a4d8SBram Moolenaar let verify =<< trim [CODE] 28979470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 28989470a4d8SBram Moolenaar call assert_equal('E121: Undefined variable: novar', v:errmsg) 28999470a4d8SBram Moolenaar [CODE] 29009470a4d8SBram Moolenaar call RunInNewVim(test, verify) 29019470a4d8SBram Moolenaarendfunc 29029470a4d8SBram Moolenaar 29039470a4d8SBram Moolenaarfunc Test_uncaught_exception_7() 29049470a4d8SBram Moolenaar CheckEnglish 29059470a4d8SBram Moolenaar 29069470a4d8SBram Moolenaar let test =<< trim [CODE] 29079470a4d8SBram Moolenaar try 29089470a4d8SBram Moolenaar Xpath 'a' 29099470a4d8SBram Moolenaar " error E108/E488; exception: E488 29109470a4d8SBram Moolenaar unlet novar # 29119470a4d8SBram Moolenaar catch /E108:/ " should not catch 29129470a4d8SBram Moolenaar call assert_report('should not get here') 29139470a4d8SBram Moolenaar endtry 29149470a4d8SBram Moolenaar call assert_report('should not get here') 29159470a4d8SBram Moolenaar [CODE] 29169470a4d8SBram Moolenaar let verify =<< trim [CODE] 29179470a4d8SBram Moolenaar call assert_equal('a', g:Xpath) 29189470a4d8SBram Moolenaar call assert_equal('E488: Trailing characters: #', v:errmsg) 29199470a4d8SBram Moolenaar [CODE] 29209470a4d8SBram Moolenaar call RunInNewVim(test, verify) 29219470a4d8SBram Moolenaarendfunc 29229470a4d8SBram Moolenaar 29239470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 29249470a4d8SBram Moolenaar" Test 53: Nesting errors: :endif/:else/:elseif {{{1 29259470a4d8SBram Moolenaar" 29269470a4d8SBram Moolenaar" For nesting errors of :if conditionals the correct error messages 29279470a4d8SBram Moolenaar" should be given. 29289470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 29299470a4d8SBram Moolenaar 29309470a4d8SBram Moolenaarfunc Test_nested_if_else_errors() 29319470a4d8SBram Moolenaar CheckEnglish 29329470a4d8SBram Moolenaar 29339470a4d8SBram Moolenaar " :endif without :if 29349470a4d8SBram Moolenaar let code =<< trim END 29359470a4d8SBram Moolenaar endif 29369470a4d8SBram Moolenaar END 29379470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29389470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 29399470a4d8SBram Moolenaar 29409470a4d8SBram Moolenaar " :endif without :if 29419470a4d8SBram Moolenaar let code =<< trim END 29429470a4d8SBram Moolenaar while 1 29439470a4d8SBram Moolenaar endif 29449470a4d8SBram Moolenaar endwhile 29459470a4d8SBram Moolenaar END 29469470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29479470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 29489470a4d8SBram Moolenaar 29499470a4d8SBram Moolenaar " :endif without :if 29509470a4d8SBram Moolenaar let code =<< trim END 29519470a4d8SBram Moolenaar try 29529470a4d8SBram Moolenaar finally 29539470a4d8SBram Moolenaar endif 29549470a4d8SBram Moolenaar endtry 29559470a4d8SBram Moolenaar END 29569470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29579470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 29589470a4d8SBram Moolenaar 29599470a4d8SBram Moolenaar " :endif without :if 29609470a4d8SBram Moolenaar let code =<< trim END 29619470a4d8SBram Moolenaar try 29629470a4d8SBram Moolenaar endif 29639470a4d8SBram Moolenaar endtry 29649470a4d8SBram Moolenaar END 29659470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29669470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 29679470a4d8SBram Moolenaar 29689470a4d8SBram Moolenaar " :endif without :if 29699470a4d8SBram Moolenaar let code =<< trim END 29709470a4d8SBram Moolenaar try 29719470a4d8SBram Moolenaar throw "a" 29729470a4d8SBram Moolenaar catch /a/ 29739470a4d8SBram Moolenaar endif 29749470a4d8SBram Moolenaar endtry 29759470a4d8SBram Moolenaar END 29769470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29779470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if') 29789470a4d8SBram Moolenaar 29799470a4d8SBram Moolenaar " :else without :if 29809470a4d8SBram Moolenaar let code =<< trim END 29819470a4d8SBram Moolenaar else 29829470a4d8SBram Moolenaar END 29839470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29849470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 29859470a4d8SBram Moolenaar 29869470a4d8SBram Moolenaar " :else without :if 29879470a4d8SBram Moolenaar let code =<< trim END 29889470a4d8SBram Moolenaar while 1 29899470a4d8SBram Moolenaar else 29909470a4d8SBram Moolenaar endwhile 29919470a4d8SBram Moolenaar END 29929470a4d8SBram Moolenaar call writefile(code, 'Xtest') 29939470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 29949470a4d8SBram Moolenaar 29959470a4d8SBram Moolenaar " :else without :if 29969470a4d8SBram Moolenaar let code =<< trim END 29979470a4d8SBram Moolenaar try 29989470a4d8SBram Moolenaar finally 29999470a4d8SBram Moolenaar else 30009470a4d8SBram Moolenaar endtry 30019470a4d8SBram Moolenaar END 30029470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30039470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 30049470a4d8SBram Moolenaar 30059470a4d8SBram Moolenaar " :else without :if 30069470a4d8SBram Moolenaar let code =<< trim END 30079470a4d8SBram Moolenaar try 30089470a4d8SBram Moolenaar else 30099470a4d8SBram Moolenaar endtry 30109470a4d8SBram Moolenaar END 30119470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30129470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 30139470a4d8SBram Moolenaar 30149470a4d8SBram Moolenaar " :else without :if 30159470a4d8SBram Moolenaar let code =<< trim END 30169470a4d8SBram Moolenaar try 30179470a4d8SBram Moolenaar throw "a" 30189470a4d8SBram Moolenaar catch /a/ 30199470a4d8SBram Moolenaar else 30209470a4d8SBram Moolenaar endtry 30219470a4d8SBram Moolenaar END 30229470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30239470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if') 30249470a4d8SBram Moolenaar 30259470a4d8SBram Moolenaar " :elseif without :if 30269470a4d8SBram Moolenaar let code =<< trim END 30279470a4d8SBram Moolenaar elseif 30289470a4d8SBram Moolenaar END 30299470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30309470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 30319470a4d8SBram Moolenaar 30329470a4d8SBram Moolenaar " :elseif without :if 30339470a4d8SBram Moolenaar let code =<< trim END 30349470a4d8SBram Moolenaar while 1 30359470a4d8SBram Moolenaar elseif 30369470a4d8SBram Moolenaar endwhile 30379470a4d8SBram Moolenaar END 30389470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30399470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 30409470a4d8SBram Moolenaar 30419470a4d8SBram Moolenaar " :elseif without :if 30429470a4d8SBram Moolenaar let code =<< trim END 30439470a4d8SBram Moolenaar try 30449470a4d8SBram Moolenaar finally 30459470a4d8SBram Moolenaar elseif 30469470a4d8SBram Moolenaar endtry 30479470a4d8SBram Moolenaar END 30489470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30499470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 30509470a4d8SBram Moolenaar 30519470a4d8SBram Moolenaar " :elseif without :if 30529470a4d8SBram Moolenaar let code =<< trim END 30539470a4d8SBram Moolenaar try 30549470a4d8SBram Moolenaar elseif 30559470a4d8SBram Moolenaar endtry 30569470a4d8SBram Moolenaar END 30579470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30589470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 30599470a4d8SBram Moolenaar 30609470a4d8SBram Moolenaar " :elseif without :if 30619470a4d8SBram Moolenaar let code =<< trim END 30629470a4d8SBram Moolenaar try 30639470a4d8SBram Moolenaar throw "a" 30649470a4d8SBram Moolenaar catch /a/ 30659470a4d8SBram Moolenaar elseif 30669470a4d8SBram Moolenaar endtry 30679470a4d8SBram Moolenaar END 30689470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30699470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if') 30709470a4d8SBram Moolenaar 30719470a4d8SBram Moolenaar " multiple :else 30729470a4d8SBram Moolenaar let code =<< trim END 30739470a4d8SBram Moolenaar if 1 30749470a4d8SBram Moolenaar else 30759470a4d8SBram Moolenaar else 30769470a4d8SBram Moolenaar endif 30779470a4d8SBram Moolenaar END 30789470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30799470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(else):E583: multiple :else') 30809470a4d8SBram Moolenaar 30819470a4d8SBram Moolenaar " :elseif after :else 30829470a4d8SBram Moolenaar let code =<< trim END 30839470a4d8SBram Moolenaar if 1 30849470a4d8SBram Moolenaar else 30859470a4d8SBram Moolenaar elseif 1 30869470a4d8SBram Moolenaar endif 30879470a4d8SBram Moolenaar END 30889470a4d8SBram Moolenaar call writefile(code, 'Xtest') 30899470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(elseif):E584: :elseif after :else') 30909470a4d8SBram Moolenaar 30919470a4d8SBram Moolenaar call delete('Xtest') 30929470a4d8SBram Moolenaarendfunc 30939470a4d8SBram Moolenaar 30949470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 30959470a4d8SBram Moolenaar" Test 54: Nesting errors: :while/:endwhile {{{1 30969470a4d8SBram Moolenaar" 30979470a4d8SBram Moolenaar" For nesting errors of :while conditionals the correct error messages 30989470a4d8SBram Moolenaar" should be given. 30999470a4d8SBram Moolenaar" 31009470a4d8SBram Moolenaar" This test reuses the function MESSAGES() from the previous test. 31019470a4d8SBram Moolenaar" This functions checks the messages in g:msgfile. 31029470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 31039470a4d8SBram Moolenaar 31049470a4d8SBram Moolenaarfunc Test_nested_while_error() 31059470a4d8SBram Moolenaar CheckEnglish 31069470a4d8SBram Moolenaar 31079470a4d8SBram Moolenaar " :endwhile without :while 31089470a4d8SBram Moolenaar let code =<< trim END 31099470a4d8SBram Moolenaar endwhile 31109470a4d8SBram Moolenaar END 31119470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31129470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 31139470a4d8SBram Moolenaar 31149470a4d8SBram Moolenaar " :endwhile without :while 31159470a4d8SBram Moolenaar let code =<< trim END 31169470a4d8SBram Moolenaar if 1 31179470a4d8SBram Moolenaar endwhile 31189470a4d8SBram Moolenaar endif 31199470a4d8SBram Moolenaar END 31209470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31219470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 31229470a4d8SBram Moolenaar 31239470a4d8SBram Moolenaar " Missing :endif 31249470a4d8SBram Moolenaar let code =<< trim END 31259470a4d8SBram Moolenaar while 1 31269470a4d8SBram Moolenaar if 1 31279470a4d8SBram Moolenaar endwhile 31289470a4d8SBram Moolenaar END 31299470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31309470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif') 31319470a4d8SBram Moolenaar 31329470a4d8SBram Moolenaar " :endwhile without :while 31339470a4d8SBram Moolenaar let code =<< trim END 31349470a4d8SBram Moolenaar try 31359470a4d8SBram Moolenaar finally 31369470a4d8SBram Moolenaar endwhile 31379470a4d8SBram Moolenaar endtry 31389470a4d8SBram Moolenaar END 31399470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31409470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 31419470a4d8SBram Moolenaar 31429470a4d8SBram Moolenaar " Missing :endtry 31439470a4d8SBram Moolenaar let code =<< trim END 31449470a4d8SBram Moolenaar while 1 31459470a4d8SBram Moolenaar try 31469470a4d8SBram Moolenaar finally 31479470a4d8SBram Moolenaar endwhile 31489470a4d8SBram Moolenaar END 31499470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31509470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry') 31519470a4d8SBram Moolenaar 31529470a4d8SBram Moolenaar " Missing :endtry 31539470a4d8SBram Moolenaar let code =<< trim END 31549470a4d8SBram Moolenaar while 1 31559470a4d8SBram Moolenaar if 1 31569470a4d8SBram Moolenaar try 31579470a4d8SBram Moolenaar finally 31589470a4d8SBram Moolenaar endwhile 31599470a4d8SBram Moolenaar END 31609470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31619470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry') 31629470a4d8SBram Moolenaar 31639470a4d8SBram Moolenaar " Missing :endif 31649470a4d8SBram Moolenaar let code =<< trim END 31659470a4d8SBram Moolenaar while 1 31669470a4d8SBram Moolenaar try 31679470a4d8SBram Moolenaar finally 31689470a4d8SBram Moolenaar if 1 31699470a4d8SBram Moolenaar endwhile 31709470a4d8SBram Moolenaar END 31719470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31729470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif') 31739470a4d8SBram Moolenaar 31749470a4d8SBram Moolenaar " :endwhile without :while 31759470a4d8SBram Moolenaar let code =<< trim END 31769470a4d8SBram Moolenaar try 31779470a4d8SBram Moolenaar endwhile 31789470a4d8SBram Moolenaar endtry 31799470a4d8SBram Moolenaar END 31809470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31819470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 31829470a4d8SBram Moolenaar 31839470a4d8SBram Moolenaar " :endwhile without :while 31849470a4d8SBram Moolenaar let code =<< trim END 31859470a4d8SBram Moolenaar while 1 31869470a4d8SBram Moolenaar try 31879470a4d8SBram Moolenaar endwhile 31889470a4d8SBram Moolenaar endtry 31899470a4d8SBram Moolenaar endwhile 31909470a4d8SBram Moolenaar END 31919470a4d8SBram Moolenaar call writefile(code, 'Xtest') 31929470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 31939470a4d8SBram Moolenaar 31949470a4d8SBram Moolenaar " :endwhile without :while 31959470a4d8SBram Moolenaar let code =<< trim END 31969470a4d8SBram Moolenaar try 31979470a4d8SBram Moolenaar throw "a" 31989470a4d8SBram Moolenaar catch /a/ 31999470a4d8SBram Moolenaar endwhile 32009470a4d8SBram Moolenaar endtry 32019470a4d8SBram Moolenaar END 32029470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32039470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 32049470a4d8SBram Moolenaar 32059470a4d8SBram Moolenaar " :endwhile without :while 32069470a4d8SBram Moolenaar let code =<< trim END 32079470a4d8SBram Moolenaar while 1 32089470a4d8SBram Moolenaar try 32099470a4d8SBram Moolenaar throw "a" 32109470a4d8SBram Moolenaar catch /a/ 32119470a4d8SBram Moolenaar endwhile 32129470a4d8SBram Moolenaar endtry 32139470a4d8SBram Moolenaar endwhile 32149470a4d8SBram Moolenaar END 32159470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32169470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while') 32179470a4d8SBram Moolenaar 32189470a4d8SBram Moolenaar call delete('Xtest') 32199470a4d8SBram Moolenaarendfunc 32209470a4d8SBram Moolenaar 32219470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 32229470a4d8SBram Moolenaar" Test 55: Nesting errors: :continue/:break {{{1 32239470a4d8SBram Moolenaar" 32249470a4d8SBram Moolenaar" For nesting errors of :continue and :break commands the correct 32259470a4d8SBram Moolenaar" error messages should be given. 32269470a4d8SBram Moolenaar" 32279470a4d8SBram Moolenaar" This test reuses the function MESSAGES() from the previous test. 32289470a4d8SBram Moolenaar" This functions checks the messages in g:msgfile. 32299470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 32309470a4d8SBram Moolenaar 32319470a4d8SBram Moolenaarfunc Test_nested_cont_break_error() 32329470a4d8SBram Moolenaar CheckEnglish 32339470a4d8SBram Moolenaar 32349470a4d8SBram Moolenaar " :continue without :while 32359470a4d8SBram Moolenaar let code =<< trim END 32369470a4d8SBram Moolenaar continue 32379470a4d8SBram Moolenaar END 32389470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32399470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 32409470a4d8SBram Moolenaar 32419470a4d8SBram Moolenaar " :continue without :while 32429470a4d8SBram Moolenaar let code =<< trim END 32439470a4d8SBram Moolenaar if 1 32449470a4d8SBram Moolenaar continue 32459470a4d8SBram Moolenaar endif 32469470a4d8SBram Moolenaar END 32479470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32489470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 32499470a4d8SBram Moolenaar 32509470a4d8SBram Moolenaar " :continue without :while 32519470a4d8SBram Moolenaar let code =<< trim END 32529470a4d8SBram Moolenaar try 32539470a4d8SBram Moolenaar finally 32549470a4d8SBram Moolenaar continue 32559470a4d8SBram Moolenaar endtry 32569470a4d8SBram Moolenaar END 32579470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32589470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 32599470a4d8SBram Moolenaar 32609470a4d8SBram Moolenaar " :continue without :while 32619470a4d8SBram Moolenaar let code =<< trim END 32629470a4d8SBram Moolenaar try 32639470a4d8SBram Moolenaar continue 32649470a4d8SBram Moolenaar endtry 32659470a4d8SBram Moolenaar END 32669470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32679470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 32689470a4d8SBram Moolenaar 32699470a4d8SBram Moolenaar " :continue without :while 32709470a4d8SBram Moolenaar let code =<< trim END 32719470a4d8SBram Moolenaar try 32729470a4d8SBram Moolenaar throw "a" 32739470a4d8SBram Moolenaar catch /a/ 32749470a4d8SBram Moolenaar continue 32759470a4d8SBram Moolenaar endtry 32769470a4d8SBram Moolenaar END 32779470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32789470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for') 32799470a4d8SBram Moolenaar 32809470a4d8SBram Moolenaar " :break without :while 32819470a4d8SBram Moolenaar let code =<< trim END 32829470a4d8SBram Moolenaar break 32839470a4d8SBram Moolenaar END 32849470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32859470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 32869470a4d8SBram Moolenaar 32879470a4d8SBram Moolenaar " :break without :while 32889470a4d8SBram Moolenaar let code =<< trim END 32899470a4d8SBram Moolenaar if 1 32909470a4d8SBram Moolenaar break 32919470a4d8SBram Moolenaar endif 32929470a4d8SBram Moolenaar END 32939470a4d8SBram Moolenaar call writefile(code, 'Xtest') 32949470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 32959470a4d8SBram Moolenaar 32969470a4d8SBram Moolenaar " :break without :while 32979470a4d8SBram Moolenaar let code =<< trim END 32989470a4d8SBram Moolenaar try 32999470a4d8SBram Moolenaar finally 33009470a4d8SBram Moolenaar break 33019470a4d8SBram Moolenaar endtry 33029470a4d8SBram Moolenaar END 33039470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33049470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 33059470a4d8SBram Moolenaar 33069470a4d8SBram Moolenaar " :break without :while 33079470a4d8SBram Moolenaar let code =<< trim END 33089470a4d8SBram Moolenaar try 33099470a4d8SBram Moolenaar break 33109470a4d8SBram Moolenaar endtry 33119470a4d8SBram Moolenaar END 33129470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33139470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 33149470a4d8SBram Moolenaar 33159470a4d8SBram Moolenaar " :break without :while 33169470a4d8SBram Moolenaar let code =<< trim END 33179470a4d8SBram Moolenaar try 33189470a4d8SBram Moolenaar throw "a" 33199470a4d8SBram Moolenaar catch /a/ 33209470a4d8SBram Moolenaar break 33219470a4d8SBram Moolenaar endtry 33229470a4d8SBram Moolenaar END 33239470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33249470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for') 33259470a4d8SBram Moolenaar 33269470a4d8SBram Moolenaar call delete('Xtest') 33279470a4d8SBram Moolenaarendfunc 33289470a4d8SBram Moolenaar 33299470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 33309470a4d8SBram Moolenaar" Test 56: Nesting errors: :endtry {{{1 33319470a4d8SBram Moolenaar" 33329470a4d8SBram Moolenaar" For nesting errors of :try conditionals the correct error messages 33339470a4d8SBram Moolenaar" should be given. 33349470a4d8SBram Moolenaar" 33359470a4d8SBram Moolenaar" This test reuses the function MESSAGES() from the previous test. 33369470a4d8SBram Moolenaar" This functions checks the messages in g:msgfile. 33379470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 33389470a4d8SBram Moolenaar 33399470a4d8SBram Moolenaarfunc Test_nested_endtry_error() 33409470a4d8SBram Moolenaar CheckEnglish 33419470a4d8SBram Moolenaar 33429470a4d8SBram Moolenaar " :endtry without :try 33439470a4d8SBram Moolenaar let code =<< trim END 33449470a4d8SBram Moolenaar endtry 33459470a4d8SBram Moolenaar END 33469470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33479470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try') 33489470a4d8SBram Moolenaar 33499470a4d8SBram Moolenaar " :endtry without :try 33509470a4d8SBram Moolenaar let code =<< trim END 33519470a4d8SBram Moolenaar if 1 33529470a4d8SBram Moolenaar endtry 33539470a4d8SBram Moolenaar endif 33549470a4d8SBram Moolenaar END 33559470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33569470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try') 33579470a4d8SBram Moolenaar 33589470a4d8SBram Moolenaar " :endtry without :try 33599470a4d8SBram Moolenaar let code =<< trim END 33609470a4d8SBram Moolenaar while 1 33619470a4d8SBram Moolenaar endtry 33629470a4d8SBram Moolenaar endwhile 33639470a4d8SBram Moolenaar END 33649470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33659470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try') 33669470a4d8SBram Moolenaar 33679470a4d8SBram Moolenaar " Missing :endif 33689470a4d8SBram Moolenaar let code =<< trim END 33699470a4d8SBram Moolenaar try 33709470a4d8SBram Moolenaar if 1 33719470a4d8SBram Moolenaar endtry 33729470a4d8SBram Moolenaar END 33739470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33749470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif') 33759470a4d8SBram Moolenaar 33769470a4d8SBram Moolenaar " Missing :endwhile 33779470a4d8SBram Moolenaar let code =<< trim END 33789470a4d8SBram Moolenaar try 33799470a4d8SBram Moolenaar while 1 33809470a4d8SBram Moolenaar endtry 33819470a4d8SBram Moolenaar END 33829470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33839470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile') 33849470a4d8SBram Moolenaar 33859470a4d8SBram Moolenaar " Missing :endif 33869470a4d8SBram Moolenaar let code =<< trim END 33879470a4d8SBram Moolenaar try 33889470a4d8SBram Moolenaar finally 33899470a4d8SBram Moolenaar if 1 33909470a4d8SBram Moolenaar endtry 33919470a4d8SBram Moolenaar END 33929470a4d8SBram Moolenaar call writefile(code, 'Xtest') 33939470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif') 33949470a4d8SBram Moolenaar 33959470a4d8SBram Moolenaar " Missing :endwhile 33969470a4d8SBram Moolenaar let code =<< trim END 33979470a4d8SBram Moolenaar try 33989470a4d8SBram Moolenaar finally 33999470a4d8SBram Moolenaar while 1 34009470a4d8SBram Moolenaar endtry 34019470a4d8SBram Moolenaar END 34029470a4d8SBram Moolenaar call writefile(code, 'Xtest') 34039470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile') 34049470a4d8SBram Moolenaar 34059470a4d8SBram Moolenaar " Missing :endif 34069470a4d8SBram Moolenaar let code =<< trim END 34079470a4d8SBram Moolenaar try 34089470a4d8SBram Moolenaar throw "a" 34099470a4d8SBram Moolenaar catch /a/ 34109470a4d8SBram Moolenaar if 1 34119470a4d8SBram Moolenaar endtry 34129470a4d8SBram Moolenaar END 34139470a4d8SBram Moolenaar call writefile(code, 'Xtest') 34149470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif') 34159470a4d8SBram Moolenaar 34169470a4d8SBram Moolenaar " Missing :endwhile 34179470a4d8SBram Moolenaar let code =<< trim END 34189470a4d8SBram Moolenaar try 34199470a4d8SBram Moolenaar throw "a" 34209470a4d8SBram Moolenaar catch /a/ 34219470a4d8SBram Moolenaar while 1 34229470a4d8SBram Moolenaar endtry 34239470a4d8SBram Moolenaar END 34249470a4d8SBram Moolenaar call writefile(code, 'Xtest') 34259470a4d8SBram Moolenaar call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile') 34269470a4d8SBram Moolenaar 34279470a4d8SBram Moolenaar call delete('Xtest') 34289470a4d8SBram Moolenaarendfunc 34299470a4d8SBram Moolenaar 34309470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 34319470a4d8SBram Moolenaar" Test 57: v:exception and v:throwpoint for user exceptions {{{1 34329470a4d8SBram Moolenaar" 34339470a4d8SBram Moolenaar" v:exception evaluates to the value of the exception that was caught 34349470a4d8SBram Moolenaar" most recently and is not finished. (A caught exception is finished 34359470a4d8SBram Moolenaar" when the next ":catch", ":finally", or ":endtry" is reached.) 34369470a4d8SBram Moolenaar" v:throwpoint evaluates to the script/function name and line number 34379470a4d8SBram Moolenaar" where that exception has been thrown. 34389470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 34399470a4d8SBram Moolenaar 34409470a4d8SBram Moolenaarfunc Test_user_exception_info() 34419470a4d8SBram Moolenaar CheckEnglish 34429470a4d8SBram Moolenaar 34439470a4d8SBram Moolenaar XpathINIT 34449470a4d8SBram Moolenaar XloopINIT 34459470a4d8SBram Moolenaar 34469470a4d8SBram Moolenaar func FuncException() 34479470a4d8SBram Moolenaar let g:exception = v:exception 34489470a4d8SBram Moolenaar endfunc 34499470a4d8SBram Moolenaar 34509470a4d8SBram Moolenaar func FuncThrowpoint() 34519470a4d8SBram Moolenaar let g:throwpoint = v:throwpoint 34529470a4d8SBram Moolenaar endfunc 34539470a4d8SBram Moolenaar 34549470a4d8SBram Moolenaar let scriptException = MakeScript("FuncException") 34559470a4d8SBram Moolenaar let scriptThrowPoint = MakeScript("FuncThrowpoint") 34569470a4d8SBram Moolenaar 34579470a4d8SBram Moolenaar command! CmdException let g:exception = v:exception 34589470a4d8SBram Moolenaar command! CmdThrowpoint let g:throwpoint = v:throwpoint 34599470a4d8SBram Moolenaar 34609470a4d8SBram Moolenaar func T(arg, line) 34619470a4d8SBram Moolenaar if a:line == 2 34629470a4d8SBram Moolenaar throw a:arg " in line 2 34639470a4d8SBram Moolenaar elseif a:line == 4 34649470a4d8SBram Moolenaar throw a:arg " in line 4 34659470a4d8SBram Moolenaar elseif a:line == 6 34669470a4d8SBram Moolenaar throw a:arg " in line 6 34679470a4d8SBram Moolenaar elseif a:line == 8 34689470a4d8SBram Moolenaar throw a:arg " in line 8 34699470a4d8SBram Moolenaar endif 34709470a4d8SBram Moolenaar endfunc 34719470a4d8SBram Moolenaar 34729470a4d8SBram Moolenaar func G(arg, line) 34739470a4d8SBram Moolenaar call T(a:arg, a:line) 34749470a4d8SBram Moolenaar endfunc 34759470a4d8SBram Moolenaar 34769470a4d8SBram Moolenaar func F(arg, line) 34779470a4d8SBram Moolenaar call G(a:arg, a:line) 34789470a4d8SBram Moolenaar endfunc 34799470a4d8SBram Moolenaar 34809470a4d8SBram Moolenaar let scriptT = MakeScript("T") 34819470a4d8SBram Moolenaar let scriptG = MakeScript("G", scriptT) 34829470a4d8SBram Moolenaar let scriptF = MakeScript("F", scriptG) 34839470a4d8SBram Moolenaar 34849470a4d8SBram Moolenaar try 34859470a4d8SBram Moolenaar Xpath 'a' 34869470a4d8SBram Moolenaar call F("oops", 2) 34879470a4d8SBram Moolenaar catch /.*/ 34889470a4d8SBram Moolenaar Xpath 'b' 34899470a4d8SBram Moolenaar let exception = v:exception 34909470a4d8SBram Moolenaar let throwpoint = v:throwpoint 34919470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 34929470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 34939470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 34949470a4d8SBram Moolenaar 34959470a4d8SBram Moolenaar exec "let exception = v:exception" 34969470a4d8SBram Moolenaar exec "let throwpoint = v:throwpoint" 34979470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 34989470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 34999470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 35009470a4d8SBram Moolenaar 35019470a4d8SBram Moolenaar CmdException 35029470a4d8SBram Moolenaar CmdThrowpoint 35039470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 35049470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 35059470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 35069470a4d8SBram Moolenaar 35079470a4d8SBram Moolenaar call FuncException() 35089470a4d8SBram Moolenaar call FuncThrowpoint() 35099470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 35109470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 35119470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 35129470a4d8SBram Moolenaar 35139470a4d8SBram Moolenaar exec "source" scriptException 35149470a4d8SBram Moolenaar exec "source" scriptThrowPoint 35159470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 35169470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 35179470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 35189470a4d8SBram Moolenaar 35199470a4d8SBram Moolenaar try 35209470a4d8SBram Moolenaar Xpath 'c' 35219470a4d8SBram Moolenaar call G("arrgh", 4) 35229470a4d8SBram Moolenaar catch /.*/ 35239470a4d8SBram Moolenaar Xpath 'd' 35249470a4d8SBram Moolenaar let exception = v:exception 35259470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35269470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 35279470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 35289470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 35299470a4d8SBram Moolenaar 35309470a4d8SBram Moolenaar try 35319470a4d8SBram Moolenaar Xpath 'e' 35329470a4d8SBram Moolenaar let g:arg = "autsch" 35339470a4d8SBram Moolenaar let g:line = 6 35349470a4d8SBram Moolenaar exec "source" scriptF 35359470a4d8SBram Moolenaar catch /.*/ 35369470a4d8SBram Moolenaar Xpath 'f' 35379470a4d8SBram Moolenaar let exception = v:exception 35389470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35399470a4d8SBram Moolenaar call assert_equal("autsch", v:exception) 35409470a4d8SBram Moolenaar call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint) 35419470a4d8SBram Moolenaar call assert_match('\<6\>', v:throwpoint) 35429470a4d8SBram Moolenaar finally 35439470a4d8SBram Moolenaar Xpath 'g' 35449470a4d8SBram Moolenaar let exception = v:exception 35459470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35469470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 35479470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 35489470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 35499470a4d8SBram Moolenaar try 35509470a4d8SBram Moolenaar Xpath 'h' 35519470a4d8SBram Moolenaar let g:arg = "brrrr" 35529470a4d8SBram Moolenaar let g:line = 8 35539470a4d8SBram Moolenaar exec "source" scriptG 35549470a4d8SBram Moolenaar catch /.*/ 35559470a4d8SBram Moolenaar Xpath 'i' 35569470a4d8SBram Moolenaar let exception = v:exception 35579470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35589470a4d8SBram Moolenaar " Resolve scriptT for matching it against v:throwpoint. 35599470a4d8SBram Moolenaar call assert_equal("brrrr", v:exception) 35609470a4d8SBram Moolenaar call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint) 35619470a4d8SBram Moolenaar call assert_match('\<8\>', v:throwpoint) 35629470a4d8SBram Moolenaar finally 35639470a4d8SBram Moolenaar Xpath 'j' 35649470a4d8SBram Moolenaar let exception = v:exception 35659470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35669470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 35679470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 35689470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 35699470a4d8SBram Moolenaar endtry 35709470a4d8SBram Moolenaar Xpath 'k' 35719470a4d8SBram Moolenaar let exception = v:exception 35729470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35739470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 35749470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 35759470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 35769470a4d8SBram Moolenaar endtry 35779470a4d8SBram Moolenaar Xpath 'l' 35789470a4d8SBram Moolenaar let exception = v:exception 35799470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35809470a4d8SBram Moolenaar call assert_equal("arrgh", v:exception) 35819470a4d8SBram Moolenaar call assert_match('\<G\[1]\.\.T\>', v:throwpoint) 35829470a4d8SBram Moolenaar call assert_match('\<4\>', v:throwpoint) 35839470a4d8SBram Moolenaar finally 35849470a4d8SBram Moolenaar Xpath 'm' 35859470a4d8SBram Moolenaar let exception = v:exception 35869470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35879470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 35889470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 35899470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 35909470a4d8SBram Moolenaar endtry 35919470a4d8SBram Moolenaar Xpath 'n' 35929470a4d8SBram Moolenaar let exception = v:exception 35939470a4d8SBram Moolenaar let throwpoint = v:throwpoint 35949470a4d8SBram Moolenaar call assert_equal("oops", v:exception) 35959470a4d8SBram Moolenaar call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint) 35969470a4d8SBram Moolenaar call assert_match('\<2\>', v:throwpoint) 35979470a4d8SBram Moolenaar finally 35989470a4d8SBram Moolenaar Xpath 'o' 35999470a4d8SBram Moolenaar let exception = v:exception 36009470a4d8SBram Moolenaar let throwpoint = v:throwpoint 36019470a4d8SBram Moolenaar call assert_equal("", v:exception) 36029470a4d8SBram Moolenaar call assert_match('^$', v:throwpoint) 36039470a4d8SBram Moolenaar call assert_match('^$', v:throwpoint) 36049470a4d8SBram Moolenaar endtry 36059470a4d8SBram Moolenaar 36069470a4d8SBram Moolenaar call assert_equal('abcdefghijklmno', g:Xpath) 36079470a4d8SBram Moolenaar 36089470a4d8SBram Moolenaar unlet exception throwpoint 36099470a4d8SBram Moolenaar delfunction FuncException 36109470a4d8SBram Moolenaar delfunction FuncThrowpoint 36119470a4d8SBram Moolenaar call delete(scriptException) 36129470a4d8SBram Moolenaar call delete(scriptThrowPoint) 36139470a4d8SBram Moolenaar unlet scriptException scriptThrowPoint 36149470a4d8SBram Moolenaar delcommand CmdException 36159470a4d8SBram Moolenaar delcommand CmdThrowpoint 36169470a4d8SBram Moolenaar delfunction T 36179470a4d8SBram Moolenaar delfunction G 36189470a4d8SBram Moolenaar delfunction F 36199470a4d8SBram Moolenaar call delete(scriptT) 36209470a4d8SBram Moolenaar call delete(scriptG) 36219470a4d8SBram Moolenaar call delete(scriptF) 36229470a4d8SBram Moolenaar unlet scriptT scriptG scriptF 36239470a4d8SBram Moolenaarendfunc 36249470a4d8SBram Moolenaar 36259470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 36269470a4d8SBram Moolenaar" 36279470a4d8SBram Moolenaar" Test 58: v:exception and v:throwpoint for error/interrupt exceptions {{{1 36289470a4d8SBram Moolenaar" 36299470a4d8SBram Moolenaar" v:exception and v:throwpoint work also for error and interrupt 36309470a4d8SBram Moolenaar" exceptions. 36319470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 36329470a4d8SBram Moolenaar 36339470a4d8SBram Moolenaarfunc Test_execption_info_for_error() 36349470a4d8SBram Moolenaar CheckEnglish 36359470a4d8SBram Moolenaar 36369470a4d8SBram Moolenaar let test =<< trim [CODE] 36379470a4d8SBram Moolenaar func T(line) 36389470a4d8SBram Moolenaar if a:line == 2 36399470a4d8SBram Moolenaar delfunction T " error (function in use) in line 2 36409470a4d8SBram Moolenaar elseif a:line == 4 36419470a4d8SBram Moolenaar call interrupt() 36429470a4d8SBram Moolenaar endif 36439470a4d8SBram Moolenaar endfunc 36449470a4d8SBram Moolenaar 36459470a4d8SBram Moolenaar while 1 36469470a4d8SBram Moolenaar try 36479470a4d8SBram Moolenaar Xpath 'a' 36489470a4d8SBram Moolenaar call T(2) 36499470a4d8SBram Moolenaar call assert_report('should not get here') 36509470a4d8SBram Moolenaar catch /.*/ 36519470a4d8SBram Moolenaar Xpath 'b' 36529470a4d8SBram Moolenaar if v:exception !~ 'Vim(delfunction):' 36539470a4d8SBram Moolenaar call assert_report('should not get here') 36549470a4d8SBram Moolenaar endif 36559470a4d8SBram Moolenaar if v:throwpoint !~ '\<T\>' 36569470a4d8SBram Moolenaar call assert_report('should not get here') 36579470a4d8SBram Moolenaar endif 36589470a4d8SBram Moolenaar if v:throwpoint !~ '\<2\>' 36599470a4d8SBram Moolenaar call assert_report('should not get here') 36609470a4d8SBram Moolenaar endif 36619470a4d8SBram Moolenaar finally 36629470a4d8SBram Moolenaar Xpath 'c' 36639470a4d8SBram Moolenaar if v:exception != "" 36649470a4d8SBram Moolenaar call assert_report('should not get here') 36659470a4d8SBram Moolenaar endif 36669470a4d8SBram Moolenaar if v:throwpoint != "" 36679470a4d8SBram Moolenaar call assert_report('should not get here') 36689470a4d8SBram Moolenaar endif 36699470a4d8SBram Moolenaar break 36709470a4d8SBram Moolenaar endtry 36719470a4d8SBram Moolenaar endwhile 36729470a4d8SBram Moolenaar 36739470a4d8SBram Moolenaar Xpath 'd' 36749470a4d8SBram Moolenaar if v:exception != "" 36759470a4d8SBram Moolenaar call assert_report('should not get here') 36769470a4d8SBram Moolenaar endif 36779470a4d8SBram Moolenaar if v:throwpoint != "" 36789470a4d8SBram Moolenaar call assert_report('should not get here') 36799470a4d8SBram Moolenaar endif 36809470a4d8SBram Moolenaar 36819470a4d8SBram Moolenaar while 1 36829470a4d8SBram Moolenaar try 36839470a4d8SBram Moolenaar Xpath 'e' 36849470a4d8SBram Moolenaar call T(4) 36859470a4d8SBram Moolenaar call assert_report('should not get here') 36869470a4d8SBram Moolenaar catch /.*/ 36879470a4d8SBram Moolenaar Xpath 'f' 36889470a4d8SBram Moolenaar if v:exception != 'Vim:Interrupt' 36899470a4d8SBram Moolenaar call assert_report('should not get here') 36909470a4d8SBram Moolenaar endif 36919470a4d8SBram Moolenaar if v:throwpoint !~ 'function T' 36929470a4d8SBram Moolenaar call assert_report('should not get here') 36939470a4d8SBram Moolenaar endif 36949470a4d8SBram Moolenaar if v:throwpoint !~ '\<4\>' 36959470a4d8SBram Moolenaar call assert_report('should not get here') 36969470a4d8SBram Moolenaar endif 36979470a4d8SBram Moolenaar finally 36989470a4d8SBram Moolenaar Xpath 'g' 36999470a4d8SBram Moolenaar if v:exception != "" 37009470a4d8SBram Moolenaar call assert_report('should not get here') 37019470a4d8SBram Moolenaar endif 37029470a4d8SBram Moolenaar if v:throwpoint != "" 37039470a4d8SBram Moolenaar call assert_report('should not get here') 37049470a4d8SBram Moolenaar endif 37059470a4d8SBram Moolenaar break 37069470a4d8SBram Moolenaar endtry 37079470a4d8SBram Moolenaar endwhile 37089470a4d8SBram Moolenaar 37099470a4d8SBram Moolenaar Xpath 'h' 37109470a4d8SBram Moolenaar if v:exception != "" 37119470a4d8SBram Moolenaar call assert_report('should not get here') 37129470a4d8SBram Moolenaar endif 37139470a4d8SBram Moolenaar if v:throwpoint != "" 37149470a4d8SBram Moolenaar call assert_report('should not get here') 37159470a4d8SBram Moolenaar endif 37169470a4d8SBram Moolenaar [CODE] 37179470a4d8SBram Moolenaar let verify =<< trim [CODE] 37189470a4d8SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 37199470a4d8SBram Moolenaar [CODE] 37209470a4d8SBram Moolenaar call RunInNewVim(test, verify) 37219470a4d8SBram Moolenaarendfunc 37229470a4d8SBram Moolenaar 37239470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 3724*efb64829SBram Moolenaar" 3725*efb64829SBram Moolenaar" Test 59: v:exception and v:throwpoint when discarding exceptions {{{1 3726*efb64829SBram Moolenaar" 3727*efb64829SBram Moolenaar" When a :catch clause is left by a ":break" etc or an error or 3728*efb64829SBram Moolenaar" interrupt exception, v:exception and v:throwpoint are reset. They 3729*efb64829SBram Moolenaar" are not affected by an exception that is discarded before being 3730*efb64829SBram Moolenaar" caught. 3731*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 3732*efb64829SBram Moolenaarfunc Test_exception_info_on_discard() 3733*efb64829SBram Moolenaar CheckEnglish 3734*efb64829SBram Moolenaar 3735*efb64829SBram Moolenaar let test =<< trim [CODE] 3736*efb64829SBram Moolenaar let sfile = expand("<sfile>") 3737*efb64829SBram Moolenaar 3738*efb64829SBram Moolenaar while 1 3739*efb64829SBram Moolenaar try 3740*efb64829SBram Moolenaar throw "x1" 3741*efb64829SBram Moolenaar catch /.*/ 3742*efb64829SBram Moolenaar break 3743*efb64829SBram Moolenaar endtry 3744*efb64829SBram Moolenaar endwhile 3745*efb64829SBram Moolenaar call assert_equal('', v:exception) 3746*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3747*efb64829SBram Moolenaar 3748*efb64829SBram Moolenaar while 1 3749*efb64829SBram Moolenaar try 3750*efb64829SBram Moolenaar throw "x2" 3751*efb64829SBram Moolenaar catch /.*/ 3752*efb64829SBram Moolenaar break 3753*efb64829SBram Moolenaar finally 3754*efb64829SBram Moolenaar call assert_equal('', v:exception) 3755*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3756*efb64829SBram Moolenaar endtry 3757*efb64829SBram Moolenaar break 3758*efb64829SBram Moolenaar endwhile 3759*efb64829SBram Moolenaar call assert_equal('', v:exception) 3760*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3761*efb64829SBram Moolenaar 3762*efb64829SBram Moolenaar while 1 3763*efb64829SBram Moolenaar try 3764*efb64829SBram Moolenaar let errcaught = 0 3765*efb64829SBram Moolenaar try 3766*efb64829SBram Moolenaar try 3767*efb64829SBram Moolenaar throw "x3" 3768*efb64829SBram Moolenaar catch /.*/ 3769*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3770*efb64829SBram Moolenaar asdf 3771*efb64829SBram Moolenaar endtry 3772*efb64829SBram Moolenaar catch /.*/ 3773*efb64829SBram Moolenaar let errcaught = 1 3774*efb64829SBram Moolenaar call assert_match('Vim:E492: Not an editor command:', v:exception) 3775*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 1), v:throwpoint) 3776*efb64829SBram Moolenaar endtry 3777*efb64829SBram Moolenaar finally 3778*efb64829SBram Moolenaar call assert_equal(1, errcaught) 3779*efb64829SBram Moolenaar break 3780*efb64829SBram Moolenaar endtry 3781*efb64829SBram Moolenaar endwhile 3782*efb64829SBram Moolenaar call assert_equal('', v:exception) 3783*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3784*efb64829SBram Moolenaar 3785*efb64829SBram Moolenaar Xpath 'a' 3786*efb64829SBram Moolenaar 3787*efb64829SBram Moolenaar while 1 3788*efb64829SBram Moolenaar try 3789*efb64829SBram Moolenaar let intcaught = 0 3790*efb64829SBram Moolenaar try 3791*efb64829SBram Moolenaar try 3792*efb64829SBram Moolenaar throw "x4" 3793*efb64829SBram Moolenaar catch /.*/ 3794*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3795*efb64829SBram Moolenaar call interrupt() 3796*efb64829SBram Moolenaar endtry 3797*efb64829SBram Moolenaar catch /.*/ 3798*efb64829SBram Moolenaar let intcaught = 1 3799*efb64829SBram Moolenaar call assert_match('Vim:Interrupt', v:exception) 3800*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 1), v:throwpoint) 3801*efb64829SBram Moolenaar endtry 3802*efb64829SBram Moolenaar finally 3803*efb64829SBram Moolenaar call assert_equal(1, intcaught) 3804*efb64829SBram Moolenaar break 3805*efb64829SBram Moolenaar endtry 3806*efb64829SBram Moolenaar endwhile 3807*efb64829SBram Moolenaar call assert_equal('', v:exception) 3808*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3809*efb64829SBram Moolenaar 3810*efb64829SBram Moolenaar Xpath 'b' 3811*efb64829SBram Moolenaar 3812*efb64829SBram Moolenaar while 1 3813*efb64829SBram Moolenaar try 3814*efb64829SBram Moolenaar let errcaught = 0 3815*efb64829SBram Moolenaar try 3816*efb64829SBram Moolenaar try 3817*efb64829SBram Moolenaar if 1 3818*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3819*efb64829SBram Moolenaar throw "x5" 3820*efb64829SBram Moolenaar " missing endif 3821*efb64829SBram Moolenaar catch /.*/ 3822*efb64829SBram Moolenaar call assert_report('should not get here') 3823*efb64829SBram Moolenaar endtry 3824*efb64829SBram Moolenaar catch /.*/ 3825*efb64829SBram Moolenaar let errcaught = 1 3826*efb64829SBram Moolenaar call assert_match('Vim(catch):E171: Missing :endif:', v:exception) 3827*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 3), v:throwpoint) 3828*efb64829SBram Moolenaar endtry 3829*efb64829SBram Moolenaar finally 3830*efb64829SBram Moolenaar call assert_equal(1, errcaught) 3831*efb64829SBram Moolenaar break 3832*efb64829SBram Moolenaar endtry 3833*efb64829SBram Moolenaar endwhile 3834*efb64829SBram Moolenaar call assert_equal('', v:exception) 3835*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3836*efb64829SBram Moolenaar 3837*efb64829SBram Moolenaar Xpath 'c' 3838*efb64829SBram Moolenaar 3839*efb64829SBram Moolenaar try 3840*efb64829SBram Moolenaar while 1 3841*efb64829SBram Moolenaar try 3842*efb64829SBram Moolenaar throw "x6" 3843*efb64829SBram Moolenaar finally 3844*efb64829SBram Moolenaar break 3845*efb64829SBram Moolenaar endtry 3846*efb64829SBram Moolenaar break 3847*efb64829SBram Moolenaar endwhile 3848*efb64829SBram Moolenaar catch /.*/ 3849*efb64829SBram Moolenaar call assert_report('should not get here') 3850*efb64829SBram Moolenaar endtry 3851*efb64829SBram Moolenaar call assert_equal('', v:exception) 3852*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3853*efb64829SBram Moolenaar 3854*efb64829SBram Moolenaar try 3855*efb64829SBram Moolenaar while 1 3856*efb64829SBram Moolenaar try 3857*efb64829SBram Moolenaar throw "x7" 3858*efb64829SBram Moolenaar finally 3859*efb64829SBram Moolenaar break 3860*efb64829SBram Moolenaar endtry 3861*efb64829SBram Moolenaar break 3862*efb64829SBram Moolenaar endwhile 3863*efb64829SBram Moolenaar catch /.*/ 3864*efb64829SBram Moolenaar call assert_report('should not get here') 3865*efb64829SBram Moolenaar finally 3866*efb64829SBram Moolenaar call assert_equal('', v:exception) 3867*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3868*efb64829SBram Moolenaar endtry 3869*efb64829SBram Moolenaar call assert_equal('', v:exception) 3870*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3871*efb64829SBram Moolenaar 3872*efb64829SBram Moolenaar while 1 3873*efb64829SBram Moolenaar try 3874*efb64829SBram Moolenaar let errcaught = 0 3875*efb64829SBram Moolenaar try 3876*efb64829SBram Moolenaar try 3877*efb64829SBram Moolenaar throw "x8" 3878*efb64829SBram Moolenaar finally 3879*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3880*efb64829SBram Moolenaar asdf 3881*efb64829SBram Moolenaar endtry 3882*efb64829SBram Moolenaar catch /.*/ 3883*efb64829SBram Moolenaar let errcaught = 1 3884*efb64829SBram Moolenaar call assert_match('Vim:E492: Not an editor command:', v:exception) 3885*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 1), v:throwpoint) 3886*efb64829SBram Moolenaar endtry 3887*efb64829SBram Moolenaar finally 3888*efb64829SBram Moolenaar call assert_equal(1, errcaught) 3889*efb64829SBram Moolenaar break 3890*efb64829SBram Moolenaar endtry 3891*efb64829SBram Moolenaar endwhile 3892*efb64829SBram Moolenaar call assert_equal('', v:exception) 3893*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3894*efb64829SBram Moolenaar 3895*efb64829SBram Moolenaar Xpath 'd' 3896*efb64829SBram Moolenaar 3897*efb64829SBram Moolenaar while 1 3898*efb64829SBram Moolenaar try 3899*efb64829SBram Moolenaar let intcaught = 0 3900*efb64829SBram Moolenaar try 3901*efb64829SBram Moolenaar try 3902*efb64829SBram Moolenaar throw "x9" 3903*efb64829SBram Moolenaar finally 3904*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3905*efb64829SBram Moolenaar call interrupt() 3906*efb64829SBram Moolenaar endtry 3907*efb64829SBram Moolenaar catch /.*/ 3908*efb64829SBram Moolenaar let intcaught = 1 3909*efb64829SBram Moolenaar call assert_match('Vim:Interrupt', v:exception) 3910*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 1), v:throwpoint) 3911*efb64829SBram Moolenaar endtry 3912*efb64829SBram Moolenaar finally 3913*efb64829SBram Moolenaar call assert_equal(1, intcaught) 3914*efb64829SBram Moolenaar break 3915*efb64829SBram Moolenaar endtry 3916*efb64829SBram Moolenaar endwhile 3917*efb64829SBram Moolenaar call assert_equal('', v:exception) 3918*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3919*efb64829SBram Moolenaar 3920*efb64829SBram Moolenaar Xpath 'e' 3921*efb64829SBram Moolenaar 3922*efb64829SBram Moolenaar while 1 3923*efb64829SBram Moolenaar try 3924*efb64829SBram Moolenaar let errcaught = 0 3925*efb64829SBram Moolenaar try 3926*efb64829SBram Moolenaar try 3927*efb64829SBram Moolenaar if 1 3928*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3929*efb64829SBram Moolenaar throw "x10" 3930*efb64829SBram Moolenaar " missing endif 3931*efb64829SBram Moolenaar finally 3932*efb64829SBram Moolenaar call assert_equal('', v:exception) 3933*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3934*efb64829SBram Moolenaar endtry 3935*efb64829SBram Moolenaar catch /.*/ 3936*efb64829SBram Moolenaar let errcaught = 1 3937*efb64829SBram Moolenaar call assert_match('Vim(finally):E171: Missing :endif:', v:exception) 3938*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 3), v:throwpoint) 3939*efb64829SBram Moolenaar endtry 3940*efb64829SBram Moolenaar finally 3941*efb64829SBram Moolenaar call assert_equal(1, errcaught) 3942*efb64829SBram Moolenaar break 3943*efb64829SBram Moolenaar endtry 3944*efb64829SBram Moolenaar endwhile 3945*efb64829SBram Moolenaar call assert_equal('', v:exception) 3946*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3947*efb64829SBram Moolenaar 3948*efb64829SBram Moolenaar Xpath 'f' 3949*efb64829SBram Moolenaar 3950*efb64829SBram Moolenaar while 1 3951*efb64829SBram Moolenaar try 3952*efb64829SBram Moolenaar let errcaught = 0 3953*efb64829SBram Moolenaar try 3954*efb64829SBram Moolenaar try 3955*efb64829SBram Moolenaar if 1 3956*efb64829SBram Moolenaar let lnum = expand("<sflnum>") 3957*efb64829SBram Moolenaar throw "x11" 3958*efb64829SBram Moolenaar " missing endif 3959*efb64829SBram Moolenaar endtry 3960*efb64829SBram Moolenaar catch /.*/ 3961*efb64829SBram Moolenaar let errcaught = 1 3962*efb64829SBram Moolenaar call assert_match('Vim(endtry):E171: Missing :endif:', v:exception) 3963*efb64829SBram Moolenaar call assert_match('line ' .. (lnum + 3), v:throwpoint) 3964*efb64829SBram Moolenaar endtry 3965*efb64829SBram Moolenaar finally 3966*efb64829SBram Moolenaar call assert_equal(1, errcaught) 3967*efb64829SBram Moolenaar break 3968*efb64829SBram Moolenaar endtry 3969*efb64829SBram Moolenaar endwhile 3970*efb64829SBram Moolenaar call assert_equal('', v:exception) 3971*efb64829SBram Moolenaar call assert_equal('', v:throwpoint) 3972*efb64829SBram Moolenaar 3973*efb64829SBram Moolenaar Xpath 'g' 3974*efb64829SBram Moolenaar [CODE] 3975*efb64829SBram Moolenaar let verify =<< trim [CODE] 3976*efb64829SBram Moolenaar call assert_equal('abcdefg', g:Xpath) 3977*efb64829SBram Moolenaar [CODE] 3978*efb64829SBram Moolenaar call RunInNewVim(test, verify) 3979*efb64829SBram Moolenaarendfunc 3980*efb64829SBram Moolenaar 3981*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 3982*efb64829SBram Moolenaar" 3983*efb64829SBram Moolenaar" Test 60: (Re)throwing v:exception; :echoerr. {{{1 3984*efb64829SBram Moolenaar" 3985*efb64829SBram Moolenaar" A user exception can be rethrown after catching by throwing 3986*efb64829SBram Moolenaar" v:exception. An error or interrupt exception cannot be rethrown 3987*efb64829SBram Moolenaar" because Vim exceptions cannot be faked. A Vim exception using the 3988*efb64829SBram Moolenaar" value of v:exception can, however, be triggered by the :echoerr 3989*efb64829SBram Moolenaar" command. 3990*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 3991*efb64829SBram Moolenaar 3992*efb64829SBram Moolenaarfunc Test_rethrow_exception_1() 3993*efb64829SBram Moolenaar XpathINIT 3994*efb64829SBram Moolenaar try 3995*efb64829SBram Moolenaar try 3996*efb64829SBram Moolenaar Xpath 'a' 3997*efb64829SBram Moolenaar throw "oops" 3998*efb64829SBram Moolenaar catch /oops/ 3999*efb64829SBram Moolenaar Xpath 'b' 4000*efb64829SBram Moolenaar throw v:exception " rethrow user exception 4001*efb64829SBram Moolenaar catch /.*/ 4002*efb64829SBram Moolenaar call assert_report('should not get here') 4003*efb64829SBram Moolenaar endtry 4004*efb64829SBram Moolenaar catch /^oops$/ " catches rethrown user exception 4005*efb64829SBram Moolenaar Xpath 'c' 4006*efb64829SBram Moolenaar catch /.*/ 4007*efb64829SBram Moolenaar call assert_report('should not get here') 4008*efb64829SBram Moolenaar endtry 4009*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4010*efb64829SBram Moolenaarendfunc 4011*efb64829SBram Moolenaar 4012*efb64829SBram Moolenaarfunc Test_rethrow_exception_2() 4013*efb64829SBram Moolenaar XpathINIT 4014*efb64829SBram Moolenaar try 4015*efb64829SBram Moolenaar let caught = 0 4016*efb64829SBram Moolenaar try 4017*efb64829SBram Moolenaar Xpath 'a' 4018*efb64829SBram Moolenaar write /n/o/n/w/r/i/t/a/b/l/e/_/f/i/l/e 4019*efb64829SBram Moolenaar call assert_report('should not get here') 4020*efb64829SBram Moolenaar catch /^Vim(write):/ 4021*efb64829SBram Moolenaar let caught = 1 4022*efb64829SBram Moolenaar throw v:exception " throw error: cannot fake Vim exception 4023*efb64829SBram Moolenaar catch /.*/ 4024*efb64829SBram Moolenaar call assert_report('should not get here') 4025*efb64829SBram Moolenaar finally 4026*efb64829SBram Moolenaar Xpath 'b' 4027*efb64829SBram Moolenaar call assert_equal(1, caught) 4028*efb64829SBram Moolenaar endtry 4029*efb64829SBram Moolenaar catch /^Vim(throw):/ " catches throw error 4030*efb64829SBram Moolenaar let caught = caught + 1 4031*efb64829SBram Moolenaar catch /.*/ 4032*efb64829SBram Moolenaar call assert_report('should not get here') 4033*efb64829SBram Moolenaar finally 4034*efb64829SBram Moolenaar Xpath 'c' 4035*efb64829SBram Moolenaar call assert_equal(2, caught) 4036*efb64829SBram Moolenaar endtry 4037*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4038*efb64829SBram Moolenaarendfunc 4039*efb64829SBram Moolenaar 4040*efb64829SBram Moolenaarfunc Test_rethrow_exception_3() 4041*efb64829SBram Moolenaar XpathINIT 4042*efb64829SBram Moolenaar try 4043*efb64829SBram Moolenaar let caught = 0 4044*efb64829SBram Moolenaar try 4045*efb64829SBram Moolenaar Xpath 'a' 4046*efb64829SBram Moolenaar asdf 4047*efb64829SBram Moolenaar catch /^Vim/ " catch error exception 4048*efb64829SBram Moolenaar let caught = 1 4049*efb64829SBram Moolenaar " Trigger Vim error exception with value specified after :echoerr 4050*efb64829SBram Moolenaar let value = substitute(v:exception, '^Vim\((.*)\)\=:', '', "") 4051*efb64829SBram Moolenaar echoerr value 4052*efb64829SBram Moolenaar catch /.*/ 4053*efb64829SBram Moolenaar call assert_report('should not get here') 4054*efb64829SBram Moolenaar finally 4055*efb64829SBram Moolenaar Xpath 'b' 4056*efb64829SBram Moolenaar call assert_equal(1, caught) 4057*efb64829SBram Moolenaar endtry 4058*efb64829SBram Moolenaar catch /^Vim(echoerr):/ 4059*efb64829SBram Moolenaar let caught = caught + 1 4060*efb64829SBram Moolenaar call assert_match(value, v:exception) 4061*efb64829SBram Moolenaar catch /.*/ 4062*efb64829SBram Moolenaar call assert_report('should not get here') 4063*efb64829SBram Moolenaar finally 4064*efb64829SBram Moolenaar Xpath 'c' 4065*efb64829SBram Moolenaar call assert_equal(2, caught) 4066*efb64829SBram Moolenaar endtry 4067*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4068*efb64829SBram Moolenaarendfunc 4069*efb64829SBram Moolenaar 4070*efb64829SBram Moolenaarfunc Test_rethrow_exception_3() 4071*efb64829SBram Moolenaar XpathINIT 4072*efb64829SBram Moolenaar try 4073*efb64829SBram Moolenaar let errcaught = 0 4074*efb64829SBram Moolenaar try 4075*efb64829SBram Moolenaar Xpath 'a' 4076*efb64829SBram Moolenaar let intcaught = 0 4077*efb64829SBram Moolenaar call interrupt() 4078*efb64829SBram Moolenaar catch /^Vim:/ " catch interrupt exception 4079*efb64829SBram Moolenaar let intcaught = 1 4080*efb64829SBram Moolenaar " Trigger Vim error exception with value specified after :echoerr 4081*efb64829SBram Moolenaar echoerr substitute(v:exception, '^Vim\((.*)\)\=:', '', "") 4082*efb64829SBram Moolenaar catch /.*/ 4083*efb64829SBram Moolenaar call assert_report('should not get here') 4084*efb64829SBram Moolenaar finally 4085*efb64829SBram Moolenaar Xpath 'b' 4086*efb64829SBram Moolenaar call assert_equal(1, intcaught) 4087*efb64829SBram Moolenaar endtry 4088*efb64829SBram Moolenaar catch /^Vim(echoerr):/ 4089*efb64829SBram Moolenaar let errcaught = 1 4090*efb64829SBram Moolenaar call assert_match('Interrupt', v:exception) 4091*efb64829SBram Moolenaar finally 4092*efb64829SBram Moolenaar Xpath 'c' 4093*efb64829SBram Moolenaar call assert_equal(1, errcaught) 4094*efb64829SBram Moolenaar endtry 4095*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4096*efb64829SBram Moolenaarendfunc 4097*efb64829SBram Moolenaar 4098*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 40999470a4d8SBram Moolenaar" Test 61: Catching interrupt exceptions {{{1 41009470a4d8SBram Moolenaar" 41019470a4d8SBram Moolenaar" When an interrupt occurs inside a :try/:endtry region, an 41029470a4d8SBram Moolenaar" interrupt exception is thrown and can be caught. Its value is 41039470a4d8SBram Moolenaar" "Vim:Interrupt". If the interrupt occurs after an error or a :throw 41049470a4d8SBram Moolenaar" but before a matching :catch is reached, all following :catches of 41059470a4d8SBram Moolenaar" that try block are ignored, but the interrupt exception can be 41069470a4d8SBram Moolenaar" caught by the next surrounding try conditional. An interrupt is 41079470a4d8SBram Moolenaar" ignored when there is a previous interrupt that has not been caught 41089470a4d8SBram Moolenaar" or causes a :finally clause to be executed. 41099470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 41109470a4d8SBram Moolenaar 41119470a4d8SBram Moolenaarfunc Test_catch_intr_exception() 41129470a4d8SBram Moolenaar let test =<< trim [CODE] 41139470a4d8SBram Moolenaar while 1 41149470a4d8SBram Moolenaar try 41159470a4d8SBram Moolenaar try 41169470a4d8SBram Moolenaar Xpath 'a' 41179470a4d8SBram Moolenaar call interrupt() 41189470a4d8SBram Moolenaar call assert_report('should not get here') 41199470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 41209470a4d8SBram Moolenaar Xpath 'b' 41219470a4d8SBram Moolenaar finally 41229470a4d8SBram Moolenaar Xpath 'c' 41239470a4d8SBram Moolenaar endtry 41249470a4d8SBram Moolenaar catch /.*/ 41259470a4d8SBram Moolenaar call assert_report('should not get here') 41269470a4d8SBram Moolenaar finally 41279470a4d8SBram Moolenaar Xpath 'd' 41289470a4d8SBram Moolenaar break 41299470a4d8SBram Moolenaar endtry 41309470a4d8SBram Moolenaar endwhile 41319470a4d8SBram Moolenaar 41329470a4d8SBram Moolenaar while 1 41339470a4d8SBram Moolenaar try 41349470a4d8SBram Moolenaar try 41359470a4d8SBram Moolenaar try 41369470a4d8SBram Moolenaar Xpath 'e' 41379470a4d8SBram Moolenaar asdf 41389470a4d8SBram Moolenaar call assert_report('should not get here') 41399470a4d8SBram Moolenaar catch /do_not_catch/ 41409470a4d8SBram Moolenaar call assert_report('should not get here') 41419470a4d8SBram Moolenaar catch /.*/ 41429470a4d8SBram Moolenaar Xpath 'f' 41439470a4d8SBram Moolenaar call interrupt() 41449470a4d8SBram Moolenaar call assert_report('should not get here') 41459470a4d8SBram Moolenaar catch /.*/ 41469470a4d8SBram Moolenaar call assert_report('should not get here') 41479470a4d8SBram Moolenaar finally 41489470a4d8SBram Moolenaar Xpath 'g' 41499470a4d8SBram Moolenaar call interrupt() 41509470a4d8SBram Moolenaar call assert_report('should not get here') 41519470a4d8SBram Moolenaar endtry 41529470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 41539470a4d8SBram Moolenaar Xpath 'h' 41549470a4d8SBram Moolenaar finally 41559470a4d8SBram Moolenaar Xpath 'i' 41569470a4d8SBram Moolenaar endtry 41579470a4d8SBram Moolenaar catch /.*/ 41589470a4d8SBram Moolenaar call assert_report('should not get here') 41599470a4d8SBram Moolenaar finally 41609470a4d8SBram Moolenaar Xpath 'j' 41619470a4d8SBram Moolenaar break 41629470a4d8SBram Moolenaar endtry 41639470a4d8SBram Moolenaar endwhile 41649470a4d8SBram Moolenaar 41659470a4d8SBram Moolenaar while 1 41669470a4d8SBram Moolenaar try 41679470a4d8SBram Moolenaar try 41689470a4d8SBram Moolenaar try 41699470a4d8SBram Moolenaar Xpath 'k' 41709470a4d8SBram Moolenaar throw "x" 41719470a4d8SBram Moolenaar call assert_report('should not get here') 41729470a4d8SBram Moolenaar catch /do_not_catch/ 41739470a4d8SBram Moolenaar call assert_report('should not get here') 41749470a4d8SBram Moolenaar catch /x/ 41759470a4d8SBram Moolenaar Xpath 'l' 41769470a4d8SBram Moolenaar call interrupt() 41779470a4d8SBram Moolenaar call assert_report('should not get here') 41789470a4d8SBram Moolenaar catch /.*/ 41799470a4d8SBram Moolenaar call assert_report('should not get here') 41809470a4d8SBram Moolenaar endtry 41819470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 41829470a4d8SBram Moolenaar Xpath 'm' 41839470a4d8SBram Moolenaar finally 41849470a4d8SBram Moolenaar Xpath 'n' 41859470a4d8SBram Moolenaar endtry 41869470a4d8SBram Moolenaar catch /.*/ 41879470a4d8SBram Moolenaar call assert_report('should not get here') 41889470a4d8SBram Moolenaar finally 41899470a4d8SBram Moolenaar Xpath 'o' 41909470a4d8SBram Moolenaar break 41919470a4d8SBram Moolenaar endtry 41929470a4d8SBram Moolenaar endwhile 41939470a4d8SBram Moolenaar 41949470a4d8SBram Moolenaar while 1 41959470a4d8SBram Moolenaar try 41969470a4d8SBram Moolenaar try 41979470a4d8SBram Moolenaar Xpath 'p' 41989470a4d8SBram Moolenaar call interrupt() 41999470a4d8SBram Moolenaar call assert_report('should not get here') 42009470a4d8SBram Moolenaar catch /do_not_catch/ 42019470a4d8SBram Moolenaar call interrupt() 42029470a4d8SBram Moolenaar call assert_report('should not get here') 42039470a4d8SBram Moolenaar catch /^Vim:Interrupt$/ 42049470a4d8SBram Moolenaar Xpath 'q' 42059470a4d8SBram Moolenaar finally 42069470a4d8SBram Moolenaar Xpath 'r' 42079470a4d8SBram Moolenaar endtry 42089470a4d8SBram Moolenaar catch /.*/ 42099470a4d8SBram Moolenaar call assert_report('should not get here') 42109470a4d8SBram Moolenaar finally 42119470a4d8SBram Moolenaar Xpath 's' 42129470a4d8SBram Moolenaar break 42139470a4d8SBram Moolenaar endtry 42149470a4d8SBram Moolenaar endwhile 42159470a4d8SBram Moolenaar 42169470a4d8SBram Moolenaar Xpath 't' 42179470a4d8SBram Moolenaar [CODE] 42189470a4d8SBram Moolenaar let verify =<< trim [CODE] 42199470a4d8SBram Moolenaar call assert_equal('abcdefghijklmnopqrst', g:Xpath) 42209470a4d8SBram Moolenaar [CODE] 42219470a4d8SBram Moolenaar call RunInNewVim(test, verify) 42229470a4d8SBram Moolenaarendfunc 42239470a4d8SBram Moolenaar 42249470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 4225*efb64829SBram Moolenaar" Test 62: Catching error exceptions {{{1 4226*efb64829SBram Moolenaar" 4227*efb64829SBram Moolenaar" An error inside a :try/:endtry region is converted to an exception 4228*efb64829SBram Moolenaar" and can be caught. The error exception has a "Vim(cmdname):" prefix 4229*efb64829SBram Moolenaar" where cmdname is the name of the failing command, or a "Vim:" prefix 4230*efb64829SBram Moolenaar" if no command name is known. The "Vim" prefixes cannot be faked. 4231*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4232*efb64829SBram Moolenaar 4233*efb64829SBram Moolenaarfunc Test_catch_err_exception_1() 4234*efb64829SBram Moolenaar XpathINIT 4235*efb64829SBram Moolenaar while 1 4236*efb64829SBram Moolenaar try 4237*efb64829SBram Moolenaar try 4238*efb64829SBram Moolenaar let caught = 0 4239*efb64829SBram Moolenaar unlet novar 4240*efb64829SBram Moolenaar catch /^Vim(unlet):/ 4241*efb64829SBram Moolenaar Xpath 'a' 4242*efb64829SBram Moolenaar let caught = 1 4243*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim(unlet):', '', "") 4244*efb64829SBram Moolenaar finally 4245*efb64829SBram Moolenaar Xpath 'b' 4246*efb64829SBram Moolenaar call assert_equal(1, caught) 4247*efb64829SBram Moolenaar call assert_match('E108: No such variable: "novar"', v:errmsg) 4248*efb64829SBram Moolenaar endtry 4249*efb64829SBram Moolenaar catch /.*/ 4250*efb64829SBram Moolenaar call assert_report('should not get here') 4251*efb64829SBram Moolenaar finally 4252*efb64829SBram Moolenaar Xpath 'c' 4253*efb64829SBram Moolenaar break 4254*efb64829SBram Moolenaar endtry 4255*efb64829SBram Moolenaar call assert_report('should not get here') 4256*efb64829SBram Moolenaar endwhile 4257*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4258*efb64829SBram Moolenaarendfunc 4259*efb64829SBram Moolenaar 4260*efb64829SBram Moolenaarfunc Test_catch_err_exception_2() 4261*efb64829SBram Moolenaar XpathINIT 4262*efb64829SBram Moolenaar while 1 4263*efb64829SBram Moolenaar try 4264*efb64829SBram Moolenaar try 4265*efb64829SBram Moolenaar let caught = 0 4266*efb64829SBram Moolenaar throw novar " error in :throw 4267*efb64829SBram Moolenaar catch /^Vim(throw):/ 4268*efb64829SBram Moolenaar Xpath 'a' 4269*efb64829SBram Moolenaar let caught = 1 4270*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim(throw):', '', "") 4271*efb64829SBram Moolenaar finally 4272*efb64829SBram Moolenaar Xpath 'b' 4273*efb64829SBram Moolenaar call assert_equal(1, caught) 4274*efb64829SBram Moolenaar call assert_match('E121: Undefined variable: novar', v:errmsg) 4275*efb64829SBram Moolenaar endtry 4276*efb64829SBram Moolenaar catch /.*/ 4277*efb64829SBram Moolenaar call assert_report('should not get here') 4278*efb64829SBram Moolenaar finally 4279*efb64829SBram Moolenaar Xpath 'c' 4280*efb64829SBram Moolenaar break 4281*efb64829SBram Moolenaar endtry 4282*efb64829SBram Moolenaar call assert_report('should not get here') 4283*efb64829SBram Moolenaar endwhile 4284*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4285*efb64829SBram Moolenaarendfunc 4286*efb64829SBram Moolenaar 4287*efb64829SBram Moolenaarfunc Test_catch_err_exception_3() 4288*efb64829SBram Moolenaar XpathINIT 4289*efb64829SBram Moolenaar while 1 4290*efb64829SBram Moolenaar try 4291*efb64829SBram Moolenaar try 4292*efb64829SBram Moolenaar let caught = 0 4293*efb64829SBram Moolenaar throw "Vim:faked" " error: cannot fake Vim exception 4294*efb64829SBram Moolenaar catch /^Vim(throw):/ 4295*efb64829SBram Moolenaar Xpath 'a' 4296*efb64829SBram Moolenaar let caught = 1 4297*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim(throw):', '', "") 4298*efb64829SBram Moolenaar finally 4299*efb64829SBram Moolenaar Xpath 'b' 4300*efb64829SBram Moolenaar call assert_equal(1, caught) 4301*efb64829SBram Moolenaar call assert_match("E608: Cannot :throw exceptions with 'Vim' prefix", 4302*efb64829SBram Moolenaar \ v:errmsg) 4303*efb64829SBram Moolenaar endtry 4304*efb64829SBram Moolenaar catch /.*/ 4305*efb64829SBram Moolenaar call assert_report('should not get here') 4306*efb64829SBram Moolenaar finally 4307*efb64829SBram Moolenaar Xpath 'c' 4308*efb64829SBram Moolenaar break 4309*efb64829SBram Moolenaar endtry 4310*efb64829SBram Moolenaar call assert_report('should not get here') 4311*efb64829SBram Moolenaar endwhile 4312*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4313*efb64829SBram Moolenaarendfunc 4314*efb64829SBram Moolenaar 4315*efb64829SBram Moolenaarfunc Test_catch_err_exception_4() 4316*efb64829SBram Moolenaar XpathINIT 4317*efb64829SBram Moolenaar func F() 4318*efb64829SBram Moolenaar while 1 4319*efb64829SBram Moolenaar " Missing :endwhile 4320*efb64829SBram Moolenaar endfunc 4321*efb64829SBram Moolenaar 4322*efb64829SBram Moolenaar while 1 4323*efb64829SBram Moolenaar try 4324*efb64829SBram Moolenaar try 4325*efb64829SBram Moolenaar let caught = 0 4326*efb64829SBram Moolenaar call F() 4327*efb64829SBram Moolenaar catch /^Vim(endfunction):/ 4328*efb64829SBram Moolenaar Xpath 'a' 4329*efb64829SBram Moolenaar let caught = 1 4330*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim(endfunction):', '', "") 4331*efb64829SBram Moolenaar finally 4332*efb64829SBram Moolenaar Xpath 'b' 4333*efb64829SBram Moolenaar call assert_equal(1, caught) 4334*efb64829SBram Moolenaar call assert_match("E170: Missing :endwhile", v:errmsg) 4335*efb64829SBram Moolenaar endtry 4336*efb64829SBram Moolenaar catch /.*/ 4337*efb64829SBram Moolenaar call assert_report('should not get here') 4338*efb64829SBram Moolenaar finally 4339*efb64829SBram Moolenaar Xpath 'c' 4340*efb64829SBram Moolenaar break 4341*efb64829SBram Moolenaar endtry 4342*efb64829SBram Moolenaar call assert_report('should not get here') 4343*efb64829SBram Moolenaar endwhile 4344*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4345*efb64829SBram Moolenaar delfunc F 4346*efb64829SBram Moolenaarendfunc 4347*efb64829SBram Moolenaar 4348*efb64829SBram Moolenaarfunc Test_catch_err_exception_5() 4349*efb64829SBram Moolenaar XpathINIT 4350*efb64829SBram Moolenaar func F() 4351*efb64829SBram Moolenaar while 1 4352*efb64829SBram Moolenaar " Missing :endwhile 4353*efb64829SBram Moolenaar endfunc 4354*efb64829SBram Moolenaar 4355*efb64829SBram Moolenaar while 1 4356*efb64829SBram Moolenaar try 4357*efb64829SBram Moolenaar try 4358*efb64829SBram Moolenaar let caught = 0 4359*efb64829SBram Moolenaar ExecAsScript F 4360*efb64829SBram Moolenaar catch /^Vim:/ 4361*efb64829SBram Moolenaar Xpath 'a' 4362*efb64829SBram Moolenaar let caught = 1 4363*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim:', '', "") 4364*efb64829SBram Moolenaar finally 4365*efb64829SBram Moolenaar Xpath 'b' 4366*efb64829SBram Moolenaar call assert_equal(1, caught) 4367*efb64829SBram Moolenaar call assert_match("E170: Missing :endwhile", v:errmsg) 4368*efb64829SBram Moolenaar endtry 4369*efb64829SBram Moolenaar catch /.*/ 4370*efb64829SBram Moolenaar call assert_report('should not get here') 4371*efb64829SBram Moolenaar finally 4372*efb64829SBram Moolenaar Xpath 'c' 4373*efb64829SBram Moolenaar break 4374*efb64829SBram Moolenaar endtry 4375*efb64829SBram Moolenaar call assert_report('should not get here') 4376*efb64829SBram Moolenaar endwhile 4377*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4378*efb64829SBram Moolenaar delfunc F 4379*efb64829SBram Moolenaarendfunc 4380*efb64829SBram Moolenaar 4381*efb64829SBram Moolenaarfunc Test_catch_err_exception_6() 4382*efb64829SBram Moolenaar XpathINIT 4383*efb64829SBram Moolenaar func G() 4384*efb64829SBram Moolenaar call G() 4385*efb64829SBram Moolenaar endfunc 4386*efb64829SBram Moolenaar 4387*efb64829SBram Moolenaar while 1 4388*efb64829SBram Moolenaar try 4389*efb64829SBram Moolenaar let mfd_save = &mfd 4390*efb64829SBram Moolenaar set mfd=3 4391*efb64829SBram Moolenaar try 4392*efb64829SBram Moolenaar let caught = 0 4393*efb64829SBram Moolenaar call G() 4394*efb64829SBram Moolenaar catch /^Vim(call):/ 4395*efb64829SBram Moolenaar Xpath 'a' 4396*efb64829SBram Moolenaar let caught = 1 4397*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim(call):', '', "") 4398*efb64829SBram Moolenaar finally 4399*efb64829SBram Moolenaar Xpath 'b' 4400*efb64829SBram Moolenaar call assert_equal(1, caught) 4401*efb64829SBram Moolenaar call assert_match("E132: Function call depth is higher than 'maxfuncdepth'", v:errmsg) 4402*efb64829SBram Moolenaar endtry 4403*efb64829SBram Moolenaar catch /.*/ 4404*efb64829SBram Moolenaar call assert_report('should not get here') 4405*efb64829SBram Moolenaar finally 4406*efb64829SBram Moolenaar Xpath 'c' 4407*efb64829SBram Moolenaar let &mfd = mfd_save 4408*efb64829SBram Moolenaar break 4409*efb64829SBram Moolenaar endtry 4410*efb64829SBram Moolenaar call assert_report('should not get here') 4411*efb64829SBram Moolenaar endwhile 4412*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4413*efb64829SBram Moolenaar delfunc G 4414*efb64829SBram Moolenaarendfunc 4415*efb64829SBram Moolenaar 4416*efb64829SBram Moolenaarfunc Test_catch_err_exception_7() 4417*efb64829SBram Moolenaar XpathINIT 4418*efb64829SBram Moolenaar func H() 4419*efb64829SBram Moolenaar return H() 4420*efb64829SBram Moolenaar endfunc 4421*efb64829SBram Moolenaar 4422*efb64829SBram Moolenaar while 1 4423*efb64829SBram Moolenaar try 4424*efb64829SBram Moolenaar let mfd_save = &mfd 4425*efb64829SBram Moolenaar set mfd=3 4426*efb64829SBram Moolenaar try 4427*efb64829SBram Moolenaar let caught = 0 4428*efb64829SBram Moolenaar call H() 4429*efb64829SBram Moolenaar catch /^Vim(return):/ 4430*efb64829SBram Moolenaar Xpath 'a' 4431*efb64829SBram Moolenaar let caught = 1 4432*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim(return):', '', "") 4433*efb64829SBram Moolenaar finally 4434*efb64829SBram Moolenaar Xpath 'b' 4435*efb64829SBram Moolenaar call assert_equal(1, caught) 4436*efb64829SBram Moolenaar call assert_match("E132: Function call depth is higher than 'maxfuncdepth'", v:errmsg) 4437*efb64829SBram Moolenaar endtry 4438*efb64829SBram Moolenaar catch /.*/ 4439*efb64829SBram Moolenaar call assert_report('should not get here') 4440*efb64829SBram Moolenaar finally 4441*efb64829SBram Moolenaar Xpath 'c' 4442*efb64829SBram Moolenaar let &mfd = mfd_save 4443*efb64829SBram Moolenaar break " discard error for $VIMNOERRTHROW 4444*efb64829SBram Moolenaar endtry 4445*efb64829SBram Moolenaar call assert_report('should not get here') 4446*efb64829SBram Moolenaar endwhile 4447*efb64829SBram Moolenaar 4448*efb64829SBram Moolenaar call assert_equal('abc', g:Xpath) 4449*efb64829SBram Moolenaar delfunc H 4450*efb64829SBram Moolenaarendfunc 4451*efb64829SBram Moolenaar 4452*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4453*efb64829SBram Moolenaar" Test 63: Suppressing error exceptions by :silent!. {{{1 4454*efb64829SBram Moolenaar" 4455*efb64829SBram Moolenaar" A :silent! command inside a :try/:endtry region suppresses the 4456*efb64829SBram Moolenaar" conversion of errors to an exception and the immediate abortion on 4457*efb64829SBram Moolenaar" error. When the commands executed by the :silent! themselves open 4458*efb64829SBram Moolenaar" a new :try/:endtry region, conversion of errors to exception and 4459*efb64829SBram Moolenaar" immediate abortion is switched on again - until the next :silent! 4460*efb64829SBram Moolenaar" etc. The :silent! has the effect of setting v:errmsg to the error 4461*efb64829SBram Moolenaar" message text (without displaying it) and continuing with the next 4462*efb64829SBram Moolenaar" script line. 4463*efb64829SBram Moolenaar" 4464*efb64829SBram Moolenaar" When a command triggering autocommands is executed by :silent! 4465*efb64829SBram Moolenaar" inside a :try/:endtry, the autocommand execution is not suppressed 4466*efb64829SBram Moolenaar" on error. 4467*efb64829SBram Moolenaar" 4468*efb64829SBram Moolenaar" This test reuses the function MSG() from the previous test. 4469*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4470*efb64829SBram Moolenaar 4471*efb64829SBram Moolenaarfunc Test_silent_exception() 4472*efb64829SBram Moolenaar XpathINIT 4473*efb64829SBram Moolenaar XloopINIT 4474*efb64829SBram Moolenaar let g:taken = "" 4475*efb64829SBram Moolenaar 4476*efb64829SBram Moolenaar func S(n) abort 4477*efb64829SBram Moolenaar XloopNEXT 4478*efb64829SBram Moolenaar let g:taken = g:taken . "E" . a:n 4479*efb64829SBram Moolenaar let v:errmsg = "" 4480*efb64829SBram Moolenaar exec "asdf" . a:n 4481*efb64829SBram Moolenaar 4482*efb64829SBram Moolenaar " Check that ":silent!" continues: 4483*efb64829SBram Moolenaar Xloop 'a' 4484*efb64829SBram Moolenaar 4485*efb64829SBram Moolenaar " Check that ":silent!" sets "v:errmsg": 4486*efb64829SBram Moolenaar call assert_match("E492: Not an editor command", v:errmsg) 4487*efb64829SBram Moolenaar endfunc 4488*efb64829SBram Moolenaar 4489*efb64829SBram Moolenaar func Foo() 4490*efb64829SBram Moolenaar while 1 4491*efb64829SBram Moolenaar try 4492*efb64829SBram Moolenaar try 4493*efb64829SBram Moolenaar let caught = 0 4494*efb64829SBram Moolenaar " This is not silent: 4495*efb64829SBram Moolenaar call S(3) 4496*efb64829SBram Moolenaar catch /^Vim:/ 4497*efb64829SBram Moolenaar Xpath 'b' 4498*efb64829SBram Moolenaar let caught = 1 4499*efb64829SBram Moolenaar let errmsg3 = substitute(v:exception, '^Vim:', '', "") 4500*efb64829SBram Moolenaar silent! call S(4) 4501*efb64829SBram Moolenaar finally 4502*efb64829SBram Moolenaar call assert_equal(1, caught) 4503*efb64829SBram Moolenaar Xpath 'c' 4504*efb64829SBram Moolenaar call assert_match("E492: Not an editor command", errmsg3) 4505*efb64829SBram Moolenaar silent! call S(5) 4506*efb64829SBram Moolenaar " Break out of try conditionals that cover ":silent!". This also 4507*efb64829SBram Moolenaar " discards the aborting error when $VIMNOERRTHROW is non-zero. 4508*efb64829SBram Moolenaar break 4509*efb64829SBram Moolenaar endtry 4510*efb64829SBram Moolenaar catch /.*/ 4511*efb64829SBram Moolenaar call assert_report('should not get here') 4512*efb64829SBram Moolenaar endtry 4513*efb64829SBram Moolenaar endwhile 4514*efb64829SBram Moolenaar " This is a double ":silent!" (see caller). 4515*efb64829SBram Moolenaar silent! call S(6) 4516*efb64829SBram Moolenaar endfunc 4517*efb64829SBram Moolenaar 4518*efb64829SBram Moolenaar func Bar() 4519*efb64829SBram Moolenaar try 4520*efb64829SBram Moolenaar silent! call S(2) 4521*efb64829SBram Moolenaar silent! execute "call Foo() | call S(7)" 4522*efb64829SBram Moolenaar silent! call S(8) 4523*efb64829SBram Moolenaar endtry " normal end of try cond that covers ":silent!" 4524*efb64829SBram Moolenaar " This has a ":silent!" from the caller: 4525*efb64829SBram Moolenaar call S(9) 4526*efb64829SBram Moolenaar endfunc 4527*efb64829SBram Moolenaar 4528*efb64829SBram Moolenaar silent! call S(1) 4529*efb64829SBram Moolenaar silent! call Bar() 4530*efb64829SBram Moolenaar silent! call S(10) 4531*efb64829SBram Moolenaar 4532*efb64829SBram Moolenaar call assert_equal("E1E2E3E4E5E6E7E8E9E10", g:taken) 4533*efb64829SBram Moolenaar 4534*efb64829SBram Moolenaar augroup TMP 4535*efb64829SBram Moolenaar au! 4536*efb64829SBram Moolenaar autocmd BufWritePost * Xpath 'd' 4537*efb64829SBram Moolenaar augroup END 4538*efb64829SBram Moolenaar 4539*efb64829SBram Moolenaar Xpath 'e' 4540*efb64829SBram Moolenaar silent! write /i/m/p/o/s/s/i/b/l/e 4541*efb64829SBram Moolenaar Xpath 'f' 4542*efb64829SBram Moolenaar 4543*efb64829SBram Moolenaar call assert_equal('a2a3ba5ca6a7a8a9a10a11edf', g:Xpath) 4544*efb64829SBram Moolenaar 4545*efb64829SBram Moolenaar augroup TMP 4546*efb64829SBram Moolenaar au! 4547*efb64829SBram Moolenaar augroup END 4548*efb64829SBram Moolenaar augroup! TMP 4549*efb64829SBram Moolenaar delfunction S 4550*efb64829SBram Moolenaar delfunction Foo 4551*efb64829SBram Moolenaar delfunction Bar 4552*efb64829SBram Moolenaarendfunc 4553*efb64829SBram Moolenaar 4554*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4555*efb64829SBram Moolenaar" Test 64: Error exceptions after error, interrupt or :throw {{{1 4556*efb64829SBram Moolenaar" 4557*efb64829SBram Moolenaar" When an error occurs after an interrupt or a :throw but before 4558*efb64829SBram Moolenaar" a matching :catch is reached, all following :catches of that try 4559*efb64829SBram Moolenaar" block are ignored, but the error exception can be caught by the next 4560*efb64829SBram Moolenaar" surrounding try conditional. Any previous error exception is 4561*efb64829SBram Moolenaar" discarded. An error is ignored when there is a previous error that 4562*efb64829SBram Moolenaar" has not been caught. 4563*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4564*efb64829SBram Moolenaar 4565*efb64829SBram Moolenaarfunc Test_exception_after_error_1() 4566*efb64829SBram Moolenaar XpathINIT 4567*efb64829SBram Moolenaar while 1 4568*efb64829SBram Moolenaar try 4569*efb64829SBram Moolenaar try 4570*efb64829SBram Moolenaar Xpath 'a' 4571*efb64829SBram Moolenaar let caught = 0 4572*efb64829SBram Moolenaar while 1 4573*efb64829SBram Moolenaar if 1 4574*efb64829SBram Moolenaar " Missing :endif 4575*efb64829SBram Moolenaar endwhile " throw error exception 4576*efb64829SBram Moolenaar catch /^Vim(/ 4577*efb64829SBram Moolenaar Xpath 'b' 4578*efb64829SBram Moolenaar let caught = 1 4579*efb64829SBram Moolenaar finally 4580*efb64829SBram Moolenaar Xpath 'c' 4581*efb64829SBram Moolenaar call assert_equal(1, caught) 4582*efb64829SBram Moolenaar endtry 4583*efb64829SBram Moolenaar catch /.*/ 4584*efb64829SBram Moolenaar call assert_report('should not get here') 4585*efb64829SBram Moolenaar finally 4586*efb64829SBram Moolenaar Xpath 'd' 4587*efb64829SBram Moolenaar break 4588*efb64829SBram Moolenaar endtry 4589*efb64829SBram Moolenaar call assert_report('should not get here') 4590*efb64829SBram Moolenaar endwhile 4591*efb64829SBram Moolenaar call assert_equal('abcd', g:Xpath) 4592*efb64829SBram Moolenaarendfunc 4593*efb64829SBram Moolenaar 4594*efb64829SBram Moolenaarfunc Test_exception_after_error_2() 4595*efb64829SBram Moolenaar XpathINIT 4596*efb64829SBram Moolenaar while 1 4597*efb64829SBram Moolenaar try 4598*efb64829SBram Moolenaar try 4599*efb64829SBram Moolenaar Xpath 'a' 4600*efb64829SBram Moolenaar let caught = 0 4601*efb64829SBram Moolenaar try 4602*efb64829SBram Moolenaar if 1 4603*efb64829SBram Moolenaar " Missing :endif 4604*efb64829SBram Moolenaar catch /.*/ " throw error exception 4605*efb64829SBram Moolenaar call assert_report('should not get here') 4606*efb64829SBram Moolenaar catch /.*/ 4607*efb64829SBram Moolenaar call assert_report('should not get here') 4608*efb64829SBram Moolenaar endtry 4609*efb64829SBram Moolenaar catch /^Vim(/ 4610*efb64829SBram Moolenaar Xpath 'b' 4611*efb64829SBram Moolenaar let caught = 1 4612*efb64829SBram Moolenaar finally 4613*efb64829SBram Moolenaar Xpath 'c' 4614*efb64829SBram Moolenaar call assert_equal(1, caught) 4615*efb64829SBram Moolenaar endtry 4616*efb64829SBram Moolenaar catch /.*/ 4617*efb64829SBram Moolenaar call assert_report('should not get here') 4618*efb64829SBram Moolenaar finally 4619*efb64829SBram Moolenaar Xpath 'd' 4620*efb64829SBram Moolenaar break 4621*efb64829SBram Moolenaar endtry 4622*efb64829SBram Moolenaar call assert_report('should not get here') 4623*efb64829SBram Moolenaar endwhile 4624*efb64829SBram Moolenaar call assert_equal('abcd', g:Xpath) 4625*efb64829SBram Moolenaarendfunc 4626*efb64829SBram Moolenaar 4627*efb64829SBram Moolenaarfunc Test_exception_after_error_3() 4628*efb64829SBram Moolenaar XpathINIT 4629*efb64829SBram Moolenaar while 1 4630*efb64829SBram Moolenaar try 4631*efb64829SBram Moolenaar try 4632*efb64829SBram Moolenaar let caught = 0 4633*efb64829SBram Moolenaar try 4634*efb64829SBram Moolenaar Xpath 'a' 4635*efb64829SBram Moolenaar call interrupt() 4636*efb64829SBram Moolenaar catch /do_not_catch/ 4637*efb64829SBram Moolenaar call assert_report('should not get here') 4638*efb64829SBram Moolenaar if 1 4639*efb64829SBram Moolenaar " Missing :endif 4640*efb64829SBram Moolenaar catch /.*/ " throw error exception 4641*efb64829SBram Moolenaar call assert_report('should not get here') 4642*efb64829SBram Moolenaar catch /.*/ 4643*efb64829SBram Moolenaar call assert_report('should not get here') 4644*efb64829SBram Moolenaar endtry 4645*efb64829SBram Moolenaar catch /^Vim(/ 4646*efb64829SBram Moolenaar Xpath 'b' 4647*efb64829SBram Moolenaar let caught = 1 4648*efb64829SBram Moolenaar finally 4649*efb64829SBram Moolenaar Xpath 'c' 4650*efb64829SBram Moolenaar call assert_equal(1, caught) 4651*efb64829SBram Moolenaar endtry 4652*efb64829SBram Moolenaar catch /.*/ 4653*efb64829SBram Moolenaar call assert_report('should not get here') 4654*efb64829SBram Moolenaar finally 4655*efb64829SBram Moolenaar Xpath 'd' 4656*efb64829SBram Moolenaar break 4657*efb64829SBram Moolenaar endtry 4658*efb64829SBram Moolenaar call assert_report('should not get here') 4659*efb64829SBram Moolenaar endwhile 4660*efb64829SBram Moolenaar call assert_equal('abcd', g:Xpath) 4661*efb64829SBram Moolenaarendfunc 4662*efb64829SBram Moolenaar 4663*efb64829SBram Moolenaarfunc Test_exception_after_error_4() 4664*efb64829SBram Moolenaar XpathINIT 4665*efb64829SBram Moolenaar while 1 4666*efb64829SBram Moolenaar try 4667*efb64829SBram Moolenaar try 4668*efb64829SBram Moolenaar let caught = 0 4669*efb64829SBram Moolenaar try 4670*efb64829SBram Moolenaar Xpath 'a' 4671*efb64829SBram Moolenaar throw "x" 4672*efb64829SBram Moolenaar catch /do_not_catch/ 4673*efb64829SBram Moolenaar call assert_report('should not get here') 4674*efb64829SBram Moolenaar if 1 4675*efb64829SBram Moolenaar " Missing :endif 4676*efb64829SBram Moolenaar catch /x/ " throw error exception 4677*efb64829SBram Moolenaar call assert_report('should not get here') 4678*efb64829SBram Moolenaar catch /.*/ 4679*efb64829SBram Moolenaar call assert_report('should not get here') 4680*efb64829SBram Moolenaar endtry 4681*efb64829SBram Moolenaar catch /^Vim(/ 4682*efb64829SBram Moolenaar Xpath 'b' 4683*efb64829SBram Moolenaar let caught = 1 4684*efb64829SBram Moolenaar finally 4685*efb64829SBram Moolenaar Xpath 'c' 4686*efb64829SBram Moolenaar call assert_equal(1, caught) 4687*efb64829SBram Moolenaar endtry 4688*efb64829SBram Moolenaar catch /.*/ 4689*efb64829SBram Moolenaar call assert_report('should not get here') 4690*efb64829SBram Moolenaar finally 4691*efb64829SBram Moolenaar Xpath 'd' 4692*efb64829SBram Moolenaar break 4693*efb64829SBram Moolenaar endtry 4694*efb64829SBram Moolenaar call assert_report('should not get here') 4695*efb64829SBram Moolenaar endwhile 4696*efb64829SBram Moolenaar call assert_equal('abcd', g:Xpath) 4697*efb64829SBram Moolenaarendfunc 4698*efb64829SBram Moolenaar 4699*efb64829SBram Moolenaarfunc Test_exception_after_error_5() 4700*efb64829SBram Moolenaar XpathINIT 4701*efb64829SBram Moolenaar while 1 4702*efb64829SBram Moolenaar try 4703*efb64829SBram Moolenaar try 4704*efb64829SBram Moolenaar let caught = 0 4705*efb64829SBram Moolenaar Xpath 'a' 4706*efb64829SBram Moolenaar endif " :endif without :if; throw error exception 4707*efb64829SBram Moolenaar if 1 4708*efb64829SBram Moolenaar " Missing :endif 4709*efb64829SBram Moolenaar catch /do_not_catch/ " ignore new error 4710*efb64829SBram Moolenaar call assert_report('should not get here') 4711*efb64829SBram Moolenaar catch /^Vim(endif):/ 4712*efb64829SBram Moolenaar Xpath 'b' 4713*efb64829SBram Moolenaar let caught = 1 4714*efb64829SBram Moolenaar catch /^Vim(/ 4715*efb64829SBram Moolenaar call assert_report('should not get here') 4716*efb64829SBram Moolenaar finally 4717*efb64829SBram Moolenaar Xpath 'c' 4718*efb64829SBram Moolenaar call assert_equal(1, caught) 4719*efb64829SBram Moolenaar endtry 4720*efb64829SBram Moolenaar catch /.*/ 4721*efb64829SBram Moolenaar call assert_report('should not get here') 4722*efb64829SBram Moolenaar finally 4723*efb64829SBram Moolenaar Xpath 'd' 4724*efb64829SBram Moolenaar break 4725*efb64829SBram Moolenaar endtry 4726*efb64829SBram Moolenaar call assert_report('should not get here') 4727*efb64829SBram Moolenaar endwhile 4728*efb64829SBram Moolenaar call assert_equal('abcd', g:Xpath) 4729*efb64829SBram Moolenaarendfunc 4730*efb64829SBram Moolenaar 4731*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 47329470a4d8SBram Moolenaar" Test 65: Errors in the /pattern/ argument of a :catch {{{1 47339470a4d8SBram Moolenaar" 47349470a4d8SBram Moolenaar" On an error in the /pattern/ argument of a :catch, the :catch does 47359470a4d8SBram Moolenaar" not match. Any following :catches of the same :try/:endtry don't 47369470a4d8SBram Moolenaar" match either. Finally clauses are executed. 47379470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 47389470a4d8SBram Moolenaar 47399470a4d8SBram Moolenaarfunc Test_catch_pattern_error() 47409470a4d8SBram Moolenaar CheckEnglish 47419470a4d8SBram Moolenaar XpathINIT 47429470a4d8SBram Moolenaar 47439470a4d8SBram Moolenaar try 47449470a4d8SBram Moolenaar try 47459470a4d8SBram Moolenaar Xpath 'a' 47469470a4d8SBram Moolenaar throw "oops" 47479470a4d8SBram Moolenaar catch /^oops$/ 47489470a4d8SBram Moolenaar Xpath 'b' 47499470a4d8SBram Moolenaar catch /\)/ " not checked; exception has already been caught 47509470a4d8SBram Moolenaar call assert_report('should not get here') 47519470a4d8SBram Moolenaar endtry 47529470a4d8SBram Moolenaar Xpath 'c' 47539470a4d8SBram Moolenaar catch /.*/ 47549470a4d8SBram Moolenaar call assert_report('should not get here') 47559470a4d8SBram Moolenaar endtry 47569470a4d8SBram Moolenaar call assert_equal('abc', g:Xpath) 47579470a4d8SBram Moolenaar 47589470a4d8SBram Moolenaar XpathINIT 47599470a4d8SBram Moolenaar func F() 47609470a4d8SBram Moolenaar try 47619470a4d8SBram Moolenaar try 47629470a4d8SBram Moolenaar try 47639470a4d8SBram Moolenaar Xpath 'a' 47649470a4d8SBram Moolenaar throw "ab" 47659470a4d8SBram Moolenaar catch /abc/ " does not catch 47669470a4d8SBram Moolenaar call assert_report('should not get here') 47679470a4d8SBram Moolenaar catch /\)/ " error; discards exception 47689470a4d8SBram Moolenaar call assert_report('should not get here') 47699470a4d8SBram Moolenaar catch /.*/ " not checked 47709470a4d8SBram Moolenaar call assert_report('should not get here') 47719470a4d8SBram Moolenaar finally 47729470a4d8SBram Moolenaar Xpath 'b' 47739470a4d8SBram Moolenaar endtry 47749470a4d8SBram Moolenaar call assert_report('should not get here') 47759470a4d8SBram Moolenaar catch /^ab$/ " checked, but original exception is discarded 47769470a4d8SBram Moolenaar call assert_report('should not get here') 47779470a4d8SBram Moolenaar catch /^Vim(catch):/ 47789470a4d8SBram Moolenaar Xpath 'c' 47799470a4d8SBram Moolenaar call assert_match('Vim(catch):E475: Invalid argument:', v:exception) 47809470a4d8SBram Moolenaar finally 47819470a4d8SBram Moolenaar Xpath 'd' 47829470a4d8SBram Moolenaar endtry 47839470a4d8SBram Moolenaar Xpath 'e' 47849470a4d8SBram Moolenaar catch /.*/ 47859470a4d8SBram Moolenaar call assert_report('should not get here') 47869470a4d8SBram Moolenaar endtry 47879470a4d8SBram Moolenaar Xpath 'f' 47889470a4d8SBram Moolenaar endfunc 47899470a4d8SBram Moolenaar 47909470a4d8SBram Moolenaar call F() 47919470a4d8SBram Moolenaar call assert_equal('abcdef', g:Xpath) 47929470a4d8SBram Moolenaar 47939470a4d8SBram Moolenaar delfunc F 47949470a4d8SBram Moolenaarendfunc 47959470a4d8SBram Moolenaar 47969470a4d8SBram Moolenaar"------------------------------------------------------------------------------- 4797*efb64829SBram Moolenaar" Test 66: Stop range :call on error, interrupt, or :throw {{{1 4798*efb64829SBram Moolenaar" 4799*efb64829SBram Moolenaar" When a function which is multiply called for a range since it 4800*efb64829SBram Moolenaar" doesn't handle the range itself has an error in a command 4801*efb64829SBram Moolenaar" dynamically enclosed by :try/:endtry or gets an interrupt or 4802*efb64829SBram Moolenaar" executes a :throw, no more calls for the remaining lines in the 4803*efb64829SBram Moolenaar" range are made. On an error in a command not dynamically enclosed 4804*efb64829SBram Moolenaar" by :try/:endtry, the function is executed again for the remaining 4805*efb64829SBram Moolenaar" lines in the range. 4806*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4807*efb64829SBram Moolenaar 4808*efb64829SBram Moolenaarfunc Test_stop_range_on_error() 4809*efb64829SBram Moolenaar let test =<< trim [CODE] 4810*efb64829SBram Moolenaar let file = tempname() 4811*efb64829SBram Moolenaar exec "edit" file 4812*efb64829SBram Moolenaar call setline(1, ['line 1', 'line 2', 'line 3']) 4813*efb64829SBram Moolenaar let taken = "" 4814*efb64829SBram Moolenaar let expected = "G1EF1E(1)F1E(2)F1E(3)G2EF2E(1)G3IF3I(1)G4TF4T(1)G5AF5A(1)" 4815*efb64829SBram Moolenaar 4816*efb64829SBram Moolenaar func F(reason, n) abort 4817*efb64829SBram Moolenaar let g:taken = g:taken .. "F" .. a:n .. 4818*efb64829SBram Moolenaar \ substitute(a:reason, '\(\l\).*', '\u\1', "") .. 4819*efb64829SBram Moolenaar \ "(" .. line(".") .. ")" 4820*efb64829SBram Moolenaar 4821*efb64829SBram Moolenaar if a:reason == "error" 4822*efb64829SBram Moolenaar asdf 4823*efb64829SBram Moolenaar elseif a:reason == "interrupt" 4824*efb64829SBram Moolenaar call interrupt() 4825*efb64829SBram Moolenaar elseif a:reason == "throw" 4826*efb64829SBram Moolenaar throw "xyz" 4827*efb64829SBram Moolenaar elseif a:reason == "aborting error" 4828*efb64829SBram Moolenaar XloopNEXT 4829*efb64829SBram Moolenaar call assert_equal(g:taken, g:expected) 4830*efb64829SBram Moolenaar try 4831*efb64829SBram Moolenaar bwipeout! 4832*efb64829SBram Moolenaar call delete(g:file) 4833*efb64829SBram Moolenaar asdf 4834*efb64829SBram Moolenaar endtry 4835*efb64829SBram Moolenaar endif 4836*efb64829SBram Moolenaar endfunc 4837*efb64829SBram Moolenaar 4838*efb64829SBram Moolenaar func G(reason, n) 4839*efb64829SBram Moolenaar let g:taken = g:taken .. "G" .. a:n .. 4840*efb64829SBram Moolenaar \ substitute(a:reason, '\(\l\).*', '\u\1', "") 4841*efb64829SBram Moolenaar 1,3call F(a:reason, a:n) 4842*efb64829SBram Moolenaar endfunc 4843*efb64829SBram Moolenaar 4844*efb64829SBram Moolenaar Xpath 'a' 4845*efb64829SBram Moolenaar call G("error", 1) 4846*efb64829SBram Moolenaar try 4847*efb64829SBram Moolenaar Xpath 'b' 4848*efb64829SBram Moolenaar try 4849*efb64829SBram Moolenaar call G("error", 2) 4850*efb64829SBram Moolenaar call assert_report('should not get here') 4851*efb64829SBram Moolenaar finally 4852*efb64829SBram Moolenaar Xpath 'c' 4853*efb64829SBram Moolenaar try 4854*efb64829SBram Moolenaar call G("interrupt", 3) 4855*efb64829SBram Moolenaar call assert_report('should not get here') 4856*efb64829SBram Moolenaar finally 4857*efb64829SBram Moolenaar Xpath 'd' 4858*efb64829SBram Moolenaar try 4859*efb64829SBram Moolenaar call G("throw", 4) 4860*efb64829SBram Moolenaar call assert_report('should not get here') 4861*efb64829SBram Moolenaar endtry 4862*efb64829SBram Moolenaar endtry 4863*efb64829SBram Moolenaar endtry 4864*efb64829SBram Moolenaar catch /xyz/ 4865*efb64829SBram Moolenaar Xpath 'e' 4866*efb64829SBram Moolenaar catch /.*/ 4867*efb64829SBram Moolenaar call assert_report('should not get here') 4868*efb64829SBram Moolenaar endtry 4869*efb64829SBram Moolenaar Xpath 'f' 4870*efb64829SBram Moolenaar call G("aborting error", 5) 4871*efb64829SBram Moolenaar call assert_report('should not get here') 4872*efb64829SBram Moolenaar [CODE] 4873*efb64829SBram Moolenaar let verify =<< trim [CODE] 4874*efb64829SBram Moolenaar call assert_equal('abcdef', g:Xpath) 4875*efb64829SBram Moolenaar [CODE] 4876*efb64829SBram Moolenaar call RunInNewVim(test, verify) 4877*efb64829SBram Moolenaarendfunc 4878*efb64829SBram Moolenaar 4879*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4880*efb64829SBram Moolenaar" Test 67: :throw across :call command {{{1 4881*efb64829SBram Moolenaar" 4882*efb64829SBram Moolenaar" On a call command, an exception might be thrown when evaluating the 4883*efb64829SBram Moolenaar" function name, during evaluation of the arguments, or when the 4884*efb64829SBram Moolenaar" function is being executed. The exception can be caught by the 4885*efb64829SBram Moolenaar" caller. 4886*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 4887*efb64829SBram Moolenaar 4888*efb64829SBram Moolenaarfunc THROW(x, n) 4889*efb64829SBram Moolenaar if a:n == 1 4890*efb64829SBram Moolenaar Xpath 'A' 4891*efb64829SBram Moolenaar elseif a:n == 2 4892*efb64829SBram Moolenaar Xpath 'B' 4893*efb64829SBram Moolenaar elseif a:n == 3 4894*efb64829SBram Moolenaar Xpath 'C' 4895*efb64829SBram Moolenaar endif 4896*efb64829SBram Moolenaar throw a:x 4897*efb64829SBram Moolenaarendfunc 4898*efb64829SBram Moolenaar 4899*efb64829SBram Moolenaarfunc NAME(x, n) 4900*efb64829SBram Moolenaar if a:n == 1 4901*efb64829SBram Moolenaar call assert_report('should not get here') 4902*efb64829SBram Moolenaar elseif a:n == 2 4903*efb64829SBram Moolenaar Xpath 'D' 4904*efb64829SBram Moolenaar elseif a:n == 3 4905*efb64829SBram Moolenaar Xpath 'E' 4906*efb64829SBram Moolenaar elseif a:n == 4 4907*efb64829SBram Moolenaar Xpath 'F' 4908*efb64829SBram Moolenaar endif 4909*efb64829SBram Moolenaar return a:x 4910*efb64829SBram Moolenaarendfunc 4911*efb64829SBram Moolenaar 4912*efb64829SBram Moolenaarfunc ARG(x, n) 4913*efb64829SBram Moolenaar if a:n == 1 4914*efb64829SBram Moolenaar call assert_report('should not get here') 4915*efb64829SBram Moolenaar elseif a:n == 2 4916*efb64829SBram Moolenaar call assert_report('should not get here') 4917*efb64829SBram Moolenaar elseif a:n == 3 4918*efb64829SBram Moolenaar Xpath 'G' 4919*efb64829SBram Moolenaar elseif a:n == 4 4920*efb64829SBram Moolenaar Xpath 'I' 4921*efb64829SBram Moolenaar endif 4922*efb64829SBram Moolenaar return a:x 4923*efb64829SBram Moolenaarendfunc 4924*efb64829SBram Moolenaar 4925*efb64829SBram Moolenaarfunc Test_throw_across_call_cmd() 4926*efb64829SBram Moolenaar XpathINIT 4927*efb64829SBram Moolenaar 4928*efb64829SBram Moolenaar func F(x, n) 4929*efb64829SBram Moolenaar if a:n == 2 4930*efb64829SBram Moolenaar call assert_report('should not get here') 4931*efb64829SBram Moolenaar elseif a:n == 4 4932*efb64829SBram Moolenaar Xpath 'a' 4933*efb64829SBram Moolenaar endif 4934*efb64829SBram Moolenaar endfunc 4935*efb64829SBram Moolenaar 4936*efb64829SBram Moolenaar while 1 4937*efb64829SBram Moolenaar try 4938*efb64829SBram Moolenaar let v:errmsg = "" 4939*efb64829SBram Moolenaar 4940*efb64829SBram Moolenaar while 1 4941*efb64829SBram Moolenaar try 4942*efb64829SBram Moolenaar Xpath 'b' 4943*efb64829SBram Moolenaar call {NAME(THROW("name", 1), 1)}(ARG(4711, 1), 1) 4944*efb64829SBram Moolenaar call assert_report('should not get here') 4945*efb64829SBram Moolenaar catch /^name$/ 4946*efb64829SBram Moolenaar Xpath 'c' 4947*efb64829SBram Moolenaar catch /.*/ 4948*efb64829SBram Moolenaar call assert_report('should not get here') 4949*efb64829SBram Moolenaar finally 4950*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 4951*efb64829SBram Moolenaar let v:errmsg = "" 4952*efb64829SBram Moolenaar break 4953*efb64829SBram Moolenaar endtry 4954*efb64829SBram Moolenaar endwhile 4955*efb64829SBram Moolenaar 4956*efb64829SBram Moolenaar while 1 4957*efb64829SBram Moolenaar try 4958*efb64829SBram Moolenaar Xpath 'd' 4959*efb64829SBram Moolenaar call {NAME("F", 2)}(ARG(THROW("arg", 2), 2), 2) 4960*efb64829SBram Moolenaar call assert_report('should not get here') 4961*efb64829SBram Moolenaar catch /^arg$/ 4962*efb64829SBram Moolenaar Xpath 'e' 4963*efb64829SBram Moolenaar catch /.*/ 4964*efb64829SBram Moolenaar call assert_report('should not get here') 4965*efb64829SBram Moolenaar finally 4966*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 4967*efb64829SBram Moolenaar let v:errmsg = "" 4968*efb64829SBram Moolenaar break 4969*efb64829SBram Moolenaar endtry 4970*efb64829SBram Moolenaar endwhile 4971*efb64829SBram Moolenaar 4972*efb64829SBram Moolenaar while 1 4973*efb64829SBram Moolenaar try 4974*efb64829SBram Moolenaar Xpath 'f' 4975*efb64829SBram Moolenaar call {NAME("THROW", 3)}(ARG("call", 3), 3) 4976*efb64829SBram Moolenaar call assert_report('should not get here') 4977*efb64829SBram Moolenaar catch /^call$/ 4978*efb64829SBram Moolenaar Xpath 'g' 4979*efb64829SBram Moolenaar catch /^0$/ " default return value 4980*efb64829SBram Moolenaar call assert_report('should not get here') 4981*efb64829SBram Moolenaar catch /.*/ 4982*efb64829SBram Moolenaar call assert_report('should not get here') 4983*efb64829SBram Moolenaar finally 4984*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 4985*efb64829SBram Moolenaar let v:errmsg = "" 4986*efb64829SBram Moolenaar break 4987*efb64829SBram Moolenaar endtry 4988*efb64829SBram Moolenaar endwhile 4989*efb64829SBram Moolenaar 4990*efb64829SBram Moolenaar while 1 4991*efb64829SBram Moolenaar try 4992*efb64829SBram Moolenaar Xpath 'h' 4993*efb64829SBram Moolenaar call {NAME("F", 4)}(ARG(4711, 4), 4) 4994*efb64829SBram Moolenaar Xpath 'i' 4995*efb64829SBram Moolenaar catch /.*/ 4996*efb64829SBram Moolenaar call assert_report('should not get here') 4997*efb64829SBram Moolenaar finally 4998*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 4999*efb64829SBram Moolenaar let v:errmsg = "" 5000*efb64829SBram Moolenaar break 5001*efb64829SBram Moolenaar endtry 5002*efb64829SBram Moolenaar endwhile 5003*efb64829SBram Moolenaar 5004*efb64829SBram Moolenaar catch /^0$/ " default return value 5005*efb64829SBram Moolenaar call assert_report('should not get here') 5006*efb64829SBram Moolenaar catch /.*/ 5007*efb64829SBram Moolenaar call assert_report('should not get here') 5008*efb64829SBram Moolenaar finally 5009*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5010*efb64829SBram Moolenaar let v:errmsg = "" 5011*efb64829SBram Moolenaar break 5012*efb64829SBram Moolenaar endtry 5013*efb64829SBram Moolenaar endwhile 5014*efb64829SBram Moolenaar 5015*efb64829SBram Moolenaar call assert_equal('bAcdDBefEGCghFIai', g:Xpath) 5016*efb64829SBram Moolenaar delfunction F 5017*efb64829SBram Moolenaarendfunc 5018*efb64829SBram Moolenaar 5019*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5020*efb64829SBram Moolenaar" Test 68: :throw across function calls in expressions {{{1 5021*efb64829SBram Moolenaar" 5022*efb64829SBram Moolenaar" On a function call within an expression, an exception might be 5023*efb64829SBram Moolenaar" thrown when evaluating the function name, during evaluation of the 5024*efb64829SBram Moolenaar" arguments, or when the function is being executed. The exception 5025*efb64829SBram Moolenaar" can be caught by the caller. 5026*efb64829SBram Moolenaar" 5027*efb64829SBram Moolenaar" This test reuses the functions THROW(), NAME(), and ARG() from the 5028*efb64829SBram Moolenaar" previous test. 5029*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5030*efb64829SBram Moolenaar 5031*efb64829SBram Moolenaarfunc Test_throw_across_call_expr() 5032*efb64829SBram Moolenaar XpathINIT 5033*efb64829SBram Moolenaar 5034*efb64829SBram Moolenaar func F(x, n) 5035*efb64829SBram Moolenaar if a:n == 2 5036*efb64829SBram Moolenaar call assert_report('should not get here') 5037*efb64829SBram Moolenaar elseif a:n == 4 5038*efb64829SBram Moolenaar Xpath 'a' 5039*efb64829SBram Moolenaar endif 5040*efb64829SBram Moolenaar return a:x 5041*efb64829SBram Moolenaar endfunction 5042*efb64829SBram Moolenaar 5043*efb64829SBram Moolenaar while 1 5044*efb64829SBram Moolenaar try 5045*efb64829SBram Moolenaar let error = 0 5046*efb64829SBram Moolenaar let v:errmsg = "" 5047*efb64829SBram Moolenaar 5048*efb64829SBram Moolenaar while 1 5049*efb64829SBram Moolenaar try 5050*efb64829SBram Moolenaar Xpath 'b' 5051*efb64829SBram Moolenaar let var1 = {NAME(THROW("name", 1), 1)}(ARG(4711, 1), 1) 5052*efb64829SBram Moolenaar call assert_report('should not get here') 5053*efb64829SBram Moolenaar catch /^name$/ 5054*efb64829SBram Moolenaar Xpath 'c' 5055*efb64829SBram Moolenaar catch /.*/ 5056*efb64829SBram Moolenaar call assert_report('should not get here') 5057*efb64829SBram Moolenaar finally 5058*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5059*efb64829SBram Moolenaar let v:errmsg = "" 5060*efb64829SBram Moolenaar break 5061*efb64829SBram Moolenaar endtry 5062*efb64829SBram Moolenaar endwhile 5063*efb64829SBram Moolenaar call assert_true(!exists('var1')) 5064*efb64829SBram Moolenaar 5065*efb64829SBram Moolenaar while 1 5066*efb64829SBram Moolenaar try 5067*efb64829SBram Moolenaar Xpath 'd' 5068*efb64829SBram Moolenaar let var2 = {NAME("F", 2)}(ARG(THROW("arg", 2), 2), 2) 5069*efb64829SBram Moolenaar call assert_report('should not get here') 5070*efb64829SBram Moolenaar catch /^arg$/ 5071*efb64829SBram Moolenaar Xpath 'e' 5072*efb64829SBram Moolenaar catch /.*/ 5073*efb64829SBram Moolenaar call assert_report('should not get here') 5074*efb64829SBram Moolenaar finally 5075*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5076*efb64829SBram Moolenaar let v:errmsg = "" 5077*efb64829SBram Moolenaar break 5078*efb64829SBram Moolenaar endtry 5079*efb64829SBram Moolenaar endwhile 5080*efb64829SBram Moolenaar call assert_true(!exists('var2')) 5081*efb64829SBram Moolenaar 5082*efb64829SBram Moolenaar while 1 5083*efb64829SBram Moolenaar try 5084*efb64829SBram Moolenaar Xpath 'f' 5085*efb64829SBram Moolenaar let var3 = {NAME("THROW", 3)}(ARG("call", 3), 3) 5086*efb64829SBram Moolenaar call assert_report('should not get here') 5087*efb64829SBram Moolenaar catch /^call$/ 5088*efb64829SBram Moolenaar Xpath 'g' 5089*efb64829SBram Moolenaar catch /^0$/ " default return value 5090*efb64829SBram Moolenaar call assert_report('should not get here') 5091*efb64829SBram Moolenaar catch /.*/ 5092*efb64829SBram Moolenaar call assert_report('should not get here') 5093*efb64829SBram Moolenaar finally 5094*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5095*efb64829SBram Moolenaar let v:errmsg = "" 5096*efb64829SBram Moolenaar break 5097*efb64829SBram Moolenaar endtry 5098*efb64829SBram Moolenaar endwhile 5099*efb64829SBram Moolenaar call assert_true(!exists('var3')) 5100*efb64829SBram Moolenaar 5101*efb64829SBram Moolenaar while 1 5102*efb64829SBram Moolenaar try 5103*efb64829SBram Moolenaar Xpath 'h' 5104*efb64829SBram Moolenaar let var4 = {NAME("F", 4)}(ARG(4711, 4), 4) 5105*efb64829SBram Moolenaar Xpath 'i' 5106*efb64829SBram Moolenaar catch /.*/ 5107*efb64829SBram Moolenaar call assert_report('should not get here') 5108*efb64829SBram Moolenaar finally 5109*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5110*efb64829SBram Moolenaar let v:errmsg = "" 5111*efb64829SBram Moolenaar break 5112*efb64829SBram Moolenaar endtry 5113*efb64829SBram Moolenaar endwhile 5114*efb64829SBram Moolenaar call assert_true(exists('var4') && var4 == 4711) 5115*efb64829SBram Moolenaar 5116*efb64829SBram Moolenaar catch /^0$/ " default return value 5117*efb64829SBram Moolenaar call assert_report('should not get here') 5118*efb64829SBram Moolenaar catch /.*/ 5119*efb64829SBram Moolenaar call assert_report('should not get here') 5120*efb64829SBram Moolenaar finally 5121*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5122*efb64829SBram Moolenaar break 5123*efb64829SBram Moolenaar endtry 5124*efb64829SBram Moolenaar endwhile 5125*efb64829SBram Moolenaar 5126*efb64829SBram Moolenaar call assert_equal('bAcdDBefEGCghFIai', g:Xpath) 5127*efb64829SBram Moolenaar delfunc F 5128*efb64829SBram Moolenaarendfunc 5129*efb64829SBram Moolenaar 5130*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5131*efb64829SBram Moolenaar" Test 76: Errors, interrupts, :throw during expression evaluation {{{1 5132*efb64829SBram Moolenaar" 5133*efb64829SBram Moolenaar" When a function call made during expression evaluation is aborted 5134*efb64829SBram Moolenaar" due to an error inside a :try/:endtry region or due to an interrupt 5135*efb64829SBram Moolenaar" or a :throw, the expression evaluation is aborted as well. No 5136*efb64829SBram Moolenaar" message is displayed for the cancelled expression evaluation. On an 5137*efb64829SBram Moolenaar" error not inside :try/:endtry, the expression evaluation continues. 5138*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5139*efb64829SBram Moolenaar 5140*efb64829SBram Moolenaarfunc Test_expr_eval_error() 5141*efb64829SBram Moolenaar let test =<< trim [CODE] 5142*efb64829SBram Moolenaar let taken = "" 5143*efb64829SBram Moolenaar 5144*efb64829SBram Moolenaar func ERR(n) 5145*efb64829SBram Moolenaar let g:taken = g:taken .. "E" .. a:n 5146*efb64829SBram Moolenaar asdf 5147*efb64829SBram Moolenaar endfunc 5148*efb64829SBram Moolenaar 5149*efb64829SBram Moolenaar func ERRabort(n) abort 5150*efb64829SBram Moolenaar let g:taken = g:taken .. "A" .. a:n 5151*efb64829SBram Moolenaar asdf 5152*efb64829SBram Moolenaar endfunc " returns -1; may cause follow-up msg for illegal var/func name 5153*efb64829SBram Moolenaar 5154*efb64829SBram Moolenaar func WRAP(n, arg) 5155*efb64829SBram Moolenaar let g:taken = g:taken .. "W" .. a:n 5156*efb64829SBram Moolenaar let g:saved_errmsg = v:errmsg 5157*efb64829SBram Moolenaar return arg 5158*efb64829SBram Moolenaar endfunc 5159*efb64829SBram Moolenaar 5160*efb64829SBram Moolenaar func INT(n) 5161*efb64829SBram Moolenaar let g:taken = g:taken .. "I" .. a:n 5162*efb64829SBram Moolenaar call interrupt() 5163*efb64829SBram Moolenaar endfunc 5164*efb64829SBram Moolenaar 5165*efb64829SBram Moolenaar func THR(n) 5166*efb64829SBram Moolenaar let g:taken = g:taken .. "T" .. a:n 5167*efb64829SBram Moolenaar throw "should not be caught" 5168*efb64829SBram Moolenaar endfunc 5169*efb64829SBram Moolenaar 5170*efb64829SBram Moolenaar func CONT(n) 5171*efb64829SBram Moolenaar let g:taken = g:taken .. "C" .. a:n 5172*efb64829SBram Moolenaar endfunc 5173*efb64829SBram Moolenaar 5174*efb64829SBram Moolenaar func MSG(n) 5175*efb64829SBram Moolenaar let g:taken = g:taken .. "M" .. a:n 5176*efb64829SBram Moolenaar let errmsg = (a:n >= 37 && a:n <= 44) ? g:saved_errmsg : v:errmsg 5177*efb64829SBram Moolenaar let msgptn = (a:n >= 10 && a:n <= 27) ? "^$" : "asdf" 5178*efb64829SBram Moolenaar call assert_match(msgptn, errmsg) 5179*efb64829SBram Moolenaar let v:errmsg = "" 5180*efb64829SBram Moolenaar let g:saved_errmsg = "" 5181*efb64829SBram Moolenaar endfunc 5182*efb64829SBram Moolenaar 5183*efb64829SBram Moolenaar let v:errmsg = "" 5184*efb64829SBram Moolenaar 5185*efb64829SBram Moolenaar try 5186*efb64829SBram Moolenaar let t = 1 5187*efb64829SBram Moolenaar while t <= 9 5188*efb64829SBram Moolenaar Xloop 'a' 5189*efb64829SBram Moolenaar try 5190*efb64829SBram Moolenaar if t == 1 5191*efb64829SBram Moolenaar let v{ERR(t) + CONT(t)} = 0 5192*efb64829SBram Moolenaar elseif t == 2 5193*efb64829SBram Moolenaar let v{ERR(t) + CONT(t)} 5194*efb64829SBram Moolenaar elseif t == 3 5195*efb64829SBram Moolenaar let var = exists('v{ERR(t) + CONT(t)}') 5196*efb64829SBram Moolenaar elseif t == 4 5197*efb64829SBram Moolenaar unlet v{ERR(t) + CONT(t)} 5198*efb64829SBram Moolenaar elseif t == 5 5199*efb64829SBram Moolenaar function F{ERR(t) + CONT(t)}() 5200*efb64829SBram Moolenaar endfunction 5201*efb64829SBram Moolenaar elseif t == 6 5202*efb64829SBram Moolenaar function F{ERR(t) + CONT(t)} 5203*efb64829SBram Moolenaar elseif t == 7 5204*efb64829SBram Moolenaar let var = exists('*F{ERR(t) + CONT(t)}') 5205*efb64829SBram Moolenaar elseif t == 8 5206*efb64829SBram Moolenaar delfunction F{ERR(t) + CONT(t)} 5207*efb64829SBram Moolenaar elseif t == 9 5208*efb64829SBram Moolenaar let var = ERR(t) + CONT(t) 5209*efb64829SBram Moolenaar endif 5210*efb64829SBram Moolenaar catch /asdf/ 5211*efb64829SBram Moolenaar " v:errmsg is not set when the error message is converted to an 5212*efb64829SBram Moolenaar " exception. Set it to the original error message. 5213*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim:', '', "") 5214*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5215*efb64829SBram Moolenaar " An error exception has been thrown after the original error. 5216*efb64829SBram Moolenaar let v:errmsg = "" 5217*efb64829SBram Moolenaar finally 5218*efb64829SBram Moolenaar call MSG(t) 5219*efb64829SBram Moolenaar let t = t + 1 5220*efb64829SBram Moolenaar XloopNEXT 5221*efb64829SBram Moolenaar continue " discard an aborting error 5222*efb64829SBram Moolenaar endtry 5223*efb64829SBram Moolenaar endwhile 5224*efb64829SBram Moolenaar catch /.*/ 5225*efb64829SBram Moolenaar call assert_report('should not get here') 5226*efb64829SBram Moolenaar endtry 5227*efb64829SBram Moolenaar 5228*efb64829SBram Moolenaar try 5229*efb64829SBram Moolenaar let t = 10 5230*efb64829SBram Moolenaar while t <= 18 5231*efb64829SBram Moolenaar Xloop 'b' 5232*efb64829SBram Moolenaar try 5233*efb64829SBram Moolenaar if t == 10 5234*efb64829SBram Moolenaar let v{INT(t) + CONT(t)} = 0 5235*efb64829SBram Moolenaar elseif t == 11 5236*efb64829SBram Moolenaar let v{INT(t) + CONT(t)} 5237*efb64829SBram Moolenaar elseif t == 12 5238*efb64829SBram Moolenaar let var = exists('v{INT(t) + CONT(t)}') 5239*efb64829SBram Moolenaar elseif t == 13 5240*efb64829SBram Moolenaar unlet v{INT(t) + CONT(t)} 5241*efb64829SBram Moolenaar elseif t == 14 5242*efb64829SBram Moolenaar function F{INT(t) + CONT(t)}() 5243*efb64829SBram Moolenaar endfunction 5244*efb64829SBram Moolenaar elseif t == 15 5245*efb64829SBram Moolenaar function F{INT(t) + CONT(t)} 5246*efb64829SBram Moolenaar elseif t == 16 5247*efb64829SBram Moolenaar let var = exists('*F{INT(t) + CONT(t)}') 5248*efb64829SBram Moolenaar elseif t == 17 5249*efb64829SBram Moolenaar delfunction F{INT(t) + CONT(t)} 5250*efb64829SBram Moolenaar elseif t == 18 5251*efb64829SBram Moolenaar let var = INT(t) + CONT(t) 5252*efb64829SBram Moolenaar endif 5253*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:\(Interrupt\)\@!/ 5254*efb64829SBram Moolenaar " An error exception has been triggered after the interrupt. 5255*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "") 5256*efb64829SBram Moolenaar finally 5257*efb64829SBram Moolenaar call MSG(t) 5258*efb64829SBram Moolenaar let t = t + 1 5259*efb64829SBram Moolenaar XloopNEXT 5260*efb64829SBram Moolenaar continue " discard interrupt 5261*efb64829SBram Moolenaar endtry 5262*efb64829SBram Moolenaar endwhile 5263*efb64829SBram Moolenaar catch /.*/ 5264*efb64829SBram Moolenaar call assert_report('should not get here') 5265*efb64829SBram Moolenaar endtry 5266*efb64829SBram Moolenaar 5267*efb64829SBram Moolenaar try 5268*efb64829SBram Moolenaar let t = 19 5269*efb64829SBram Moolenaar while t <= 27 5270*efb64829SBram Moolenaar Xloop 'c' 5271*efb64829SBram Moolenaar try 5272*efb64829SBram Moolenaar if t == 19 5273*efb64829SBram Moolenaar let v{THR(t) + CONT(t)} = 0 5274*efb64829SBram Moolenaar elseif t == 20 5275*efb64829SBram Moolenaar let v{THR(t) + CONT(t)} 5276*efb64829SBram Moolenaar elseif t == 21 5277*efb64829SBram Moolenaar let var = exists('v{THR(t) + CONT(t)}') 5278*efb64829SBram Moolenaar elseif t == 22 5279*efb64829SBram Moolenaar unlet v{THR(t) + CONT(t)} 5280*efb64829SBram Moolenaar elseif t == 23 5281*efb64829SBram Moolenaar function F{THR(t) + CONT(t)}() 5282*efb64829SBram Moolenaar endfunction 5283*efb64829SBram Moolenaar elseif t == 24 5284*efb64829SBram Moolenaar function F{THR(t) + CONT(t)} 5285*efb64829SBram Moolenaar elseif t == 25 5286*efb64829SBram Moolenaar let var = exists('*F{THR(t) + CONT(t)}') 5287*efb64829SBram Moolenaar elseif t == 26 5288*efb64829SBram Moolenaar delfunction F{THR(t) + CONT(t)} 5289*efb64829SBram Moolenaar elseif t == 27 5290*efb64829SBram Moolenaar let var = THR(t) + CONT(t) 5291*efb64829SBram Moolenaar endif 5292*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5293*efb64829SBram Moolenaar " An error exception has been triggered after the :throw. 5294*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "") 5295*efb64829SBram Moolenaar finally 5296*efb64829SBram Moolenaar call MSG(t) 5297*efb64829SBram Moolenaar let t = t + 1 5298*efb64829SBram Moolenaar XloopNEXT 5299*efb64829SBram Moolenaar continue " discard exception 5300*efb64829SBram Moolenaar endtry 5301*efb64829SBram Moolenaar endwhile 5302*efb64829SBram Moolenaar catch /.*/ 5303*efb64829SBram Moolenaar call assert_report('should not get here') 5304*efb64829SBram Moolenaar endtry 5305*efb64829SBram Moolenaar 5306*efb64829SBram Moolenaar let v{ERR(28) + CONT(28)} = 0 5307*efb64829SBram Moolenaar call MSG(28) 5308*efb64829SBram Moolenaar let v{ERR(29) + CONT(29)} 5309*efb64829SBram Moolenaar call MSG(29) 5310*efb64829SBram Moolenaar let var = exists('v{ERR(30) + CONT(30)}') 5311*efb64829SBram Moolenaar call MSG(30) 5312*efb64829SBram Moolenaar unlet v{ERR(31) + CONT(31)} 5313*efb64829SBram Moolenaar call MSG(31) 5314*efb64829SBram Moolenaar function F{ERR(32) + CONT(32)}() 5315*efb64829SBram Moolenaar endfunction 5316*efb64829SBram Moolenaar call MSG(32) 5317*efb64829SBram Moolenaar function F{ERR(33) + CONT(33)} 5318*efb64829SBram Moolenaar call MSG(33) 5319*efb64829SBram Moolenaar let var = exists('*F{ERR(34) + CONT(34)}') 5320*efb64829SBram Moolenaar call MSG(34) 5321*efb64829SBram Moolenaar delfunction F{ERR(35) + CONT(35)} 5322*efb64829SBram Moolenaar call MSG(35) 5323*efb64829SBram Moolenaar let var = ERR(36) + CONT(36) 5324*efb64829SBram Moolenaar call MSG(36) 5325*efb64829SBram Moolenaar 5326*efb64829SBram Moolenaar let saved_errmsg = "" 5327*efb64829SBram Moolenaar 5328*efb64829SBram Moolenaar let v{WRAP(37, ERRabort(37)) + CONT(37)} = 0 5329*efb64829SBram Moolenaar call MSG(37) 5330*efb64829SBram Moolenaar let v{WRAP(38, ERRabort(38)) + CONT(38)} 5331*efb64829SBram Moolenaar call MSG(38) 5332*efb64829SBram Moolenaar let var = exists('v{WRAP(39, ERRabort(39)) + CONT(39)}') 5333*efb64829SBram Moolenaar call MSG(39) 5334*efb64829SBram Moolenaar unlet v{WRAP(40, ERRabort(40)) + CONT(40)} 5335*efb64829SBram Moolenaar call MSG(40) 5336*efb64829SBram Moolenaar function F{WRAP(41, ERRabort(41)) + CONT(41)}() 5337*efb64829SBram Moolenaar endfunction 5338*efb64829SBram Moolenaar call MSG(41) 5339*efb64829SBram Moolenaar function F{WRAP(42, ERRabort(42)) + CONT(42)} 5340*efb64829SBram Moolenaar call MSG(42) 5341*efb64829SBram Moolenaar let var = exists('*F{WRAP(43, ERRabort(43)) + CONT(43)}') 5342*efb64829SBram Moolenaar call MSG(43) 5343*efb64829SBram Moolenaar delfunction F{WRAP(44, ERRabort(44)) + CONT(44)} 5344*efb64829SBram Moolenaar call MSG(44) 5345*efb64829SBram Moolenaar let var = ERRabort(45) + CONT(45) 5346*efb64829SBram Moolenaar call MSG(45) 5347*efb64829SBram Moolenaar Xpath 'd' 5348*efb64829SBram Moolenaar 5349*efb64829SBram Moolenaar let expected = "" 5350*efb64829SBram Moolenaar \ .. "E1M1E2M2E3M3E4M4E5M5E6M6E7M7E8M8E9M9" 5351*efb64829SBram Moolenaar \ .. "I10M10I11M11I12M12I13M13I14M14I15M15I16M16I17M17I18M18" 5352*efb64829SBram Moolenaar \ .. "T19M19T20M20T21M21T22M22T23M23T24M24T25M25T26M26T27M27" 5353*efb64829SBram Moolenaar \ .. "E28C28M28E29C29M29E30C30M30E31C31M31E32C32M32E33C33M33" 5354*efb64829SBram Moolenaar \ .. "E34C34M34E35C35M35E36C36M36" 5355*efb64829SBram Moolenaar \ .. "A37W37C37M37A38W38C38M38A39W39C39M39A40W40C40M40A41W41C41M41" 5356*efb64829SBram Moolenaar \ .. "A42W42C42M42A43W43C43M43A44W44C44M44A45C45M45" 5357*efb64829SBram Moolenaar call assert_equal(expected, taken) 5358*efb64829SBram Moolenaar [CODE] 5359*efb64829SBram Moolenaar let verify =<< trim [CODE] 5360*efb64829SBram Moolenaar let expected = "a1a2a3a4a5a6a7a8a9" 5361*efb64829SBram Moolenaar \ .. "b10b11b12b13b14b15b16b17b18" 5362*efb64829SBram Moolenaar \ .. "c19c20c21c22c23c24c25c26c27d" 5363*efb64829SBram Moolenaar call assert_equal(expected, g:Xpath) 5364*efb64829SBram Moolenaar [CODE] 5365*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5366*efb64829SBram Moolenaarendfunc 5367*efb64829SBram Moolenaar 5368*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5369*efb64829SBram Moolenaar" Test 77: Errors, interrupts, :throw in name{brace-expression} {{{1 5370*efb64829SBram Moolenaar" 5371*efb64829SBram Moolenaar" When a function call made during evaluation of an expression in 5372*efb64829SBram Moolenaar" braces as part of a function name after ":function" is aborted due 5373*efb64829SBram Moolenaar" to an error inside a :try/:endtry region or due to an interrupt or 5374*efb64829SBram Moolenaar" a :throw, the expression evaluation is aborted as well, and the 5375*efb64829SBram Moolenaar" function definition is ignored, skipping all commands to the 5376*efb64829SBram Moolenaar" ":endfunction". On an error not inside :try/:endtry, the expression 5377*efb64829SBram Moolenaar" evaluation continues and the function gets defined, and can be 5378*efb64829SBram Moolenaar" called and deleted. 5379*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5380*efb64829SBram Moolenaarfunc Test_brace_expr_error() 5381*efb64829SBram Moolenaar let test =<< trim [CODE] 5382*efb64829SBram Moolenaar func ERR() abort 5383*efb64829SBram Moolenaar Xloop 'a' 5384*efb64829SBram Moolenaar asdf 5385*efb64829SBram Moolenaar endfunc " returns -1 5386*efb64829SBram Moolenaar 5387*efb64829SBram Moolenaar func OK() 5388*efb64829SBram Moolenaar Xloop 'b' 5389*efb64829SBram Moolenaar let v:errmsg = "" 5390*efb64829SBram Moolenaar return 0 5391*efb64829SBram Moolenaar endfunc 5392*efb64829SBram Moolenaar 5393*efb64829SBram Moolenaar let v:errmsg = "" 5394*efb64829SBram Moolenaar 5395*efb64829SBram Moolenaar Xpath 'c' 5396*efb64829SBram Moolenaar func F{1 + ERR() + OK()}(arg) 5397*efb64829SBram Moolenaar " F0 should be defined. 5398*efb64829SBram Moolenaar if exists("a:arg") && a:arg == "calling" 5399*efb64829SBram Moolenaar Xpath 'd' 5400*efb64829SBram Moolenaar else 5401*efb64829SBram Moolenaar call assert_report('should not get here') 5402*efb64829SBram Moolenaar endif 5403*efb64829SBram Moolenaar endfunction 5404*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5405*efb64829SBram Moolenaar XloopNEXT 5406*efb64829SBram Moolenaar 5407*efb64829SBram Moolenaar Xpath 'e' 5408*efb64829SBram Moolenaar call F{1 + ERR() + OK()}("calling") 5409*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5410*efb64829SBram Moolenaar XloopNEXT 5411*efb64829SBram Moolenaar 5412*efb64829SBram Moolenaar Xpath 'f' 5413*efb64829SBram Moolenaar delfunction F{1 + ERR() + OK()} 5414*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5415*efb64829SBram Moolenaar XloopNEXT 5416*efb64829SBram Moolenaar 5417*efb64829SBram Moolenaar try 5418*efb64829SBram Moolenaar while 1 5419*efb64829SBram Moolenaar try 5420*efb64829SBram Moolenaar Xpath 'g' 5421*efb64829SBram Moolenaar func G{1 + ERR() + OK()}(arg) 5422*efb64829SBram Moolenaar " G0 should not be defined, and the function body should be 5423*efb64829SBram Moolenaar " skipped. 5424*efb64829SBram Moolenaar call assert_report('should not get here') 5425*efb64829SBram Moolenaar " Use an unmatched ":finally" to check whether the body is 5426*efb64829SBram Moolenaar " skipped when an error occurs in ERR(). This works whether or 5427*efb64829SBram Moolenaar " not the exception is converted to an exception. 5428*efb64829SBram Moolenaar finally 5429*efb64829SBram Moolenaar call assert_report('should not get here') 5430*efb64829SBram Moolenaar endtry 5431*efb64829SBram Moolenaar try 5432*efb64829SBram Moolenaar call assert_report('should not get here') 5433*efb64829SBram Moolenaar endfunction 5434*efb64829SBram Moolenaar 5435*efb64829SBram Moolenaar call assert_report('should not get here') 5436*efb64829SBram Moolenaar catch /asdf/ 5437*efb64829SBram Moolenaar " Jumped to when the function is not defined and the body is 5438*efb64829SBram Moolenaar " skipped. 5439*efb64829SBram Moolenaar Xpath 'h' 5440*efb64829SBram Moolenaar catch /.*/ 5441*efb64829SBram Moolenaar call assert_report('should not get here') 5442*efb64829SBram Moolenaar finally 5443*efb64829SBram Moolenaar Xpath 'i' 5444*efb64829SBram Moolenaar break 5445*efb64829SBram Moolenaar endtry " jumped to when the body is not skipped 5446*efb64829SBram Moolenaar endwhile 5447*efb64829SBram Moolenaar catch /.*/ 5448*efb64829SBram Moolenaar call assert_report('should not get here') 5449*efb64829SBram Moolenaar endtry 5450*efb64829SBram Moolenaar [CODE] 5451*efb64829SBram Moolenaar let verify =<< trim [CODE] 5452*efb64829SBram Moolenaar call assert_equal('ca1b1ea2b2dfa3b3ga4hi', g:Xpath) 5453*efb64829SBram Moolenaar [CODE] 5454*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5455*efb64829SBram Moolenaarendfunc 5456*efb64829SBram Moolenaar 5457*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5458*efb64829SBram Moolenaar" Test 78: Messages on parsing errors in expression evaluation {{{1 5459*efb64829SBram Moolenaar" 5460*efb64829SBram Moolenaar" When an expression evaluation detects a parsing error, an error 5461*efb64829SBram Moolenaar" message is given and converted to an exception, and the expression 5462*efb64829SBram Moolenaar" evaluation is aborted. 5463*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5464*efb64829SBram Moolenaarfunc Test_expr_eval_error_msg() 5465*efb64829SBram Moolenaar CheckEnglish 5466*efb64829SBram Moolenaar 5467*efb64829SBram Moolenaar let test =<< trim [CODE] 5468*efb64829SBram Moolenaar let taken = "" 5469*efb64829SBram Moolenaar 5470*efb64829SBram Moolenaar func F(n) 5471*efb64829SBram Moolenaar let g:taken = g:taken . "F" . a:n 5472*efb64829SBram Moolenaar endfunc 5473*efb64829SBram Moolenaar 5474*efb64829SBram Moolenaar func MSG(n, enr, emsg) 5475*efb64829SBram Moolenaar let g:taken = g:taken . "M" . a:n 5476*efb64829SBram Moolenaar call assert_match('^' .. a:enr .. ':', v:errmsg) 5477*efb64829SBram Moolenaar call assert_match(a:emsg, v:errmsg) 5478*efb64829SBram Moolenaar endfunc 5479*efb64829SBram Moolenaar 5480*efb64829SBram Moolenaar func CONT(n) 5481*efb64829SBram Moolenaar let g:taken = g:taken . "C" . a:n 5482*efb64829SBram Moolenaar endfunc 5483*efb64829SBram Moolenaar 5484*efb64829SBram Moolenaar let v:errmsg = "" 5485*efb64829SBram Moolenaar try 5486*efb64829SBram Moolenaar let t = 1 5487*efb64829SBram Moolenaar while t <= 14 5488*efb64829SBram Moolenaar let g:taken = g:taken . "T" . t 5489*efb64829SBram Moolenaar let v:errmsg = "" 5490*efb64829SBram Moolenaar try 5491*efb64829SBram Moolenaar if t == 1 5492*efb64829SBram Moolenaar let v{novar + CONT(t)} = 0 5493*efb64829SBram Moolenaar elseif t == 2 5494*efb64829SBram Moolenaar let v{novar + CONT(t)} 5495*efb64829SBram Moolenaar elseif t == 3 5496*efb64829SBram Moolenaar let var = exists('v{novar + CONT(t)}') 5497*efb64829SBram Moolenaar elseif t == 4 5498*efb64829SBram Moolenaar unlet v{novar + CONT(t)} 5499*efb64829SBram Moolenaar elseif t == 5 5500*efb64829SBram Moolenaar function F{novar + CONT(t)}() 5501*efb64829SBram Moolenaar endfunction 5502*efb64829SBram Moolenaar elseif t == 6 5503*efb64829SBram Moolenaar function F{novar + CONT(t)} 5504*efb64829SBram Moolenaar elseif t == 7 5505*efb64829SBram Moolenaar let var = exists('*F{novar + CONT(t)}') 5506*efb64829SBram Moolenaar elseif t == 8 5507*efb64829SBram Moolenaar delfunction F{novar + CONT(t)} 5508*efb64829SBram Moolenaar elseif t == 9 5509*efb64829SBram Moolenaar echo novar + CONT(t) 5510*efb64829SBram Moolenaar elseif t == 10 5511*efb64829SBram Moolenaar echo v{novar + CONT(t)} 5512*efb64829SBram Moolenaar elseif t == 11 5513*efb64829SBram Moolenaar echo F{novar + CONT(t)} 5514*efb64829SBram Moolenaar elseif t == 12 5515*efb64829SBram Moolenaar let var = novar + CONT(t) 5516*efb64829SBram Moolenaar elseif t == 13 5517*efb64829SBram Moolenaar let var = v{novar + CONT(t)} 5518*efb64829SBram Moolenaar elseif t == 14 5519*efb64829SBram Moolenaar let var = F{novar + CONT(t)}() 5520*efb64829SBram Moolenaar endif 5521*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5522*efb64829SBram Moolenaar Xloop 'a' 5523*efb64829SBram Moolenaar " v:errmsg is not set when the error message is converted to an 5524*efb64829SBram Moolenaar " exception. Set it to the original error message. 5525*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "") 5526*efb64829SBram Moolenaar finally 5527*efb64829SBram Moolenaar Xloop 'b' 5528*efb64829SBram Moolenaar if t <= 8 && t != 3 && t != 7 5529*efb64829SBram Moolenaar call MSG(t, 'E475', 'Invalid argument\>') 5530*efb64829SBram Moolenaar else 5531*efb64829SBram Moolenaar call MSG(t, 'E121', "Undefined variable") 5532*efb64829SBram Moolenaar endif 5533*efb64829SBram Moolenaar let t = t + 1 5534*efb64829SBram Moolenaar XloopNEXT 5535*efb64829SBram Moolenaar continue " discard an aborting error 5536*efb64829SBram Moolenaar endtry 5537*efb64829SBram Moolenaar endwhile 5538*efb64829SBram Moolenaar catch /.*/ 5539*efb64829SBram Moolenaar call assert_report('should not get here') 5540*efb64829SBram Moolenaar endtry 5541*efb64829SBram Moolenaar 5542*efb64829SBram Moolenaar func T(n, expr, enr, emsg) 5543*efb64829SBram Moolenaar try 5544*efb64829SBram Moolenaar let g:taken = g:taken . "T" . a:n 5545*efb64829SBram Moolenaar let v:errmsg = "" 5546*efb64829SBram Moolenaar try 5547*efb64829SBram Moolenaar execute "let var = " . a:expr 5548*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5549*efb64829SBram Moolenaar Xloop 'c' 5550*efb64829SBram Moolenaar " v:errmsg is not set when the error message is converted to an 5551*efb64829SBram Moolenaar " exception. Set it to the original error message. 5552*efb64829SBram Moolenaar let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "") 5553*efb64829SBram Moolenaar finally 5554*efb64829SBram Moolenaar Xloop 'd' 5555*efb64829SBram Moolenaar call MSG(a:n, a:enr, a:emsg) 5556*efb64829SBram Moolenaar XloopNEXT 5557*efb64829SBram Moolenaar " Discard an aborting error: 5558*efb64829SBram Moolenaar return 5559*efb64829SBram Moolenaar endtry 5560*efb64829SBram Moolenaar catch /.*/ 5561*efb64829SBram Moolenaar call assert_report('should not get here') 5562*efb64829SBram Moolenaar endtry 5563*efb64829SBram Moolenaar endfunc 5564*efb64829SBram Moolenaar 5565*efb64829SBram Moolenaar call T(15, 'Nofunc() + CONT(15)', 'E117', "Unknown function") 5566*efb64829SBram Moolenaar call T(16, 'F(1 2 + CONT(16))', 'E116', "Invalid arguments") 5567*efb64829SBram Moolenaar call T(17, 'F(1, 2) + CONT(17)', 'E118', "Too many arguments") 5568*efb64829SBram Moolenaar call T(18, 'F() + CONT(18)', 'E119', "Not enough arguments") 5569*efb64829SBram Moolenaar call T(19, '{(1} + CONT(19)', 'E110', "Missing ')'") 5570*efb64829SBram Moolenaar call T(20, '("abc"[1) + CONT(20)', 'E111', "Missing ']'") 5571*efb64829SBram Moolenaar call T(21, '(1 +) + CONT(21)', 'E15', "Invalid expression") 5572*efb64829SBram Moolenaar call T(22, '1 2 + CONT(22)', 'E15', "Invalid expression") 5573*efb64829SBram Moolenaar call T(23, '(1 ? 2) + CONT(23)', 'E109', "Missing ':' after '?'") 5574*efb64829SBram Moolenaar call T(24, '("abc) + CONT(24)', 'E114', "Missing quote") 5575*efb64829SBram Moolenaar call T(25, "('abc) + CONT(25)", 'E115', "Missing quote") 5576*efb64829SBram Moolenaar call T(26, '& + CONT(26)', 'E112', "Option name missing") 5577*efb64829SBram Moolenaar call T(27, '&asdf + CONT(27)', 'E113', "Unknown option") 5578*efb64829SBram Moolenaar 5579*efb64829SBram Moolenaar let expected = "" 5580*efb64829SBram Moolenaar \ .. "T1M1T2M2T3M3T4M4T5M5T6M6T7M7T8M8T9M9T10M10T11M11T12M12T13M13T14M14" 5581*efb64829SBram Moolenaar \ .. "T15M15T16M16T17M17T18M18T19M19T20M20T21M21T22M22T23M23T24M24T25M25" 5582*efb64829SBram Moolenaar \ .. "T26M26T27M27" 5583*efb64829SBram Moolenaar 5584*efb64829SBram Moolenaar call assert_equal(expected, taken) 5585*efb64829SBram Moolenaar [CODE] 5586*efb64829SBram Moolenaar let verify =<< trim [CODE] 5587*efb64829SBram Moolenaar let expected = "a1b1a2b2a3b3a4b4a5b5a6b6a7b7a8b8a9b9a10b10a11b11a12b12" 5588*efb64829SBram Moolenaar \ .. "a13b13a14b14c15d15c16d16c17d17c18d18c19d19c20d20" 5589*efb64829SBram Moolenaar \ .. "c21d21c22d22c23d23c24d24c25d25c26d26c27d27" 5590*efb64829SBram Moolenaar call assert_equal(expected, g:Xpath) 5591*efb64829SBram Moolenaar [CODE] 5592*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5593*efb64829SBram Moolenaarendfunc 5594*efb64829SBram Moolenaar 5595*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5596*efb64829SBram Moolenaar" Test 79: Throwing one of several errors for the same command {{{1 5597*efb64829SBram Moolenaar" 5598*efb64829SBram Moolenaar" When several errors appear in a row (for instance during expression 5599*efb64829SBram Moolenaar" evaluation), the first as the most specific one is used when 5600*efb64829SBram Moolenaar" throwing an error exception. If, however, a syntax error is 5601*efb64829SBram Moolenaar" detected afterwards, this one is used for the error exception. 5602*efb64829SBram Moolenaar" On a syntax error, the next command is not executed, on a normal 5603*efb64829SBram Moolenaar" error, however, it is (relevant only in a function without the 5604*efb64829SBram Moolenaar" "abort" flag). v:errmsg is not set. 5605*efb64829SBram Moolenaar" 5606*efb64829SBram Moolenaar" If throwing error exceptions is configured off, v:errmsg is always 5607*efb64829SBram Moolenaar" set to the latest error message, that is, to the more general 5608*efb64829SBram Moolenaar" message or the syntax error, respectively. 5609*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5610*efb64829SBram Moolenaarfunc Test_throw_multi_error() 5611*efb64829SBram Moolenaar CheckEnglish 5612*efb64829SBram Moolenaar 5613*efb64829SBram Moolenaar let test =<< trim [CODE] 5614*efb64829SBram Moolenaar func NEXT(cmd) 5615*efb64829SBram Moolenaar exec a:cmd . " | Xloop 'a'" 5616*efb64829SBram Moolenaar endfun 5617*efb64829SBram Moolenaar 5618*efb64829SBram Moolenaar call NEXT('echo novar') " (checks nextcmd) 5619*efb64829SBram Moolenaar XloopNEXT 5620*efb64829SBram Moolenaar call NEXT('let novar #') " (skips nextcmd) 5621*efb64829SBram Moolenaar XloopNEXT 5622*efb64829SBram Moolenaar call NEXT('unlet novar #') " (skips nextcmd) 5623*efb64829SBram Moolenaar XloopNEXT 5624*efb64829SBram Moolenaar call NEXT('let {novar}') " (skips nextcmd) 5625*efb64829SBram Moolenaar XloopNEXT 5626*efb64829SBram Moolenaar call NEXT('unlet{ novar}') " (skips nextcmd) 5627*efb64829SBram Moolenaar 5628*efb64829SBram Moolenaar call assert_equal('a1', g:Xpath) 5629*efb64829SBram Moolenaar XpathINIT 5630*efb64829SBram Moolenaar XloopINIT 5631*efb64829SBram Moolenaar 5632*efb64829SBram Moolenaar func EXEC(cmd) 5633*efb64829SBram Moolenaar exec a:cmd 5634*efb64829SBram Moolenaar endfunc 5635*efb64829SBram Moolenaar 5636*efb64829SBram Moolenaar try 5637*efb64829SBram Moolenaar while 1 " dummy loop 5638*efb64829SBram Moolenaar try 5639*efb64829SBram Moolenaar let v:errmsg = "" 5640*efb64829SBram Moolenaar call EXEC('echo novar') " normal error 5641*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5642*efb64829SBram Moolenaar Xpath 'b' 5643*efb64829SBram Moolenaar call assert_match('E121: Undefined variable: novar', v:exception) 5644*efb64829SBram Moolenaar finally 5645*efb64829SBram Moolenaar Xpath 'c' 5646*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5647*efb64829SBram Moolenaar break 5648*efb64829SBram Moolenaar endtry 5649*efb64829SBram Moolenaar endwhile 5650*efb64829SBram Moolenaar 5651*efb64829SBram Moolenaar Xpath 'd' 5652*efb64829SBram Moolenaar let cmd = "let" 5653*efb64829SBram Moolenaar while cmd != "" 5654*efb64829SBram Moolenaar try 5655*efb64829SBram Moolenaar let v:errmsg = "" 5656*efb64829SBram Moolenaar call EXEC(cmd . ' novar #') " normal plus syntax error 5657*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5658*efb64829SBram Moolenaar Xloop 'e' 5659*efb64829SBram Moolenaar call assert_match('E488: Trailing characters', v:exception) 5660*efb64829SBram Moolenaar finally 5661*efb64829SBram Moolenaar Xloop 'f' 5662*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5663*efb64829SBram Moolenaar if cmd == "let" 5664*efb64829SBram Moolenaar let cmd = "unlet" 5665*efb64829SBram Moolenaar else 5666*efb64829SBram Moolenaar let cmd = "" 5667*efb64829SBram Moolenaar endif 5668*efb64829SBram Moolenaar XloopNEXT 5669*efb64829SBram Moolenaar continue 5670*efb64829SBram Moolenaar endtry 5671*efb64829SBram Moolenaar endwhile 5672*efb64829SBram Moolenaar 5673*efb64829SBram Moolenaar Xpath 'g' 5674*efb64829SBram Moolenaar let cmd = "let" 5675*efb64829SBram Moolenaar while cmd != "" 5676*efb64829SBram Moolenaar try 5677*efb64829SBram Moolenaar let v:errmsg = "" 5678*efb64829SBram Moolenaar call EXEC(cmd . ' {novar}') " normal plus syntax error 5679*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5680*efb64829SBram Moolenaar Xloop 'h' 5681*efb64829SBram Moolenaar call assert_match('E475: Invalid argument: {novar}', v:exception) 5682*efb64829SBram Moolenaar finally 5683*efb64829SBram Moolenaar Xloop 'i' 5684*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5685*efb64829SBram Moolenaar if cmd == "let" 5686*efb64829SBram Moolenaar let cmd = "unlet" 5687*efb64829SBram Moolenaar else 5688*efb64829SBram Moolenaar let cmd = "" 5689*efb64829SBram Moolenaar endif 5690*efb64829SBram Moolenaar XloopNEXT 5691*efb64829SBram Moolenaar continue 5692*efb64829SBram Moolenaar endtry 5693*efb64829SBram Moolenaar endwhile 5694*efb64829SBram Moolenaar catch /.*/ 5695*efb64829SBram Moolenaar call assert_report('should not get here') 5696*efb64829SBram Moolenaar endtry 5697*efb64829SBram Moolenaar Xpath 'j' 5698*efb64829SBram Moolenaar [CODE] 5699*efb64829SBram Moolenaar let verify =<< trim [CODE] 5700*efb64829SBram Moolenaar call assert_equal('bcde1f1e2f2gh3i3h4i4j', g:Xpath) 5701*efb64829SBram Moolenaar [CODE] 5702*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5703*efb64829SBram Moolenaarendfunc 5704*efb64829SBram Moolenaar 5705*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5706*efb64829SBram Moolenaar" Test 80: Syntax error in expression for illegal :elseif {{{1 5707*efb64829SBram Moolenaar" 5708*efb64829SBram Moolenaar" If there is a syntax error in the expression after an illegal 5709*efb64829SBram Moolenaar" :elseif, an error message is given (or an error exception thrown) 5710*efb64829SBram Moolenaar" for the illegal :elseif rather than the expression error. 5711*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5712*efb64829SBram Moolenaarfunc Test_if_syntax_error() 5713*efb64829SBram Moolenaar CheckEnglish 5714*efb64829SBram Moolenaar 5715*efb64829SBram Moolenaar let test =<< trim [CODE] 5716*efb64829SBram Moolenaar let v:errmsg = "" 5717*efb64829SBram Moolenaar if 0 5718*efb64829SBram Moolenaar else 5719*efb64829SBram Moolenaar elseif 1 ||| 2 5720*efb64829SBram Moolenaar endif 5721*efb64829SBram Moolenaar Xpath 'a' 5722*efb64829SBram Moolenaar call assert_match('E584: :elseif after :else', v:errmsg) 5723*efb64829SBram Moolenaar 5724*efb64829SBram Moolenaar let v:errmsg = "" 5725*efb64829SBram Moolenaar if 1 5726*efb64829SBram Moolenaar else 5727*efb64829SBram Moolenaar elseif 1 ||| 2 5728*efb64829SBram Moolenaar endif 5729*efb64829SBram Moolenaar Xpath 'b' 5730*efb64829SBram Moolenaar call assert_match('E584: :elseif after :else', v:errmsg) 5731*efb64829SBram Moolenaar 5732*efb64829SBram Moolenaar let v:errmsg = "" 5733*efb64829SBram Moolenaar elseif 1 ||| 2 5734*efb64829SBram Moolenaar Xpath 'c' 5735*efb64829SBram Moolenaar call assert_match('E582: :elseif without :if', v:errmsg) 5736*efb64829SBram Moolenaar 5737*efb64829SBram Moolenaar let v:errmsg = "" 5738*efb64829SBram Moolenaar while 1 5739*efb64829SBram Moolenaar elseif 1 ||| 2 5740*efb64829SBram Moolenaar endwhile 5741*efb64829SBram Moolenaar Xpath 'd' 5742*efb64829SBram Moolenaar call assert_match('E582: :elseif without :if', v:errmsg) 5743*efb64829SBram Moolenaar 5744*efb64829SBram Moolenaar while 1 5745*efb64829SBram Moolenaar try 5746*efb64829SBram Moolenaar try 5747*efb64829SBram Moolenaar let v:errmsg = "" 5748*efb64829SBram Moolenaar if 0 5749*efb64829SBram Moolenaar else 5750*efb64829SBram Moolenaar elseif 1 ||| 2 5751*efb64829SBram Moolenaar endif 5752*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5753*efb64829SBram Moolenaar Xpath 'e' 5754*efb64829SBram Moolenaar call assert_match('E584: :elseif after :else', v:exception) 5755*efb64829SBram Moolenaar finally 5756*efb64829SBram Moolenaar Xpath 'f' 5757*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5758*efb64829SBram Moolenaar endtry 5759*efb64829SBram Moolenaar catch /.*/ 5760*efb64829SBram Moolenaar call assert_report('should not get here') 5761*efb64829SBram Moolenaar finally 5762*efb64829SBram Moolenaar Xpath 'g' 5763*efb64829SBram Moolenaar break 5764*efb64829SBram Moolenaar endtry 5765*efb64829SBram Moolenaar endwhile 5766*efb64829SBram Moolenaar 5767*efb64829SBram Moolenaar while 1 5768*efb64829SBram Moolenaar try 5769*efb64829SBram Moolenaar try 5770*efb64829SBram Moolenaar let v:errmsg = "" 5771*efb64829SBram Moolenaar if 1 5772*efb64829SBram Moolenaar else 5773*efb64829SBram Moolenaar elseif 1 ||| 2 5774*efb64829SBram Moolenaar endif 5775*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5776*efb64829SBram Moolenaar Xpath 'h' 5777*efb64829SBram Moolenaar call assert_match('E584: :elseif after :else', v:exception) 5778*efb64829SBram Moolenaar finally 5779*efb64829SBram Moolenaar Xpath 'i' 5780*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5781*efb64829SBram Moolenaar endtry 5782*efb64829SBram Moolenaar catch /.*/ 5783*efb64829SBram Moolenaar call assert_report('should not get here') 5784*efb64829SBram Moolenaar finally 5785*efb64829SBram Moolenaar Xpath 'j' 5786*efb64829SBram Moolenaar break 5787*efb64829SBram Moolenaar endtry 5788*efb64829SBram Moolenaar endwhile 5789*efb64829SBram Moolenaar 5790*efb64829SBram Moolenaar while 1 5791*efb64829SBram Moolenaar try 5792*efb64829SBram Moolenaar try 5793*efb64829SBram Moolenaar let v:errmsg = "" 5794*efb64829SBram Moolenaar elseif 1 ||| 2 5795*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5796*efb64829SBram Moolenaar Xpath 'k' 5797*efb64829SBram Moolenaar call assert_match('E582: :elseif without :if', v:exception) 5798*efb64829SBram Moolenaar finally 5799*efb64829SBram Moolenaar Xpath 'l' 5800*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5801*efb64829SBram Moolenaar endtry 5802*efb64829SBram Moolenaar catch /.*/ 5803*efb64829SBram Moolenaar call assert_report('should not get here') 5804*efb64829SBram Moolenaar finally 5805*efb64829SBram Moolenaar Xpath 'm' 5806*efb64829SBram Moolenaar break 5807*efb64829SBram Moolenaar endtry 5808*efb64829SBram Moolenaar endwhile 5809*efb64829SBram Moolenaar 5810*efb64829SBram Moolenaar while 1 5811*efb64829SBram Moolenaar try 5812*efb64829SBram Moolenaar try 5813*efb64829SBram Moolenaar let v:errmsg = "" 5814*efb64829SBram Moolenaar while 1 5815*efb64829SBram Moolenaar elseif 1 ||| 2 5816*efb64829SBram Moolenaar endwhile 5817*efb64829SBram Moolenaar catch /^Vim\((\a\+)\)\=:/ 5818*efb64829SBram Moolenaar Xpath 'n' 5819*efb64829SBram Moolenaar call assert_match('E582: :elseif without :if', v:exception) 5820*efb64829SBram Moolenaar finally 5821*efb64829SBram Moolenaar Xpath 'o' 5822*efb64829SBram Moolenaar call assert_equal("", v:errmsg) 5823*efb64829SBram Moolenaar endtry 5824*efb64829SBram Moolenaar catch /.*/ 5825*efb64829SBram Moolenaar call assert_report('should not get here') 5826*efb64829SBram Moolenaar finally 5827*efb64829SBram Moolenaar Xpath 'p' 5828*efb64829SBram Moolenaar break 5829*efb64829SBram Moolenaar endtry 5830*efb64829SBram Moolenaar endwhile 5831*efb64829SBram Moolenaar Xpath 'q' 5832*efb64829SBram Moolenaar [CODE] 5833*efb64829SBram Moolenaar let verify =<< trim [CODE] 5834*efb64829SBram Moolenaar call assert_equal('abcdefghijklmnopq', g:Xpath) 5835*efb64829SBram Moolenaar [CODE] 5836*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5837*efb64829SBram Moolenaarendfunc 5838*efb64829SBram Moolenaar 5839*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5840*efb64829SBram Moolenaar" Test 81: Discarding exceptions after an error or interrupt {{{1 5841*efb64829SBram Moolenaar" 5842*efb64829SBram Moolenaar" When an exception is thrown from inside a :try conditional without 5843*efb64829SBram Moolenaar" :catch and :finally clauses and an error or interrupt occurs before 5844*efb64829SBram Moolenaar" the :endtry is reached, the exception is discarded. 5845*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 5846*efb64829SBram Moolenaar 5847*efb64829SBram Moolenaarfunc Test_discard_exception_after_error_1() 5848*efb64829SBram Moolenaar let test =<< trim [CODE] 5849*efb64829SBram Moolenaar try 5850*efb64829SBram Moolenaar Xpath 'a' 5851*efb64829SBram Moolenaar try 5852*efb64829SBram Moolenaar Xpath 'b' 5853*efb64829SBram Moolenaar throw "arrgh" 5854*efb64829SBram Moolenaar call assert_report('should not get here') 5855*efb64829SBram Moolenaar if 1 5856*efb64829SBram Moolenaar call assert_report('should not get here') 5857*efb64829SBram Moolenaar " error after :throw: missing :endif 5858*efb64829SBram Moolenaar endtry 5859*efb64829SBram Moolenaar call assert_report('should not get here') 5860*efb64829SBram Moolenaar catch /arrgh/ 5861*efb64829SBram Moolenaar call assert_report('should not get here') 5862*efb64829SBram Moolenaar endtry 5863*efb64829SBram Moolenaar call assert_report('should not get here') 5864*efb64829SBram Moolenaar [CODE] 5865*efb64829SBram Moolenaar let verify =<< trim [CODE] 5866*efb64829SBram Moolenaar call assert_equal('ab', g:Xpath) 5867*efb64829SBram Moolenaar [CODE] 5868*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5869*efb64829SBram Moolenaarendfunc 5870*efb64829SBram Moolenaar 5871*efb64829SBram Moolenaar" TODO: Not able inject an interrupt after throwing an exception 5872*efb64829SBram Moolenaarfunc Disable_Test_discard_exception_after_error_2() 5873*efb64829SBram Moolenaar let test =<< trim [CODE] 5874*efb64829SBram Moolenaar try 5875*efb64829SBram Moolenaar Xpath 'a' 5876*efb64829SBram Moolenaar try 5877*efb64829SBram Moolenaar Xpath 'b' 5878*efb64829SBram Moolenaar throw "arrgh" 5879*efb64829SBram Moolenaar call interrupt() " FIXME: throw is not interrupted here 5880*efb64829SBram Moolenaar call assert_report('should not get here') 5881*efb64829SBram Moolenaar endtry 5882*efb64829SBram Moolenaar call assert_report('should not get here') 5883*efb64829SBram Moolenaar catch /arrgh/ 5884*efb64829SBram Moolenaar call assert_report('should not get here') 5885*efb64829SBram Moolenaar endtry 5886*efb64829SBram Moolenaar call assert_report('should not get here') 5887*efb64829SBram Moolenaar [CODE] 5888*efb64829SBram Moolenaar let verify =<< trim [CODE] 5889*efb64829SBram Moolenaar call assert_equal('ab', g:Xpath) 5890*efb64829SBram Moolenaar [CODE] 5891*efb64829SBram Moolenaar call RunInNewVim(test, verify) 5892*efb64829SBram Moolenaarendfunc 5893*efb64829SBram Moolenaar 5894*efb64829SBram Moolenaar"------------------------------------------------------------------------------- 58951f068233SBram Moolenaar" Test 87 using (expr) ? funcref : funcref {{{1 58961f068233SBram Moolenaar" 58971f068233SBram Moolenaar" Vim needs to correctly parse the funcref and even when it does 58981f068233SBram Moolenaar" not execute the funcref, it needs to consume the trailing () 58991f068233SBram Moolenaar"------------------------------------------------------------------------------- 59001f068233SBram Moolenaar 59011f068233SBram Moolenaarfunc Add2(x1, x2) 59021f068233SBram Moolenaar return a:x1 + a:x2 59031f068233SBram Moolenaarendfu 59041f068233SBram Moolenaar 59051f068233SBram Moolenaarfunc GetStr() 59061f068233SBram Moolenaar return "abcdefghijklmnopqrstuvwxyp" 59071f068233SBram Moolenaarendfu 59081f068233SBram Moolenaar 59091f068233SBram Moolenaarfunc Test_funcref_with_condexpr() 59101f068233SBram Moolenaar call assert_equal(5, function('Add2')(2,3)) 59111f068233SBram Moolenaar 59121f068233SBram Moolenaar call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3)) 59131f068233SBram Moolenaar call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3)) 59141f068233SBram Moolenaar " Make sure, GetStr() still works. 59151f068233SBram Moolenaar call assert_equal('abcdefghijk', GetStr()[0:10]) 59161f068233SBram Moolenaarendfunc 59171f068233SBram Moolenaar 5918b544f3c8SBram Moolenaar" Test 90: Recognizing {} in variable name. {{{1 5919b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 5920b544f3c8SBram Moolenaar 5921b544f3c8SBram Moolenaarfunc Test_curlies() 5922b544f3c8SBram Moolenaar let s:var = 66 5923b544f3c8SBram Moolenaar let ns = 's' 5924b544f3c8SBram Moolenaar call assert_equal(66, {ns}:var) 5925b544f3c8SBram Moolenaar 5926b544f3c8SBram Moolenaar let g:a = {} 5927b544f3c8SBram Moolenaar let g:b = 't' 5928b544f3c8SBram Moolenaar let g:a[g:b] = 77 5929b544f3c8SBram Moolenaar call assert_equal(77, g:a['t']) 5930b544f3c8SBram Moolenaarendfunc 5931b544f3c8SBram Moolenaar 5932b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 5933b544f3c8SBram Moolenaar" Test 91: using type(). {{{1 5934b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 5935b544f3c8SBram Moolenaar 5936b544f3c8SBram Moolenaarfunc Test_type() 5937b544f3c8SBram Moolenaar call assert_equal(0, type(0)) 5938b544f3c8SBram Moolenaar call assert_equal(1, type("")) 5939b544f3c8SBram Moolenaar call assert_equal(2, type(function("tr"))) 5940b544f3c8SBram Moolenaar call assert_equal(2, type(function("tr", [8]))) 5941b544f3c8SBram Moolenaar call assert_equal(3, type([])) 5942b544f3c8SBram Moolenaar call assert_equal(4, type({})) 59435feabe00SBram Moolenaar if has('float') 5944b544f3c8SBram Moolenaar call assert_equal(5, type(0.0)) 59455feabe00SBram Moolenaar endif 5946b544f3c8SBram Moolenaar call assert_equal(6, type(v:false)) 5947b544f3c8SBram Moolenaar call assert_equal(6, type(v:true)) 5948b544f3c8SBram Moolenaar call assert_equal(7, type(v:none)) 5949b544f3c8SBram Moolenaar call assert_equal(7, type(v:null)) 5950b544f3c8SBram Moolenaar call assert_equal(8, v:t_job) 5951b544f3c8SBram Moolenaar call assert_equal(9, v:t_channel) 5952b544f3c8SBram Moolenaar call assert_equal(v:t_number, type(0)) 5953b544f3c8SBram Moolenaar call assert_equal(v:t_string, type("")) 5954b544f3c8SBram Moolenaar call assert_equal(v:t_func, type(function("tr"))) 5955b544f3c8SBram Moolenaar call assert_equal(v:t_func, type(function("tr", [8]))) 5956b544f3c8SBram Moolenaar call assert_equal(v:t_list, type([])) 5957b544f3c8SBram Moolenaar call assert_equal(v:t_dict, type({})) 59585feabe00SBram Moolenaar if has('float') 5959b544f3c8SBram Moolenaar call assert_equal(v:t_float, type(0.0)) 59605feabe00SBram Moolenaar endif 5961b544f3c8SBram Moolenaar call assert_equal(v:t_bool, type(v:false)) 5962b544f3c8SBram Moolenaar call assert_equal(v:t_bool, type(v:true)) 5963b544f3c8SBram Moolenaar call assert_equal(v:t_none, type(v:none)) 5964b544f3c8SBram Moolenaar call assert_equal(v:t_none, type(v:null)) 596592b83ccfSBram Moolenaar call assert_equal(v:t_string, type(test_null_string())) 596692b83ccfSBram Moolenaar call assert_equal(v:t_func, type(test_null_function())) 596792b83ccfSBram Moolenaar call assert_equal(v:t_func, type(test_null_partial())) 596892b83ccfSBram Moolenaar call assert_equal(v:t_list, type(test_null_list())) 596992b83ccfSBram Moolenaar call assert_equal(v:t_dict, type(test_null_dict())) 597092b83ccfSBram Moolenaar if has('job') 597192b83ccfSBram Moolenaar call assert_equal(v:t_job, type(test_null_job())) 597292b83ccfSBram Moolenaar endif 597392b83ccfSBram Moolenaar if has('channel') 597492b83ccfSBram Moolenaar call assert_equal(v:t_channel, type(test_null_channel())) 597592b83ccfSBram Moolenaar endif 597692b83ccfSBram Moolenaar call assert_equal(v:t_blob, type(test_null_blob())) 5977b544f3c8SBram Moolenaar 59787c215c58SBram Moolenaar call assert_fails("call type(test_void())", 'E685:') 59797c215c58SBram Moolenaar call assert_fails("call type(test_unknown())", 'E685:') 5980b544f3c8SBram Moolenaar 5981b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:false) 5982b544f3c8SBram Moolenaar call assert_equal(1, 0 + v:true) 5983b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:none) 5984b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:null) 5985b544f3c8SBram Moolenaar 5986b544f3c8SBram Moolenaar call assert_equal('v:false', '' . v:false) 5987b544f3c8SBram Moolenaar call assert_equal('v:true', '' . v:true) 5988b544f3c8SBram Moolenaar call assert_equal('v:none', '' . v:none) 5989b544f3c8SBram Moolenaar call assert_equal('v:null', '' . v:null) 5990b544f3c8SBram Moolenaar 5991b544f3c8SBram Moolenaar call assert_true(v:false == 0) 5992b544f3c8SBram Moolenaar call assert_false(v:false != 0) 5993b544f3c8SBram Moolenaar call assert_true(v:true == 1) 5994b544f3c8SBram Moolenaar call assert_false(v:true != 1) 5995b544f3c8SBram Moolenaar call assert_false(v:true == v:false) 5996b544f3c8SBram Moolenaar call assert_true(v:true != v:false) 5997b544f3c8SBram Moolenaar 5998b544f3c8SBram Moolenaar call assert_true(v:null == 0) 5999b544f3c8SBram Moolenaar call assert_false(v:null != 0) 6000b544f3c8SBram Moolenaar call assert_true(v:none == 0) 6001b544f3c8SBram Moolenaar call assert_false(v:none != 0) 6002b544f3c8SBram Moolenaar 6003b544f3c8SBram Moolenaar call assert_true(v:false is v:false) 6004b544f3c8SBram Moolenaar call assert_true(v:true is v:true) 6005b544f3c8SBram Moolenaar call assert_true(v:none is v:none) 6006b544f3c8SBram Moolenaar call assert_true(v:null is v:null) 6007b544f3c8SBram Moolenaar 6008b544f3c8SBram Moolenaar call assert_false(v:false isnot v:false) 6009b544f3c8SBram Moolenaar call assert_false(v:true isnot v:true) 6010b544f3c8SBram Moolenaar call assert_false(v:none isnot v:none) 6011b544f3c8SBram Moolenaar call assert_false(v:null isnot v:null) 6012b544f3c8SBram Moolenaar 6013b544f3c8SBram Moolenaar call assert_false(v:false is 0) 6014b544f3c8SBram Moolenaar call assert_false(v:true is 1) 6015b544f3c8SBram Moolenaar call assert_false(v:true is v:false) 6016b544f3c8SBram Moolenaar call assert_false(v:none is 0) 6017b544f3c8SBram Moolenaar call assert_false(v:null is 0) 6018b544f3c8SBram Moolenaar call assert_false(v:null is v:none) 6019b544f3c8SBram Moolenaar 6020b544f3c8SBram Moolenaar call assert_true(v:false isnot 0) 6021b544f3c8SBram Moolenaar call assert_true(v:true isnot 1) 6022b544f3c8SBram Moolenaar call assert_true(v:true isnot v:false) 6023b544f3c8SBram Moolenaar call assert_true(v:none isnot 0) 6024b544f3c8SBram Moolenaar call assert_true(v:null isnot 0) 6025b544f3c8SBram Moolenaar call assert_true(v:null isnot v:none) 6026b544f3c8SBram Moolenaar 6027b544f3c8SBram Moolenaar call assert_equal(v:false, eval(string(v:false))) 6028b544f3c8SBram Moolenaar call assert_equal(v:true, eval(string(v:true))) 6029b544f3c8SBram Moolenaar call assert_equal(v:none, eval(string(v:none))) 6030b544f3c8SBram Moolenaar call assert_equal(v:null, eval(string(v:null))) 6031b544f3c8SBram Moolenaar 6032b544f3c8SBram Moolenaar call assert_equal(v:false, copy(v:false)) 6033b544f3c8SBram Moolenaar call assert_equal(v:true, copy(v:true)) 6034b544f3c8SBram Moolenaar call assert_equal(v:none, copy(v:none)) 6035b544f3c8SBram Moolenaar call assert_equal(v:null, copy(v:null)) 6036b544f3c8SBram Moolenaar 6037b544f3c8SBram Moolenaar call assert_equal([v:false], deepcopy([v:false])) 6038b544f3c8SBram Moolenaar call assert_equal([v:true], deepcopy([v:true])) 6039b544f3c8SBram Moolenaar call assert_equal([v:none], deepcopy([v:none])) 6040b544f3c8SBram Moolenaar call assert_equal([v:null], deepcopy([v:null])) 6041b544f3c8SBram Moolenaar 6042b544f3c8SBram Moolenaar call assert_true(empty(v:false)) 6043b544f3c8SBram Moolenaar call assert_false(empty(v:true)) 6044b544f3c8SBram Moolenaar call assert_true(empty(v:null)) 6045b544f3c8SBram Moolenaar call assert_true(empty(v:none)) 6046b544f3c8SBram Moolenaar 6047b544f3c8SBram Moolenaar func ChangeYourMind() 6048b544f3c8SBram Moolenaar try 6049b544f3c8SBram Moolenaar return v:true 6050b544f3c8SBram Moolenaar finally 6051b544f3c8SBram Moolenaar return 'something else' 6052b544f3c8SBram Moolenaar endtry 6053b544f3c8SBram Moolenaar endfunc 6054b544f3c8SBram Moolenaar 6055b544f3c8SBram Moolenaar call ChangeYourMind() 6056b544f3c8SBram Moolenaarendfunc 6057b544f3c8SBram Moolenaar 6058b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6059b544f3c8SBram Moolenaar" Test 92: skipping code {{{1 6060b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6061b544f3c8SBram Moolenaar 6062b544f3c8SBram Moolenaarfunc Test_skip() 6063b544f3c8SBram Moolenaar let Fn = function('Test_type') 6064b544f3c8SBram Moolenaar call assert_false(0 && Fn[1]) 6065b544f3c8SBram Moolenaar call assert_false(0 && string(Fn)) 6066b544f3c8SBram Moolenaar call assert_false(0 && len(Fn)) 6067b544f3c8SBram Moolenaar let l = [] 6068b544f3c8SBram Moolenaar call assert_false(0 && l[1]) 6069b544f3c8SBram Moolenaar call assert_false(0 && string(l)) 6070b544f3c8SBram Moolenaar call assert_false(0 && len(l)) 6071b544f3c8SBram Moolenaar let f = 1.0 6072b544f3c8SBram Moolenaar call assert_false(0 && f[1]) 6073b544f3c8SBram Moolenaar call assert_false(0 && string(f)) 6074b544f3c8SBram Moolenaar call assert_false(0 && len(f)) 6075b544f3c8SBram Moolenaar let sp = v:null 6076b544f3c8SBram Moolenaar call assert_false(0 && sp[1]) 6077b544f3c8SBram Moolenaar call assert_false(0 && string(sp)) 6078b544f3c8SBram Moolenaar call assert_false(0 && len(sp)) 6079b544f3c8SBram Moolenaar 6080b544f3c8SBram Moolenaarendfunc 6081b544f3c8SBram Moolenaar 6082b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6083b544f3c8SBram Moolenaar" Test 93: :echo and string() {{{1 6084b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6085b544f3c8SBram Moolenaar 6086b544f3c8SBram Moolenaarfunc Test_echo_and_string() 6087b544f3c8SBram Moolenaar " String 6088b544f3c8SBram Moolenaar let a = 'foo bar' 6089b544f3c8SBram Moolenaar redir => result 6090b544f3c8SBram Moolenaar echo a 6091b544f3c8SBram Moolenaar echo string(a) 6092b544f3c8SBram Moolenaar redir END 6093b544f3c8SBram Moolenaar let l = split(result, "\n") 6094b544f3c8SBram Moolenaar call assert_equal(["foo bar", 6095b544f3c8SBram Moolenaar \ "'foo bar'"], l) 6096b544f3c8SBram Moolenaar 6097b544f3c8SBram Moolenaar " Float 6098b544f3c8SBram Moolenaar if has('float') 6099b544f3c8SBram Moolenaar let a = -1.2e0 6100b544f3c8SBram Moolenaar redir => result 6101b544f3c8SBram Moolenaar echo a 6102b544f3c8SBram Moolenaar echo string(a) 6103b544f3c8SBram Moolenaar redir END 6104b544f3c8SBram Moolenaar let l = split(result, "\n") 6105b544f3c8SBram Moolenaar call assert_equal(["-1.2", 6106b544f3c8SBram Moolenaar \ "-1.2"], l) 6107b544f3c8SBram Moolenaar endif 6108b544f3c8SBram Moolenaar 6109b544f3c8SBram Moolenaar " Funcref 6110b544f3c8SBram Moolenaar redir => result 6111b544f3c8SBram Moolenaar echo function('string') 6112b544f3c8SBram Moolenaar echo string(function('string')) 6113b544f3c8SBram Moolenaar redir END 6114b544f3c8SBram Moolenaar let l = split(result, "\n") 6115b544f3c8SBram Moolenaar call assert_equal(["string", 6116b544f3c8SBram Moolenaar \ "function('string')"], l) 6117b544f3c8SBram Moolenaar 6118b544f3c8SBram Moolenaar " Recursive dictionary 6119b544f3c8SBram Moolenaar let a = {} 6120b544f3c8SBram Moolenaar let a["a"] = a 6121b544f3c8SBram Moolenaar redir => result 6122b544f3c8SBram Moolenaar echo a 6123b544f3c8SBram Moolenaar echo string(a) 6124b544f3c8SBram Moolenaar redir END 6125b544f3c8SBram Moolenaar let l = split(result, "\n") 6126b544f3c8SBram Moolenaar call assert_equal(["{'a': {...}}", 6127b544f3c8SBram Moolenaar \ "{'a': {...}}"], l) 6128b544f3c8SBram Moolenaar 6129b544f3c8SBram Moolenaar " Recursive list 6130b544f3c8SBram Moolenaar let a = [0] 6131b544f3c8SBram Moolenaar let a[0] = a 6132b544f3c8SBram Moolenaar redir => result 6133b544f3c8SBram Moolenaar echo a 6134b544f3c8SBram Moolenaar echo string(a) 6135b544f3c8SBram Moolenaar redir END 6136b544f3c8SBram Moolenaar let l = split(result, "\n") 6137b544f3c8SBram Moolenaar call assert_equal(["[[...]]", 6138b544f3c8SBram Moolenaar \ "[[...]]"], l) 6139b544f3c8SBram Moolenaar 6140b544f3c8SBram Moolenaar " Empty dictionaries in a list 6141b544f3c8SBram Moolenaar let a = {} 6142b544f3c8SBram Moolenaar redir => result 6143b544f3c8SBram Moolenaar echo [a, a, a] 6144b544f3c8SBram Moolenaar echo string([a, a, a]) 6145b544f3c8SBram Moolenaar redir END 6146b544f3c8SBram Moolenaar let l = split(result, "\n") 6147b544f3c8SBram Moolenaar call assert_equal(["[{}, {}, {}]", 6148b544f3c8SBram Moolenaar \ "[{}, {}, {}]"], l) 6149b544f3c8SBram Moolenaar 6150b544f3c8SBram Moolenaar " Empty dictionaries in a dictionary 6151b544f3c8SBram Moolenaar let a = {} 6152b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 6153b544f3c8SBram Moolenaar redir => result 6154b544f3c8SBram Moolenaar echo b 6155b544f3c8SBram Moolenaar echo string(b) 6156b544f3c8SBram Moolenaar redir END 6157b544f3c8SBram Moolenaar let l = split(result, "\n") 6158b544f3c8SBram Moolenaar call assert_equal(["{'a': {}, 'b': {}}", 6159b544f3c8SBram Moolenaar \ "{'a': {}, 'b': {}}"], l) 6160b544f3c8SBram Moolenaar 6161b544f3c8SBram Moolenaar " Empty lists in a list 6162b544f3c8SBram Moolenaar let a = [] 6163b544f3c8SBram Moolenaar redir => result 6164b544f3c8SBram Moolenaar echo [a, a, a] 6165b544f3c8SBram Moolenaar echo string([a, a, a]) 6166b544f3c8SBram Moolenaar redir END 6167b544f3c8SBram Moolenaar let l = split(result, "\n") 6168b544f3c8SBram Moolenaar call assert_equal(["[[], [], []]", 6169b544f3c8SBram Moolenaar \ "[[], [], []]"], l) 6170b544f3c8SBram Moolenaar 6171b544f3c8SBram Moolenaar " Empty lists in a dictionary 6172b544f3c8SBram Moolenaar let a = [] 6173b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 6174b544f3c8SBram Moolenaar redir => result 6175b544f3c8SBram Moolenaar echo b 6176b544f3c8SBram Moolenaar echo string(b) 6177b544f3c8SBram Moolenaar redir END 6178b544f3c8SBram Moolenaar let l = split(result, "\n") 6179b544f3c8SBram Moolenaar call assert_equal(["{'a': [], 'b': []}", 6180b544f3c8SBram Moolenaar \ "{'a': [], 'b': []}"], l) 6181b544f3c8SBram Moolenaar 6182b544f3c8SBram Moolenaar " Dictionaries in a list 6183b544f3c8SBram Moolenaar let a = {"one": "yes", "two": "yes", "three": "yes"} 6184b544f3c8SBram Moolenaar redir => result 6185b544f3c8SBram Moolenaar echo [a, a, a] 6186b544f3c8SBram Moolenaar echo string([a, a, a]) 6187b544f3c8SBram Moolenaar redir END 6188b544f3c8SBram Moolenaar let l = split(result, "\n") 6189b544f3c8SBram Moolenaar call assert_equal(["[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {...}, {...}]", 6190b544f3c8SBram Moolenaar \ "[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}]"], l) 6191b544f3c8SBram Moolenaar 6192b544f3c8SBram Moolenaar " Dictionaries in a dictionary 6193b544f3c8SBram Moolenaar let a = {"one": "yes", "two": "yes", "three": "yes"} 6194b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 6195b544f3c8SBram Moolenaar redir => result 6196b544f3c8SBram Moolenaar echo b 6197b544f3c8SBram Moolenaar echo string(b) 6198b544f3c8SBram Moolenaar redir END 6199b544f3c8SBram Moolenaar let l = split(result, "\n") 6200b544f3c8SBram Moolenaar call assert_equal(["{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {...}}", 6201b544f3c8SBram Moolenaar \ "{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {'one': 'yes', 'two': 'yes', 'three': 'yes'}}"], l) 6202b544f3c8SBram Moolenaar 6203b544f3c8SBram Moolenaar " Lists in a list 6204b544f3c8SBram Moolenaar let a = [1, 2, 3] 6205b544f3c8SBram Moolenaar redir => result 6206b544f3c8SBram Moolenaar echo [a, a, a] 6207b544f3c8SBram Moolenaar echo string([a, a, a]) 6208b544f3c8SBram Moolenaar redir END 6209b544f3c8SBram Moolenaar let l = split(result, "\n") 6210b544f3c8SBram Moolenaar call assert_equal(["[[1, 2, 3], [...], [...]]", 6211b544f3c8SBram Moolenaar \ "[[1, 2, 3], [1, 2, 3], [1, 2, 3]]"], l) 6212b544f3c8SBram Moolenaar 6213b544f3c8SBram Moolenaar " Lists in a dictionary 6214b544f3c8SBram Moolenaar let a = [1, 2, 3] 6215b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 6216b544f3c8SBram Moolenaar redir => result 6217b544f3c8SBram Moolenaar echo b 6218b544f3c8SBram Moolenaar echo string(b) 6219b544f3c8SBram Moolenaar redir END 6220b544f3c8SBram Moolenaar let l = split(result, "\n") 6221b544f3c8SBram Moolenaar call assert_equal(["{'a': [1, 2, 3], 'b': [...]}", 6222b544f3c8SBram Moolenaar \ "{'a': [1, 2, 3], 'b': [1, 2, 3]}"], l) 6223b544f3c8SBram Moolenaar 62241363a30cSBram Moolenaar call assert_fails('echo &:', 'E112:') 62251363a30cSBram Moolenaar call assert_fails('echo &g:', 'E112:') 62261363a30cSBram Moolenaar call assert_fails('echo &l:', 'E112:') 62271363a30cSBram Moolenaar 6228b544f3c8SBram Moolenaarendfunc 6229b544f3c8SBram Moolenaar 6230b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6231b544f3c8SBram Moolenaar" Test 94: 64-bit Numbers {{{1 6232b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6233b544f3c8SBram Moolenaar 6234b544f3c8SBram Moolenaarfunc Test_num64() 6235b544f3c8SBram Moolenaar call assert_notequal( 4294967296, 0) 6236b544f3c8SBram Moolenaar call assert_notequal(-4294967296, 0) 6237b544f3c8SBram Moolenaar call assert_equal( 4294967296, 0xFFFFffff + 1) 6238b544f3c8SBram Moolenaar call assert_equal(-4294967296, -0xFFFFffff - 1) 6239b544f3c8SBram Moolenaar 6240b544f3c8SBram Moolenaar call assert_equal( 9223372036854775807, 1 / 0) 6241b544f3c8SBram Moolenaar call assert_equal(-9223372036854775807, -1 / 0) 6242b544f3c8SBram Moolenaar call assert_equal(-9223372036854775807 - 1, 0 / 0) 6243b544f3c8SBram Moolenaar 62445feabe00SBram Moolenaar if has('float') 6245b544f3c8SBram Moolenaar call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150)) 6246b544f3c8SBram Moolenaar call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150)) 62475feabe00SBram Moolenaar endif 6248b544f3c8SBram Moolenaar 6249b544f3c8SBram Moolenaar let rng = range(0xFFFFffff, 0x100000001) 6250b544f3c8SBram Moolenaar call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng) 6251b544f3c8SBram Moolenaar call assert_equal(0x100000001, max(rng)) 6252b544f3c8SBram Moolenaar call assert_equal(0xFFFFffff, min(rng)) 6253b544f3c8SBram Moolenaar call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N')) 6254b544f3c8SBram Moolenaarendfunc 6255b544f3c8SBram Moolenaar 6256b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6257b544f3c8SBram Moolenaar" Test 95: lines of :append, :change, :insert {{{1 6258b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6259b544f3c8SBram Moolenaar 6260b544f3c8SBram Moolenaarfunction! DefineFunction(name, body) 6261b544f3c8SBram Moolenaar let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n") 6262b544f3c8SBram Moolenaar exec func 6263b544f3c8SBram Moolenaarendfunction 6264b544f3c8SBram Moolenaar 6265b544f3c8SBram Moolenaarfunc Test_script_lines() 6266b544f3c8SBram Moolenaar " :append 6267b544f3c8SBram Moolenaar try 6268b544f3c8SBram Moolenaar call DefineFunction('T_Append', [ 6269b544f3c8SBram Moolenaar \ 'append', 6270b544f3c8SBram Moolenaar \ 'py <<EOS', 6271b544f3c8SBram Moolenaar \ '.', 6272b544f3c8SBram Moolenaar \ ]) 6273b544f3c8SBram Moolenaar catch 627437175409SBram Moolenaar call assert_report("Can't define function") 6275b544f3c8SBram Moolenaar endtry 6276b544f3c8SBram Moolenaar try 6277b544f3c8SBram Moolenaar call DefineFunction('T_Append', [ 6278b544f3c8SBram Moolenaar \ 'append', 6279b544f3c8SBram Moolenaar \ 'abc', 6280b544f3c8SBram Moolenaar \ ]) 628137175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 6282b544f3c8SBram Moolenaar catch 6283b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 6284b544f3c8SBram Moolenaar endtry 6285b544f3c8SBram Moolenaar 6286b544f3c8SBram Moolenaar " :change 6287b544f3c8SBram Moolenaar try 6288b544f3c8SBram Moolenaar call DefineFunction('T_Change', [ 6289b544f3c8SBram Moolenaar \ 'change', 6290b544f3c8SBram Moolenaar \ 'py <<EOS', 6291b544f3c8SBram Moolenaar \ '.', 6292b544f3c8SBram Moolenaar \ ]) 6293b544f3c8SBram Moolenaar catch 629437175409SBram Moolenaar call assert_report("Can't define function") 6295b544f3c8SBram Moolenaar endtry 6296b544f3c8SBram Moolenaar try 6297b544f3c8SBram Moolenaar call DefineFunction('T_Change', [ 6298b544f3c8SBram Moolenaar \ 'change', 6299b544f3c8SBram Moolenaar \ 'abc', 6300b544f3c8SBram Moolenaar \ ]) 630137175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 6302b544f3c8SBram Moolenaar catch 6303b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 6304b544f3c8SBram Moolenaar endtry 6305b544f3c8SBram Moolenaar 6306b544f3c8SBram Moolenaar " :insert 6307b544f3c8SBram Moolenaar try 6308b544f3c8SBram Moolenaar call DefineFunction('T_Insert', [ 6309b544f3c8SBram Moolenaar \ 'insert', 6310b544f3c8SBram Moolenaar \ 'py <<EOS', 6311b544f3c8SBram Moolenaar \ '.', 6312b544f3c8SBram Moolenaar \ ]) 6313b544f3c8SBram Moolenaar catch 631437175409SBram Moolenaar call assert_report("Can't define function") 6315b544f3c8SBram Moolenaar endtry 6316b544f3c8SBram Moolenaar try 6317b544f3c8SBram Moolenaar call DefineFunction('T_Insert', [ 6318b544f3c8SBram Moolenaar \ 'insert', 6319b544f3c8SBram Moolenaar \ 'abc', 6320b544f3c8SBram Moolenaar \ ]) 632137175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 6322b544f3c8SBram Moolenaar catch 6323b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 6324b544f3c8SBram Moolenaar endtry 6325b544f3c8SBram Moolenaarendfunc 6326b544f3c8SBram Moolenaar 6327b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6328478af67dSBram Moolenaar" Test 96: line continuation {{{1 6329478af67dSBram Moolenaar" 6330478af67dSBram Moolenaar" Undefined behavior was detected by ubsan with line continuation 6331478af67dSBram Moolenaar" after an empty line. 6332478af67dSBram Moolenaar"------------------------------------------------------------------------------- 6333478af67dSBram Moolenaarfunc Test_script_emty_line_continuation() 6334478af67dSBram Moolenaar 6335478af67dSBram Moolenaar \ 6336478af67dSBram Moolenaarendfunc 6337478af67dSBram Moolenaar 6338478af67dSBram Moolenaar"------------------------------------------------------------------------------- 6339863e80b4SBram Moolenaar" Test 97: bitwise functions {{{1 6340863e80b4SBram Moolenaar"------------------------------------------------------------------------------- 6341863e80b4SBram Moolenaarfunc Test_bitwise_functions() 6342863e80b4SBram Moolenaar " and 6343863e80b4SBram Moolenaar call assert_equal(127, and(127, 127)) 6344863e80b4SBram Moolenaar call assert_equal(16, and(127, 16)) 6345073e4b92SBram Moolenaar eval 127->and(16)->assert_equal(16) 6346863e80b4SBram Moolenaar call assert_equal(0, and(127, 128)) 6347863e80b4SBram Moolenaar call assert_fails("call and([], 1)", 'E745:') 6348863e80b4SBram Moolenaar call assert_fails("call and({}, 1)", 'E728:') 63495feabe00SBram Moolenaar if has('float') 63505feabe00SBram Moolenaar call assert_fails("call and(1.0, 1)", 'E805:') 6351863e80b4SBram Moolenaar call assert_fails("call and(1, 1.0)", 'E805:') 63525feabe00SBram Moolenaar endif 6353863e80b4SBram Moolenaar call assert_fails("call and(1, [])", 'E745:') 6354863e80b4SBram Moolenaar call assert_fails("call and(1, {})", 'E728:') 6355863e80b4SBram Moolenaar " or 6356863e80b4SBram Moolenaar call assert_equal(23, or(16, 7)) 6357863e80b4SBram Moolenaar call assert_equal(15, or(8, 7)) 6358073e4b92SBram Moolenaar eval 8->or(7)->assert_equal(15) 6359863e80b4SBram Moolenaar call assert_equal(123, or(0, 123)) 6360863e80b4SBram Moolenaar call assert_fails("call or([], 1)", 'E745:') 6361863e80b4SBram Moolenaar call assert_fails("call or({}, 1)", 'E728:') 63625feabe00SBram Moolenaar if has('float') 63635feabe00SBram Moolenaar call assert_fails("call or(1.0, 1)", 'E805:') 6364863e80b4SBram Moolenaar call assert_fails("call or(1, 1.0)", 'E805:') 63655feabe00SBram Moolenaar endif 6366863e80b4SBram Moolenaar call assert_fails("call or(1, [])", 'E745:') 6367863e80b4SBram Moolenaar call assert_fails("call or(1, {})", 'E728:') 6368863e80b4SBram Moolenaar " xor 6369863e80b4SBram Moolenaar call assert_equal(0, xor(127, 127)) 6370863e80b4SBram Moolenaar call assert_equal(111, xor(127, 16)) 6371073e4b92SBram Moolenaar eval 127->xor(16)->assert_equal(111) 6372863e80b4SBram Moolenaar call assert_equal(255, xor(127, 128)) 63735feabe00SBram Moolenaar if has('float') 6374863e80b4SBram Moolenaar call assert_fails("call xor(1.0, 1)", 'E805:') 63755feabe00SBram Moolenaar call assert_fails("call xor(1, 1.0)", 'E805:') 63765feabe00SBram Moolenaar endif 6377863e80b4SBram Moolenaar call assert_fails("call xor([], 1)", 'E745:') 6378863e80b4SBram Moolenaar call assert_fails("call xor({}, 1)", 'E728:') 6379863e80b4SBram Moolenaar call assert_fails("call xor(1, [])", 'E745:') 6380863e80b4SBram Moolenaar call assert_fails("call xor(1, {})", 'E728:') 6381863e80b4SBram Moolenaar " invert 6382863e80b4SBram Moolenaar call assert_equal(65408, and(invert(127), 65535)) 6383073e4b92SBram Moolenaar eval 127->invert()->and(65535)->assert_equal(65408) 6384863e80b4SBram Moolenaar call assert_equal(65519, and(invert(16), 65535)) 6385863e80b4SBram Moolenaar call assert_equal(65407, and(invert(128), 65535)) 63865feabe00SBram Moolenaar if has('float') 6387863e80b4SBram Moolenaar call assert_fails("call invert(1.0)", 'E805:') 63885feabe00SBram Moolenaar endif 6389863e80b4SBram Moolenaar call assert_fails("call invert([])", 'E745:') 6390863e80b4SBram Moolenaar call assert_fails("call invert({})", 'E728:') 6391863e80b4SBram Moolenaarendfunc 6392863e80b4SBram Moolenaar 63936f9a476bSBram Moolenaar" Test using bang after user command {{{1 63946f9a476bSBram Moolenaarfunc Test_user_command_with_bang() 63956f9a476bSBram Moolenaar command -bang Nieuw let nieuw = 1 63966f9a476bSBram Moolenaar Ni! 63976f9a476bSBram Moolenaar call assert_equal(1, nieuw) 63986f9a476bSBram Moolenaar unlet nieuw 63996f9a476bSBram Moolenaar delcommand Nieuw 64006f9a476bSBram Moolenaarendfunc 64016f9a476bSBram Moolenaar 6402b9adef79SBram Moolenaarfunc Test_script_expand_sfile() 6403b9adef79SBram Moolenaar let lines =<< trim END 6404b9adef79SBram Moolenaar func s:snr() 6405b9adef79SBram Moolenaar return expand('<sfile>') 6406b9adef79SBram Moolenaar endfunc 6407b9adef79SBram Moolenaar let g:result = s:snr() 6408b9adef79SBram Moolenaar END 6409b9adef79SBram Moolenaar call writefile(lines, 'Xexpand') 6410b9adef79SBram Moolenaar source Xexpand 6411b9adef79SBram Moolenaar call assert_match('<SNR>\d\+_snr', g:result) 6412b9adef79SBram Moolenaar source Xexpand 6413b9adef79SBram Moolenaar call assert_match('<SNR>\d\+_snr', g:result) 6414b9adef79SBram Moolenaar 6415b9adef79SBram Moolenaar call delete('Xexpand') 6416b9adef79SBram Moolenaar unlet g:result 6417b9adef79SBram Moolenaarendfunc 6418b9adef79SBram Moolenaar 6419ff697e6cSBram Moolenaarfunc Test_compound_assignment_operators() 6420ff697e6cSBram Moolenaar " Test for number 6421ff697e6cSBram Moolenaar let x = 1 6422ff697e6cSBram Moolenaar let x += 10 6423ff697e6cSBram Moolenaar call assert_equal(11, x) 6424ff697e6cSBram Moolenaar let x -= 5 6425ff697e6cSBram Moolenaar call assert_equal(6, x) 6426ff697e6cSBram Moolenaar let x *= 4 6427ff697e6cSBram Moolenaar call assert_equal(24, x) 6428ff697e6cSBram Moolenaar let x /= 3 6429ff697e6cSBram Moolenaar call assert_equal(8, x) 6430ff697e6cSBram Moolenaar let x %= 3 6431ff697e6cSBram Moolenaar call assert_equal(2, x) 6432ff697e6cSBram Moolenaar let x .= 'n' 6433ff697e6cSBram Moolenaar call assert_equal('2n', x) 6434ff697e6cSBram Moolenaar 6435e21c1580SBram Moolenaar " Test special cases: division or modulus with 0. 6436e21c1580SBram Moolenaar let x = 1 6437e21c1580SBram Moolenaar let x /= 0 6438e21c1580SBram Moolenaar call assert_equal(0x7FFFFFFFFFFFFFFF, x) 6439e21c1580SBram Moolenaar 6440e21c1580SBram Moolenaar let x = -1 6441e21c1580SBram Moolenaar let x /= 0 6442e21c1580SBram Moolenaar call assert_equal(-0x7FFFFFFFFFFFFFFF, x) 6443e21c1580SBram Moolenaar 6444e21c1580SBram Moolenaar let x = 0 6445e21c1580SBram Moolenaar let x /= 0 6446e21c1580SBram Moolenaar call assert_equal(-0x7FFFFFFFFFFFFFFF - 1, x) 6447e21c1580SBram Moolenaar 6448e21c1580SBram Moolenaar let x = 1 6449e21c1580SBram Moolenaar let x %= 0 6450e21c1580SBram Moolenaar call assert_equal(0, x) 6451e21c1580SBram Moolenaar 6452e21c1580SBram Moolenaar let x = -1 6453e21c1580SBram Moolenaar let x %= 0 6454e21c1580SBram Moolenaar call assert_equal(0, x) 6455e21c1580SBram Moolenaar 6456e21c1580SBram Moolenaar let x = 0 6457e21c1580SBram Moolenaar let x %= 0 6458e21c1580SBram Moolenaar call assert_equal(0, x) 6459e21c1580SBram Moolenaar 6460ff697e6cSBram Moolenaar " Test for string 6461ff697e6cSBram Moolenaar let x = 'str' 6462ff697e6cSBram Moolenaar let x .= 'ing' 6463ff697e6cSBram Moolenaar call assert_equal('string', x) 6464ff697e6cSBram Moolenaar let x += 1 6465ff697e6cSBram Moolenaar call assert_equal(1, x) 6466ff697e6cSBram Moolenaar 6467ff697e6cSBram Moolenaar if has('float') 6468ff697e6cSBram Moolenaar " Test for float 64695feabe00SBram Moolenaar let x -= 1.5 64705feabe00SBram Moolenaar call assert_equal(-0.5, x) 6471ff697e6cSBram Moolenaar let x = 0.5 6472ff697e6cSBram Moolenaar let x += 4.5 6473ff697e6cSBram Moolenaar call assert_equal(5.0, x) 6474ff697e6cSBram Moolenaar let x -= 1.5 6475ff697e6cSBram Moolenaar call assert_equal(3.5, x) 6476ff697e6cSBram Moolenaar let x *= 3.0 6477ff697e6cSBram Moolenaar call assert_equal(10.5, x) 6478ff697e6cSBram Moolenaar let x /= 2.5 6479ff697e6cSBram Moolenaar call assert_equal(4.2, x) 6480ff697e6cSBram Moolenaar call assert_fails('let x %= 0.5', 'E734') 6481ff697e6cSBram Moolenaar call assert_fails('let x .= "f"', 'E734') 64828b633135SBram Moolenaar let x = !3.14 64838b633135SBram Moolenaar call assert_equal(0.0, x) 6484ea04a6e8SBram Moolenaar 6485ea04a6e8SBram Moolenaar " integer and float operations 6486ea04a6e8SBram Moolenaar let x = 1 6487ea04a6e8SBram Moolenaar let x *= 2.1 6488ea04a6e8SBram Moolenaar call assert_equal(2.1, x) 6489ea04a6e8SBram Moolenaar let x = 1 6490ea04a6e8SBram Moolenaar let x /= 0.25 6491ea04a6e8SBram Moolenaar call assert_equal(4.0, x) 6492ea04a6e8SBram Moolenaar let x = 1 6493ea04a6e8SBram Moolenaar call assert_fails('let x %= 0.25', 'E734:') 6494ea04a6e8SBram Moolenaar let x = 1 6495ea04a6e8SBram Moolenaar call assert_fails('let x .= 0.25', 'E734:') 6496ea04a6e8SBram Moolenaar let x = 1.0 6497ea04a6e8SBram Moolenaar call assert_fails('let x += [1.1]', 'E734:') 6498ff697e6cSBram Moolenaar endif 6499ff697e6cSBram Moolenaar 6500ff697e6cSBram Moolenaar " Test for environment variable 6501ff697e6cSBram Moolenaar let $FOO = 1 6502ff697e6cSBram Moolenaar call assert_fails('let $FOO += 1', 'E734') 6503ff697e6cSBram Moolenaar call assert_fails('let $FOO -= 1', 'E734') 6504ff697e6cSBram Moolenaar call assert_fails('let $FOO *= 1', 'E734') 6505ff697e6cSBram Moolenaar call assert_fails('let $FOO /= 1', 'E734') 6506ff697e6cSBram Moolenaar call assert_fails('let $FOO %= 1', 'E734') 6507ff697e6cSBram Moolenaar let $FOO .= 's' 6508ff697e6cSBram Moolenaar call assert_equal('1s', $FOO) 6509ff697e6cSBram Moolenaar unlet $FOO 6510ff697e6cSBram Moolenaar 6511ff697e6cSBram Moolenaar " Test for option variable (type: number) 6512ff697e6cSBram Moolenaar let &scrolljump = 1 6513ff697e6cSBram Moolenaar let &scrolljump += 5 6514ff697e6cSBram Moolenaar call assert_equal(6, &scrolljump) 6515ff697e6cSBram Moolenaar let &scrolljump -= 2 6516ff697e6cSBram Moolenaar call assert_equal(4, &scrolljump) 6517ff697e6cSBram Moolenaar let &scrolljump *= 3 6518ff697e6cSBram Moolenaar call assert_equal(12, &scrolljump) 6519ff697e6cSBram Moolenaar let &scrolljump /= 2 6520ff697e6cSBram Moolenaar call assert_equal(6, &scrolljump) 6521ff697e6cSBram Moolenaar let &scrolljump %= 5 6522ff697e6cSBram Moolenaar call assert_equal(1, &scrolljump) 6523ff697e6cSBram Moolenaar call assert_fails('let &scrolljump .= "j"', 'E734') 6524ff697e6cSBram Moolenaar set scrolljump&vim 6525ff697e6cSBram Moolenaar 6526ff697e6cSBram Moolenaar " Test for register 6527ff697e6cSBram Moolenaar let @/ = 1 6528ff697e6cSBram Moolenaar call assert_fails('let @/ += 1', 'E734') 6529ff697e6cSBram Moolenaar call assert_fails('let @/ -= 1', 'E734') 6530ff697e6cSBram Moolenaar call assert_fails('let @/ *= 1', 'E734') 6531ff697e6cSBram Moolenaar call assert_fails('let @/ /= 1', 'E734') 6532ff697e6cSBram Moolenaar call assert_fails('let @/ %= 1', 'E734') 6533ff697e6cSBram Moolenaar let @/ .= 's' 6534ff697e6cSBram Moolenaar call assert_equal('1s', @/) 6535ff697e6cSBram Moolenaar let @/ = '' 6536ff697e6cSBram Moolenaarendfunc 6537ff697e6cSBram Moolenaar 65387e0868efSBram Moolenaarfunc Test_unlet_env() 65397e0868efSBram Moolenaar let $TESTVAR = 'yes' 65407e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 65417e0868efSBram Moolenaar call assert_fails('lockvar $TESTVAR', 'E940') 65427e0868efSBram Moolenaar call assert_fails('unlockvar $TESTVAR', 'E940') 65437e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 65447e0868efSBram Moolenaar if 0 65457e0868efSBram Moolenaar unlet $TESTVAR 65467e0868efSBram Moolenaar endif 65477e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 65487e0868efSBram Moolenaar unlet $TESTVAR 65497e0868efSBram Moolenaar call assert_equal('', $TESTVAR) 65507e0868efSBram Moolenaarendfunc 65517e0868efSBram Moolenaar 6552c3e92c16SBram Moolenaarfunc Test_refcount() 6553c3e92c16SBram Moolenaar " Immediate values 6554c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(1)) 6555c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount('s')) 6556c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(v:true)) 6557c3e92c16SBram Moolenaar call assert_equal(0, test_refcount([])) 6558c3e92c16SBram Moolenaar call assert_equal(0, test_refcount({})) 6559c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(0zff)) 6560c3e92c16SBram Moolenaar call assert_equal(0, test_refcount({-> line('.')})) 6561c3e92c16SBram Moolenaar if has('float') 6562c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(0.1)) 6563c3e92c16SBram Moolenaar endif 6564c3e92c16SBram Moolenaar if has('job') 6565c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .']))) 6566c3e92c16SBram Moolenaar endif 6567c3e92c16SBram Moolenaar 6568c3e92c16SBram Moolenaar " No refcount types 6569c3e92c16SBram Moolenaar let x = 1 6570c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 6571c3e92c16SBram Moolenaar let x = 's' 6572c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 6573c3e92c16SBram Moolenaar let x = v:true 6574c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 6575c3e92c16SBram Moolenaar if has('float') 6576c3e92c16SBram Moolenaar let x = 0.1 6577c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 6578c3e92c16SBram Moolenaar endif 6579c3e92c16SBram Moolenaar 6580c3e92c16SBram Moolenaar " Check refcount 6581c3e92c16SBram Moolenaar let x = [] 6582c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(x)) 6583c3e92c16SBram Moolenaar 6584c3e92c16SBram Moolenaar let x = {} 6585ce90e36fSBram Moolenaar call assert_equal(1, x->test_refcount()) 6586c3e92c16SBram Moolenaar 6587c3e92c16SBram Moolenaar let x = 0zff 6588c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(x)) 6589c3e92c16SBram Moolenaar 6590c3e92c16SBram Moolenaar let X = {-> line('.')} 6591c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(X)) 6592c3e92c16SBram Moolenaar let Y = X 6593c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 6594c3e92c16SBram Moolenaar 6595c3e92c16SBram Moolenaar if has('job') 6596c3e92c16SBram Moolenaar let job = job_start([&shell, &shellcmdflag, 'echo .']) 6597c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job)) 6598c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job_getchannel(job))) 6599c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job)) 6600c3e92c16SBram Moolenaar endif 6601c3e92c16SBram Moolenaar 6602c3e92c16SBram Moolenaar " Function arguments, copying and unassigning 6603c3e92c16SBram Moolenaar func ExprCheck(x, i) 6604c3e92c16SBram Moolenaar let i = a:i + 1 6605c3e92c16SBram Moolenaar call assert_equal(i, test_refcount(a:x)) 6606c3e92c16SBram Moolenaar let Y = a:x 6607c3e92c16SBram Moolenaar call assert_equal(i + 1, test_refcount(a:x)) 6608c3e92c16SBram Moolenaar call assert_equal(test_refcount(a:x), test_refcount(Y)) 6609c3e92c16SBram Moolenaar let Y = 0 6610c3e92c16SBram Moolenaar call assert_equal(i, test_refcount(a:x)) 6611c3e92c16SBram Moolenaar endfunc 6612c3e92c16SBram Moolenaar call ExprCheck([], 0) 6613c3e92c16SBram Moolenaar call ExprCheck({}, 0) 6614c3e92c16SBram Moolenaar call ExprCheck(0zff, 0) 6615c3e92c16SBram Moolenaar call ExprCheck({-> line('.')}, 0) 6616c3e92c16SBram Moolenaar if has('job') 6617c3e92c16SBram Moolenaar call ExprCheck(job, 1) 6618c3e92c16SBram Moolenaar call ExprCheck(job_getchannel(job), 1) 6619c3e92c16SBram Moolenaar call job_stop(job) 6620c3e92c16SBram Moolenaar endif 6621c3e92c16SBram Moolenaar delfunc ExprCheck 6622c3e92c16SBram Moolenaar 6623c3e92c16SBram Moolenaar " Regarding function 6624c3e92c16SBram Moolenaar func Func(x) abort 6625c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(function('Func'))) 6626c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func'))) 6627c3e92c16SBram Moolenaar endfunc 6628c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(function('Func'))) 6629c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(function('Func', [1]))) 6630c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func'))) 6631c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func', [1]))) 6632c3e92c16SBram Moolenaar let X = function('Func') 6633c3e92c16SBram Moolenaar let Y = X 6634c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(X)) 6635c3e92c16SBram Moolenaar let X = function('Func', [1]) 6636c3e92c16SBram Moolenaar let Y = X 6637c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 6638c3e92c16SBram Moolenaar let X = funcref('Func') 6639c3e92c16SBram Moolenaar let Y = X 6640c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 6641c3e92c16SBram Moolenaar let X = funcref('Func', [1]) 6642c3e92c16SBram Moolenaar let Y = X 6643c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 6644c3e92c16SBram Moolenaar unlet X 6645c3e92c16SBram Moolenaar unlet Y 6646c3e92c16SBram Moolenaar call Func(1) 6647c3e92c16SBram Moolenaar delfunc Func 6648c3e92c16SBram Moolenaar 6649c3e92c16SBram Moolenaar " Function with dict 6650c3e92c16SBram Moolenaar func DictFunc() dict 6651c3e92c16SBram Moolenaar call assert_equal(3, test_refcount(self)) 6652c3e92c16SBram Moolenaar endfunc 6653c3e92c16SBram Moolenaar let d = {'Func': function('DictFunc')} 6654c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(d)) 6655c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(d.Func)) 6656c3e92c16SBram Moolenaar call d.Func() 6657c3e92c16SBram Moolenaar unlet d 6658c3e92c16SBram Moolenaar delfunc DictFunc 6659c3e92c16SBram Moolenaarendfunc 6660c3e92c16SBram Moolenaar 66619f6277bdSBram Moolenaar" Test for missing :endif, :endfor, :endwhile and :endtry {{{1 66629f6277bdSBram Moolenaarfunc Test_missing_end() 66639f6277bdSBram Moolenaar call writefile(['if 2 > 1', 'echo ">"'], 'Xscript') 66649f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E171:') 66659f6277bdSBram Moolenaar call writefile(['for i in range(5)', 'echo i'], 'Xscript') 66669f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E170:') 66679f6277bdSBram Moolenaar call writefile(['while v:true', 'echo "."'], 'Xscript') 66689f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E170:') 66699f6277bdSBram Moolenaar call writefile(['try', 'echo "."'], 'Xscript') 66709f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E600:') 66719f6277bdSBram Moolenaar call delete('Xscript') 6672818fc9adSBram Moolenaar 6673818fc9adSBram Moolenaar " Using endfor with :while 6674818fc9adSBram Moolenaar let caught_e732 = 0 6675818fc9adSBram Moolenaar try 6676818fc9adSBram Moolenaar while v:true 6677818fc9adSBram Moolenaar endfor 6678818fc9adSBram Moolenaar catch /E732:/ 6679818fc9adSBram Moolenaar let caught_e732 = 1 6680818fc9adSBram Moolenaar endtry 6681818fc9adSBram Moolenaar call assert_equal(1, caught_e732) 6682818fc9adSBram Moolenaar 6683818fc9adSBram Moolenaar " Using endwhile with :for 6684818fc9adSBram Moolenaar let caught_e733 = 0 6685818fc9adSBram Moolenaar try 6686818fc9adSBram Moolenaar for i in range(1) 6687818fc9adSBram Moolenaar endwhile 6688818fc9adSBram Moolenaar catch /E733:/ 6689818fc9adSBram Moolenaar let caught_e733 = 1 6690818fc9adSBram Moolenaar endtry 6691818fc9adSBram Moolenaar call assert_equal(1, caught_e733) 6692818fc9adSBram Moolenaar 6693ee4e0c1eSBram Moolenaar " Using endfunc with :if 6694ee4e0c1eSBram Moolenaar call assert_fails('exe "if 1 | endfunc | endif"', 'E193:') 6695ee4e0c1eSBram Moolenaar 6696818fc9adSBram Moolenaar " Missing 'in' in a :for statement 6697818fc9adSBram Moolenaar call assert_fails('for i range(1) | endfor', 'E690:') 6698ea04a6e8SBram Moolenaar 6699ea04a6e8SBram Moolenaar " Incorrect number of variables in for 6700ea04a6e8SBram Moolenaar call assert_fails('for [i,] in range(3) | endfor', 'E475:') 67019f6277bdSBram Moolenaarendfunc 67029f6277bdSBram Moolenaar 67039f6277bdSBram Moolenaar" Test for deep nesting of if/for/while/try statements {{{1 67049f6277bdSBram Moolenaarfunc Test_deep_nest() 6705494e9069SBram Moolenaar CheckRunVimInTerminal 67069f6277bdSBram Moolenaar 67079f6277bdSBram Moolenaar let lines =<< trim [SCRIPT] 67089f6277bdSBram Moolenaar " Deep nesting of if ... endif 67099f6277bdSBram Moolenaar func Test1() 67109f6277bdSBram Moolenaar let @a = join(repeat(['if v:true'], 51), "\n") 67119f6277bdSBram Moolenaar let @a ..= "\n" 67129f6277bdSBram Moolenaar let @a ..= join(repeat(['endif'], 51), "\n") 67139f6277bdSBram Moolenaar @a 67149f6277bdSBram Moolenaar let @a = '' 67159f6277bdSBram Moolenaar endfunc 67169f6277bdSBram Moolenaar 67179f6277bdSBram Moolenaar " Deep nesting of for ... endfor 67189f6277bdSBram Moolenaar func Test2() 67199f6277bdSBram Moolenaar let @a = join(repeat(['for i in [1]'], 51), "\n") 67209f6277bdSBram Moolenaar let @a ..= "\n" 67219f6277bdSBram Moolenaar let @a ..= join(repeat(['endfor'], 51), "\n") 67229f6277bdSBram Moolenaar @a 67239f6277bdSBram Moolenaar let @a = '' 67249f6277bdSBram Moolenaar endfunc 67259f6277bdSBram Moolenaar 67269f6277bdSBram Moolenaar " Deep nesting of while ... endwhile 67279f6277bdSBram Moolenaar func Test3() 67289f6277bdSBram Moolenaar let @a = join(repeat(['while v:true'], 51), "\n") 67299f6277bdSBram Moolenaar let @a ..= "\n" 67309f6277bdSBram Moolenaar let @a ..= join(repeat(['endwhile'], 51), "\n") 67319f6277bdSBram Moolenaar @a 67329f6277bdSBram Moolenaar let @a = '' 67339f6277bdSBram Moolenaar endfunc 67349f6277bdSBram Moolenaar 67359f6277bdSBram Moolenaar " Deep nesting of try ... endtry 67369f6277bdSBram Moolenaar func Test4() 67379f6277bdSBram Moolenaar let @a = join(repeat(['try'], 51), "\n") 67389f6277bdSBram Moolenaar let @a ..= "\necho v:true\n" 67399f6277bdSBram Moolenaar let @a ..= join(repeat(['endtry'], 51), "\n") 67409f6277bdSBram Moolenaar @a 67419f6277bdSBram Moolenaar let @a = '' 67429f6277bdSBram Moolenaar endfunc 6743ee4e0c1eSBram Moolenaar 6744ee4e0c1eSBram Moolenaar " Deep nesting of function ... endfunction 6745ee4e0c1eSBram Moolenaar func Test5() 6746ee4e0c1eSBram Moolenaar let @a = join(repeat(['function X()'], 51), "\n") 6747ee4e0c1eSBram Moolenaar let @a ..= "\necho v:true\n" 6748ee4e0c1eSBram Moolenaar let @a ..= join(repeat(['endfunction'], 51), "\n") 6749ee4e0c1eSBram Moolenaar @a 6750ee4e0c1eSBram Moolenaar let @a = '' 6751ee4e0c1eSBram Moolenaar endfunc 67529f6277bdSBram Moolenaar [SCRIPT] 67539f6277bdSBram Moolenaar call writefile(lines, 'Xscript') 67549f6277bdSBram Moolenaar 67559f6277bdSBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'rows': 6}) 67569f6277bdSBram Moolenaar 67579f6277bdSBram Moolenaar " Deep nesting of if ... endif 67589f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test1()\n") 67596a2c5a7dSBram Moolenaar call TermWait(buf) 67609f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E579:', term_getline(buf, 5))}) 67619f6277bdSBram Moolenaar 67629f6277bdSBram Moolenaar " Deep nesting of for ... endfor 67639f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test2()\n") 67646a2c5a7dSBram Moolenaar call TermWait(buf) 67659f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))}) 67669f6277bdSBram Moolenaar 67679f6277bdSBram Moolenaar " Deep nesting of while ... endwhile 67689f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test3()\n") 67696a2c5a7dSBram Moolenaar call TermWait(buf) 67709f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))}) 67719f6277bdSBram Moolenaar 67729f6277bdSBram Moolenaar " Deep nesting of try ... endtry 67739f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test4()\n") 67746a2c5a7dSBram Moolenaar call TermWait(buf) 67759f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E601:', term_getline(buf, 5))}) 67769f6277bdSBram Moolenaar 6777ee4e0c1eSBram Moolenaar " Deep nesting of function ... endfunction 6778ee4e0c1eSBram Moolenaar call term_sendkeys(buf, ":call Test5()\n") 67796a2c5a7dSBram Moolenaar call TermWait(buf) 6780ee4e0c1eSBram Moolenaar call WaitForAssert({-> assert_match('^E1058:', term_getline(buf, 4))}) 6781ee4e0c1eSBram Moolenaar call term_sendkeys(buf, "\<C-C>\n") 67826a2c5a7dSBram Moolenaar call TermWait(buf) 6783ee4e0c1eSBram Moolenaar 67849f6277bdSBram Moolenaar "let l = '' 67859f6277bdSBram Moolenaar "for i in range(1, 6) 67869f6277bdSBram Moolenaar " let l ..= term_getline(buf, i) . "\n" 67879f6277bdSBram Moolenaar "endfor 67889f6277bdSBram Moolenaar "call assert_report(l) 67899f6277bdSBram Moolenaar 67909f6277bdSBram Moolenaar call StopVimInTerminal(buf) 67919f6277bdSBram Moolenaar call delete('Xscript') 67929f6277bdSBram Moolenaarendfunc 67939f6277bdSBram Moolenaar 67948b633135SBram Moolenaar" Test for errors in converting to float from various types {{{1 67958b633135SBram Moolenaarfunc Test_float_conversion_errors() 67968b633135SBram Moolenaar if has('float') 67978b633135SBram Moolenaar call assert_fails('let x = 4.0 % 2.0', 'E804') 67988b633135SBram Moolenaar call assert_fails('echo 1.1[0]', 'E806') 67998b633135SBram Moolenaar call assert_fails('echo sort([function("min"), 1], "f")', 'E891:') 68008b633135SBram Moolenaar call assert_fails('echo 3.2 == "vim"', 'E892:') 68018b633135SBram Moolenaar call assert_fails('echo sort([[], 1], "f")', 'E893:') 68028b633135SBram Moolenaar call assert_fails('echo sort([{}, 1], "f")', 'E894:') 68038b633135SBram Moolenaar call assert_fails('echo 3.2 == v:true', 'E362:') 68048b633135SBram Moolenaar call assert_fails('echo 3.2 == v:none', 'E907:') 68058b633135SBram Moolenaar endif 68068b633135SBram Moolenaarendfunc 68078b633135SBram Moolenaar 68088e6cbb72SBram Moolenaar" invalid function names {{{1 680908f4157cSBram Moolenaarfunc Test_invalid_function_names() 681008f4157cSBram Moolenaar " function name not starting with capital 681108f4157cSBram Moolenaar let caught_e128 = 0 681208f4157cSBram Moolenaar try 681308f4157cSBram Moolenaar func! g:test() 681408f4157cSBram Moolenaar echo "test" 681508f4157cSBram Moolenaar endfunc 681608f4157cSBram Moolenaar catch /E128:/ 681708f4157cSBram Moolenaar let caught_e128 = 1 681808f4157cSBram Moolenaar endtry 681908f4157cSBram Moolenaar call assert_equal(1, caught_e128) 682008f4157cSBram Moolenaar 682108f4157cSBram Moolenaar " function name includes a colon 682208f4157cSBram Moolenaar let caught_e884 = 0 682308f4157cSBram Moolenaar try 682408f4157cSBram Moolenaar func! b:test() 682508f4157cSBram Moolenaar echo "test" 682608f4157cSBram Moolenaar endfunc 682708f4157cSBram Moolenaar catch /E884:/ 682808f4157cSBram Moolenaar let caught_e884 = 1 682908f4157cSBram Moolenaar endtry 683008f4157cSBram Moolenaar call assert_equal(1, caught_e884) 683108f4157cSBram Moolenaar 683208f4157cSBram Moolenaar " function name folowed by # 683308f4157cSBram Moolenaar let caught_e128 = 0 683408f4157cSBram Moolenaar try 683508f4157cSBram Moolenaar func! test2() "# 683608f4157cSBram Moolenaar echo "test2" 683708f4157cSBram Moolenaar endfunc 683808f4157cSBram Moolenaar catch /E128:/ 683908f4157cSBram Moolenaar let caught_e128 = 1 684008f4157cSBram Moolenaar endtry 684108f4157cSBram Moolenaar call assert_equal(1, caught_e128) 684208f4157cSBram Moolenaar 684308f4157cSBram Moolenaar " function name starting with/without "g:", buffer-local funcref. 684408f4157cSBram Moolenaar function! g:Foo(n) 684508f4157cSBram Moolenaar return 'called Foo(' . a:n . ')' 684608f4157cSBram Moolenaar endfunction 684708f4157cSBram Moolenaar let b:my_func = function('Foo') 684808f4157cSBram Moolenaar call assert_equal('called Foo(1)', b:my_func(1)) 684908f4157cSBram Moolenaar call assert_equal('called Foo(2)', g:Foo(2)) 685008f4157cSBram Moolenaar call assert_equal('called Foo(3)', Foo(3)) 685108f4157cSBram Moolenaar delfunc g:Foo 685208f4157cSBram Moolenaar 685308f4157cSBram Moolenaar " script-local function used in Funcref must exist. 685408f4157cSBram Moolenaar let lines =<< trim END 685508f4157cSBram Moolenaar func s:Testje() 685608f4157cSBram Moolenaar return "foo" 685708f4157cSBram Moolenaar endfunc 685808f4157cSBram Moolenaar let Bar = function('s:Testje') 685908f4157cSBram Moolenaar call assert_equal(0, exists('s:Testje')) 686008f4157cSBram Moolenaar call assert_equal(1, exists('*s:Testje')) 686108f4157cSBram Moolenaar call assert_equal(1, exists('Bar')) 686208f4157cSBram Moolenaar call assert_equal(1, exists('*Bar')) 686308f4157cSBram Moolenaar END 686408f4157cSBram Moolenaar call writefile(lines, 'Xscript') 686508f4157cSBram Moolenaar source Xscript 686608f4157cSBram Moolenaar call delete('Xscript') 686708f4157cSBram Moolenaarendfunc 686808f4157cSBram Moolenaar 68698e6cbb72SBram Moolenaar" substring and variable name {{{1 687008f4157cSBram Moolenaarfunc Test_substring_var() 687108f4157cSBram Moolenaar let str = 'abcdef' 687208f4157cSBram Moolenaar let n = 3 687308f4157cSBram Moolenaar call assert_equal('def', str[n:]) 687408f4157cSBram Moolenaar call assert_equal('abcd', str[:n]) 687508f4157cSBram Moolenaar call assert_equal('d', str[n:n]) 687608f4157cSBram Moolenaar unlet n 687708f4157cSBram Moolenaar let nn = 3 687808f4157cSBram Moolenaar call assert_equal('def', str[nn:]) 687908f4157cSBram Moolenaar call assert_equal('abcd', str[:nn]) 688008f4157cSBram Moolenaar call assert_equal('d', str[nn:nn]) 688108f4157cSBram Moolenaar unlet nn 688208f4157cSBram Moolenaar let b:nn = 4 688308f4157cSBram Moolenaar call assert_equal('ef', str[b:nn:]) 688408f4157cSBram Moolenaar call assert_equal('abcde', str[:b:nn]) 688508f4157cSBram Moolenaar call assert_equal('e', str[b:nn:b:nn]) 688608f4157cSBram Moolenaar unlet b:nn 688708f4157cSBram Moolenaarendfunc 688808f4157cSBram Moolenaar 68898e6cbb72SBram Moolenaar" Test using s: with a typed command {{{1 68908e6cbb72SBram Moolenaarfunc Test_typed_script_var() 68918e6cbb72SBram Moolenaar CheckRunVimInTerminal 68928e6cbb72SBram Moolenaar 68938e6cbb72SBram Moolenaar let buf = RunVimInTerminal('', {'rows': 6}) 68948e6cbb72SBram Moolenaar 68958e6cbb72SBram Moolenaar " Deep nesting of if ... endif 68968e6cbb72SBram Moolenaar call term_sendkeys(buf, ":echo get(s:, 'foo', 'x')\n") 68978e6cbb72SBram Moolenaar call TermWait(buf) 68988e6cbb72SBram Moolenaar call WaitForAssert({-> assert_match('^E116:', term_getline(buf, 5))}) 68998e6cbb72SBram Moolenaar 69008e6cbb72SBram Moolenaar call StopVimInTerminal(buf) 69018e6cbb72SBram Moolenaarendfunc 69028e6cbb72SBram Moolenaar 6903863e80b4SBram Moolenaar"------------------------------------------------------------------------------- 6904b544f3c8SBram Moolenaar" Modelines {{{1 69051f068233SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 6906b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 6907