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