15d7ead3bSBram Moolenaar" Test various aspects of the Vim script language. 2b544f3c8SBram Moolenaar" Most of this was formerly in test49. 3b544f3c8SBram Moolenaar 48c5a278fSBram Moolenaarsource check.vim 593344c2dSBram Moolenaarsource shared.vim 6*a6296200SBram Moolenaarsource script_util.vim 78c5a278fSBram Moolenaar 8b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 9b544f3c8SBram Moolenaar" Test environment {{{1 10b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 11b544f3c8SBram Moolenaar 12b544f3c8SBram Moolenaar" Append a message to the "messages" file 131e115360SBram Moolenaarfunc Xout(text) 14b544f3c8SBram Moolenaar split messages 15b544f3c8SBram Moolenaar $put =a:text 16b544f3c8SBram Moolenaar wq 17b544f3c8SBram Moolenaarendfunc 18b544f3c8SBram Moolenaar 19b544f3c8SBram Moolenaarcom! -nargs=1 Xout call Xout(<args>) 20b544f3c8SBram Moolenaar 21*a6296200SBram Moolenaar" Create a new instance of Vim and run the commands in 'test' and then 'verify' 22*a6296200SBram Moolenaar" The commands in 'test' are expected to store the test results in the Xtest.out 23*a6296200SBram Moolenaar" file. If the test passes successfully, then Xtest.out should be empty. 24*a6296200SBram Moolenaarfunc RunInNewVim(test, verify) 25*a6296200SBram Moolenaar let init =<< trim END 26*a6296200SBram Moolenaar source script_util.vim 27*a6296200SBram Moolenaar XpathINIT 28*a6296200SBram Moolenaar XloopINIT 29*a6296200SBram Moolenaar END 30*a6296200SBram Moolenaar let cleanup =<< trim END 31*a6296200SBram Moolenaar call writefile(v:errors, 'Xtest.out') 32*a6296200SBram Moolenaar qall 33*a6296200SBram Moolenaar END 34*a6296200SBram Moolenaar call writefile(init, 'Xtest.vim') 35*a6296200SBram Moolenaar call writefile(a:test, 'Xtest.vim', 'a') 36*a6296200SBram Moolenaar call writefile(a:verify, 'Xverify.vim') 37*a6296200SBram Moolenaar call writefile(cleanup, 'Xverify.vim', 'a') 38*a6296200SBram Moolenaar call RunVim([], [], "-S Xtest.vim -S Xverify.vim") 39*a6296200SBram Moolenaar call assert_equal([], readfile('Xtest.out')) 40*a6296200SBram Moolenaar call delete('Xtest.out') 41*a6296200SBram Moolenaar call delete('Xtest.vim') 42*a6296200SBram Moolenaar call delete('Xverify.vim') 431e115360SBram Moolenaarendfunc 44b544f3c8SBram Moolenaar 45b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 46b544f3c8SBram Moolenaar" Test 1: :endwhile in function {{{1 47b544f3c8SBram Moolenaar" 48b544f3c8SBram Moolenaar" Detect if a broken loop is (incorrectly) reactivated by the 49b544f3c8SBram Moolenaar" :endwhile. Use a :return to prevent an endless loop, and make 50b544f3c8SBram Moolenaar" this test first to get a meaningful result on an error before other 51b544f3c8SBram Moolenaar" tests will hang. 52b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 53b544f3c8SBram Moolenaar 54*a6296200SBram Moolenaarfunc T1_F() 55b544f3c8SBram Moolenaar Xpath 'a' 56b544f3c8SBram Moolenaar let first = 1 57b544f3c8SBram Moolenaar while 1 58b544f3c8SBram Moolenaar Xpath 'b' 59b544f3c8SBram Moolenaar if first 60b544f3c8SBram Moolenaar Xpath 'c' 61b544f3c8SBram Moolenaar let first = 0 62b544f3c8SBram Moolenaar break 63b544f3c8SBram Moolenaar else 64b544f3c8SBram Moolenaar Xpath 'd' 65b544f3c8SBram Moolenaar return 66b544f3c8SBram Moolenaar endif 67b544f3c8SBram Moolenaar endwhile 68*a6296200SBram Moolenaarendfunc 69b544f3c8SBram Moolenaar 70*a6296200SBram Moolenaarfunc T1_G() 71b544f3c8SBram Moolenaar Xpath 'h' 72b544f3c8SBram Moolenaar let first = 1 73b544f3c8SBram Moolenaar while 1 74b544f3c8SBram Moolenaar Xpath 'i' 75b544f3c8SBram Moolenaar if first 76b544f3c8SBram Moolenaar Xpath 'j' 77b544f3c8SBram Moolenaar let first = 0 78b544f3c8SBram Moolenaar break 79b544f3c8SBram Moolenaar else 80b544f3c8SBram Moolenaar Xpath 'k' 81b544f3c8SBram Moolenaar return 82b544f3c8SBram Moolenaar endif 83b544f3c8SBram Moolenaar if 1 " unmatched :if 84b544f3c8SBram Moolenaar endwhile 85*a6296200SBram Moolenaarendfunc 86b544f3c8SBram Moolenaar 87b544f3c8SBram Moolenaarfunc Test_endwhile_function() 88b544f3c8SBram Moolenaar XpathINIT 89b544f3c8SBram Moolenaar call T1_F() 90b544f3c8SBram Moolenaar Xpath 'F' 91b544f3c8SBram Moolenaar 92b544f3c8SBram Moolenaar try 93b544f3c8SBram Moolenaar call T1_G() 94b544f3c8SBram Moolenaar catch 95b544f3c8SBram Moolenaar " Catch missing :endif 96b544f3c8SBram Moolenaar call assert_true(v:exception =~ 'E171') 97b544f3c8SBram Moolenaar Xpath 'x' 98b544f3c8SBram Moolenaar endtry 99b544f3c8SBram Moolenaar Xpath 'G' 100b544f3c8SBram Moolenaar 101b544f3c8SBram Moolenaar call assert_equal('abcFhijxG', g:Xpath) 102b544f3c8SBram Moolenaarendfunc 103b544f3c8SBram Moolenaar 104b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 105b544f3c8SBram Moolenaar" Test 2: :endwhile in script {{{1 106b544f3c8SBram Moolenaar" 107b544f3c8SBram Moolenaar" Detect if a broken loop is (incorrectly) reactivated by the 108b544f3c8SBram Moolenaar" :endwhile. Use a :finish to prevent an endless loop, and place 109b544f3c8SBram Moolenaar" this test before others that might hang to get a meaningful result 110b544f3c8SBram Moolenaar" on an error. 111b544f3c8SBram Moolenaar" 112b544f3c8SBram Moolenaar" This test executes the bodies of the functions T1_F and T1_G from 113b544f3c8SBram Moolenaar" the previous test as script files (:return replaced by :finish). 114b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 115b544f3c8SBram Moolenaar 116b544f3c8SBram Moolenaarfunc Test_endwhile_script() 117b544f3c8SBram Moolenaar XpathINIT 118b544f3c8SBram Moolenaar ExecAsScript T1_F 119b544f3c8SBram Moolenaar Xpath 'F' 120b544f3c8SBram Moolenaar call DeleteTheScript() 121b544f3c8SBram Moolenaar 122b544f3c8SBram Moolenaar try 123b544f3c8SBram Moolenaar ExecAsScript T1_G 124b544f3c8SBram Moolenaar catch 125b544f3c8SBram Moolenaar " Catch missing :endif 126b544f3c8SBram Moolenaar call assert_true(v:exception =~ 'E171') 127b544f3c8SBram Moolenaar Xpath 'x' 128b544f3c8SBram Moolenaar endtry 129b544f3c8SBram Moolenaar Xpath 'G' 130b544f3c8SBram Moolenaar call DeleteTheScript() 131b544f3c8SBram Moolenaar 132b544f3c8SBram Moolenaar call assert_equal('abcFhijxG', g:Xpath) 133b544f3c8SBram Moolenaarendfunc 134b544f3c8SBram Moolenaar 135b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 136b544f3c8SBram Moolenaar" Test 3: :if, :elseif, :while, :continue, :break {{{1 137b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 138b544f3c8SBram Moolenaar 139*a6296200SBram Moolenaarfunc Test_if_while() 140b544f3c8SBram Moolenaar XpathINIT 141b544f3c8SBram Moolenaar if 1 142b544f3c8SBram Moolenaar Xpath 'a' 143b544f3c8SBram Moolenaar let loops = 3 144b544f3c8SBram Moolenaar while loops > -1 " main loop: loops == 3, 2, 1 (which breaks) 145b544f3c8SBram Moolenaar if loops <= 0 146b544f3c8SBram Moolenaar let break_err = 1 147b544f3c8SBram Moolenaar let loops = -1 148b544f3c8SBram Moolenaar else 149b544f3c8SBram Moolenaar Xpath 'b' . loops 150b544f3c8SBram Moolenaar endif 151b544f3c8SBram Moolenaar if (loops == 2) 152b544f3c8SBram Moolenaar while loops == 2 " dummy loop 153b544f3c8SBram Moolenaar Xpath 'c' . loops 154b544f3c8SBram Moolenaar let loops = loops - 1 155b544f3c8SBram Moolenaar continue " stop dummy loop 156b544f3c8SBram Moolenaar Xpath 'd' . loops 157b544f3c8SBram Moolenaar endwhile 158b544f3c8SBram Moolenaar continue " continue main loop 159b544f3c8SBram Moolenaar Xpath 'e' . loops 160b544f3c8SBram Moolenaar elseif (loops == 1) 161b544f3c8SBram Moolenaar let p = 1 162b544f3c8SBram Moolenaar while p " dummy loop 163b544f3c8SBram Moolenaar Xpath 'f' . loops 164b544f3c8SBram Moolenaar let p = 0 165b544f3c8SBram Moolenaar break " break dummy loop 166b544f3c8SBram Moolenaar Xpath 'g' . loops 167b544f3c8SBram Moolenaar endwhile 168b544f3c8SBram Moolenaar Xpath 'h' . loops 169b544f3c8SBram Moolenaar unlet p 170b544f3c8SBram Moolenaar break " break main loop 171b544f3c8SBram Moolenaar Xpath 'i' . loops 172b544f3c8SBram Moolenaar endif 173b544f3c8SBram Moolenaar if (loops > 0) 174b544f3c8SBram Moolenaar Xpath 'j' . loops 175b544f3c8SBram Moolenaar endif 176b544f3c8SBram Moolenaar while loops == 3 " dummy loop 177b544f3c8SBram Moolenaar let loops = loops - 1 178b544f3c8SBram Moolenaar endwhile " end dummy loop 179b544f3c8SBram Moolenaar endwhile " end main loop 180b544f3c8SBram Moolenaar Xpath 'k' 181b544f3c8SBram Moolenaar else 182b544f3c8SBram Moolenaar Xpath 'l' 183b544f3c8SBram Moolenaar endif 184b544f3c8SBram Moolenaar Xpath 'm' 185b544f3c8SBram Moolenaar if exists("break_err") 186b544f3c8SBram Moolenaar Xpath 'm' 187b544f3c8SBram Moolenaar unlet break_err 188b544f3c8SBram Moolenaar endif 189b544f3c8SBram Moolenaar 190b544f3c8SBram Moolenaar unlet loops 191b544f3c8SBram Moolenaar 192b544f3c8SBram Moolenaar call assert_equal('ab3j3b2c2b1f1h1km', g:Xpath) 193b544f3c8SBram Moolenaarendfunc 194b544f3c8SBram Moolenaar 195b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 196b544f3c8SBram Moolenaar" Test 4: :return {{{1 197b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 198b544f3c8SBram Moolenaar 199*a6296200SBram Moolenaarfunc T4_F() 200b544f3c8SBram Moolenaar if 1 201b544f3c8SBram Moolenaar Xpath 'a' 202b544f3c8SBram Moolenaar let loops = 3 203b544f3c8SBram Moolenaar while loops > 0 " 3: 2: 1: 204b544f3c8SBram Moolenaar Xpath 'b' . loops 205b544f3c8SBram Moolenaar if (loops == 2) 206b544f3c8SBram Moolenaar Xpath 'c' . loops 207b544f3c8SBram Moolenaar return 208b544f3c8SBram Moolenaar Xpath 'd' . loops 209b544f3c8SBram Moolenaar endif 210b544f3c8SBram Moolenaar Xpath 'e' . loops 211b544f3c8SBram Moolenaar let loops = loops - 1 212b544f3c8SBram Moolenaar endwhile 213b544f3c8SBram Moolenaar Xpath 'f' 214b544f3c8SBram Moolenaar else 215b544f3c8SBram Moolenaar Xpath 'g' 216b544f3c8SBram Moolenaar endif 217*a6296200SBram Moolenaarendfunc 218b544f3c8SBram Moolenaar 219*a6296200SBram Moolenaarfunc Test_return() 220b544f3c8SBram Moolenaar XpathINIT 221b544f3c8SBram Moolenaar call T4_F() 222b544f3c8SBram Moolenaar Xpath '4' 223b544f3c8SBram Moolenaar 224b544f3c8SBram Moolenaar call assert_equal('ab3e3b2c24', g:Xpath) 225*a6296200SBram Moolenaarendfunc 226b544f3c8SBram Moolenaar 227b544f3c8SBram Moolenaar 228b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 229b544f3c8SBram Moolenaar" Test 5: :finish {{{1 230b544f3c8SBram Moolenaar" 231b544f3c8SBram Moolenaar" This test executes the body of the function T4_F from the previous 232b544f3c8SBram Moolenaar" test as a script file (:return replaced by :finish). 233b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 234b544f3c8SBram Moolenaar 235*a6296200SBram Moolenaarfunc Test_finish() 236b544f3c8SBram Moolenaar XpathINIT 237b544f3c8SBram Moolenaar ExecAsScript T4_F 238b544f3c8SBram Moolenaar Xpath '5' 239b544f3c8SBram Moolenaar call DeleteTheScript() 240b544f3c8SBram Moolenaar 241b544f3c8SBram Moolenaar call assert_equal('ab3e3b2c25', g:Xpath) 242*a6296200SBram Moolenaarendfunc 243b544f3c8SBram Moolenaar 244b544f3c8SBram Moolenaar 245b544f3c8SBram Moolenaar 246b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 247b544f3c8SBram Moolenaar" Test 6: Defining functions in :while loops {{{1 248b544f3c8SBram Moolenaar" 249b544f3c8SBram Moolenaar" Functions can be defined inside other functions. An inner function 250b544f3c8SBram Moolenaar" gets defined when the outer function is executed. Functions may 251b544f3c8SBram Moolenaar" also be defined inside while loops. Expressions in braces for 252b544f3c8SBram Moolenaar" defining the function name are allowed. 253b544f3c8SBram Moolenaar" 254b544f3c8SBram Moolenaar" The functions are defined when sourcing the script, only the 255b544f3c8SBram Moolenaar" resulting path is checked in the test function. 256b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 257b544f3c8SBram Moolenaar 258b544f3c8SBram MoolenaarXpathINIT 259b544f3c8SBram Moolenaar 260b544f3c8SBram Moolenaar" The command CALL collects the argument of all its invocations in "calls" 261b544f3c8SBram Moolenaar" when used from a function (that is, when the global variable "calls" needs 262b544f3c8SBram Moolenaar" the "g:" prefix). This is to check that the function code is skipped when 263b544f3c8SBram Moolenaar" the function is defined. For inner functions, do so only if the outer 264b544f3c8SBram Moolenaar" function is not being executed. 265b544f3c8SBram Moolenaar" 266b544f3c8SBram Moolenaarlet calls = "" 267b544f3c8SBram Moolenaarcom! -nargs=1 CALL 268b544f3c8SBram Moolenaar \ if !exists("calls") && !exists("outer") | 269b544f3c8SBram Moolenaar \ let g:calls = g:calls . <args> | 270b544f3c8SBram Moolenaar \ endif 271b544f3c8SBram Moolenaar 272b544f3c8SBram Moolenaarlet i = 0 273b544f3c8SBram Moolenaarwhile i < 3 274b544f3c8SBram Moolenaar let i = i + 1 275b544f3c8SBram Moolenaar if i == 1 276b544f3c8SBram Moolenaar Xpath 'a' 277b544f3c8SBram Moolenaar function! F1(arg) 278b544f3c8SBram Moolenaar CALL a:arg 279b544f3c8SBram Moolenaar let outer = 1 280b544f3c8SBram Moolenaar 281b544f3c8SBram Moolenaar let j = 0 282b544f3c8SBram Moolenaar while j < 1 283b544f3c8SBram Moolenaar Xpath 'b' 284b544f3c8SBram Moolenaar let j = j + 1 285b544f3c8SBram Moolenaar function! G1(arg) 286b544f3c8SBram Moolenaar CALL a:arg 287b544f3c8SBram Moolenaar endfunction 288b544f3c8SBram Moolenaar Xpath 'c' 289b544f3c8SBram Moolenaar endwhile 290b544f3c8SBram Moolenaar endfunction 291b544f3c8SBram Moolenaar Xpath 'd' 292b544f3c8SBram Moolenaar 293b544f3c8SBram Moolenaar continue 294b544f3c8SBram Moolenaar endif 295b544f3c8SBram Moolenaar 296b544f3c8SBram Moolenaar Xpath 'e' . i 297b544f3c8SBram Moolenaar function! F{i}(i, arg) 298b544f3c8SBram Moolenaar CALL a:arg 299b544f3c8SBram Moolenaar let outer = 1 300b544f3c8SBram Moolenaar 301b544f3c8SBram Moolenaar if a:i == 3 302b544f3c8SBram Moolenaar Xpath 'f' 303b544f3c8SBram Moolenaar endif 304b544f3c8SBram Moolenaar let k = 0 305b544f3c8SBram Moolenaar while k < 3 306b544f3c8SBram Moolenaar Xpath 'g' . k 307b544f3c8SBram Moolenaar let k = k + 1 308b544f3c8SBram Moolenaar function! G{a:i}{k}(arg) 309b544f3c8SBram Moolenaar CALL a:arg 310b544f3c8SBram Moolenaar endfunction 311b544f3c8SBram Moolenaar Xpath 'h' . k 312b544f3c8SBram Moolenaar endwhile 313b544f3c8SBram Moolenaar endfunction 314b544f3c8SBram Moolenaar Xpath 'i' 315b544f3c8SBram Moolenaar 316b544f3c8SBram Moolenaarendwhile 317b544f3c8SBram Moolenaar 318b544f3c8SBram Moolenaarif exists("*G1") 319b544f3c8SBram Moolenaar Xpath 'j' 320b544f3c8SBram Moolenaarendif 321b544f3c8SBram Moolenaarif exists("*F1") 322b544f3c8SBram Moolenaar call F1("F1") 323b544f3c8SBram Moolenaar if exists("*G1") 324b544f3c8SBram Moolenaar call G1("G1") 325b544f3c8SBram Moolenaar endif 326b544f3c8SBram Moolenaarendif 327b544f3c8SBram Moolenaar 328b544f3c8SBram Moolenaarif exists("G21") || exists("G22") || exists("G23") 329b544f3c8SBram Moolenaar Xpath 'k' 330b544f3c8SBram Moolenaarendif 331b544f3c8SBram Moolenaarif exists("*F2") 332b544f3c8SBram Moolenaar call F2(2, "F2") 333b544f3c8SBram Moolenaar if exists("*G21") 334b544f3c8SBram Moolenaar call G21("G21") 335b544f3c8SBram Moolenaar endif 336b544f3c8SBram Moolenaar if exists("*G22") 337b544f3c8SBram Moolenaar call G22("G22") 338b544f3c8SBram Moolenaar endif 339b544f3c8SBram Moolenaar if exists("*G23") 340b544f3c8SBram Moolenaar call G23("G23") 341b544f3c8SBram Moolenaar endif 342b544f3c8SBram Moolenaarendif 343b544f3c8SBram Moolenaar 344b544f3c8SBram Moolenaarif exists("G31") || exists("G32") || exists("G33") 345b544f3c8SBram Moolenaar Xpath 'l' 346b544f3c8SBram Moolenaarendif 347b544f3c8SBram Moolenaarif exists("*F3") 348b544f3c8SBram Moolenaar call F3(3, "F3") 349b544f3c8SBram Moolenaar if exists("*G31") 350b544f3c8SBram Moolenaar call G31("G31") 351b544f3c8SBram Moolenaar endif 352b544f3c8SBram Moolenaar if exists("*G32") 353b544f3c8SBram Moolenaar call G32("G32") 354b544f3c8SBram Moolenaar endif 355b544f3c8SBram Moolenaar if exists("*G33") 356b544f3c8SBram Moolenaar call G33("G33") 357b544f3c8SBram Moolenaar endif 358b544f3c8SBram Moolenaarendif 359b544f3c8SBram Moolenaar 360b544f3c8SBram MoolenaarXpath 'm' 361b544f3c8SBram Moolenaar 362b544f3c8SBram Moolenaarlet g:test6_result = g:Xpath 363b544f3c8SBram Moolenaarlet g:test6_calls = calls 364b544f3c8SBram Moolenaar 365b544f3c8SBram Moolenaarunlet calls 366b544f3c8SBram Moolenaardelfunction F1 367b544f3c8SBram Moolenaardelfunction G1 368b544f3c8SBram Moolenaardelfunction F2 369b544f3c8SBram Moolenaardelfunction G21 370b544f3c8SBram Moolenaardelfunction G22 371b544f3c8SBram Moolenaardelfunction G23 372b544f3c8SBram Moolenaardelfunction G31 373b544f3c8SBram Moolenaardelfunction G32 374b544f3c8SBram Moolenaardelfunction G33 375b544f3c8SBram Moolenaar 376*a6296200SBram Moolenaarfunc Test_defining_functions() 377b544f3c8SBram Moolenaar call assert_equal('ade2ie3ibcg0h1g1h2g2h3fg0h1g1h2g2h3m', g:test6_result) 378b544f3c8SBram Moolenaar call assert_equal('F1G1F2G21G22G23F3G31G32G33', g:test6_calls) 379b544f3c8SBram Moolenaarendfunc 380b544f3c8SBram Moolenaar 381b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 382b544f3c8SBram Moolenaar" Test 7: Continuing on errors outside functions {{{1 383b544f3c8SBram Moolenaar" 384b544f3c8SBram Moolenaar" On an error outside a function, the script processing continues 385b544f3c8SBram Moolenaar" at the line following the outermost :endif or :endwhile. When not 386b544f3c8SBram Moolenaar" inside an :if or :while, the script processing continues at the next 387b544f3c8SBram Moolenaar" line. 388b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 389b544f3c8SBram Moolenaar 390b544f3c8SBram MoolenaarXpathINIT 391b544f3c8SBram Moolenaar 392b544f3c8SBram Moolenaarif 1 393b544f3c8SBram Moolenaar Xpath 'a' 394b544f3c8SBram Moolenaar while 1 395b544f3c8SBram Moolenaar Xpath 'b' 396b544f3c8SBram Moolenaar asdf 397b544f3c8SBram Moolenaar Xpath 'c' 398b544f3c8SBram Moolenaar break 399b544f3c8SBram Moolenaar endwhile | Xpath 'd' 400b544f3c8SBram Moolenaar Xpath 'e' 401b544f3c8SBram Moolenaarendif | Xpath 'f' 402b544f3c8SBram MoolenaarXpath 'g' 403b544f3c8SBram Moolenaar 404b544f3c8SBram Moolenaarwhile 1 405b544f3c8SBram Moolenaar Xpath 'h' 406b544f3c8SBram Moolenaar if 1 407b544f3c8SBram Moolenaar Xpath 'i' 408b544f3c8SBram Moolenaar asdf 409b544f3c8SBram Moolenaar Xpath 'j' 410b544f3c8SBram Moolenaar endif | Xpath 'k' 411b544f3c8SBram Moolenaar Xpath 'l' 412b544f3c8SBram Moolenaar break 413b544f3c8SBram Moolenaarendwhile | Xpath 'm' 414b544f3c8SBram MoolenaarXpath 'n' 415b544f3c8SBram Moolenaar 416b544f3c8SBram Moolenaarasdf 417b544f3c8SBram MoolenaarXpath 'o' 418b544f3c8SBram Moolenaar 419b544f3c8SBram Moolenaarasdf | Xpath 'p' 420b544f3c8SBram MoolenaarXpath 'q' 421b544f3c8SBram Moolenaar 422b544f3c8SBram Moolenaarlet g:test7_result = g:Xpath 423b544f3c8SBram Moolenaar 424b544f3c8SBram Moolenaarfunc Test_error_in_script() 425b544f3c8SBram Moolenaar call assert_equal('abghinoq', g:test7_result) 426b544f3c8SBram Moolenaarendfunc 427b544f3c8SBram Moolenaar 428b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 429b544f3c8SBram Moolenaar" Test 8: Aborting and continuing on errors inside functions {{{1 430b544f3c8SBram Moolenaar" 431b544f3c8SBram Moolenaar" On an error inside a function without the "abort" attribute, the 432b544f3c8SBram Moolenaar" script processing continues at the next line (unless the error was 433b544f3c8SBram Moolenaar" in a :return command). On an error inside a function with the 434b544f3c8SBram Moolenaar" "abort" attribute, the function is aborted and the script processing 435b544f3c8SBram Moolenaar" continues after the function call; the value -1 is returned then. 436b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 437b544f3c8SBram Moolenaar 438b544f3c8SBram MoolenaarXpathINIT 439b544f3c8SBram Moolenaar 440*a6296200SBram Moolenaarfunc T8_F() 441b544f3c8SBram Moolenaar if 1 442b544f3c8SBram Moolenaar Xpath 'a' 443b544f3c8SBram Moolenaar while 1 444b544f3c8SBram Moolenaar Xpath 'b' 445b544f3c8SBram Moolenaar asdf 446b544f3c8SBram Moolenaar Xpath 'c' 447b544f3c8SBram Moolenaar asdf | Xpath 'd' 448b544f3c8SBram Moolenaar Xpath 'e' 449b544f3c8SBram Moolenaar break 450b544f3c8SBram Moolenaar endwhile 451b544f3c8SBram Moolenaar Xpath 'f' 452b544f3c8SBram Moolenaar endif | Xpath 'g' 453b544f3c8SBram Moolenaar Xpath 'h' 454b544f3c8SBram Moolenaar 455b544f3c8SBram Moolenaar while 1 456b544f3c8SBram Moolenaar Xpath 'i' 457b544f3c8SBram Moolenaar if 1 458b544f3c8SBram Moolenaar Xpath 'j' 459b544f3c8SBram Moolenaar asdf 460b544f3c8SBram Moolenaar Xpath 'k' 461b544f3c8SBram Moolenaar asdf | Xpath 'l' 462b544f3c8SBram Moolenaar Xpath 'm' 463b544f3c8SBram Moolenaar endif 464b544f3c8SBram Moolenaar Xpath 'n' 465b544f3c8SBram Moolenaar break 466b544f3c8SBram Moolenaar endwhile | Xpath 'o' 467b544f3c8SBram Moolenaar Xpath 'p' 468b544f3c8SBram Moolenaar 469b544f3c8SBram Moolenaar return novar " returns (default return value 0) 470b544f3c8SBram Moolenaar Xpath 'q' 471b544f3c8SBram Moolenaar return 1 " not reached 472*a6296200SBram Moolenaarendfunc 473b544f3c8SBram Moolenaar 474*a6296200SBram Moolenaarfunc T8_G() abort 475b544f3c8SBram Moolenaar if 1 476b544f3c8SBram Moolenaar Xpath 'r' 477b544f3c8SBram Moolenaar while 1 478b544f3c8SBram Moolenaar Xpath 's' 479b544f3c8SBram Moolenaar asdf " returns -1 480b544f3c8SBram Moolenaar Xpath 't' 481b544f3c8SBram Moolenaar break 482b544f3c8SBram Moolenaar endwhile 483b544f3c8SBram Moolenaar Xpath 'v' 484b544f3c8SBram Moolenaar endif | Xpath 'w' 485b544f3c8SBram Moolenaar Xpath 'x' 486b544f3c8SBram Moolenaar 487b544f3c8SBram Moolenaar return -4 " not reached 488*a6296200SBram Moolenaarendfunc 489b544f3c8SBram Moolenaar 490*a6296200SBram Moolenaarfunc T8_H() abort 491b544f3c8SBram Moolenaar while 1 492b544f3c8SBram Moolenaar Xpath 'A' 493b544f3c8SBram Moolenaar if 1 494b544f3c8SBram Moolenaar Xpath 'B' 495b544f3c8SBram Moolenaar asdf " returns -1 496b544f3c8SBram Moolenaar Xpath 'C' 497b544f3c8SBram Moolenaar endif 498b544f3c8SBram Moolenaar Xpath 'D' 499b544f3c8SBram Moolenaar break 500b544f3c8SBram Moolenaar endwhile | Xpath 'E' 501b544f3c8SBram Moolenaar Xpath 'F' 502b544f3c8SBram Moolenaar 503b544f3c8SBram Moolenaar return -4 " not reached 504*a6296200SBram Moolenaarendfunc 505b544f3c8SBram Moolenaar 506b544f3c8SBram Moolenaar" Aborted functions (T8_G and T8_H) return -1. 507b544f3c8SBram Moolenaarlet g:test8_sum = (T8_F() + 1) - 4 * T8_G() - 8 * T8_H() 508b544f3c8SBram MoolenaarXpath 'X' 509b544f3c8SBram Moolenaarlet g:test8_result = g:Xpath 510b544f3c8SBram Moolenaar 511b544f3c8SBram Moolenaarfunc Test_error_in_function() 512b544f3c8SBram Moolenaar call assert_equal(13, g:test8_sum) 513b544f3c8SBram Moolenaar call assert_equal('abcefghijkmnoprsABX', g:test8_result) 514b544f3c8SBram Moolenaar 515b544f3c8SBram Moolenaar delfunction T8_F 516b544f3c8SBram Moolenaar delfunction T8_G 517b544f3c8SBram Moolenaar delfunction T8_H 518b544f3c8SBram Moolenaarendfunc 519b544f3c8SBram Moolenaar 520b544f3c8SBram Moolenaar 521b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 522b544f3c8SBram Moolenaar" Test 9: Continuing after aborted functions {{{1 523b544f3c8SBram Moolenaar" 524b544f3c8SBram Moolenaar" When a function with the "abort" attribute is aborted due to an 525b544f3c8SBram Moolenaar" error, the next function back in the call hierarchy without an 526b544f3c8SBram Moolenaar" "abort" attribute continues; the value -1 is returned then. 527b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 528b544f3c8SBram Moolenaar 529b544f3c8SBram MoolenaarXpathINIT 530b544f3c8SBram Moolenaar 531*a6296200SBram Moolenaarfunc F() abort 532b544f3c8SBram Moolenaar Xpath 'a' 533b544f3c8SBram Moolenaar let result = G() " not aborted 534b544f3c8SBram Moolenaar Xpath 'b' 535b544f3c8SBram Moolenaar if result != 2 536b544f3c8SBram Moolenaar Xpath 'c' 537b544f3c8SBram Moolenaar endif 538b544f3c8SBram Moolenaar return 1 539*a6296200SBram Moolenaarendfunc 540b544f3c8SBram Moolenaar 541*a6296200SBram Moolenaarfunc G() " no abort attribute 542b544f3c8SBram Moolenaar Xpath 'd' 543b544f3c8SBram Moolenaar if H() != -1 " aborted 544b544f3c8SBram Moolenaar Xpath 'e' 545b544f3c8SBram Moolenaar endif 546b544f3c8SBram Moolenaar Xpath 'f' 547b544f3c8SBram Moolenaar return 2 548*a6296200SBram Moolenaarendfunc 549b544f3c8SBram Moolenaar 550*a6296200SBram Moolenaarfunc H() abort 551b544f3c8SBram Moolenaar Xpath 'g' 552b544f3c8SBram Moolenaar call I() " aborted 553b544f3c8SBram Moolenaar Xpath 'h' 554b544f3c8SBram Moolenaar return 4 555*a6296200SBram Moolenaarendfunc 556b544f3c8SBram Moolenaar 557*a6296200SBram Moolenaarfunc I() abort 558b544f3c8SBram Moolenaar Xpath 'i' 559b544f3c8SBram Moolenaar asdf " error 560b544f3c8SBram Moolenaar Xpath 'j' 561b544f3c8SBram Moolenaar return 8 562*a6296200SBram Moolenaarendfunc 563b544f3c8SBram Moolenaar 564b544f3c8SBram Moolenaarif F() != 1 565b544f3c8SBram Moolenaar Xpath 'k' 566b544f3c8SBram Moolenaarendif 567b544f3c8SBram Moolenaar 568b544f3c8SBram Moolenaarlet g:test9_result = g:Xpath 569b544f3c8SBram Moolenaar 570b544f3c8SBram Moolenaardelfunction F 571b544f3c8SBram Moolenaardelfunction G 572b544f3c8SBram Moolenaardelfunction H 573b544f3c8SBram Moolenaardelfunction I 574b544f3c8SBram Moolenaar 575b544f3c8SBram Moolenaarfunc Test_func_abort() 576b544f3c8SBram Moolenaar call assert_equal('adgifb', g:test9_result) 577b544f3c8SBram Moolenaarendfunc 578b544f3c8SBram Moolenaar 579b544f3c8SBram Moolenaar 580b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 581b544f3c8SBram Moolenaar" Test 10: :if, :elseif, :while argument parsing {{{1 582b544f3c8SBram Moolenaar" 583b544f3c8SBram Moolenaar" A '"' or '|' in an argument expression must not be mixed up with 584b544f3c8SBram Moolenaar" a comment or a next command after a bar. Parsing errors should 585b544f3c8SBram Moolenaar" be recognized. 586b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 587b544f3c8SBram Moolenaar 588b544f3c8SBram MoolenaarXpathINIT 589b544f3c8SBram Moolenaar 590*a6296200SBram Moolenaarfunc MSG(enr, emsg) 591b544f3c8SBram Moolenaar let english = v:lang == "C" || v:lang =~ '^[Ee]n' 592b544f3c8SBram Moolenaar if a:enr == "" 593b544f3c8SBram Moolenaar Xout "TODO: Add message number for:" a:emsg 594b544f3c8SBram Moolenaar let v:errmsg = ":" . v:errmsg 595b544f3c8SBram Moolenaar endif 596b544f3c8SBram Moolenaar let match = 1 597b544f3c8SBram Moolenaar if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg) 598b544f3c8SBram Moolenaar let match = 0 599b544f3c8SBram Moolenaar if v:errmsg == "" 600b544f3c8SBram Moolenaar Xout "Message missing." 601b544f3c8SBram Moolenaar else 602a4208966SBram Moolenaar let v:errmsg = v:errmsg->escape('"') 603b544f3c8SBram Moolenaar Xout "Unexpected message:" v:errmsg 604b544f3c8SBram Moolenaar endif 605b544f3c8SBram Moolenaar endif 606b544f3c8SBram Moolenaar return match 6071e115360SBram Moolenaarendfunc 608b544f3c8SBram Moolenaar 609b544f3c8SBram Moolenaarif 1 || strlen("\"") | Xpath 'a' 610b544f3c8SBram Moolenaar Xpath 'b' 611b544f3c8SBram Moolenaarendif 612b544f3c8SBram MoolenaarXpath 'c' 613b544f3c8SBram Moolenaar 614b544f3c8SBram Moolenaarif 0 615b544f3c8SBram Moolenaarelseif 1 || strlen("\"") | Xpath 'd' 616b544f3c8SBram Moolenaar Xpath 'e' 617b544f3c8SBram Moolenaarendif 618b544f3c8SBram MoolenaarXpath 'f' 619b544f3c8SBram Moolenaar 620b544f3c8SBram Moolenaarwhile 1 || strlen("\"") | Xpath 'g' 621b544f3c8SBram Moolenaar Xpath 'h' 622b544f3c8SBram Moolenaar break 623b544f3c8SBram Moolenaarendwhile 624b544f3c8SBram MoolenaarXpath 'i' 625b544f3c8SBram Moolenaar 626b544f3c8SBram Moolenaarlet v:errmsg = "" 627b544f3c8SBram Moolenaarif 1 ||| strlen("\"") | Xpath 'j' 628b544f3c8SBram Moolenaar Xpath 'k' 629b544f3c8SBram Moolenaarendif 630b544f3c8SBram MoolenaarXpath 'l' 631b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 632b544f3c8SBram Moolenaar Xpath 'm' 633b544f3c8SBram Moolenaarendif 634b544f3c8SBram Moolenaar 635b544f3c8SBram Moolenaarlet v:errmsg = "" 636b544f3c8SBram Moolenaarif 0 637b544f3c8SBram Moolenaarelseif 1 ||| strlen("\"") | Xpath 'n' 638b544f3c8SBram Moolenaar Xpath 'o' 639b544f3c8SBram Moolenaarendif 640b544f3c8SBram MoolenaarXpath 'p' 641b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 642b544f3c8SBram Moolenaar Xpath 'q' 643b544f3c8SBram Moolenaarendif 644b544f3c8SBram Moolenaar 645b544f3c8SBram Moolenaarlet v:errmsg = "" 646b544f3c8SBram Moolenaarwhile 1 ||| strlen("\"") | Xpath 'r' 647b544f3c8SBram Moolenaar Xpath 's' 648b544f3c8SBram Moolenaar break 649b544f3c8SBram Moolenaarendwhile 650b544f3c8SBram MoolenaarXpath 't' 651b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression") 652b544f3c8SBram Moolenaar Xpath 'u' 653b544f3c8SBram Moolenaarendif 654b544f3c8SBram Moolenaar 655b544f3c8SBram Moolenaarlet g:test10_result = g:Xpath 656b544f3c8SBram Moolenaardelfunction MSG 657b544f3c8SBram Moolenaar 658b544f3c8SBram Moolenaarfunc Test_expr_parsing() 659b544f3c8SBram Moolenaar call assert_equal('abcdefghilpt', g:test10_result) 660b544f3c8SBram Moolenaarendfunc 661b544f3c8SBram Moolenaar 662b544f3c8SBram Moolenaar 663b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 664b544f3c8SBram Moolenaar" Test 11: :if, :elseif, :while argument evaluation after abort {{{1 665b544f3c8SBram Moolenaar" 666b544f3c8SBram Moolenaar" When code is skipped over due to an error, the boolean argument to 667b544f3c8SBram Moolenaar" an :if, :elseif, or :while must not be evaluated. 668b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 669b544f3c8SBram Moolenaar 670b544f3c8SBram MoolenaarXpathINIT 671b544f3c8SBram Moolenaar 672b544f3c8SBram Moolenaarlet calls = 0 673b544f3c8SBram Moolenaar 674*a6296200SBram Moolenaarfunc P(num) 675b544f3c8SBram Moolenaar let g:calls = g:calls + a:num " side effect on call 676b544f3c8SBram Moolenaar return 0 677*a6296200SBram Moolenaarendfunc 678b544f3c8SBram Moolenaar 679b544f3c8SBram Moolenaarif 1 680b544f3c8SBram Moolenaar Xpath 'a' 681b544f3c8SBram Moolenaar asdf " error 682b544f3c8SBram Moolenaar Xpath 'b' 683b544f3c8SBram Moolenaar if P(1) " should not be called 684b544f3c8SBram Moolenaar Xpath 'c' 685b544f3c8SBram Moolenaar elseif !P(2) " should not be called 686b544f3c8SBram Moolenaar Xpath 'd' 687b544f3c8SBram Moolenaar else 688b544f3c8SBram Moolenaar Xpath 'e' 689b544f3c8SBram Moolenaar endif 690b544f3c8SBram Moolenaar Xpath 'f' 691b544f3c8SBram Moolenaar while P(4) " should not be called 692b544f3c8SBram Moolenaar Xpath 'g' 693b544f3c8SBram Moolenaar endwhile 694b544f3c8SBram Moolenaar Xpath 'h' 695b544f3c8SBram Moolenaarendif 696b544f3c8SBram MoolenaarXpath 'x' 697b544f3c8SBram Moolenaar 698b544f3c8SBram Moolenaarlet g:test11_calls = calls 699b544f3c8SBram Moolenaarlet g:test11_result = g:Xpath 700b544f3c8SBram Moolenaar 701b544f3c8SBram Moolenaarunlet calls 702b544f3c8SBram Moolenaardelfunction P 703b544f3c8SBram Moolenaar 704b544f3c8SBram Moolenaarfunc Test_arg_abort() 705b544f3c8SBram Moolenaar call assert_equal(0, g:test11_calls) 706b544f3c8SBram Moolenaar call assert_equal('ax', g:test11_result) 707b544f3c8SBram Moolenaarendfunc 708b544f3c8SBram Moolenaar 709b544f3c8SBram Moolenaar 710b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 711b544f3c8SBram Moolenaar" Test 12: Expressions in braces in skipped code {{{1 712b544f3c8SBram Moolenaar" 713b544f3c8SBram Moolenaar" In code skipped over due to an error or inactive conditional, 714b544f3c8SBram Moolenaar" an expression in braces as part of a variable or function name 715b544f3c8SBram Moolenaar" should not be evaluated. 716b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 717b544f3c8SBram Moolenaar 718b544f3c8SBram MoolenaarXpathINIT 719b544f3c8SBram Moolenaar 720b544f3c8SBram Moolenaarfunction! NULL() 721b544f3c8SBram Moolenaar Xpath 'a' 722b544f3c8SBram Moolenaar return 0 723b544f3c8SBram Moolenaarendfunction 724b544f3c8SBram Moolenaar 725b544f3c8SBram Moolenaarfunction! ZERO() 726b544f3c8SBram Moolenaar Xpath 'b' 727b544f3c8SBram Moolenaar return 0 728b544f3c8SBram Moolenaarendfunction 729b544f3c8SBram Moolenaar 730b544f3c8SBram Moolenaarfunction! F0() 731b544f3c8SBram Moolenaar Xpath 'c' 732b544f3c8SBram Moolenaarendfunction 733b544f3c8SBram Moolenaar 734b544f3c8SBram Moolenaarfunction! F1(arg) 735b544f3c8SBram Moolenaar Xpath 'e' 736b544f3c8SBram Moolenaarendfunction 737b544f3c8SBram Moolenaar 738b544f3c8SBram Moolenaarlet V0 = 1 739b544f3c8SBram Moolenaar 740b544f3c8SBram MoolenaarXpath 'f' 741b544f3c8SBram Moolenaarecho 0 ? F{NULL() + V{ZERO()}}() : 1 742b544f3c8SBram Moolenaar 743b544f3c8SBram MoolenaarXpath 'g' 744b544f3c8SBram Moolenaarif 0 745b544f3c8SBram Moolenaar Xpath 'h' 746b544f3c8SBram Moolenaar call F{NULL() + V{ZERO()}}() 747b544f3c8SBram Moolenaarendif 748b544f3c8SBram Moolenaar 749b544f3c8SBram MoolenaarXpath 'i' 750b544f3c8SBram Moolenaarif 1 751b544f3c8SBram Moolenaar asdf " error 752b544f3c8SBram Moolenaar Xpath 'j' 753b544f3c8SBram Moolenaar call F1(F{NULL() + V{ZERO()}}()) 754b544f3c8SBram Moolenaarendif 755b544f3c8SBram Moolenaar 756b544f3c8SBram MoolenaarXpath 'k' 757b544f3c8SBram Moolenaarif 1 758b544f3c8SBram Moolenaar asdf " error 759b544f3c8SBram Moolenaar Xpath 'l' 760b544f3c8SBram Moolenaar call F{NULL() + V{ZERO()}}() 761b544f3c8SBram Moolenaarendif 762b544f3c8SBram Moolenaar 763b544f3c8SBram Moolenaarlet g:test12_result = g:Xpath 764b544f3c8SBram Moolenaar 765b544f3c8SBram Moolenaarfunc Test_braces_skipped() 766b544f3c8SBram Moolenaar call assert_equal('fgik', g:test12_result) 767b544f3c8SBram Moolenaarendfunc 768b544f3c8SBram Moolenaar 769b544f3c8SBram Moolenaar 770b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 771b544f3c8SBram Moolenaar" Test 13: Failure in argument evaluation for :while {{{1 772b544f3c8SBram Moolenaar" 773b544f3c8SBram Moolenaar" A failure in the expression evaluation for the condition of a :while 774b544f3c8SBram Moolenaar" causes the whole :while loop until the matching :endwhile being 775b544f3c8SBram Moolenaar" ignored. Continuation is at the next following line. 776b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 777b544f3c8SBram Moolenaar 778b544f3c8SBram MoolenaarXpathINIT 779b544f3c8SBram Moolenaar 780b544f3c8SBram MoolenaarXpath 'a' 781b544f3c8SBram Moolenaarwhile asdf 782b544f3c8SBram Moolenaar Xpath 'b' 783b544f3c8SBram Moolenaar while 1 784b544f3c8SBram Moolenaar Xpath 'c' 785b544f3c8SBram Moolenaar break 786b544f3c8SBram Moolenaar endwhile 787b544f3c8SBram Moolenaar Xpath 'd' 788b544f3c8SBram Moolenaar break 789b544f3c8SBram Moolenaarendwhile 790b544f3c8SBram MoolenaarXpath 'e' 791b544f3c8SBram Moolenaar 792b544f3c8SBram Moolenaarwhile asdf | Xpath 'f' | endwhile | Xpath 'g' 793b544f3c8SBram MoolenaarXpath 'h' 794b544f3c8SBram Moolenaarlet g:test13_result = g:Xpath 795b544f3c8SBram Moolenaar 796b544f3c8SBram Moolenaarfunc Test_while_fail() 797b544f3c8SBram Moolenaar call assert_equal('aeh', g:test13_result) 798b544f3c8SBram Moolenaarendfunc 799b544f3c8SBram Moolenaar 800b544f3c8SBram Moolenaar 801b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 802b544f3c8SBram Moolenaar" Test 14: Failure in argument evaluation for :if {{{1 803b544f3c8SBram Moolenaar" 804b544f3c8SBram Moolenaar" A failure in the expression evaluation for the condition of an :if 805b544f3c8SBram Moolenaar" does not cause the corresponding :else or :endif being matched to 806b544f3c8SBram Moolenaar" a previous :if/:elseif. Neither of both branches of the failed :if 807b544f3c8SBram Moolenaar" are executed. 808b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 809b544f3c8SBram Moolenaar 810b544f3c8SBram MoolenaarXpathINIT 811b544f3c8SBram Moolenaar 812b544f3c8SBram Moolenaarfunction! F() 813b544f3c8SBram Moolenaar Xpath 'a' 814b544f3c8SBram Moolenaar let x = 0 815b544f3c8SBram Moolenaar if x " false 816b544f3c8SBram Moolenaar Xpath 'b' 817b544f3c8SBram Moolenaar elseif !x " always true 818b544f3c8SBram Moolenaar Xpath 'c' 819b544f3c8SBram Moolenaar let x = 1 820b544f3c8SBram Moolenaar if g:boolvar " possibly undefined 821b544f3c8SBram Moolenaar Xpath 'd' 822b544f3c8SBram Moolenaar else 823b544f3c8SBram Moolenaar Xpath 'e' 824b544f3c8SBram Moolenaar endif 825b544f3c8SBram Moolenaar Xpath 'f' 826b544f3c8SBram Moolenaar elseif x " never executed 827b544f3c8SBram Moolenaar Xpath 'g' 828b544f3c8SBram Moolenaar endif 829b544f3c8SBram Moolenaar Xpath 'h' 830b544f3c8SBram Moolenaarendfunction 831b544f3c8SBram Moolenaar 832b544f3c8SBram Moolenaarlet boolvar = 1 833b544f3c8SBram Moolenaarcall F() 834b544f3c8SBram MoolenaarXpath '-' 835b544f3c8SBram Moolenaar 836b544f3c8SBram Moolenaarunlet boolvar 837b544f3c8SBram Moolenaarcall F() 838b544f3c8SBram Moolenaarlet g:test14_result = g:Xpath 839b544f3c8SBram Moolenaar 840b544f3c8SBram Moolenaardelfunction F 841b544f3c8SBram Moolenaar 842b544f3c8SBram Moolenaarfunc Test_if_fail() 843b544f3c8SBram Moolenaar call assert_equal('acdfh-acfh', g:test14_result) 844b544f3c8SBram Moolenaarendfunc 845b544f3c8SBram Moolenaar 846b544f3c8SBram Moolenaar 847b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 848b544f3c8SBram Moolenaar" Test 15: Failure in argument evaluation for :if (bar) {{{1 849b544f3c8SBram Moolenaar" 850b544f3c8SBram Moolenaar" Like previous test, except that the failing :if ... | ... | :endif 851b544f3c8SBram Moolenaar" is in a single line. 852b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 853b544f3c8SBram Moolenaar 854b544f3c8SBram MoolenaarXpathINIT 855b544f3c8SBram Moolenaar 856b544f3c8SBram Moolenaarfunction! F() 857b544f3c8SBram Moolenaar Xpath 'a' 858b544f3c8SBram Moolenaar let x = 0 859b544f3c8SBram Moolenaar if x " false 860b544f3c8SBram Moolenaar Xpath 'b' 861b544f3c8SBram Moolenaar elseif !x " always true 862b544f3c8SBram Moolenaar Xpath 'c' 863b544f3c8SBram Moolenaar let x = 1 864b544f3c8SBram Moolenaar if g:boolvar | Xpath 'd' | else | Xpath 'e' | endif 865b544f3c8SBram Moolenaar Xpath 'f' 866b544f3c8SBram Moolenaar elseif x " never executed 867b544f3c8SBram Moolenaar Xpath 'g' 868b544f3c8SBram Moolenaar endif 869b544f3c8SBram Moolenaar Xpath 'h' 870b544f3c8SBram Moolenaarendfunction 871b544f3c8SBram Moolenaar 872b544f3c8SBram Moolenaarlet boolvar = 1 873b544f3c8SBram Moolenaarcall F() 874b544f3c8SBram MoolenaarXpath '-' 875b544f3c8SBram Moolenaar 876b544f3c8SBram Moolenaarunlet boolvar 877b544f3c8SBram Moolenaarcall F() 878b544f3c8SBram Moolenaarlet g:test15_result = g:Xpath 879b544f3c8SBram Moolenaar 880b544f3c8SBram Moolenaardelfunction F 881b544f3c8SBram Moolenaar 882b544f3c8SBram Moolenaarfunc Test_if_bar_fail() 883b544f3c8SBram Moolenaar call assert_equal('acdfh-acfh', g:test15_result) 884b544f3c8SBram Moolenaarendfunc 885b544f3c8SBram Moolenaar 886b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 8871f068233SBram Moolenaar" Test 16: Double :else or :elseif after :else {{{1 8881f068233SBram Moolenaar" 8891f068233SBram Moolenaar" Multiple :elses or an :elseif after an :else are forbidden. 8901f068233SBram Moolenaar"------------------------------------------------------------------------------- 8911f068233SBram Moolenaar 8921f068233SBram Moolenaarfunc T16_F() abort 8931f068233SBram Moolenaar if 0 8941f068233SBram Moolenaar Xpath 'a' 8951f068233SBram Moolenaar else 8961f068233SBram Moolenaar Xpath 'b' 8971f068233SBram Moolenaar else " aborts function 8981f068233SBram Moolenaar Xpath 'c' 8991f068233SBram Moolenaar endif 9001f068233SBram Moolenaar Xpath 'd' 9011f068233SBram Moolenaarendfunc 9021f068233SBram Moolenaar 9031f068233SBram Moolenaarfunc T16_G() abort 9041f068233SBram Moolenaar if 0 9051f068233SBram Moolenaar Xpath 'a' 9061f068233SBram Moolenaar else 9071f068233SBram Moolenaar Xpath 'b' 9081f068233SBram Moolenaar elseif 1 " aborts function 9091f068233SBram Moolenaar Xpath 'c' 9101f068233SBram Moolenaar else 9111f068233SBram Moolenaar Xpath 'd' 9121f068233SBram Moolenaar endif 9131f068233SBram Moolenaar Xpath 'e' 9141f068233SBram Moolenaarendfunc 9151f068233SBram Moolenaar 9161f068233SBram Moolenaarfunc T16_H() abort 9171f068233SBram Moolenaar if 0 9181f068233SBram Moolenaar Xpath 'a' 9191f068233SBram Moolenaar elseif 0 9201f068233SBram Moolenaar Xpath 'b' 9211f068233SBram Moolenaar else 9221f068233SBram Moolenaar Xpath 'c' 9231f068233SBram Moolenaar else " aborts function 9241f068233SBram Moolenaar Xpath 'd' 9251f068233SBram Moolenaar endif 9261f068233SBram Moolenaar Xpath 'e' 9271f068233SBram Moolenaarendfunc 9281f068233SBram Moolenaar 9291f068233SBram Moolenaarfunc T16_I() abort 9301f068233SBram Moolenaar if 0 9311f068233SBram Moolenaar Xpath 'a' 9321f068233SBram Moolenaar elseif 0 9331f068233SBram Moolenaar Xpath 'b' 9341f068233SBram Moolenaar else 9351f068233SBram Moolenaar Xpath 'c' 9361f068233SBram Moolenaar elseif 1 " aborts function 9371f068233SBram Moolenaar Xpath 'd' 9381f068233SBram Moolenaar else 9391f068233SBram Moolenaar Xpath 'e' 9401f068233SBram Moolenaar endif 9411f068233SBram Moolenaar Xpath 'f' 9421f068233SBram Moolenaarendfunc 9431f068233SBram Moolenaar 9441f068233SBram Moolenaarfunc Test_Multi_Else() 9451f068233SBram Moolenaar XpathINIT 9461f068233SBram Moolenaar try 9471f068233SBram Moolenaar call T16_F() 9481f068233SBram Moolenaar catch /E583:/ 9491f068233SBram Moolenaar Xpath 'e' 9501f068233SBram Moolenaar endtry 9511f068233SBram Moolenaar call assert_equal('be', g:Xpath) 9521f068233SBram Moolenaar 9531f068233SBram Moolenaar XpathINIT 9541f068233SBram Moolenaar try 9551f068233SBram Moolenaar call T16_G() 9561f068233SBram Moolenaar catch /E584:/ 9571f068233SBram Moolenaar Xpath 'f' 9581f068233SBram Moolenaar endtry 9591f068233SBram Moolenaar call assert_equal('bf', g:Xpath) 9601f068233SBram Moolenaar 9611f068233SBram Moolenaar XpathINIT 9621f068233SBram Moolenaar try 9631f068233SBram Moolenaar call T16_H() 9641f068233SBram Moolenaar catch /E583:/ 9651f068233SBram Moolenaar Xpath 'f' 9661f068233SBram Moolenaar endtry 9671f068233SBram Moolenaar call assert_equal('cf', g:Xpath) 9681f068233SBram Moolenaar 9691f068233SBram Moolenaar XpathINIT 9701f068233SBram Moolenaar try 9711f068233SBram Moolenaar call T16_I() 9721f068233SBram Moolenaar catch /E584:/ 9731f068233SBram Moolenaar Xpath 'g' 9741f068233SBram Moolenaar endtry 9751f068233SBram Moolenaar call assert_equal('cg', g:Xpath) 9761f068233SBram Moolenaarendfunc 9771f068233SBram Moolenaar 9781f068233SBram Moolenaar"------------------------------------------------------------------------------- 9791f068233SBram Moolenaar" Test 17: Nesting of unmatched :if or :endif inside a :while {{{1 9801f068233SBram Moolenaar" 9811f068233SBram Moolenaar" The :while/:endwhile takes precedence in nesting over an unclosed 9821f068233SBram Moolenaar" :if or an unopened :endif. 9831f068233SBram Moolenaar"------------------------------------------------------------------------------- 9841f068233SBram Moolenaar 9851f068233SBram Moolenaar" While loops inside a function are continued on error. 9861f068233SBram Moolenaarfunc T17_F() 9871f068233SBram Moolenaar let loops = 3 9881f068233SBram Moolenaar while loops > 0 9891f068233SBram Moolenaar let loops -= 1 9901f068233SBram Moolenaar Xpath 'a' . loops 9911f068233SBram Moolenaar if (loops == 1) 9921f068233SBram Moolenaar Xpath 'b' . loops 9931f068233SBram Moolenaar continue 9941f068233SBram Moolenaar elseif (loops == 0) 9951f068233SBram Moolenaar Xpath 'c' . loops 9961f068233SBram Moolenaar break 9971f068233SBram Moolenaar elseif 1 9981f068233SBram Moolenaar Xpath 'd' . loops 9991f068233SBram Moolenaar " endif missing! 10001f068233SBram Moolenaar endwhile " :endwhile after :if 1 10011f068233SBram Moolenaar Xpath 'e' 10021f068233SBram Moolenaarendfunc 10031f068233SBram Moolenaar 10041f068233SBram Moolenaarfunc T17_G() 10051f068233SBram Moolenaar let loops = 2 10061f068233SBram Moolenaar while loops > 0 10071f068233SBram Moolenaar let loops -= 1 10081f068233SBram Moolenaar Xpath 'a' . loops 10091f068233SBram Moolenaar if 0 10101f068233SBram Moolenaar Xpath 'b' . loops 10111f068233SBram Moolenaar " endif missing 10121f068233SBram Moolenaar endwhile " :endwhile after :if 0 10131f068233SBram Moolenaarendfunc 10141f068233SBram Moolenaar 10151f068233SBram Moolenaarfunc T17_H() 10161f068233SBram Moolenaar let loops = 2 10171f068233SBram Moolenaar while loops > 0 10181f068233SBram Moolenaar let loops -= 1 10191f068233SBram Moolenaar Xpath 'a' . loops 10201f068233SBram Moolenaar " if missing! 10211f068233SBram Moolenaar endif " :endif without :if in while 10221f068233SBram Moolenaar Xpath 'b' . loops 10231f068233SBram Moolenaar endwhile 10241f068233SBram Moolenaarendfunc 10251f068233SBram Moolenaar 10261f068233SBram Moolenaar" Error continuation outside a function is at the outermost :endwhile or :endif. 10271f068233SBram MoolenaarXpathINIT 10281f068233SBram Moolenaarlet v:errmsg = '' 10291f068233SBram Moolenaarlet loops = 2 10301f068233SBram Moolenaarwhile loops > 0 10311f068233SBram Moolenaar let loops -= 1 10321f068233SBram Moolenaar Xpath 'a' . loops 10331f068233SBram Moolenaar if 0 10341f068233SBram Moolenaar Xpath 'b' . loops 10351f068233SBram Moolenaar " endif missing! Following :endwhile fails. 10361f068233SBram Moolenaarendwhile | Xpath 'c' 10371f068233SBram MoolenaarXpath 'd' 10381f068233SBram Moolenaarcall assert_match('E171:', v:errmsg) 10391f068233SBram Moolenaarcall assert_equal('a1d', g:Xpath) 10401f068233SBram Moolenaar 10411f068233SBram Moolenaarfunc Test_unmatched_if_in_while() 10421f068233SBram Moolenaar XpathINIT 10431f068233SBram Moolenaar call assert_fails('call T17_F()', 'E171:') 10441f068233SBram Moolenaar call assert_equal('a2d2a1b1a0c0e', g:Xpath) 10451f068233SBram Moolenaar 10461f068233SBram Moolenaar XpathINIT 10471f068233SBram Moolenaar call assert_fails('call T17_G()', 'E171:') 10481f068233SBram Moolenaar call assert_equal('a1a0', g:Xpath) 10491f068233SBram Moolenaar 10501f068233SBram Moolenaar XpathINIT 10511f068233SBram Moolenaar call assert_fails('call T17_H()', 'E580:') 10521f068233SBram Moolenaar call assert_equal('a1b1a0b0', g:Xpath) 10531f068233SBram Moolenaarendfunc 10541f068233SBram Moolenaar 10551f068233SBram Moolenaar"------------------------------------------------------------------------------- 1056*a6296200SBram Moolenaar" Test 18: Interrupt (Ctrl-C pressed) {{{1 1057*a6296200SBram Moolenaar" 1058*a6296200SBram Moolenaar" On an interrupt, the script processing is terminated immediately. 10591f068233SBram Moolenaar"------------------------------------------------------------------------------- 1060*a6296200SBram Moolenaar 1061*a6296200SBram Moolenaarfunc Test_interrupt_while_if() 1062*a6296200SBram Moolenaar let test =<< trim [CODE] 1063*a6296200SBram Moolenaar try 1064*a6296200SBram Moolenaar if 1 1065*a6296200SBram Moolenaar Xpath 'a' 1066*a6296200SBram Moolenaar while 1 1067*a6296200SBram Moolenaar Xpath 'b' 1068*a6296200SBram Moolenaar if 1 1069*a6296200SBram Moolenaar Xpath 'c' 1070*a6296200SBram Moolenaar call interrupt() 1071*a6296200SBram Moolenaar call assert_report('should not get here') 1072*a6296200SBram Moolenaar break 1073*a6296200SBram Moolenaar finish 1074*a6296200SBram Moolenaar endif | call assert_report('should not get here') 1075*a6296200SBram Moolenaar call assert_report('should not get here') 1076*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1077*a6296200SBram Moolenaar call assert_report('should not get here') 1078*a6296200SBram Moolenaar endif | call assert_report('should not get here') 1079*a6296200SBram Moolenaar call assert_report('should not get here') 1080*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1081*a6296200SBram Moolenaar Xpath 'd' 1082*a6296200SBram Moolenaar endtry | Xpath 'e' 1083*a6296200SBram Moolenaar Xpath 'f' 1084*a6296200SBram Moolenaar [CODE] 1085*a6296200SBram Moolenaar let verify =<< trim [CODE] 1086*a6296200SBram Moolenaar call assert_equal('abcdef', g:Xpath) 1087*a6296200SBram Moolenaar [CODE] 1088*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1089*a6296200SBram Moolenaarendfunc 1090*a6296200SBram Moolenaar 1091*a6296200SBram Moolenaarfunc Test_interrupt_try() 1092*a6296200SBram Moolenaar let test =<< trim [CODE] 1093*a6296200SBram Moolenaar try 1094*a6296200SBram Moolenaar try 1095*a6296200SBram Moolenaar Xpath 'a' 1096*a6296200SBram Moolenaar call interrupt() 1097*a6296200SBram Moolenaar call assert_report('should not get here') 1098*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1099*a6296200SBram Moolenaar call assert_report('should not get here') 1100*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1101*a6296200SBram Moolenaar Xpath 'b' 1102*a6296200SBram Moolenaar endtry | Xpath 'c' 1103*a6296200SBram Moolenaar Xpath 'd' 1104*a6296200SBram Moolenaar [CODE] 1105*a6296200SBram Moolenaar let verify =<< trim [CODE] 1106*a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1107*a6296200SBram Moolenaar [CODE] 1108*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1109*a6296200SBram Moolenaarendfunc 1110*a6296200SBram Moolenaar 1111*a6296200SBram Moolenaarfunc Test_interrupt_func_while_if() 1112*a6296200SBram Moolenaar let test =<< trim [CODE] 1113*a6296200SBram Moolenaar func F() 1114*a6296200SBram Moolenaar if 1 1115*a6296200SBram Moolenaar Xpath 'a' 1116*a6296200SBram Moolenaar while 1 1117*a6296200SBram Moolenaar Xpath 'b' 1118*a6296200SBram Moolenaar if 1 1119*a6296200SBram Moolenaar Xpath 'c' 1120*a6296200SBram Moolenaar call interrupt() 1121*a6296200SBram Moolenaar call assert_report('should not get here') 1122*a6296200SBram Moolenaar break 1123*a6296200SBram Moolenaar return 1124*a6296200SBram Moolenaar endif | call assert_report('should not get here') 1125*a6296200SBram Moolenaar call assert_report('should not get here') 1126*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1127*a6296200SBram Moolenaar call assert_report('should not get here') 1128*a6296200SBram Moolenaar endif | call assert_report('should not get here') 1129*a6296200SBram Moolenaar call assert_report('should not get here') 1130*a6296200SBram Moolenaar endfunc 1131*a6296200SBram Moolenaar 1132*a6296200SBram Moolenaar Xpath 'd' 1133*a6296200SBram Moolenaar try 1134*a6296200SBram Moolenaar call F() | call assert_report('should not get here') 1135*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1136*a6296200SBram Moolenaar Xpath 'e' 1137*a6296200SBram Moolenaar endtry | Xpath 'f' 1138*a6296200SBram Moolenaar Xpath 'g' 1139*a6296200SBram Moolenaar [CODE] 1140*a6296200SBram Moolenaar let verify =<< trim [CODE] 1141*a6296200SBram Moolenaar call assert_equal('dabcefg', g:Xpath) 1142*a6296200SBram Moolenaar [CODE] 1143*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1144*a6296200SBram Moolenaarendfunc 1145*a6296200SBram Moolenaar 1146*a6296200SBram Moolenaarfunc Test_interrupt_func_try() 1147*a6296200SBram Moolenaar let test =<< trim [CODE] 1148*a6296200SBram Moolenaar func G() 1149*a6296200SBram Moolenaar try 1150*a6296200SBram Moolenaar Xpath 'a' 1151*a6296200SBram Moolenaar call interrupt() 1152*a6296200SBram Moolenaar call assert_report('should not get here') 1153*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1154*a6296200SBram Moolenaar call assert_report('should not get here') 1155*a6296200SBram Moolenaar endfunc 1156*a6296200SBram Moolenaar 1157*a6296200SBram Moolenaar Xpath 'b' 1158*a6296200SBram Moolenaar try 1159*a6296200SBram Moolenaar call G() | call assert_report('should not get here') 1160*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1161*a6296200SBram Moolenaar Xpath 'c' 1162*a6296200SBram Moolenaar endtry | Xpath 'd' 1163*a6296200SBram Moolenaar Xpath 'e' 1164*a6296200SBram Moolenaar [CODE] 1165*a6296200SBram Moolenaar let verify =<< trim [CODE] 1166*a6296200SBram Moolenaar call assert_equal('bacde', g:Xpath) 1167*a6296200SBram Moolenaar [CODE] 1168*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1169*a6296200SBram Moolenaarendfunc 1170*a6296200SBram Moolenaar 1171*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1172*a6296200SBram Moolenaar" Test 19: Aborting on errors inside :try/:endtry {{{1 1173*a6296200SBram Moolenaar" 1174*a6296200SBram Moolenaar" An error in a command dynamically enclosed in a :try/:endtry region 1175*a6296200SBram Moolenaar" aborts script processing immediately. It does not matter whether 1176*a6296200SBram Moolenaar" the failing command is outside or inside a function and whether a 1177*a6296200SBram Moolenaar" function has an "abort" attribute. 1178*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1179*a6296200SBram Moolenaar 1180*a6296200SBram Moolenaarfunc Test_try_error_abort_1() 1181*a6296200SBram Moolenaar let test =<< trim [CODE] 1182*a6296200SBram Moolenaar func F() abort 1183*a6296200SBram Moolenaar Xpath 'a' 1184*a6296200SBram Moolenaar asdf 1185*a6296200SBram Moolenaar call assert_report('should not get here') 1186*a6296200SBram Moolenaar endfunc 1187*a6296200SBram Moolenaar 1188*a6296200SBram Moolenaar try 1189*a6296200SBram Moolenaar Xpath 'b' 1190*a6296200SBram Moolenaar call F() 1191*a6296200SBram Moolenaar call assert_report('should not get here') 1192*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1193*a6296200SBram Moolenaar call assert_report('should not get here') 1194*a6296200SBram Moolenaar [CODE] 1195*a6296200SBram Moolenaar let verify =<< trim [CODE] 1196*a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1197*a6296200SBram Moolenaar [CODE] 1198*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1199*a6296200SBram Moolenaarendfunc 1200*a6296200SBram Moolenaar 1201*a6296200SBram Moolenaarfunc Test_try_error_abort_2() 1202*a6296200SBram Moolenaar let test =<< trim [CODE] 1203*a6296200SBram Moolenaar func G() 1204*a6296200SBram Moolenaar Xpath 'a' 1205*a6296200SBram Moolenaar asdf 1206*a6296200SBram Moolenaar call assert_report('should not get here') 1207*a6296200SBram Moolenaar endfunc 1208*a6296200SBram Moolenaar 1209*a6296200SBram Moolenaar try 1210*a6296200SBram Moolenaar Xpath 'b' 1211*a6296200SBram Moolenaar call G() 1212*a6296200SBram Moolenaar call assert_report('should not get here') 1213*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1214*a6296200SBram Moolenaar call assert_report('should not get here') 1215*a6296200SBram Moolenaar [CODE] 1216*a6296200SBram Moolenaar let verify =<< trim [CODE] 1217*a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1218*a6296200SBram Moolenaar [CODE] 1219*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1220*a6296200SBram Moolenaarendfunc 1221*a6296200SBram Moolenaar 1222*a6296200SBram Moolenaarfunc Test_try_error_abort_3() 1223*a6296200SBram Moolenaar let test =<< trim [CODE] 1224*a6296200SBram Moolenaar try 1225*a6296200SBram Moolenaar Xpath 'a' 1226*a6296200SBram Moolenaar asdf 1227*a6296200SBram Moolenaar call assert_report('should not get here') 1228*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1229*a6296200SBram Moolenaar call assert_report('should not get here') 1230*a6296200SBram Moolenaar [CODE] 1231*a6296200SBram Moolenaar let verify =<< trim [CODE] 1232*a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1233*a6296200SBram Moolenaar [CODE] 1234*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1235*a6296200SBram Moolenaarendfunc 1236*a6296200SBram Moolenaar 1237*a6296200SBram Moolenaarfunc Test_try_error_abort_4() 1238*a6296200SBram Moolenaar let test =<< trim [CODE] 1239*a6296200SBram Moolenaar if 1 1240*a6296200SBram Moolenaar try 1241*a6296200SBram Moolenaar Xpath 'a' 1242*a6296200SBram Moolenaar asdf 1243*a6296200SBram Moolenaar call assert_report('should not get here') 1244*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1245*a6296200SBram Moolenaar endif | call assert_report('should not get here') 1246*a6296200SBram Moolenaar call assert_report('should not get here') 1247*a6296200SBram Moolenaar [CODE] 1248*a6296200SBram Moolenaar let verify =<< trim [CODE] 1249*a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1250*a6296200SBram Moolenaar [CODE] 1251*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1252*a6296200SBram Moolenaarendfunc 1253*a6296200SBram Moolenaar 1254*a6296200SBram Moolenaarfunc Test_try_error_abort_5() 1255*a6296200SBram Moolenaar let test =<< trim [CODE] 1256*a6296200SBram Moolenaar let p = 1 1257*a6296200SBram Moolenaar while p 1258*a6296200SBram Moolenaar let p = 0 1259*a6296200SBram Moolenaar try 1260*a6296200SBram Moolenaar Xpath 'a' 1261*a6296200SBram Moolenaar asdf 1262*a6296200SBram Moolenaar call assert_report('should not get here') 1263*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1264*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1265*a6296200SBram Moolenaar call assert_report('should not get here') 1266*a6296200SBram Moolenaar [CODE] 1267*a6296200SBram Moolenaar let verify =<< trim [CODE] 1268*a6296200SBram Moolenaar call assert_equal('a', g:Xpath) 1269*a6296200SBram Moolenaar [CODE] 1270*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1271*a6296200SBram Moolenaarendfunc 1272*a6296200SBram Moolenaar 1273*a6296200SBram Moolenaarfunc Test_try_error_abort_6() 1274*a6296200SBram Moolenaar let test =<< trim [CODE] 1275*a6296200SBram Moolenaar let p = 1 1276*a6296200SBram Moolenaar Xpath 'a' 1277*a6296200SBram Moolenaar while p 1278*a6296200SBram Moolenaar Xpath 'b' 1279*a6296200SBram Moolenaar let p = 0 1280*a6296200SBram Moolenaar try 1281*a6296200SBram Moolenaar Xpath 'c' 1282*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1283*a6296200SBram Moolenaar call assert_report('should not get here') 1284*a6296200SBram Moolenaar [CODE] 1285*a6296200SBram Moolenaar let verify =<< trim [CODE] 1286*a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1287*a6296200SBram Moolenaar [CODE] 1288*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1289*a6296200SBram Moolenaarendfunc 1290*a6296200SBram Moolenaar 1291*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1292*a6296200SBram Moolenaar" Test 20: Aborting on errors after :try/:endtry {{{1 1293*a6296200SBram Moolenaar" 1294*a6296200SBram Moolenaar" When an error occurs after the last active :try/:endtry region has 1295*a6296200SBram Moolenaar" been left, termination behavior is as if no :try/:endtry has been 1296*a6296200SBram Moolenaar" seen. 1297*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1298*a6296200SBram Moolenaar 1299*a6296200SBram Moolenaarfunc Test_error_after_try_1() 1300*a6296200SBram Moolenaar let test =<< trim [CODE] 1301*a6296200SBram Moolenaar let p = 1 1302*a6296200SBram Moolenaar while p 1303*a6296200SBram Moolenaar let p = 0 1304*a6296200SBram Moolenaar Xpath 'a' 1305*a6296200SBram Moolenaar try 1306*a6296200SBram Moolenaar Xpath 'b' 1307*a6296200SBram Moolenaar endtry 1308*a6296200SBram Moolenaar asdf 1309*a6296200SBram Moolenaar call assert_report('should not get here') 1310*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1311*a6296200SBram Moolenaar Xpath 'c' 1312*a6296200SBram Moolenaar [CODE] 1313*a6296200SBram Moolenaar let verify =<< trim [CODE] 1314*a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1315*a6296200SBram Moolenaar [CODE] 1316*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1317*a6296200SBram Moolenaarendfunc 1318*a6296200SBram Moolenaar 1319*a6296200SBram Moolenaarfunc Test_error_after_try_2() 1320*a6296200SBram Moolenaar let test =<< trim [CODE] 1321*a6296200SBram Moolenaar while 1 1322*a6296200SBram Moolenaar try 1323*a6296200SBram Moolenaar Xpath 'a' 1324*a6296200SBram Moolenaar break 1325*a6296200SBram Moolenaar call assert_report('should not get here') 1326*a6296200SBram Moolenaar endtry 1327*a6296200SBram Moolenaar endwhile 1328*a6296200SBram Moolenaar Xpath 'b' 1329*a6296200SBram Moolenaar asdf 1330*a6296200SBram Moolenaar Xpath 'c' 1331*a6296200SBram Moolenaar [CODE] 1332*a6296200SBram Moolenaar let verify =<< trim [CODE] 1333*a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1334*a6296200SBram Moolenaar [CODE] 1335*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1336*a6296200SBram Moolenaarendfunc 1337*a6296200SBram Moolenaar 1338*a6296200SBram Moolenaarfunc Test_error_after_try_3() 1339*a6296200SBram Moolenaar let test =<< trim [CODE] 1340*a6296200SBram Moolenaar while 1 1341*a6296200SBram Moolenaar try 1342*a6296200SBram Moolenaar Xpath 'a' 1343*a6296200SBram Moolenaar break 1344*a6296200SBram Moolenaar call assert_report('should not get here') 1345*a6296200SBram Moolenaar finally 1346*a6296200SBram Moolenaar Xpath 'b' 1347*a6296200SBram Moolenaar endtry 1348*a6296200SBram Moolenaar endwhile 1349*a6296200SBram Moolenaar Xpath 'c' 1350*a6296200SBram Moolenaar asdf 1351*a6296200SBram Moolenaar Xpath 'd' 1352*a6296200SBram Moolenaar [CODE] 1353*a6296200SBram Moolenaar let verify =<< trim [CODE] 1354*a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1355*a6296200SBram Moolenaar [CODE] 1356*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1357*a6296200SBram Moolenaarendfunc 1358*a6296200SBram Moolenaar 1359*a6296200SBram Moolenaarfunc Test_error_after_try_4() 1360*a6296200SBram Moolenaar let test =<< trim [CODE] 1361*a6296200SBram Moolenaar while 1 1362*a6296200SBram Moolenaar try 1363*a6296200SBram Moolenaar Xpath 'a' 1364*a6296200SBram Moolenaar finally 1365*a6296200SBram Moolenaar Xpath 'b' 1366*a6296200SBram Moolenaar break 1367*a6296200SBram Moolenaar call assert_report('should not get here') 1368*a6296200SBram Moolenaar endtry 1369*a6296200SBram Moolenaar endwhile 1370*a6296200SBram Moolenaar Xpath 'c' 1371*a6296200SBram Moolenaar asdf 1372*a6296200SBram Moolenaar Xpath 'd' 1373*a6296200SBram Moolenaar [CODE] 1374*a6296200SBram Moolenaar let verify =<< trim [CODE] 1375*a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1376*a6296200SBram Moolenaar [CODE] 1377*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1378*a6296200SBram Moolenaarendfunc 1379*a6296200SBram Moolenaar 1380*a6296200SBram Moolenaarfunc Test_error_after_try_5() 1381*a6296200SBram Moolenaar let test =<< trim [CODE] 1382*a6296200SBram Moolenaar let p = 1 1383*a6296200SBram Moolenaar while p 1384*a6296200SBram Moolenaar let p = 0 1385*a6296200SBram Moolenaar try 1386*a6296200SBram Moolenaar Xpath 'a' 1387*a6296200SBram Moolenaar continue 1388*a6296200SBram Moolenaar call assert_report('should not get here') 1389*a6296200SBram Moolenaar endtry 1390*a6296200SBram Moolenaar endwhile 1391*a6296200SBram Moolenaar Xpath 'b' 1392*a6296200SBram Moolenaar asdf 1393*a6296200SBram Moolenaar Xpath 'c' 1394*a6296200SBram Moolenaar [CODE] 1395*a6296200SBram Moolenaar let verify =<< trim [CODE] 1396*a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1397*a6296200SBram Moolenaar [CODE] 1398*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1399*a6296200SBram Moolenaarendfunc 1400*a6296200SBram Moolenaar 1401*a6296200SBram Moolenaarfunc Test_error_after_try_6() 1402*a6296200SBram Moolenaar let test =<< trim [CODE] 1403*a6296200SBram Moolenaar let p = 1 1404*a6296200SBram Moolenaar while p 1405*a6296200SBram Moolenaar let p = 0 1406*a6296200SBram Moolenaar try 1407*a6296200SBram Moolenaar Xpath 'a' 1408*a6296200SBram Moolenaar continue 1409*a6296200SBram Moolenaar call assert_report('should not get here') 1410*a6296200SBram Moolenaar finally 1411*a6296200SBram Moolenaar Xpath 'b' 1412*a6296200SBram Moolenaar endtry 1413*a6296200SBram Moolenaar endwhile 1414*a6296200SBram Moolenaar Xpath 'c' 1415*a6296200SBram Moolenaar asdf 1416*a6296200SBram Moolenaar Xpath 'd' 1417*a6296200SBram Moolenaar [CODE] 1418*a6296200SBram Moolenaar let verify =<< trim [CODE] 1419*a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1420*a6296200SBram Moolenaar [CODE] 1421*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1422*a6296200SBram Moolenaarendfunc 1423*a6296200SBram Moolenaar 1424*a6296200SBram Moolenaarfunc Test_error_after_try_7() 1425*a6296200SBram Moolenaar let test =<< trim [CODE] 1426*a6296200SBram Moolenaar let p = 1 1427*a6296200SBram Moolenaar while p 1428*a6296200SBram Moolenaar let p = 0 1429*a6296200SBram Moolenaar try 1430*a6296200SBram Moolenaar Xpath 'a' 1431*a6296200SBram Moolenaar finally 1432*a6296200SBram Moolenaar Xpath 'b' 1433*a6296200SBram Moolenaar continue 1434*a6296200SBram Moolenaar call assert_report('should not get here') 1435*a6296200SBram Moolenaar endtry 1436*a6296200SBram Moolenaar endwhile 1437*a6296200SBram Moolenaar Xpath 'c' 1438*a6296200SBram Moolenaar asdf 1439*a6296200SBram Moolenaar Xpath 'd' 1440*a6296200SBram Moolenaar [CODE] 1441*a6296200SBram Moolenaar let verify =<< trim [CODE] 1442*a6296200SBram Moolenaar call assert_equal('abcd', g:Xpath) 1443*a6296200SBram Moolenaar [CODE] 1444*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1445*a6296200SBram Moolenaarendfunc 1446*a6296200SBram Moolenaar 1447*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1448*a6296200SBram Moolenaar" Test 21: :finally for :try after :continue/:break/:return/:finish {{{1 1449*a6296200SBram Moolenaar" 1450*a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :continue, 1451*a6296200SBram Moolenaar" :break, :return, or :finish, its :finally clause should not be 1452*a6296200SBram Moolenaar" executed. 1453*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1454*a6296200SBram Moolenaar 1455*a6296200SBram Moolenaarfunc Test_finally_after_loop_ctrl_statement() 1456*a6296200SBram Moolenaar let test =<< trim [CODE] 1457*a6296200SBram Moolenaar func F() 1458*a6296200SBram Moolenaar let loops = 2 1459*a6296200SBram Moolenaar while loops > 0 1460*a6296200SBram Moolenaar XloopNEXT 1461*a6296200SBram Moolenaar let loops = loops - 1 1462*a6296200SBram Moolenaar try 1463*a6296200SBram Moolenaar if loops == 1 1464*a6296200SBram Moolenaar Xloop 'a' 1465*a6296200SBram Moolenaar continue 1466*a6296200SBram Moolenaar call assert_report('should not get here') 1467*a6296200SBram Moolenaar elseif loops == 0 1468*a6296200SBram Moolenaar Xloop 'b' 1469*a6296200SBram Moolenaar break 1470*a6296200SBram Moolenaar call assert_report('should not get here') 1471*a6296200SBram Moolenaar endif 1472*a6296200SBram Moolenaar 1473*a6296200SBram Moolenaar try " inactive 1474*a6296200SBram Moolenaar call assert_report('should not get here') 1475*a6296200SBram Moolenaar finally 1476*a6296200SBram Moolenaar call assert_report('should not get here') 1477*a6296200SBram Moolenaar endtry 1478*a6296200SBram Moolenaar finally 1479*a6296200SBram Moolenaar Xloop 'c' 1480*a6296200SBram Moolenaar endtry 1481*a6296200SBram Moolenaar call assert_report('should not get here') 1482*a6296200SBram Moolenaar endwhile 1483*a6296200SBram Moolenaar 1484*a6296200SBram Moolenaar try 1485*a6296200SBram Moolenaar Xpath 'd' 1486*a6296200SBram Moolenaar return 1487*a6296200SBram Moolenaar call assert_report('should not get here') 1488*a6296200SBram Moolenaar try " inactive 1489*a6296200SBram Moolenaar call assert_report('should not get here') 1490*a6296200SBram Moolenaar finally 1491*a6296200SBram Moolenaar call assert_report('should not get here') 1492*a6296200SBram Moolenaar endtry 1493*a6296200SBram Moolenaar finally 1494*a6296200SBram Moolenaar Xpath 'e' 1495*a6296200SBram Moolenaar endtry 1496*a6296200SBram Moolenaar call assert_report('should not get here') 1497*a6296200SBram Moolenaar endfunc 1498*a6296200SBram Moolenaar 1499*a6296200SBram Moolenaar try 1500*a6296200SBram Moolenaar Xpath 'f' 1501*a6296200SBram Moolenaar call F() 1502*a6296200SBram Moolenaar Xpath 'g' 1503*a6296200SBram Moolenaar finish 1504*a6296200SBram Moolenaar call assert_report('should not get here') 1505*a6296200SBram Moolenaar try " inactive 1506*a6296200SBram Moolenaar call assert_report('should not get here') 1507*a6296200SBram Moolenaar finally 1508*a6296200SBram Moolenaar call assert_report('should not get here') 1509*a6296200SBram Moolenaar endtry 1510*a6296200SBram Moolenaar finally 1511*a6296200SBram Moolenaar Xpath 'h' 1512*a6296200SBram Moolenaar endtry 1513*a6296200SBram Moolenaar call assert_report('should not get here') 1514*a6296200SBram Moolenaar [CODE] 1515*a6296200SBram Moolenaar let verify =<< trim [CODE] 1516*a6296200SBram Moolenaar call assert_equal('fa2c2b3c3degh', g:Xpath) 1517*a6296200SBram Moolenaar [CODE] 1518*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1519*a6296200SBram Moolenaarendfunc 1520*a6296200SBram Moolenaar 1521*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1522*a6296200SBram Moolenaar" Test 22: :finally for a :try after an error/interrupt/:throw {{{1 1523*a6296200SBram Moolenaar" 1524*a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding error or 1525*a6296200SBram Moolenaar" interrupt or :throw, its :finally clause should not be executed. 1526*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1527*a6296200SBram Moolenaar 1528*a6296200SBram Moolenaarfunc Test_finally_after_error_in_func() 1529*a6296200SBram Moolenaar let test =<< trim [CODE] 1530*a6296200SBram Moolenaar func Error() 1531*a6296200SBram Moolenaar try 1532*a6296200SBram Moolenaar Xpath 'b' 1533*a6296200SBram Moolenaar asdf " aborting error, triggering error exception 1534*a6296200SBram Moolenaar call assert_report('should not get here') 1535*a6296200SBram Moolenaar endtry 1536*a6296200SBram Moolenaar call assert_report('should not get here') 1537*a6296200SBram Moolenaar endfunc 1538*a6296200SBram Moolenaar 1539*a6296200SBram Moolenaar Xpath 'a' 1540*a6296200SBram Moolenaar call Error() 1541*a6296200SBram Moolenaar call assert_report('should not get here') 1542*a6296200SBram Moolenaar 1543*a6296200SBram Moolenaar if 1 " not active due to error 1544*a6296200SBram Moolenaar try " not active since :if inactive 1545*a6296200SBram Moolenaar call assert_report('should not get here') 1546*a6296200SBram Moolenaar finally 1547*a6296200SBram Moolenaar call assert_report('should not get here') 1548*a6296200SBram Moolenaar endtry 1549*a6296200SBram Moolenaar endif 1550*a6296200SBram Moolenaar 1551*a6296200SBram Moolenaar try " not active due to error 1552*a6296200SBram Moolenaar call assert_report('should not get here') 1553*a6296200SBram Moolenaar finally 1554*a6296200SBram Moolenaar call assert_report('should not get here') 1555*a6296200SBram Moolenaar endtry 1556*a6296200SBram Moolenaar [CODE] 1557*a6296200SBram Moolenaar let verify =<< trim [CODE] 1558*a6296200SBram Moolenaar call assert_equal('ab', g:Xpath) 1559*a6296200SBram Moolenaar [CODE] 1560*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1561*a6296200SBram Moolenaarendfunc 1562*a6296200SBram Moolenaar 1563*a6296200SBram Moolenaarfunc Test_finally_after_interrupt() 1564*a6296200SBram Moolenaar let test =<< trim [CODE] 1565*a6296200SBram Moolenaar func Interrupt() 1566*a6296200SBram Moolenaar try 1567*a6296200SBram Moolenaar Xpath 'a' 1568*a6296200SBram Moolenaar call interrupt() " triggering interrupt exception 1569*a6296200SBram Moolenaar call assert_report('should not get here') 1570*a6296200SBram Moolenaar endtry 1571*a6296200SBram Moolenaar endfunc 1572*a6296200SBram Moolenaar 1573*a6296200SBram Moolenaar Xpath 'b' 1574*a6296200SBram Moolenaar try 1575*a6296200SBram Moolenaar call Interrupt() 1576*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1577*a6296200SBram Moolenaar Xpath 'c' 1578*a6296200SBram Moolenaar finish 1579*a6296200SBram Moolenaar endtry 1580*a6296200SBram Moolenaar call assert_report('should not get here') 1581*a6296200SBram Moolenaar 1582*a6296200SBram Moolenaar if 1 " not active due to interrupt 1583*a6296200SBram Moolenaar try " not active since :if inactive 1584*a6296200SBram Moolenaar call assert_report('should not get here') 1585*a6296200SBram Moolenaar finally 1586*a6296200SBram Moolenaar call assert_report('should not get here') 1587*a6296200SBram Moolenaar endtry 1588*a6296200SBram Moolenaar endif 1589*a6296200SBram Moolenaar 1590*a6296200SBram Moolenaar try " not active due to interrupt 1591*a6296200SBram Moolenaar call assert_report('should not get here') 1592*a6296200SBram Moolenaar finally 1593*a6296200SBram Moolenaar call assert_report('should not get here') 1594*a6296200SBram Moolenaar endtry 1595*a6296200SBram Moolenaar [CODE] 1596*a6296200SBram Moolenaar let verify =<< trim [CODE] 1597*a6296200SBram Moolenaar call assert_equal('bac', g:Xpath) 1598*a6296200SBram Moolenaar [CODE] 1599*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1600*a6296200SBram Moolenaarendfunc 1601*a6296200SBram Moolenaar 1602*a6296200SBram Moolenaarfunc Test_finally_after_throw() 1603*a6296200SBram Moolenaar let test =<< trim [CODE] 1604*a6296200SBram Moolenaar func Throw() 1605*a6296200SBram Moolenaar Xpath 'a' 1606*a6296200SBram Moolenaar throw 'xyz' 1607*a6296200SBram Moolenaar endfunc 1608*a6296200SBram Moolenaar 1609*a6296200SBram Moolenaar Xpath 'b' 1610*a6296200SBram Moolenaar call Throw() 1611*a6296200SBram Moolenaar call assert_report('should not get here') 1612*a6296200SBram Moolenaar 1613*a6296200SBram Moolenaar if 1 " not active due to :throw 1614*a6296200SBram Moolenaar try " not active since :if inactive 1615*a6296200SBram Moolenaar call assert_report('should not get here') 1616*a6296200SBram Moolenaar finally 1617*a6296200SBram Moolenaar call assert_report('should not get here') 1618*a6296200SBram Moolenaar endtry 1619*a6296200SBram Moolenaar endif 1620*a6296200SBram Moolenaar 1621*a6296200SBram Moolenaar try " not active due to :throw 1622*a6296200SBram Moolenaar call assert_report('should not get here') 1623*a6296200SBram Moolenaar finally 1624*a6296200SBram Moolenaar call assert_report('should not get here') 1625*a6296200SBram Moolenaar endtry 1626*a6296200SBram Moolenaar [CODE] 1627*a6296200SBram Moolenaar let verify =<< trim [CODE] 1628*a6296200SBram Moolenaar call assert_equal('ba', g:Xpath) 1629*a6296200SBram Moolenaar [CODE] 1630*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1631*a6296200SBram Moolenaarendfunc 1632*a6296200SBram Moolenaar 1633*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1634*a6296200SBram Moolenaar" Test 23: :catch clauses for a :try after a :throw {{{1 1635*a6296200SBram Moolenaar" 1636*a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :throw, 1637*a6296200SBram Moolenaar" none of its :catch clauses should be executed. 1638*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1639*a6296200SBram Moolenaar 1640*a6296200SBram Moolenaarfunc Test_catch_after_throw() 1641*a6296200SBram Moolenaar let test =<< trim [CODE] 1642*a6296200SBram Moolenaar try 1643*a6296200SBram Moolenaar Xpath 'a' 1644*a6296200SBram Moolenaar throw "xyz" 1645*a6296200SBram Moolenaar call assert_report('should not get here') 1646*a6296200SBram Moolenaar 1647*a6296200SBram Moolenaar if 1 " not active due to :throw 1648*a6296200SBram Moolenaar try " not active since :if inactive 1649*a6296200SBram Moolenaar call assert_report('should not get here') 1650*a6296200SBram Moolenaar catch /xyz/ 1651*a6296200SBram Moolenaar call assert_report('should not get here') 1652*a6296200SBram Moolenaar endtry 1653*a6296200SBram Moolenaar endif 1654*a6296200SBram Moolenaar catch /xyz/ 1655*a6296200SBram Moolenaar Xpath 'b' 1656*a6296200SBram Moolenaar endtry 1657*a6296200SBram Moolenaar 1658*a6296200SBram Moolenaar Xpath 'c' 1659*a6296200SBram Moolenaar throw "abc" 1660*a6296200SBram Moolenaar call assert_report('should not get here') 1661*a6296200SBram Moolenaar 1662*a6296200SBram Moolenaar try " not active due to :throw 1663*a6296200SBram Moolenaar call assert_report('should not get here') 1664*a6296200SBram Moolenaar catch /abc/ 1665*a6296200SBram Moolenaar call assert_report('should not get here') 1666*a6296200SBram Moolenaar endtry 1667*a6296200SBram Moolenaar [CODE] 1668*a6296200SBram Moolenaar let verify =<< trim [CODE] 1669*a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1670*a6296200SBram Moolenaar [CODE] 1671*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1672*a6296200SBram Moolenaarendfunc 1673*a6296200SBram Moolenaar 1674*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1675*a6296200SBram Moolenaar" Test 24: :endtry for a :try after a :throw {{{1 1676*a6296200SBram Moolenaar" 1677*a6296200SBram Moolenaar" If a :try conditional stays inactive due to a preceding :throw, 1678*a6296200SBram Moolenaar" its :endtry should not rethrow the exception to the next surrounding 1679*a6296200SBram Moolenaar" active :try conditional. 1680*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1681*a6296200SBram Moolenaar 1682*a6296200SBram Moolenaarfunc Test_endtry_after_throw() 1683*a6296200SBram Moolenaar let test =<< trim [CODE] 1684*a6296200SBram Moolenaar try " try 1 1685*a6296200SBram Moolenaar try " try 2 1686*a6296200SBram Moolenaar Xpath 'a' 1687*a6296200SBram Moolenaar throw "xyz" " makes try 2 inactive 1688*a6296200SBram Moolenaar call assert_report('should not get here') 1689*a6296200SBram Moolenaar 1690*a6296200SBram Moolenaar try " try 3 1691*a6296200SBram Moolenaar call assert_report('should not get here') 1692*a6296200SBram Moolenaar endtry " no rethrow to try 1 1693*a6296200SBram Moolenaar catch /xyz/ " should catch although try 2 inactive 1694*a6296200SBram Moolenaar Xpath 'b' 1695*a6296200SBram Moolenaar endtry 1696*a6296200SBram Moolenaar catch /xyz/ " try 1 active, but exception already caught 1697*a6296200SBram Moolenaar call assert_report('should not get here') 1698*a6296200SBram Moolenaar endtry 1699*a6296200SBram Moolenaar Xpath 'c' 1700*a6296200SBram Moolenaar [CODE] 1701*a6296200SBram Moolenaar let verify =<< trim [CODE] 1702*a6296200SBram Moolenaar call assert_equal('abc', g:Xpath) 1703*a6296200SBram Moolenaar [CODE] 1704*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1705*a6296200SBram Moolenaarendfunc 1706*a6296200SBram Moolenaar 1707*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1708*a6296200SBram Moolenaar" Test 27: Executing :finally clauses after :return {{{1 1709*a6296200SBram Moolenaar" 1710*a6296200SBram Moolenaar" For a :return command dynamically enclosed in a :try/:endtry region, 1711*a6296200SBram Moolenaar" :finally clauses are executed and the called function is ended. 1712*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1713*a6296200SBram Moolenaar 1714*a6296200SBram Moolenaarfunc T27_F() 1715*a6296200SBram Moolenaar try 1716*a6296200SBram Moolenaar Xpath 'a' 1717*a6296200SBram Moolenaar try 1718*a6296200SBram Moolenaar Xpath 'b' 1719*a6296200SBram Moolenaar return 1720*a6296200SBram Moolenaar call assert_report('should not get here') 1721*a6296200SBram Moolenaar finally 1722*a6296200SBram Moolenaar Xpath 'c' 1723*a6296200SBram Moolenaar endtry 1724*a6296200SBram Moolenaar Xpath 'd' 1725*a6296200SBram Moolenaar finally 1726*a6296200SBram Moolenaar Xpath 'e' 1727*a6296200SBram Moolenaar endtry 1728*a6296200SBram Moolenaar call assert_report('should not get here') 1729*a6296200SBram Moolenaarendfunc 1730*a6296200SBram Moolenaar 1731*a6296200SBram Moolenaarfunc T27_G() 1732*a6296200SBram Moolenaar try 1733*a6296200SBram Moolenaar Xpath 'f' 1734*a6296200SBram Moolenaar return 1735*a6296200SBram Moolenaar call assert_report('should not get here') 1736*a6296200SBram Moolenaar finally 1737*a6296200SBram Moolenaar Xpath 'g' 1738*a6296200SBram Moolenaar call T27_F() 1739*a6296200SBram Moolenaar Xpath 'h' 1740*a6296200SBram Moolenaar endtry 1741*a6296200SBram Moolenaar call assert_report('should not get here') 1742*a6296200SBram Moolenaarendfunc 1743*a6296200SBram Moolenaar 1744*a6296200SBram Moolenaarfunc T27_H() 1745*a6296200SBram Moolenaar try 1746*a6296200SBram Moolenaar Xpath 'i' 1747*a6296200SBram Moolenaar call T27_G() 1748*a6296200SBram Moolenaar Xpath 'j' 1749*a6296200SBram Moolenaar finally 1750*a6296200SBram Moolenaar Xpath 'k' 1751*a6296200SBram Moolenaar return 1752*a6296200SBram Moolenaar call assert_report('should not get here') 1753*a6296200SBram Moolenaar endtry 1754*a6296200SBram Moolenaar call assert_report('should not get here') 1755*a6296200SBram Moolenaarendfunction 1756*a6296200SBram Moolenaar 1757*a6296200SBram Moolenaarfunc Test_finally_after_return() 1758*a6296200SBram Moolenaar XpathINIT 1759*a6296200SBram Moolenaar try 1760*a6296200SBram Moolenaar Xpath 'l' 1761*a6296200SBram Moolenaar call T27_H() 1762*a6296200SBram Moolenaar Xpath 'm' 1763*a6296200SBram Moolenaar finally 1764*a6296200SBram Moolenaar Xpath 'n' 1765*a6296200SBram Moolenaar endtry 1766*a6296200SBram Moolenaar call assert_equal('lifgabcehjkmn', g:Xpath) 1767*a6296200SBram Moolenaarendfunc 1768*a6296200SBram Moolenaar 1769*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1770*a6296200SBram Moolenaar" Test 28: Executing :finally clauses after :finish {{{1 1771*a6296200SBram Moolenaar" 1772*a6296200SBram Moolenaar" For a :finish command dynamically enclosed in a :try/:endtry region, 1773*a6296200SBram Moolenaar" :finally clauses are executed and the sourced file is finished. 1774*a6296200SBram Moolenaar" 1775*a6296200SBram Moolenaar" This test executes the bodies of the functions F, G, and H from the 1776*a6296200SBram Moolenaar" previous test as script files (:return replaced by :finish). 1777*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1778*a6296200SBram Moolenaar 1779*a6296200SBram Moolenaarfunc Test_finally_after_finish() 1780*a6296200SBram Moolenaar XpathINIT 1781*a6296200SBram Moolenaar 1782*a6296200SBram Moolenaar let scriptF = MakeScript("T27_F") 1783*a6296200SBram Moolenaar let scriptG = MakeScript("T27_G", scriptF) 1784*a6296200SBram Moolenaar let scriptH = MakeScript("T27_H", scriptG) 1785*a6296200SBram Moolenaar 1786*a6296200SBram Moolenaar try 1787*a6296200SBram Moolenaar Xpath 'A' 1788*a6296200SBram Moolenaar exec "source" scriptH 1789*a6296200SBram Moolenaar Xpath 'B' 1790*a6296200SBram Moolenaar finally 1791*a6296200SBram Moolenaar Xpath 'C' 1792*a6296200SBram Moolenaar endtry 1793*a6296200SBram Moolenaar Xpath 'D' 1794*a6296200SBram Moolenaar call assert_equal('AifgabcehjkBCD', g:Xpath) 1795*a6296200SBram Moolenaar call delete(scriptF) 1796*a6296200SBram Moolenaar call delete(scriptG) 1797*a6296200SBram Moolenaar call delete(scriptH) 1798*a6296200SBram Moolenaarendfunc 1799*a6296200SBram Moolenaar 1800*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1801*a6296200SBram Moolenaar" Test 29: Executing :finally clauses on errors {{{1 1802*a6296200SBram Moolenaar" 1803*a6296200SBram Moolenaar" After an error in a command dynamically enclosed in a :try/:endtry 1804*a6296200SBram Moolenaar" region, :finally clauses are executed and the script processing is 1805*a6296200SBram Moolenaar" terminated. 1806*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1807*a6296200SBram Moolenaar 1808*a6296200SBram Moolenaarfunc Test_finally_after_error_1() 1809*a6296200SBram Moolenaar let test =<< trim [CODE] 1810*a6296200SBram Moolenaar func F() 1811*a6296200SBram Moolenaar while 1 1812*a6296200SBram Moolenaar try 1813*a6296200SBram Moolenaar Xpath 'a' 1814*a6296200SBram Moolenaar while 1 1815*a6296200SBram Moolenaar try 1816*a6296200SBram Moolenaar Xpath 'b' 1817*a6296200SBram Moolenaar asdf " error 1818*a6296200SBram Moolenaar call assert_report('should not get here') 1819*a6296200SBram Moolenaar finally 1820*a6296200SBram Moolenaar Xpath 'c' 1821*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1822*a6296200SBram Moolenaar call assert_report('should not get here') 1823*a6296200SBram Moolenaar break 1824*a6296200SBram Moolenaar endwhile 1825*a6296200SBram Moolenaar call assert_report('should not get here') 1826*a6296200SBram Moolenaar finally 1827*a6296200SBram Moolenaar Xpath 'd' 1828*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1829*a6296200SBram Moolenaar call assert_report('should not get here') 1830*a6296200SBram Moolenaar break 1831*a6296200SBram Moolenaar endwhile 1832*a6296200SBram Moolenaar call assert_report('should not get here') 1833*a6296200SBram Moolenaar endfunc 1834*a6296200SBram Moolenaar 1835*a6296200SBram Moolenaar while 1 1836*a6296200SBram Moolenaar try 1837*a6296200SBram Moolenaar Xpath 'e' 1838*a6296200SBram Moolenaar while 1 1839*a6296200SBram Moolenaar call F() 1840*a6296200SBram Moolenaar call assert_report('should not get here') 1841*a6296200SBram Moolenaar break 1842*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1843*a6296200SBram Moolenaar call assert_report('should not get here') 1844*a6296200SBram Moolenaar finally 1845*a6296200SBram Moolenaar Xpath 'f' 1846*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1847*a6296200SBram Moolenaar endwhile | call assert_report('should not get here') 1848*a6296200SBram Moolenaar call assert_report('should not get here') 1849*a6296200SBram Moolenaar [CODE] 1850*a6296200SBram Moolenaar let verify =<< trim [CODE] 1851*a6296200SBram Moolenaar call assert_equal('eabcdf', g:Xpath) 1852*a6296200SBram Moolenaar [CODE] 1853*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1854*a6296200SBram Moolenaarendfunc 1855*a6296200SBram Moolenaar 1856*a6296200SBram Moolenaarfunc Test_finally_after_error_2() 1857*a6296200SBram Moolenaar let test =<< trim [CODE] 1858*a6296200SBram Moolenaar func G() abort 1859*a6296200SBram Moolenaar if 1 1860*a6296200SBram Moolenaar try 1861*a6296200SBram Moolenaar Xpath 'a' 1862*a6296200SBram Moolenaar asdf " error 1863*a6296200SBram Moolenaar call assert_report('should not get here') 1864*a6296200SBram Moolenaar finally 1865*a6296200SBram Moolenaar Xpath 'b' 1866*a6296200SBram Moolenaar endtry | Xpath 'c' 1867*a6296200SBram Moolenaar endif | Xpath 'd' 1868*a6296200SBram Moolenaar call assert_report('should not get here') 1869*a6296200SBram Moolenaar endfunc 1870*a6296200SBram Moolenaar 1871*a6296200SBram Moolenaar if 1 1872*a6296200SBram Moolenaar try 1873*a6296200SBram Moolenaar Xpath 'e' 1874*a6296200SBram Moolenaar call G() 1875*a6296200SBram Moolenaar call assert_report('should not get here') 1876*a6296200SBram Moolenaar finally 1877*a6296200SBram Moolenaar Xpath 'f' 1878*a6296200SBram Moolenaar endtry | call assert_report('should not get here') 1879*a6296200SBram Moolenaar endif | call assert_report('should not get here') 1880*a6296200SBram Moolenaar call assert_report('should not get here') 1881*a6296200SBram Moolenaar [CODE] 1882*a6296200SBram Moolenaar let verify =<< trim [CODE] 1883*a6296200SBram Moolenaar call assert_equal('eabf', g:Xpath) 1884*a6296200SBram Moolenaar [CODE] 1885*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1886*a6296200SBram Moolenaarendfunc 1887*a6296200SBram Moolenaar 1888*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1889*a6296200SBram Moolenaar" Test 30: Executing :finally clauses on interrupt {{{1 1890*a6296200SBram Moolenaar" 1891*a6296200SBram Moolenaar" After an interrupt in a command dynamically enclosed in 1892*a6296200SBram Moolenaar" a :try/:endtry region, :finally clauses are executed and the 1893*a6296200SBram Moolenaar" script processing is terminated. 1894*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1895*a6296200SBram Moolenaar 1896*a6296200SBram Moolenaarfunc Test_finally_on_interrupt() 1897*a6296200SBram Moolenaar let test =<< trim [CODE] 1898*a6296200SBram Moolenaar func F() 1899*a6296200SBram Moolenaar try 1900*a6296200SBram Moolenaar Xloop 'a' 1901*a6296200SBram Moolenaar call interrupt() 1902*a6296200SBram Moolenaar call assert_report('should not get here') 1903*a6296200SBram Moolenaar finally 1904*a6296200SBram Moolenaar Xloop 'b' 1905*a6296200SBram Moolenaar endtry 1906*a6296200SBram Moolenaar call assert_report('should not get here') 1907*a6296200SBram Moolenaar endfunc 1908*a6296200SBram Moolenaar 1909*a6296200SBram Moolenaar try 1910*a6296200SBram Moolenaar try 1911*a6296200SBram Moolenaar Xpath 'c' 1912*a6296200SBram Moolenaar try 1913*a6296200SBram Moolenaar Xpath 'd' 1914*a6296200SBram Moolenaar call interrupt() 1915*a6296200SBram Moolenaar call assert_report('should not get here') 1916*a6296200SBram Moolenaar finally 1917*a6296200SBram Moolenaar Xpath 'e' 1918*a6296200SBram Moolenaar try 1919*a6296200SBram Moolenaar Xpath 'f' 1920*a6296200SBram Moolenaar try 1921*a6296200SBram Moolenaar Xpath 'g' 1922*a6296200SBram Moolenaar finally 1923*a6296200SBram Moolenaar Xpath 'h' 1924*a6296200SBram Moolenaar try 1925*a6296200SBram Moolenaar Xpath 'i' 1926*a6296200SBram Moolenaar call interrupt() 1927*a6296200SBram Moolenaar call assert_report('should not get here') 1928*a6296200SBram Moolenaar endtry 1929*a6296200SBram Moolenaar call assert_report('should not get here') 1930*a6296200SBram Moolenaar endtry 1931*a6296200SBram Moolenaar call assert_report('should not get here') 1932*a6296200SBram Moolenaar endtry 1933*a6296200SBram Moolenaar call assert_report('should not get here') 1934*a6296200SBram Moolenaar endtry 1935*a6296200SBram Moolenaar call assert_report('should not get here') 1936*a6296200SBram Moolenaar finally 1937*a6296200SBram Moolenaar Xpath 'j' 1938*a6296200SBram Moolenaar try 1939*a6296200SBram Moolenaar Xpath 'k' 1940*a6296200SBram Moolenaar call F() 1941*a6296200SBram Moolenaar call assert_report('should not get here') 1942*a6296200SBram Moolenaar finally 1943*a6296200SBram Moolenaar Xpath 'l' 1944*a6296200SBram Moolenaar try 1945*a6296200SBram Moolenaar Xpath 'm' 1946*a6296200SBram Moolenaar XloopNEXT 1947*a6296200SBram Moolenaar ExecAsScript F 1948*a6296200SBram Moolenaar call assert_report('should not get here') 1949*a6296200SBram Moolenaar finally 1950*a6296200SBram Moolenaar Xpath 'n' 1951*a6296200SBram Moolenaar endtry 1952*a6296200SBram Moolenaar call assert_report('should not get here') 1953*a6296200SBram Moolenaar endtry 1954*a6296200SBram Moolenaar call assert_report('should not get here') 1955*a6296200SBram Moolenaar endtry 1956*a6296200SBram Moolenaar call assert_report('should not get here') 1957*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 1958*a6296200SBram Moolenaar Xpath 'o' 1959*a6296200SBram Moolenaar endtry 1960*a6296200SBram Moolenaar [CODE] 1961*a6296200SBram Moolenaar let verify =<< trim [CODE] 1962*a6296200SBram Moolenaar call assert_equal('cdefghijka1b1lma2b2no', g:Xpath) 1963*a6296200SBram Moolenaar [CODE] 1964*a6296200SBram Moolenaar call RunInNewVim(test, verify) 1965*a6296200SBram Moolenaarendfunc 1966*a6296200SBram Moolenaar 1967*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1968*a6296200SBram Moolenaar" Test 31: Executing :finally clauses after :throw {{{1 1969*a6296200SBram Moolenaar" 1970*a6296200SBram Moolenaar" After a :throw dynamically enclosed in a :try/:endtry region, 1971*a6296200SBram Moolenaar" :finally clauses are executed and the script processing is 1972*a6296200SBram Moolenaar" terminated. 1973*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 1974*a6296200SBram Moolenaar 1975*a6296200SBram Moolenaarfunc Test_finally_after_throw_2() 1976*a6296200SBram Moolenaar let test =<< trim [CODE] 1977*a6296200SBram Moolenaar func F() 1978*a6296200SBram Moolenaar try 1979*a6296200SBram Moolenaar Xloop 'a' 1980*a6296200SBram Moolenaar throw "exception" 1981*a6296200SBram Moolenaar call assert_report('should not get here') 1982*a6296200SBram Moolenaar finally 1983*a6296200SBram Moolenaar Xloop 'b' 1984*a6296200SBram Moolenaar endtry 1985*a6296200SBram Moolenaar call assert_report('should not get here') 1986*a6296200SBram Moolenaar endfunc 1987*a6296200SBram Moolenaar 1988*a6296200SBram Moolenaar try 1989*a6296200SBram Moolenaar Xpath 'c' 1990*a6296200SBram Moolenaar try 1991*a6296200SBram Moolenaar Xpath 'd' 1992*a6296200SBram Moolenaar throw "exception" 1993*a6296200SBram Moolenaar call assert_report('should not get here') 1994*a6296200SBram Moolenaar finally 1995*a6296200SBram Moolenaar Xpath 'e' 1996*a6296200SBram Moolenaar try 1997*a6296200SBram Moolenaar Xpath 'f' 1998*a6296200SBram Moolenaar try 1999*a6296200SBram Moolenaar Xpath 'g' 2000*a6296200SBram Moolenaar finally 2001*a6296200SBram Moolenaar Xpath 'h' 2002*a6296200SBram Moolenaar try 2003*a6296200SBram Moolenaar Xpath 'i' 2004*a6296200SBram Moolenaar throw "exception" 2005*a6296200SBram Moolenaar call assert_report('should not get here') 2006*a6296200SBram Moolenaar endtry 2007*a6296200SBram Moolenaar call assert_report('should not get here') 2008*a6296200SBram Moolenaar endtry 2009*a6296200SBram Moolenaar call assert_report('should not get here') 2010*a6296200SBram Moolenaar endtry 2011*a6296200SBram Moolenaar call assert_report('should not get here') 2012*a6296200SBram Moolenaar endtry 2013*a6296200SBram Moolenaar call assert_report('should not get here') 2014*a6296200SBram Moolenaar finally 2015*a6296200SBram Moolenaar Xpath 'j' 2016*a6296200SBram Moolenaar try 2017*a6296200SBram Moolenaar Xpath 'k' 2018*a6296200SBram Moolenaar call F() 2019*a6296200SBram Moolenaar call assert_report('should not get here') 2020*a6296200SBram Moolenaar finally 2021*a6296200SBram Moolenaar Xpath 'l' 2022*a6296200SBram Moolenaar try 2023*a6296200SBram Moolenaar Xpath 'm' 2024*a6296200SBram Moolenaar XloopNEXT 2025*a6296200SBram Moolenaar ExecAsScript F 2026*a6296200SBram Moolenaar call assert_report('should not get here') 2027*a6296200SBram Moolenaar finally 2028*a6296200SBram Moolenaar Xpath 'n' 2029*a6296200SBram Moolenaar endtry 2030*a6296200SBram Moolenaar call assert_report('should not get here') 2031*a6296200SBram Moolenaar endtry 2032*a6296200SBram Moolenaar call assert_report('should not get here') 2033*a6296200SBram Moolenaar endtry 2034*a6296200SBram Moolenaar call assert_report('should not get here') 2035*a6296200SBram Moolenaar [CODE] 2036*a6296200SBram Moolenaar let verify =<< trim [CODE] 2037*a6296200SBram Moolenaar call assert_equal('cdefghijka1b1lma2b2n', g:Xpath) 2038*a6296200SBram Moolenaar [CODE] 2039*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2040*a6296200SBram Moolenaarendfunc 2041*a6296200SBram Moolenaar 2042*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2043*a6296200SBram Moolenaar" Test 34: :finally reason discarded by :continue {{{1 2044*a6296200SBram Moolenaar" 2045*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2046*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2047*a6296200SBram Moolenaar" discarded by a :continue in the finally clause. 2048*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2049*a6296200SBram Moolenaar 2050*a6296200SBram Moolenaarfunc Test_finally_after_continue() 2051*a6296200SBram Moolenaar let test =<< trim [CODE] 2052*a6296200SBram Moolenaar func C(jump) 2053*a6296200SBram Moolenaar XloopNEXT 2054*a6296200SBram Moolenaar let loop = 0 2055*a6296200SBram Moolenaar while loop < 2 2056*a6296200SBram Moolenaar let loop = loop + 1 2057*a6296200SBram Moolenaar if loop == 1 2058*a6296200SBram Moolenaar try 2059*a6296200SBram Moolenaar if a:jump == "continue" 2060*a6296200SBram Moolenaar continue 2061*a6296200SBram Moolenaar elseif a:jump == "break" 2062*a6296200SBram Moolenaar break 2063*a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2064*a6296200SBram Moolenaar return 2065*a6296200SBram Moolenaar elseif a:jump == "error" 2066*a6296200SBram Moolenaar asdf 2067*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2068*a6296200SBram Moolenaar call interrupt() 2069*a6296200SBram Moolenaar let dummy = 0 2070*a6296200SBram Moolenaar elseif a:jump == "throw" 2071*a6296200SBram Moolenaar throw "abc" 2072*a6296200SBram Moolenaar endif 2073*a6296200SBram Moolenaar finally 2074*a6296200SBram Moolenaar continue " discards jump that caused the :finally 2075*a6296200SBram Moolenaar call assert_report('should not get here') 2076*a6296200SBram Moolenaar endtry 2077*a6296200SBram Moolenaar call assert_report('should not get here') 2078*a6296200SBram Moolenaar elseif loop == 2 2079*a6296200SBram Moolenaar Xloop 'a' 2080*a6296200SBram Moolenaar endif 2081*a6296200SBram Moolenaar endwhile 2082*a6296200SBram Moolenaar endfunc 2083*a6296200SBram Moolenaar 2084*a6296200SBram Moolenaar call C("continue") 2085*a6296200SBram Moolenaar Xpath 'b' 2086*a6296200SBram Moolenaar call C("break") 2087*a6296200SBram Moolenaar Xpath 'c' 2088*a6296200SBram Moolenaar call C("return") 2089*a6296200SBram Moolenaar Xpath 'd' 2090*a6296200SBram Moolenaar let g:jump = "finish" 2091*a6296200SBram Moolenaar ExecAsScript C 2092*a6296200SBram Moolenaar unlet g:jump 2093*a6296200SBram Moolenaar Xpath 'e' 2094*a6296200SBram Moolenaar try 2095*a6296200SBram Moolenaar call C("error") 2096*a6296200SBram Moolenaar Xpath 'f' 2097*a6296200SBram Moolenaar finally 2098*a6296200SBram Moolenaar Xpath 'g' 2099*a6296200SBram Moolenaar try 2100*a6296200SBram Moolenaar call C("interrupt") 2101*a6296200SBram Moolenaar Xpath 'h' 2102*a6296200SBram Moolenaar finally 2103*a6296200SBram Moolenaar Xpath 'i' 2104*a6296200SBram Moolenaar call C("throw") 2105*a6296200SBram Moolenaar Xpath 'j' 2106*a6296200SBram Moolenaar endtry 2107*a6296200SBram Moolenaar endtry 2108*a6296200SBram Moolenaar Xpath 'k' 2109*a6296200SBram Moolenaar [CODE] 2110*a6296200SBram Moolenaar let verify =<< trim [CODE] 2111*a6296200SBram Moolenaar call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath) 2112*a6296200SBram Moolenaar [CODE] 2113*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2114*a6296200SBram Moolenaarendfunc 2115*a6296200SBram Moolenaar 2116*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2117*a6296200SBram Moolenaar" Test 35: :finally reason discarded by :break {{{1 2118*a6296200SBram Moolenaar" 2119*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2120*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2121*a6296200SBram Moolenaar" discarded by a :break in the finally clause. 2122*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2123*a6296200SBram Moolenaar 2124*a6296200SBram Moolenaarfunc Test_finally_discard_by_break() 2125*a6296200SBram Moolenaar let test =<< trim [CODE] 2126*a6296200SBram Moolenaar func B(jump) 2127*a6296200SBram Moolenaar XloopNEXT 2128*a6296200SBram Moolenaar let loop = 0 2129*a6296200SBram Moolenaar while loop < 2 2130*a6296200SBram Moolenaar let loop = loop + 1 2131*a6296200SBram Moolenaar if loop == 1 2132*a6296200SBram Moolenaar try 2133*a6296200SBram Moolenaar if a:jump == "continue" 2134*a6296200SBram Moolenaar continue 2135*a6296200SBram Moolenaar elseif a:jump == "break" 2136*a6296200SBram Moolenaar break 2137*a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2138*a6296200SBram Moolenaar return 2139*a6296200SBram Moolenaar elseif a:jump == "error" 2140*a6296200SBram Moolenaar asdf 2141*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2142*a6296200SBram Moolenaar call interrupt() 2143*a6296200SBram Moolenaar let dummy = 0 2144*a6296200SBram Moolenaar elseif a:jump == "throw" 2145*a6296200SBram Moolenaar throw "abc" 2146*a6296200SBram Moolenaar endif 2147*a6296200SBram Moolenaar finally 2148*a6296200SBram Moolenaar break " discards jump that caused the :finally 2149*a6296200SBram Moolenaar call assert_report('should not get here') 2150*a6296200SBram Moolenaar endtry 2151*a6296200SBram Moolenaar elseif loop == 2 2152*a6296200SBram Moolenaar call assert_report('should not get here') 2153*a6296200SBram Moolenaar endif 2154*a6296200SBram Moolenaar endwhile 2155*a6296200SBram Moolenaar Xloop 'a' 2156*a6296200SBram Moolenaar endfunc 2157*a6296200SBram Moolenaar 2158*a6296200SBram Moolenaar call B("continue") 2159*a6296200SBram Moolenaar Xpath 'b' 2160*a6296200SBram Moolenaar call B("break") 2161*a6296200SBram Moolenaar Xpath 'c' 2162*a6296200SBram Moolenaar call B("return") 2163*a6296200SBram Moolenaar Xpath 'd' 2164*a6296200SBram Moolenaar let g:jump = "finish" 2165*a6296200SBram Moolenaar ExecAsScript B 2166*a6296200SBram Moolenaar unlet g:jump 2167*a6296200SBram Moolenaar Xpath 'e' 2168*a6296200SBram Moolenaar try 2169*a6296200SBram Moolenaar call B("error") 2170*a6296200SBram Moolenaar Xpath 'f' 2171*a6296200SBram Moolenaar finally 2172*a6296200SBram Moolenaar Xpath 'g' 2173*a6296200SBram Moolenaar try 2174*a6296200SBram Moolenaar call B("interrupt") 2175*a6296200SBram Moolenaar Xpath 'h' 2176*a6296200SBram Moolenaar finally 2177*a6296200SBram Moolenaar Xpath 'i' 2178*a6296200SBram Moolenaar call B("throw") 2179*a6296200SBram Moolenaar Xpath 'j' 2180*a6296200SBram Moolenaar endtry 2181*a6296200SBram Moolenaar endtry 2182*a6296200SBram Moolenaar Xpath 'k' 2183*a6296200SBram Moolenaar [CODE] 2184*a6296200SBram Moolenaar let verify =<< trim [CODE] 2185*a6296200SBram Moolenaar call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath) 2186*a6296200SBram Moolenaar [CODE] 2187*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2188*a6296200SBram Moolenaarendfunc 2189*a6296200SBram Moolenaar 2190*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2191*a6296200SBram Moolenaar" Test 36: :finally reason discarded by :return {{{1 2192*a6296200SBram Moolenaar" 2193*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2194*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2195*a6296200SBram Moolenaar" discarded by a :return in the finally clause. 2196*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2197*a6296200SBram Moolenaar 2198*a6296200SBram Moolenaarfunc Test_finally_discard_by_return() 2199*a6296200SBram Moolenaar let test =<< trim [CODE] 2200*a6296200SBram Moolenaar func R(jump, retval) abort 2201*a6296200SBram Moolenaar let loop = 0 2202*a6296200SBram Moolenaar while loop < 2 2203*a6296200SBram Moolenaar let loop = loop + 1 2204*a6296200SBram Moolenaar if loop == 1 2205*a6296200SBram Moolenaar try 2206*a6296200SBram Moolenaar if a:jump == "continue" 2207*a6296200SBram Moolenaar continue 2208*a6296200SBram Moolenaar elseif a:jump == "break" 2209*a6296200SBram Moolenaar break 2210*a6296200SBram Moolenaar elseif a:jump == "return" 2211*a6296200SBram Moolenaar return 2212*a6296200SBram Moolenaar elseif a:jump == "error" 2213*a6296200SBram Moolenaar asdf 2214*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2215*a6296200SBram Moolenaar call interrupt() 2216*a6296200SBram Moolenaar let dummy = 0 2217*a6296200SBram Moolenaar elseif a:jump == "throw" 2218*a6296200SBram Moolenaar throw "abc" 2219*a6296200SBram Moolenaar endif 2220*a6296200SBram Moolenaar finally 2221*a6296200SBram Moolenaar return a:retval " discards jump that caused the :finally 2222*a6296200SBram Moolenaar call assert_report('should not get here') 2223*a6296200SBram Moolenaar endtry 2224*a6296200SBram Moolenaar elseif loop == 2 2225*a6296200SBram Moolenaar call assert_report('should not get here') 2226*a6296200SBram Moolenaar endif 2227*a6296200SBram Moolenaar endwhile 2228*a6296200SBram Moolenaar call assert_report('should not get here') 2229*a6296200SBram Moolenaar endfunc 2230*a6296200SBram Moolenaar 2231*a6296200SBram Moolenaar let sum = -R("continue", -8) 2232*a6296200SBram Moolenaar Xpath 'a' 2233*a6296200SBram Moolenaar let sum = sum - R("break", -16) 2234*a6296200SBram Moolenaar Xpath 'b' 2235*a6296200SBram Moolenaar let sum = sum - R("return", -32) 2236*a6296200SBram Moolenaar Xpath 'c' 2237*a6296200SBram Moolenaar try 2238*a6296200SBram Moolenaar let sum = sum - R("error", -64) 2239*a6296200SBram Moolenaar Xpath 'd' 2240*a6296200SBram Moolenaar finally 2241*a6296200SBram Moolenaar Xpath 'e' 2242*a6296200SBram Moolenaar try 2243*a6296200SBram Moolenaar let sum = sum - R("interrupt", -128) 2244*a6296200SBram Moolenaar Xpath 'f' 2245*a6296200SBram Moolenaar finally 2246*a6296200SBram Moolenaar Xpath 'g' 2247*a6296200SBram Moolenaar let sum = sum - R("throw", -256) 2248*a6296200SBram Moolenaar Xpath 'h' 2249*a6296200SBram Moolenaar endtry 2250*a6296200SBram Moolenaar endtry 2251*a6296200SBram Moolenaar Xpath 'i' 2252*a6296200SBram Moolenaar 2253*a6296200SBram Moolenaar let expected = 8 + 16 + 32 + 64 + 128 + 256 2254*a6296200SBram Moolenaar call assert_equal(sum, expected) 2255*a6296200SBram Moolenaar [CODE] 2256*a6296200SBram Moolenaar let verify =<< trim [CODE] 2257*a6296200SBram Moolenaar call assert_equal('abcdefghi', g:Xpath) 2258*a6296200SBram Moolenaar [CODE] 2259*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2260*a6296200SBram Moolenaarendfunc 2261*a6296200SBram Moolenaar 2262*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2263*a6296200SBram Moolenaar" Test 37: :finally reason discarded by :finish {{{1 2264*a6296200SBram Moolenaar" 2265*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2266*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2267*a6296200SBram Moolenaar" discarded by a :finish in the finally clause. 2268*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2269*a6296200SBram Moolenaar 2270*a6296200SBram Moolenaarfunc Test_finally_discard_by_finish() 2271*a6296200SBram Moolenaar let test =<< trim [CODE] 2272*a6296200SBram Moolenaar func F(jump) " not executed as function, transformed to a script 2273*a6296200SBram Moolenaar let loop = 0 2274*a6296200SBram Moolenaar while loop < 2 2275*a6296200SBram Moolenaar let loop = loop + 1 2276*a6296200SBram Moolenaar if loop == 1 2277*a6296200SBram Moolenaar try 2278*a6296200SBram Moolenaar if a:jump == "continue" 2279*a6296200SBram Moolenaar continue 2280*a6296200SBram Moolenaar elseif a:jump == "break" 2281*a6296200SBram Moolenaar break 2282*a6296200SBram Moolenaar elseif a:jump == "finish" 2283*a6296200SBram Moolenaar finish 2284*a6296200SBram Moolenaar elseif a:jump == "error" 2285*a6296200SBram Moolenaar asdf 2286*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2287*a6296200SBram Moolenaar call interrupt() 2288*a6296200SBram Moolenaar let dummy = 0 2289*a6296200SBram Moolenaar elseif a:jump == "throw" 2290*a6296200SBram Moolenaar throw "abc" 2291*a6296200SBram Moolenaar endif 2292*a6296200SBram Moolenaar finally 2293*a6296200SBram Moolenaar finish " discards jump that caused the :finally 2294*a6296200SBram Moolenaar call assert_report('should not get here') 2295*a6296200SBram Moolenaar endtry 2296*a6296200SBram Moolenaar elseif loop == 2 2297*a6296200SBram Moolenaar call assert_report('should not get here') 2298*a6296200SBram Moolenaar endif 2299*a6296200SBram Moolenaar endwhile 2300*a6296200SBram Moolenaar call assert_report('should not get here') 2301*a6296200SBram Moolenaar endfunc 2302*a6296200SBram Moolenaar 2303*a6296200SBram Moolenaar let scriptF = MakeScript("F") 2304*a6296200SBram Moolenaar delfunction F 2305*a6296200SBram Moolenaar 2306*a6296200SBram Moolenaar let g:jump = "continue" 2307*a6296200SBram Moolenaar exec "source" scriptF 2308*a6296200SBram Moolenaar Xpath 'a' 2309*a6296200SBram Moolenaar let g:jump = "break" 2310*a6296200SBram Moolenaar exec "source" scriptF 2311*a6296200SBram Moolenaar Xpath 'b' 2312*a6296200SBram Moolenaar let g:jump = "finish" 2313*a6296200SBram Moolenaar exec "source" scriptF 2314*a6296200SBram Moolenaar Xpath 'c' 2315*a6296200SBram Moolenaar try 2316*a6296200SBram Moolenaar let g:jump = "error" 2317*a6296200SBram Moolenaar exec "source" scriptF 2318*a6296200SBram Moolenaar Xpath 'd' 2319*a6296200SBram Moolenaar finally 2320*a6296200SBram Moolenaar Xpath 'e' 2321*a6296200SBram Moolenaar try 2322*a6296200SBram Moolenaar let g:jump = "interrupt" 2323*a6296200SBram Moolenaar exec "source" scriptF 2324*a6296200SBram Moolenaar Xpath 'f' 2325*a6296200SBram Moolenaar finally 2326*a6296200SBram Moolenaar Xpath 'g' 2327*a6296200SBram Moolenaar try 2328*a6296200SBram Moolenaar let g:jump = "throw" 2329*a6296200SBram Moolenaar exec "source" scriptF 2330*a6296200SBram Moolenaar Xpath 'h' 2331*a6296200SBram Moolenaar finally 2332*a6296200SBram Moolenaar Xpath 'i' 2333*a6296200SBram Moolenaar endtry 2334*a6296200SBram Moolenaar endtry 2335*a6296200SBram Moolenaar endtry 2336*a6296200SBram Moolenaar unlet g:jump 2337*a6296200SBram Moolenaar call delete(scriptF) 2338*a6296200SBram Moolenaar [CODE] 2339*a6296200SBram Moolenaar let verify =<< trim [CODE] 2340*a6296200SBram Moolenaar call assert_equal('abcdefghi', g:Xpath) 2341*a6296200SBram Moolenaar [CODE] 2342*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2343*a6296200SBram Moolenaarendfunc 2344*a6296200SBram Moolenaar 2345*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2346*a6296200SBram Moolenaar" Test 38: :finally reason discarded by an error {{{1 2347*a6296200SBram Moolenaar" 2348*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2349*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2350*a6296200SBram Moolenaar" discarded by an error in the finally clause. 2351*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2352*a6296200SBram Moolenaar 2353*a6296200SBram Moolenaarfunc Test_finally_discard_by_error() 2354*a6296200SBram Moolenaar let test =<< trim [CODE] 2355*a6296200SBram Moolenaar func E(jump) 2356*a6296200SBram Moolenaar let loop = 0 2357*a6296200SBram Moolenaar while loop < 2 2358*a6296200SBram Moolenaar let loop = loop + 1 2359*a6296200SBram Moolenaar if loop == 1 2360*a6296200SBram Moolenaar try 2361*a6296200SBram Moolenaar if a:jump == "continue" 2362*a6296200SBram Moolenaar continue 2363*a6296200SBram Moolenaar elseif a:jump == "break" 2364*a6296200SBram Moolenaar break 2365*a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2366*a6296200SBram Moolenaar return 2367*a6296200SBram Moolenaar elseif a:jump == "error" 2368*a6296200SBram Moolenaar asdf 2369*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2370*a6296200SBram Moolenaar call interrupt() 2371*a6296200SBram Moolenaar let dummy = 0 2372*a6296200SBram Moolenaar elseif a:jump == "throw" 2373*a6296200SBram Moolenaar throw "abc" 2374*a6296200SBram Moolenaar endif 2375*a6296200SBram Moolenaar finally 2376*a6296200SBram Moolenaar asdf " error; discards jump that caused the :finally 2377*a6296200SBram Moolenaar endtry 2378*a6296200SBram Moolenaar elseif loop == 2 2379*a6296200SBram Moolenaar call assert_report('should not get here') 2380*a6296200SBram Moolenaar endif 2381*a6296200SBram Moolenaar endwhile 2382*a6296200SBram Moolenaar call assert_report('should not get here') 2383*a6296200SBram Moolenaar endfunc 2384*a6296200SBram Moolenaar 2385*a6296200SBram Moolenaar try 2386*a6296200SBram Moolenaar Xpath 'a' 2387*a6296200SBram Moolenaar call E("continue") 2388*a6296200SBram Moolenaar call assert_report('should not get here') 2389*a6296200SBram Moolenaar finally 2390*a6296200SBram Moolenaar try 2391*a6296200SBram Moolenaar Xpath 'b' 2392*a6296200SBram Moolenaar call E("break") 2393*a6296200SBram Moolenaar call assert_report('should not get here') 2394*a6296200SBram Moolenaar finally 2395*a6296200SBram Moolenaar try 2396*a6296200SBram Moolenaar Xpath 'c' 2397*a6296200SBram Moolenaar call E("return") 2398*a6296200SBram Moolenaar call assert_report('should not get here') 2399*a6296200SBram Moolenaar finally 2400*a6296200SBram Moolenaar try 2401*a6296200SBram Moolenaar Xpath 'd' 2402*a6296200SBram Moolenaar let g:jump = "finish" 2403*a6296200SBram Moolenaar ExecAsScript E 2404*a6296200SBram Moolenaar call assert_report('should not get here') 2405*a6296200SBram Moolenaar finally 2406*a6296200SBram Moolenaar unlet g:jump 2407*a6296200SBram Moolenaar try 2408*a6296200SBram Moolenaar Xpath 'e' 2409*a6296200SBram Moolenaar call E("error") 2410*a6296200SBram Moolenaar call assert_report('should not get here') 2411*a6296200SBram Moolenaar finally 2412*a6296200SBram Moolenaar try 2413*a6296200SBram Moolenaar Xpath 'f' 2414*a6296200SBram Moolenaar call E("interrupt") 2415*a6296200SBram Moolenaar call assert_report('should not get here') 2416*a6296200SBram Moolenaar finally 2417*a6296200SBram Moolenaar try 2418*a6296200SBram Moolenaar Xpath 'g' 2419*a6296200SBram Moolenaar call E("throw") 2420*a6296200SBram Moolenaar call assert_report('should not get here') 2421*a6296200SBram Moolenaar finally 2422*a6296200SBram Moolenaar Xpath 'h' 2423*a6296200SBram Moolenaar delfunction E 2424*a6296200SBram Moolenaar endtry 2425*a6296200SBram Moolenaar endtry 2426*a6296200SBram Moolenaar endtry 2427*a6296200SBram Moolenaar endtry 2428*a6296200SBram Moolenaar endtry 2429*a6296200SBram Moolenaar endtry 2430*a6296200SBram Moolenaar endtry 2431*a6296200SBram Moolenaar call assert_report('should not get here') 2432*a6296200SBram Moolenaar [CODE] 2433*a6296200SBram Moolenaar let verify =<< trim [CODE] 2434*a6296200SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 2435*a6296200SBram Moolenaar [CODE] 2436*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2437*a6296200SBram Moolenaarendfunc 2438*a6296200SBram Moolenaar 2439*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2440*a6296200SBram Moolenaar" Test 39: :finally reason discarded by an interrupt {{{1 2441*a6296200SBram Moolenaar" 2442*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2443*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2444*a6296200SBram Moolenaar" discarded by an interrupt in the finally clause. 2445*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2446*a6296200SBram Moolenaar 2447*a6296200SBram Moolenaarfunc Test_finally_discarded_by_interrupt() 2448*a6296200SBram Moolenaar let test =<< trim [CODE] 2449*a6296200SBram Moolenaar func I(jump) 2450*a6296200SBram Moolenaar let loop = 0 2451*a6296200SBram Moolenaar while loop < 2 2452*a6296200SBram Moolenaar let loop = loop + 1 2453*a6296200SBram Moolenaar if loop == 1 2454*a6296200SBram Moolenaar try 2455*a6296200SBram Moolenaar if a:jump == "continue" 2456*a6296200SBram Moolenaar continue 2457*a6296200SBram Moolenaar elseif a:jump == "break" 2458*a6296200SBram Moolenaar break 2459*a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2460*a6296200SBram Moolenaar return 2461*a6296200SBram Moolenaar elseif a:jump == "error" 2462*a6296200SBram Moolenaar asdf 2463*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2464*a6296200SBram Moolenaar call interrupt() 2465*a6296200SBram Moolenaar let dummy = 0 2466*a6296200SBram Moolenaar elseif a:jump == "throw" 2467*a6296200SBram Moolenaar throw "abc" 2468*a6296200SBram Moolenaar endif 2469*a6296200SBram Moolenaar finally 2470*a6296200SBram Moolenaar call interrupt() 2471*a6296200SBram Moolenaar let dummy = 0 2472*a6296200SBram Moolenaar endtry 2473*a6296200SBram Moolenaar elseif loop == 2 2474*a6296200SBram Moolenaar call assert_report('should not get here') 2475*a6296200SBram Moolenaar endif 2476*a6296200SBram Moolenaar endwhile 2477*a6296200SBram Moolenaar call assert_report('should not get here') 2478*a6296200SBram Moolenaar endfunc 2479*a6296200SBram Moolenaar 2480*a6296200SBram Moolenaar try 2481*a6296200SBram Moolenaar try 2482*a6296200SBram Moolenaar Xpath 'a' 2483*a6296200SBram Moolenaar call I("continue") 2484*a6296200SBram Moolenaar call assert_report('should not get here') 2485*a6296200SBram Moolenaar finally 2486*a6296200SBram Moolenaar try 2487*a6296200SBram Moolenaar Xpath 'b' 2488*a6296200SBram Moolenaar call I("break") 2489*a6296200SBram Moolenaar call assert_report('should not get here') 2490*a6296200SBram Moolenaar finally 2491*a6296200SBram Moolenaar try 2492*a6296200SBram Moolenaar Xpath 'c' 2493*a6296200SBram Moolenaar call I("return") 2494*a6296200SBram Moolenaar call assert_report('should not get here') 2495*a6296200SBram Moolenaar finally 2496*a6296200SBram Moolenaar try 2497*a6296200SBram Moolenaar Xpath 'd' 2498*a6296200SBram Moolenaar let g:jump = "finish" 2499*a6296200SBram Moolenaar ExecAsScript I 2500*a6296200SBram Moolenaar call assert_report('should not get here') 2501*a6296200SBram Moolenaar finally 2502*a6296200SBram Moolenaar unlet g:jump 2503*a6296200SBram Moolenaar try 2504*a6296200SBram Moolenaar Xpath 'e' 2505*a6296200SBram Moolenaar call I("error") 2506*a6296200SBram Moolenaar call assert_report('should not get here') 2507*a6296200SBram Moolenaar finally 2508*a6296200SBram Moolenaar try 2509*a6296200SBram Moolenaar Xpath 'f' 2510*a6296200SBram Moolenaar call I("interrupt") 2511*a6296200SBram Moolenaar call assert_report('should not get here') 2512*a6296200SBram Moolenaar finally 2513*a6296200SBram Moolenaar try 2514*a6296200SBram Moolenaar Xpath 'g' 2515*a6296200SBram Moolenaar call I("throw") 2516*a6296200SBram Moolenaar call assert_report('should not get here') 2517*a6296200SBram Moolenaar finally 2518*a6296200SBram Moolenaar Xpath 'h' 2519*a6296200SBram Moolenaar delfunction I 2520*a6296200SBram Moolenaar endtry 2521*a6296200SBram Moolenaar endtry 2522*a6296200SBram Moolenaar endtry 2523*a6296200SBram Moolenaar endtry 2524*a6296200SBram Moolenaar endtry 2525*a6296200SBram Moolenaar endtry 2526*a6296200SBram Moolenaar endtry 2527*a6296200SBram Moolenaar call assert_report('should not get here') 2528*a6296200SBram Moolenaar catch /^Vim:Interrupt$/ 2529*a6296200SBram Moolenaar Xpath 'A' 2530*a6296200SBram Moolenaar endtry 2531*a6296200SBram Moolenaar [CODE] 2532*a6296200SBram Moolenaar let verify =<< trim [CODE] 2533*a6296200SBram Moolenaar call assert_equal('abcdefghA', g:Xpath) 2534*a6296200SBram Moolenaar [CODE] 2535*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2536*a6296200SBram Moolenaarendfunc 2537*a6296200SBram Moolenaar 2538*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2539*a6296200SBram Moolenaar" Test 40: :finally reason discarded by :throw {{{1 2540*a6296200SBram Moolenaar" 2541*a6296200SBram Moolenaar" When a :finally clause is executed due to a :continue, :break, 2542*a6296200SBram Moolenaar" :return, :finish, error, interrupt or :throw, the jump reason is 2543*a6296200SBram Moolenaar" discarded by a :throw in the finally clause. 2544*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2545*a6296200SBram Moolenaar 2546*a6296200SBram Moolenaarfunc Test_finally_discard_by_throw() 2547*a6296200SBram Moolenaar let test =<< trim [CODE] 2548*a6296200SBram Moolenaar func T(jump) 2549*a6296200SBram Moolenaar let loop = 0 2550*a6296200SBram Moolenaar while loop < 2 2551*a6296200SBram Moolenaar let loop = loop + 1 2552*a6296200SBram Moolenaar if loop == 1 2553*a6296200SBram Moolenaar try 2554*a6296200SBram Moolenaar if a:jump == "continue" 2555*a6296200SBram Moolenaar continue 2556*a6296200SBram Moolenaar elseif a:jump == "break" 2557*a6296200SBram Moolenaar break 2558*a6296200SBram Moolenaar elseif a:jump == "return" || a:jump == "finish" 2559*a6296200SBram Moolenaar return 2560*a6296200SBram Moolenaar elseif a:jump == "error" 2561*a6296200SBram Moolenaar asdf 2562*a6296200SBram Moolenaar elseif a:jump == "interrupt" 2563*a6296200SBram Moolenaar call interrupt() 2564*a6296200SBram Moolenaar let dummy = 0 2565*a6296200SBram Moolenaar elseif a:jump == "throw" 2566*a6296200SBram Moolenaar throw "abc" 2567*a6296200SBram Moolenaar endif 2568*a6296200SBram Moolenaar finally 2569*a6296200SBram Moolenaar throw "xyz" " discards jump that caused the :finally 2570*a6296200SBram Moolenaar endtry 2571*a6296200SBram Moolenaar elseif loop == 2 2572*a6296200SBram Moolenaar call assert_report('should not get here') 2573*a6296200SBram Moolenaar endif 2574*a6296200SBram Moolenaar endwhile 2575*a6296200SBram Moolenaar call assert_report('should not get here') 2576*a6296200SBram Moolenaar endfunc 2577*a6296200SBram Moolenaar 2578*a6296200SBram Moolenaar try 2579*a6296200SBram Moolenaar Xpath 'a' 2580*a6296200SBram Moolenaar call T("continue") 2581*a6296200SBram Moolenaar call assert_report('should not get here') 2582*a6296200SBram Moolenaar finally 2583*a6296200SBram Moolenaar try 2584*a6296200SBram Moolenaar Xpath 'b' 2585*a6296200SBram Moolenaar call T("break") 2586*a6296200SBram Moolenaar call assert_report('should not get here') 2587*a6296200SBram Moolenaar finally 2588*a6296200SBram Moolenaar try 2589*a6296200SBram Moolenaar Xpath 'c' 2590*a6296200SBram Moolenaar call T("return") 2591*a6296200SBram Moolenaar call assert_report('should not get here') 2592*a6296200SBram Moolenaar finally 2593*a6296200SBram Moolenaar try 2594*a6296200SBram Moolenaar Xpath 'd' 2595*a6296200SBram Moolenaar let g:jump = "finish" 2596*a6296200SBram Moolenaar ExecAsScript T 2597*a6296200SBram Moolenaar call assert_report('should not get here') 2598*a6296200SBram Moolenaar finally 2599*a6296200SBram Moolenaar unlet g:jump 2600*a6296200SBram Moolenaar try 2601*a6296200SBram Moolenaar Xpath 'e' 2602*a6296200SBram Moolenaar call T("error") 2603*a6296200SBram Moolenaar call assert_report('should not get here') 2604*a6296200SBram Moolenaar finally 2605*a6296200SBram Moolenaar try 2606*a6296200SBram Moolenaar Xpath 'f' 2607*a6296200SBram Moolenaar call T("interrupt") 2608*a6296200SBram Moolenaar call assert_report('should not get here') 2609*a6296200SBram Moolenaar finally 2610*a6296200SBram Moolenaar try 2611*a6296200SBram Moolenaar Xpath 'g' 2612*a6296200SBram Moolenaar call T("throw") 2613*a6296200SBram Moolenaar call assert_report('should not get here') 2614*a6296200SBram Moolenaar finally 2615*a6296200SBram Moolenaar Xpath 'h' 2616*a6296200SBram Moolenaar delfunction T 2617*a6296200SBram Moolenaar endtry 2618*a6296200SBram Moolenaar endtry 2619*a6296200SBram Moolenaar endtry 2620*a6296200SBram Moolenaar endtry 2621*a6296200SBram Moolenaar endtry 2622*a6296200SBram Moolenaar endtry 2623*a6296200SBram Moolenaar endtry 2624*a6296200SBram Moolenaar call assert_report('should not get here') 2625*a6296200SBram Moolenaar [CODE] 2626*a6296200SBram Moolenaar let verify =<< trim [CODE] 2627*a6296200SBram Moolenaar call assert_equal('abcdefgh', g:Xpath) 2628*a6296200SBram Moolenaar [CODE] 2629*a6296200SBram Moolenaar call RunInNewVim(test, verify) 2630*a6296200SBram Moolenaarendfunc 2631*a6296200SBram Moolenaar 2632*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2633*a6296200SBram Moolenaar" Test 49: Throwing exceptions across functions {{{1 2634*a6296200SBram Moolenaar" 2635*a6296200SBram Moolenaar" When an exception is thrown but not caught inside a function, the 2636*a6296200SBram Moolenaar" caller is checked for a matching :catch clause. 2637*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2638*a6296200SBram Moolenaar 2639*a6296200SBram Moolenaarfunc T49_C() 2640*a6296200SBram Moolenaar try 2641*a6296200SBram Moolenaar Xpath 'a' 2642*a6296200SBram Moolenaar throw "arrgh" 2643*a6296200SBram Moolenaar call assert_report('should not get here') 2644*a6296200SBram Moolenaar catch /arrgh/ 2645*a6296200SBram Moolenaar Xpath 'b' 2646*a6296200SBram Moolenaar endtry 2647*a6296200SBram Moolenaar Xpath 'c' 2648*a6296200SBram Moolenaarendfunc 2649*a6296200SBram Moolenaar 2650*a6296200SBram Moolenaarfunc T49_T1() 2651*a6296200SBram Moolenaar XloopNEXT 2652*a6296200SBram Moolenaar try 2653*a6296200SBram Moolenaar Xloop 'd' 2654*a6296200SBram Moolenaar throw "arrgh" 2655*a6296200SBram Moolenaar call assert_report('should not get here') 2656*a6296200SBram Moolenaar finally 2657*a6296200SBram Moolenaar Xloop 'e' 2658*a6296200SBram Moolenaar endtry 2659*a6296200SBram Moolenaar Xloop 'f' 2660*a6296200SBram Moolenaarendfunc 2661*a6296200SBram Moolenaar 2662*a6296200SBram Moolenaarfunc T49_T2() 2663*a6296200SBram Moolenaar try 2664*a6296200SBram Moolenaar Xpath 'g' 2665*a6296200SBram Moolenaar call T49_T1() 2666*a6296200SBram Moolenaar call assert_report('should not get here') 2667*a6296200SBram Moolenaar finally 2668*a6296200SBram Moolenaar Xpath 'h' 2669*a6296200SBram Moolenaar endtry 2670*a6296200SBram Moolenaar call assert_report('should not get here') 2671*a6296200SBram Moolenaarendfunc 2672*a6296200SBram Moolenaar 2673*a6296200SBram Moolenaarfunc Test_throw_exception_across_funcs() 2674*a6296200SBram Moolenaar XpathINIT 2675*a6296200SBram Moolenaar XloopINIT 2676*a6296200SBram Moolenaar try 2677*a6296200SBram Moolenaar Xpath 'i' 2678*a6296200SBram Moolenaar call T49_C() " throw and catch 2679*a6296200SBram Moolenaar Xpath 'j' 2680*a6296200SBram Moolenaar catch /.*/ 2681*a6296200SBram Moolenaar call assert_report('should not get here') 2682*a6296200SBram Moolenaar endtry 2683*a6296200SBram Moolenaar 2684*a6296200SBram Moolenaar try 2685*a6296200SBram Moolenaar Xpath 'k' 2686*a6296200SBram Moolenaar call T49_T1() " throw, one level 2687*a6296200SBram Moolenaar call assert_report('should not get here') 2688*a6296200SBram Moolenaar catch /arrgh/ 2689*a6296200SBram Moolenaar Xpath 'l' 2690*a6296200SBram Moolenaar catch /.*/ 2691*a6296200SBram Moolenaar call assert_report('should not get here') 2692*a6296200SBram Moolenaar endtry 2693*a6296200SBram Moolenaar 2694*a6296200SBram Moolenaar try 2695*a6296200SBram Moolenaar Xpath 'm' 2696*a6296200SBram Moolenaar call T49_T2() " throw, two levels 2697*a6296200SBram Moolenaar call assert_report('should not get here') 2698*a6296200SBram Moolenaar catch /arrgh/ 2699*a6296200SBram Moolenaar Xpath 'n' 2700*a6296200SBram Moolenaar catch /.*/ 2701*a6296200SBram Moolenaar call assert_report('should not get here') 2702*a6296200SBram Moolenaar endtry 2703*a6296200SBram Moolenaar Xpath 'o' 2704*a6296200SBram Moolenaar 2705*a6296200SBram Moolenaar call assert_equal('iabcjkd2e2lmgd3e3hno', g:Xpath) 2706*a6296200SBram Moolenaarendfunc 2707*a6296200SBram Moolenaar 2708*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2709*a6296200SBram Moolenaar" Test 50: Throwing exceptions across script files {{{1 2710*a6296200SBram Moolenaar" 2711*a6296200SBram Moolenaar" When an exception is thrown but not caught inside a script file, 2712*a6296200SBram Moolenaar" the sourcing script or function is checked for a matching :catch 2713*a6296200SBram Moolenaar" clause. 2714*a6296200SBram Moolenaar" 2715*a6296200SBram Moolenaar" This test executes the bodies of the functions C, T1, and T2 from 2716*a6296200SBram Moolenaar" the previous test as script files (:return replaced by :finish). 2717*a6296200SBram Moolenaar"------------------------------------------------------------------------------- 2718*a6296200SBram Moolenaar 2719*a6296200SBram Moolenaarfunc T50_F() 2720*a6296200SBram Moolenaar try 2721*a6296200SBram Moolenaar Xpath 'A' 2722*a6296200SBram Moolenaar exec "source" g:scriptC 2723*a6296200SBram Moolenaar Xpath 'B' 2724*a6296200SBram Moolenaar catch /.*/ 2725*a6296200SBram Moolenaar call assert_report('should not get here') 2726*a6296200SBram Moolenaar endtry 2727*a6296200SBram Moolenaar 2728*a6296200SBram Moolenaar try 2729*a6296200SBram Moolenaar Xpath 'C' 2730*a6296200SBram Moolenaar exec "source" g:scriptT1 2731*a6296200SBram Moolenaar call assert_report('should not get here') 2732*a6296200SBram Moolenaar catch /arrgh/ 2733*a6296200SBram Moolenaar Xpath 'D' 2734*a6296200SBram Moolenaar catch /.*/ 2735*a6296200SBram Moolenaar call assert_report('should not get here') 2736*a6296200SBram Moolenaar endtry 2737*a6296200SBram Moolenaarendfunc 2738*a6296200SBram Moolenaar 2739*a6296200SBram Moolenaarfunc Test_throw_across_script() 2740*a6296200SBram Moolenaar XpathINIT 2741*a6296200SBram Moolenaar XloopINIT 2742*a6296200SBram Moolenaar let g:scriptC = MakeScript("T49_C") 2743*a6296200SBram Moolenaar let g:scriptT1 = MakeScript("T49_T1") 2744*a6296200SBram Moolenaar let scriptT2 = MakeScript("T49_T2", g:scriptT1) 2745*a6296200SBram Moolenaar 2746*a6296200SBram Moolenaar try 2747*a6296200SBram Moolenaar Xpath 'E' 2748*a6296200SBram Moolenaar call T50_F() 2749*a6296200SBram Moolenaar Xpath 'F' 2750*a6296200SBram Moolenaar exec "source" scriptT2 2751*a6296200SBram Moolenaar call assert_report('should not get here') 2752*a6296200SBram Moolenaar catch /arrgh/ 2753*a6296200SBram Moolenaar Xpath 'G' 2754*a6296200SBram Moolenaar catch /.*/ 2755*a6296200SBram Moolenaar call assert_report('should not get here') 2756*a6296200SBram Moolenaar endtry 2757*a6296200SBram Moolenaar Xpath 'H' 2758*a6296200SBram Moolenaar call assert_equal('EAabcBCd2e2DFgd3e3hGH', g:Xpath) 2759*a6296200SBram Moolenaar 2760*a6296200SBram Moolenaar call delete(g:scriptC) 2761*a6296200SBram Moolenaar call delete(g:scriptT1) 2762*a6296200SBram Moolenaar call delete(scriptT2) 2763*a6296200SBram Moolenaar unlet g:scriptC g:scriptT1 scriptT2 2764*a6296200SBram Moolenaarendfunc 2765*a6296200SBram Moolenaar 27661f068233SBram Moolenaar"------------------------------------------------------------------------------- 27671f068233SBram Moolenaar" Test 87 using (expr) ? funcref : funcref {{{1 27681f068233SBram Moolenaar" 27691f068233SBram Moolenaar" Vim needs to correctly parse the funcref and even when it does 27701f068233SBram Moolenaar" not execute the funcref, it needs to consume the trailing () 27711f068233SBram Moolenaar"------------------------------------------------------------------------------- 27721f068233SBram Moolenaar 27731f068233SBram Moolenaarfunc Add2(x1, x2) 27741f068233SBram Moolenaar return a:x1 + a:x2 27751f068233SBram Moolenaarendfu 27761f068233SBram Moolenaar 27771f068233SBram Moolenaarfunc GetStr() 27781f068233SBram Moolenaar return "abcdefghijklmnopqrstuvwxyp" 27791f068233SBram Moolenaarendfu 27801f068233SBram Moolenaar 27811f068233SBram Moolenaarfunc Test_funcref_with_condexpr() 27821f068233SBram Moolenaar call assert_equal(5, function('Add2')(2,3)) 27831f068233SBram Moolenaar 27841f068233SBram Moolenaar call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3)) 27851f068233SBram Moolenaar call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3)) 27861f068233SBram Moolenaar " Make sure, GetStr() still works. 27871f068233SBram Moolenaar call assert_equal('abcdefghijk', GetStr()[0:10]) 27881f068233SBram Moolenaarendfunc 27891f068233SBram Moolenaar 2790b544f3c8SBram Moolenaar" Test 90: Recognizing {} in variable name. {{{1 2791b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2792b544f3c8SBram Moolenaar 2793b544f3c8SBram Moolenaarfunc Test_curlies() 2794b544f3c8SBram Moolenaar let s:var = 66 2795b544f3c8SBram Moolenaar let ns = 's' 2796b544f3c8SBram Moolenaar call assert_equal(66, {ns}:var) 2797b544f3c8SBram Moolenaar 2798b544f3c8SBram Moolenaar let g:a = {} 2799b544f3c8SBram Moolenaar let g:b = 't' 2800b544f3c8SBram Moolenaar let g:a[g:b] = 77 2801b544f3c8SBram Moolenaar call assert_equal(77, g:a['t']) 2802b544f3c8SBram Moolenaarendfunc 2803b544f3c8SBram Moolenaar 2804b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2805b544f3c8SBram Moolenaar" Test 91: using type(). {{{1 2806b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2807b544f3c8SBram Moolenaar 2808b544f3c8SBram Moolenaarfunc Test_type() 2809b544f3c8SBram Moolenaar call assert_equal(0, type(0)) 2810b544f3c8SBram Moolenaar call assert_equal(1, type("")) 2811b544f3c8SBram Moolenaar call assert_equal(2, type(function("tr"))) 2812b544f3c8SBram Moolenaar call assert_equal(2, type(function("tr", [8]))) 2813b544f3c8SBram Moolenaar call assert_equal(3, type([])) 2814b544f3c8SBram Moolenaar call assert_equal(4, type({})) 28155feabe00SBram Moolenaar if has('float') 2816b544f3c8SBram Moolenaar call assert_equal(5, type(0.0)) 28175feabe00SBram Moolenaar endif 2818b544f3c8SBram Moolenaar call assert_equal(6, type(v:false)) 2819b544f3c8SBram Moolenaar call assert_equal(6, type(v:true)) 2820b544f3c8SBram Moolenaar call assert_equal(7, type(v:none)) 2821b544f3c8SBram Moolenaar call assert_equal(7, type(v:null)) 2822b544f3c8SBram Moolenaar call assert_equal(8, v:t_job) 2823b544f3c8SBram Moolenaar call assert_equal(9, v:t_channel) 2824b544f3c8SBram Moolenaar call assert_equal(v:t_number, type(0)) 2825b544f3c8SBram Moolenaar call assert_equal(v:t_string, type("")) 2826b544f3c8SBram Moolenaar call assert_equal(v:t_func, type(function("tr"))) 2827b544f3c8SBram Moolenaar call assert_equal(v:t_func, type(function("tr", [8]))) 2828b544f3c8SBram Moolenaar call assert_equal(v:t_list, type([])) 2829b544f3c8SBram Moolenaar call assert_equal(v:t_dict, type({})) 28305feabe00SBram Moolenaar if has('float') 2831b544f3c8SBram Moolenaar call assert_equal(v:t_float, type(0.0)) 28325feabe00SBram Moolenaar endif 2833b544f3c8SBram Moolenaar call assert_equal(v:t_bool, type(v:false)) 2834b544f3c8SBram Moolenaar call assert_equal(v:t_bool, type(v:true)) 2835b544f3c8SBram Moolenaar call assert_equal(v:t_none, type(v:none)) 2836b544f3c8SBram Moolenaar call assert_equal(v:t_none, type(v:null)) 283792b83ccfSBram Moolenaar call assert_equal(v:t_string, type(test_null_string())) 283892b83ccfSBram Moolenaar call assert_equal(v:t_func, type(test_null_function())) 283992b83ccfSBram Moolenaar call assert_equal(v:t_func, type(test_null_partial())) 284092b83ccfSBram Moolenaar call assert_equal(v:t_list, type(test_null_list())) 284192b83ccfSBram Moolenaar call assert_equal(v:t_dict, type(test_null_dict())) 284292b83ccfSBram Moolenaar if has('job') 284392b83ccfSBram Moolenaar call assert_equal(v:t_job, type(test_null_job())) 284492b83ccfSBram Moolenaar endif 284592b83ccfSBram Moolenaar if has('channel') 284692b83ccfSBram Moolenaar call assert_equal(v:t_channel, type(test_null_channel())) 284792b83ccfSBram Moolenaar endif 284892b83ccfSBram Moolenaar call assert_equal(v:t_blob, type(test_null_blob())) 2849b544f3c8SBram Moolenaar 28507c215c58SBram Moolenaar call assert_fails("call type(test_void())", 'E685:') 28517c215c58SBram Moolenaar call assert_fails("call type(test_unknown())", 'E685:') 2852b544f3c8SBram Moolenaar 2853b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:false) 2854b544f3c8SBram Moolenaar call assert_equal(1, 0 + v:true) 2855b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:none) 2856b544f3c8SBram Moolenaar call assert_equal(0, 0 + v:null) 2857b544f3c8SBram Moolenaar 2858b544f3c8SBram Moolenaar call assert_equal('v:false', '' . v:false) 2859b544f3c8SBram Moolenaar call assert_equal('v:true', '' . v:true) 2860b544f3c8SBram Moolenaar call assert_equal('v:none', '' . v:none) 2861b544f3c8SBram Moolenaar call assert_equal('v:null', '' . v:null) 2862b544f3c8SBram Moolenaar 2863b544f3c8SBram Moolenaar call assert_true(v:false == 0) 2864b544f3c8SBram Moolenaar call assert_false(v:false != 0) 2865b544f3c8SBram Moolenaar call assert_true(v:true == 1) 2866b544f3c8SBram Moolenaar call assert_false(v:true != 1) 2867b544f3c8SBram Moolenaar call assert_false(v:true == v:false) 2868b544f3c8SBram Moolenaar call assert_true(v:true != v:false) 2869b544f3c8SBram Moolenaar 2870b544f3c8SBram Moolenaar call assert_true(v:null == 0) 2871b544f3c8SBram Moolenaar call assert_false(v:null != 0) 2872b544f3c8SBram Moolenaar call assert_true(v:none == 0) 2873b544f3c8SBram Moolenaar call assert_false(v:none != 0) 2874b544f3c8SBram Moolenaar 2875b544f3c8SBram Moolenaar call assert_true(v:false is v:false) 2876b544f3c8SBram Moolenaar call assert_true(v:true is v:true) 2877b544f3c8SBram Moolenaar call assert_true(v:none is v:none) 2878b544f3c8SBram Moolenaar call assert_true(v:null is v:null) 2879b544f3c8SBram Moolenaar 2880b544f3c8SBram Moolenaar call assert_false(v:false isnot v:false) 2881b544f3c8SBram Moolenaar call assert_false(v:true isnot v:true) 2882b544f3c8SBram Moolenaar call assert_false(v:none isnot v:none) 2883b544f3c8SBram Moolenaar call assert_false(v:null isnot v:null) 2884b544f3c8SBram Moolenaar 2885b544f3c8SBram Moolenaar call assert_false(v:false is 0) 2886b544f3c8SBram Moolenaar call assert_false(v:true is 1) 2887b544f3c8SBram Moolenaar call assert_false(v:true is v:false) 2888b544f3c8SBram Moolenaar call assert_false(v:none is 0) 2889b544f3c8SBram Moolenaar call assert_false(v:null is 0) 2890b544f3c8SBram Moolenaar call assert_false(v:null is v:none) 2891b544f3c8SBram Moolenaar 2892b544f3c8SBram Moolenaar call assert_true(v:false isnot 0) 2893b544f3c8SBram Moolenaar call assert_true(v:true isnot 1) 2894b544f3c8SBram Moolenaar call assert_true(v:true isnot v:false) 2895b544f3c8SBram Moolenaar call assert_true(v:none isnot 0) 2896b544f3c8SBram Moolenaar call assert_true(v:null isnot 0) 2897b544f3c8SBram Moolenaar call assert_true(v:null isnot v:none) 2898b544f3c8SBram Moolenaar 2899b544f3c8SBram Moolenaar call assert_equal(v:false, eval(string(v:false))) 2900b544f3c8SBram Moolenaar call assert_equal(v:true, eval(string(v:true))) 2901b544f3c8SBram Moolenaar call assert_equal(v:none, eval(string(v:none))) 2902b544f3c8SBram Moolenaar call assert_equal(v:null, eval(string(v:null))) 2903b544f3c8SBram Moolenaar 2904b544f3c8SBram Moolenaar call assert_equal(v:false, copy(v:false)) 2905b544f3c8SBram Moolenaar call assert_equal(v:true, copy(v:true)) 2906b544f3c8SBram Moolenaar call assert_equal(v:none, copy(v:none)) 2907b544f3c8SBram Moolenaar call assert_equal(v:null, copy(v:null)) 2908b544f3c8SBram Moolenaar 2909b544f3c8SBram Moolenaar call assert_equal([v:false], deepcopy([v:false])) 2910b544f3c8SBram Moolenaar call assert_equal([v:true], deepcopy([v:true])) 2911b544f3c8SBram Moolenaar call assert_equal([v:none], deepcopy([v:none])) 2912b544f3c8SBram Moolenaar call assert_equal([v:null], deepcopy([v:null])) 2913b544f3c8SBram Moolenaar 2914b544f3c8SBram Moolenaar call assert_true(empty(v:false)) 2915b544f3c8SBram Moolenaar call assert_false(empty(v:true)) 2916b544f3c8SBram Moolenaar call assert_true(empty(v:null)) 2917b544f3c8SBram Moolenaar call assert_true(empty(v:none)) 2918b544f3c8SBram Moolenaar 2919b544f3c8SBram Moolenaar func ChangeYourMind() 2920b544f3c8SBram Moolenaar try 2921b544f3c8SBram Moolenaar return v:true 2922b544f3c8SBram Moolenaar finally 2923b544f3c8SBram Moolenaar return 'something else' 2924b544f3c8SBram Moolenaar endtry 2925b544f3c8SBram Moolenaar endfunc 2926b544f3c8SBram Moolenaar 2927b544f3c8SBram Moolenaar call ChangeYourMind() 2928b544f3c8SBram Moolenaarendfunc 2929b544f3c8SBram Moolenaar 2930b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2931b544f3c8SBram Moolenaar" Test 92: skipping code {{{1 2932b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2933b544f3c8SBram Moolenaar 2934b544f3c8SBram Moolenaarfunc Test_skip() 2935b544f3c8SBram Moolenaar let Fn = function('Test_type') 2936b544f3c8SBram Moolenaar call assert_false(0 && Fn[1]) 2937b544f3c8SBram Moolenaar call assert_false(0 && string(Fn)) 2938b544f3c8SBram Moolenaar call assert_false(0 && len(Fn)) 2939b544f3c8SBram Moolenaar let l = [] 2940b544f3c8SBram Moolenaar call assert_false(0 && l[1]) 2941b544f3c8SBram Moolenaar call assert_false(0 && string(l)) 2942b544f3c8SBram Moolenaar call assert_false(0 && len(l)) 2943b544f3c8SBram Moolenaar let f = 1.0 2944b544f3c8SBram Moolenaar call assert_false(0 && f[1]) 2945b544f3c8SBram Moolenaar call assert_false(0 && string(f)) 2946b544f3c8SBram Moolenaar call assert_false(0 && len(f)) 2947b544f3c8SBram Moolenaar let sp = v:null 2948b544f3c8SBram Moolenaar call assert_false(0 && sp[1]) 2949b544f3c8SBram Moolenaar call assert_false(0 && string(sp)) 2950b544f3c8SBram Moolenaar call assert_false(0 && len(sp)) 2951b544f3c8SBram Moolenaar 2952b544f3c8SBram Moolenaarendfunc 2953b544f3c8SBram Moolenaar 2954b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2955b544f3c8SBram Moolenaar" Test 93: :echo and string() {{{1 2956b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 2957b544f3c8SBram Moolenaar 2958b544f3c8SBram Moolenaarfunc Test_echo_and_string() 2959b544f3c8SBram Moolenaar " String 2960b544f3c8SBram Moolenaar let a = 'foo bar' 2961b544f3c8SBram Moolenaar redir => result 2962b544f3c8SBram Moolenaar echo a 2963b544f3c8SBram Moolenaar echo string(a) 2964b544f3c8SBram Moolenaar redir END 2965b544f3c8SBram Moolenaar let l = split(result, "\n") 2966b544f3c8SBram Moolenaar call assert_equal(["foo bar", 2967b544f3c8SBram Moolenaar \ "'foo bar'"], l) 2968b544f3c8SBram Moolenaar 2969b544f3c8SBram Moolenaar " Float 2970b544f3c8SBram Moolenaar if has('float') 2971b544f3c8SBram Moolenaar let a = -1.2e0 2972b544f3c8SBram Moolenaar redir => result 2973b544f3c8SBram Moolenaar echo a 2974b544f3c8SBram Moolenaar echo string(a) 2975b544f3c8SBram Moolenaar redir END 2976b544f3c8SBram Moolenaar let l = split(result, "\n") 2977b544f3c8SBram Moolenaar call assert_equal(["-1.2", 2978b544f3c8SBram Moolenaar \ "-1.2"], l) 2979b544f3c8SBram Moolenaar endif 2980b544f3c8SBram Moolenaar 2981b544f3c8SBram Moolenaar " Funcref 2982b544f3c8SBram Moolenaar redir => result 2983b544f3c8SBram Moolenaar echo function('string') 2984b544f3c8SBram Moolenaar echo string(function('string')) 2985b544f3c8SBram Moolenaar redir END 2986b544f3c8SBram Moolenaar let l = split(result, "\n") 2987b544f3c8SBram Moolenaar call assert_equal(["string", 2988b544f3c8SBram Moolenaar \ "function('string')"], l) 2989b544f3c8SBram Moolenaar 2990b544f3c8SBram Moolenaar " Recursive dictionary 2991b544f3c8SBram Moolenaar let a = {} 2992b544f3c8SBram Moolenaar let a["a"] = a 2993b544f3c8SBram Moolenaar redir => result 2994b544f3c8SBram Moolenaar echo a 2995b544f3c8SBram Moolenaar echo string(a) 2996b544f3c8SBram Moolenaar redir END 2997b544f3c8SBram Moolenaar let l = split(result, "\n") 2998b544f3c8SBram Moolenaar call assert_equal(["{'a': {...}}", 2999b544f3c8SBram Moolenaar \ "{'a': {...}}"], l) 3000b544f3c8SBram Moolenaar 3001b544f3c8SBram Moolenaar " Recursive list 3002b544f3c8SBram Moolenaar let a = [0] 3003b544f3c8SBram Moolenaar let a[0] = a 3004b544f3c8SBram Moolenaar redir => result 3005b544f3c8SBram Moolenaar echo a 3006b544f3c8SBram Moolenaar echo string(a) 3007b544f3c8SBram Moolenaar redir END 3008b544f3c8SBram Moolenaar let l = split(result, "\n") 3009b544f3c8SBram Moolenaar call assert_equal(["[[...]]", 3010b544f3c8SBram Moolenaar \ "[[...]]"], l) 3011b544f3c8SBram Moolenaar 3012b544f3c8SBram Moolenaar " Empty dictionaries in a list 3013b544f3c8SBram Moolenaar let a = {} 3014b544f3c8SBram Moolenaar redir => result 3015b544f3c8SBram Moolenaar echo [a, a, a] 3016b544f3c8SBram Moolenaar echo string([a, a, a]) 3017b544f3c8SBram Moolenaar redir END 3018b544f3c8SBram Moolenaar let l = split(result, "\n") 3019b544f3c8SBram Moolenaar call assert_equal(["[{}, {}, {}]", 3020b544f3c8SBram Moolenaar \ "[{}, {}, {}]"], l) 3021b544f3c8SBram Moolenaar 3022b544f3c8SBram Moolenaar " Empty dictionaries in a dictionary 3023b544f3c8SBram Moolenaar let a = {} 3024b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 3025b544f3c8SBram Moolenaar redir => result 3026b544f3c8SBram Moolenaar echo b 3027b544f3c8SBram Moolenaar echo string(b) 3028b544f3c8SBram Moolenaar redir END 3029b544f3c8SBram Moolenaar let l = split(result, "\n") 3030b544f3c8SBram Moolenaar call assert_equal(["{'a': {}, 'b': {}}", 3031b544f3c8SBram Moolenaar \ "{'a': {}, 'b': {}}"], l) 3032b544f3c8SBram Moolenaar 3033b544f3c8SBram Moolenaar " Empty lists in a list 3034b544f3c8SBram Moolenaar let a = [] 3035b544f3c8SBram Moolenaar redir => result 3036b544f3c8SBram Moolenaar echo [a, a, a] 3037b544f3c8SBram Moolenaar echo string([a, a, a]) 3038b544f3c8SBram Moolenaar redir END 3039b544f3c8SBram Moolenaar let l = split(result, "\n") 3040b544f3c8SBram Moolenaar call assert_equal(["[[], [], []]", 3041b544f3c8SBram Moolenaar \ "[[], [], []]"], l) 3042b544f3c8SBram Moolenaar 3043b544f3c8SBram Moolenaar " Empty lists in a dictionary 3044b544f3c8SBram Moolenaar let a = [] 3045b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 3046b544f3c8SBram Moolenaar redir => result 3047b544f3c8SBram Moolenaar echo b 3048b544f3c8SBram Moolenaar echo string(b) 3049b544f3c8SBram Moolenaar redir END 3050b544f3c8SBram Moolenaar let l = split(result, "\n") 3051b544f3c8SBram Moolenaar call assert_equal(["{'a': [], 'b': []}", 3052b544f3c8SBram Moolenaar \ "{'a': [], 'b': []}"], l) 3053b544f3c8SBram Moolenaar 3054b544f3c8SBram Moolenaar " Dictionaries in a list 3055b544f3c8SBram Moolenaar let a = {"one": "yes", "two": "yes", "three": "yes"} 3056b544f3c8SBram Moolenaar redir => result 3057b544f3c8SBram Moolenaar echo [a, a, a] 3058b544f3c8SBram Moolenaar echo string([a, a, a]) 3059b544f3c8SBram Moolenaar redir END 3060b544f3c8SBram Moolenaar let l = split(result, "\n") 3061b544f3c8SBram Moolenaar call assert_equal(["[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {...}, {...}]", 3062b544f3c8SBram Moolenaar \ "[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}]"], l) 3063b544f3c8SBram Moolenaar 3064b544f3c8SBram Moolenaar " Dictionaries in a dictionary 3065b544f3c8SBram Moolenaar let a = {"one": "yes", "two": "yes", "three": "yes"} 3066b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 3067b544f3c8SBram Moolenaar redir => result 3068b544f3c8SBram Moolenaar echo b 3069b544f3c8SBram Moolenaar echo string(b) 3070b544f3c8SBram Moolenaar redir END 3071b544f3c8SBram Moolenaar let l = split(result, "\n") 3072b544f3c8SBram Moolenaar call assert_equal(["{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {...}}", 3073b544f3c8SBram Moolenaar \ "{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {'one': 'yes', 'two': 'yes', 'three': 'yes'}}"], l) 3074b544f3c8SBram Moolenaar 3075b544f3c8SBram Moolenaar " Lists in a list 3076b544f3c8SBram Moolenaar let a = [1, 2, 3] 3077b544f3c8SBram Moolenaar redir => result 3078b544f3c8SBram Moolenaar echo [a, a, a] 3079b544f3c8SBram Moolenaar echo string([a, a, a]) 3080b544f3c8SBram Moolenaar redir END 3081b544f3c8SBram Moolenaar let l = split(result, "\n") 3082b544f3c8SBram Moolenaar call assert_equal(["[[1, 2, 3], [...], [...]]", 3083b544f3c8SBram Moolenaar \ "[[1, 2, 3], [1, 2, 3], [1, 2, 3]]"], l) 3084b544f3c8SBram Moolenaar 3085b544f3c8SBram Moolenaar " Lists in a dictionary 3086b544f3c8SBram Moolenaar let a = [1, 2, 3] 3087b544f3c8SBram Moolenaar let b = {"a": a, "b": a} 3088b544f3c8SBram Moolenaar redir => result 3089b544f3c8SBram Moolenaar echo b 3090b544f3c8SBram Moolenaar echo string(b) 3091b544f3c8SBram Moolenaar redir END 3092b544f3c8SBram Moolenaar let l = split(result, "\n") 3093b544f3c8SBram Moolenaar call assert_equal(["{'a': [1, 2, 3], 'b': [...]}", 3094b544f3c8SBram Moolenaar \ "{'a': [1, 2, 3], 'b': [1, 2, 3]}"], l) 3095b544f3c8SBram Moolenaar 30961363a30cSBram Moolenaar call assert_fails('echo &:', 'E112:') 30971363a30cSBram Moolenaar call assert_fails('echo &g:', 'E112:') 30981363a30cSBram Moolenaar call assert_fails('echo &l:', 'E112:') 30991363a30cSBram Moolenaar 3100b544f3c8SBram Moolenaarendfunc 3101b544f3c8SBram Moolenaar 3102b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3103b544f3c8SBram Moolenaar" Test 94: 64-bit Numbers {{{1 3104b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3105b544f3c8SBram Moolenaar 3106b544f3c8SBram Moolenaarfunc Test_num64() 3107b544f3c8SBram Moolenaar call assert_notequal( 4294967296, 0) 3108b544f3c8SBram Moolenaar call assert_notequal(-4294967296, 0) 3109b544f3c8SBram Moolenaar call assert_equal( 4294967296, 0xFFFFffff + 1) 3110b544f3c8SBram Moolenaar call assert_equal(-4294967296, -0xFFFFffff - 1) 3111b544f3c8SBram Moolenaar 3112b544f3c8SBram Moolenaar call assert_equal( 9223372036854775807, 1 / 0) 3113b544f3c8SBram Moolenaar call assert_equal(-9223372036854775807, -1 / 0) 3114b544f3c8SBram Moolenaar call assert_equal(-9223372036854775807 - 1, 0 / 0) 3115b544f3c8SBram Moolenaar 31165feabe00SBram Moolenaar if has('float') 3117b544f3c8SBram Moolenaar call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150)) 3118b544f3c8SBram Moolenaar call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150)) 31195feabe00SBram Moolenaar endif 3120b544f3c8SBram Moolenaar 3121b544f3c8SBram Moolenaar let rng = range(0xFFFFffff, 0x100000001) 3122b544f3c8SBram Moolenaar call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng) 3123b544f3c8SBram Moolenaar call assert_equal(0x100000001, max(rng)) 3124b544f3c8SBram Moolenaar call assert_equal(0xFFFFffff, min(rng)) 3125b544f3c8SBram Moolenaar call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N')) 3126b544f3c8SBram Moolenaarendfunc 3127b544f3c8SBram Moolenaar 3128b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3129b544f3c8SBram Moolenaar" Test 95: lines of :append, :change, :insert {{{1 3130b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3131b544f3c8SBram Moolenaar 3132b544f3c8SBram Moolenaarfunction! DefineFunction(name, body) 3133b544f3c8SBram Moolenaar let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n") 3134b544f3c8SBram Moolenaar exec func 3135b544f3c8SBram Moolenaarendfunction 3136b544f3c8SBram Moolenaar 3137b544f3c8SBram Moolenaarfunc Test_script_lines() 3138b544f3c8SBram Moolenaar " :append 3139b544f3c8SBram Moolenaar try 3140b544f3c8SBram Moolenaar call DefineFunction('T_Append', [ 3141b544f3c8SBram Moolenaar \ 'append', 3142b544f3c8SBram Moolenaar \ 'py <<EOS', 3143b544f3c8SBram Moolenaar \ '.', 3144b544f3c8SBram Moolenaar \ ]) 3145b544f3c8SBram Moolenaar catch 314637175409SBram Moolenaar call assert_report("Can't define function") 3147b544f3c8SBram Moolenaar endtry 3148b544f3c8SBram Moolenaar try 3149b544f3c8SBram Moolenaar call DefineFunction('T_Append', [ 3150b544f3c8SBram Moolenaar \ 'append', 3151b544f3c8SBram Moolenaar \ 'abc', 3152b544f3c8SBram Moolenaar \ ]) 315337175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 3154b544f3c8SBram Moolenaar catch 3155b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 3156b544f3c8SBram Moolenaar endtry 3157b544f3c8SBram Moolenaar 3158b544f3c8SBram Moolenaar " :change 3159b544f3c8SBram Moolenaar try 3160b544f3c8SBram Moolenaar call DefineFunction('T_Change', [ 3161b544f3c8SBram Moolenaar \ 'change', 3162b544f3c8SBram Moolenaar \ 'py <<EOS', 3163b544f3c8SBram Moolenaar \ '.', 3164b544f3c8SBram Moolenaar \ ]) 3165b544f3c8SBram Moolenaar catch 316637175409SBram Moolenaar call assert_report("Can't define function") 3167b544f3c8SBram Moolenaar endtry 3168b544f3c8SBram Moolenaar try 3169b544f3c8SBram Moolenaar call DefineFunction('T_Change', [ 3170b544f3c8SBram Moolenaar \ 'change', 3171b544f3c8SBram Moolenaar \ 'abc', 3172b544f3c8SBram Moolenaar \ ]) 317337175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 3174b544f3c8SBram Moolenaar catch 3175b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 3176b544f3c8SBram Moolenaar endtry 3177b544f3c8SBram Moolenaar 3178b544f3c8SBram Moolenaar " :insert 3179b544f3c8SBram Moolenaar try 3180b544f3c8SBram Moolenaar call DefineFunction('T_Insert', [ 3181b544f3c8SBram Moolenaar \ 'insert', 3182b544f3c8SBram Moolenaar \ 'py <<EOS', 3183b544f3c8SBram Moolenaar \ '.', 3184b544f3c8SBram Moolenaar \ ]) 3185b544f3c8SBram Moolenaar catch 318637175409SBram Moolenaar call assert_report("Can't define function") 3187b544f3c8SBram Moolenaar endtry 3188b544f3c8SBram Moolenaar try 3189b544f3c8SBram Moolenaar call DefineFunction('T_Insert', [ 3190b544f3c8SBram Moolenaar \ 'insert', 3191b544f3c8SBram Moolenaar \ 'abc', 3192b544f3c8SBram Moolenaar \ ]) 319337175409SBram Moolenaar call assert_report("Shouldn't be able to define function") 3194b544f3c8SBram Moolenaar catch 3195b544f3c8SBram Moolenaar call assert_exception('Vim(function):E126: Missing :endfunction') 3196b544f3c8SBram Moolenaar endtry 3197b544f3c8SBram Moolenaarendfunc 3198b544f3c8SBram Moolenaar 3199b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3200478af67dSBram Moolenaar" Test 96: line continuation {{{1 3201478af67dSBram Moolenaar" 3202478af67dSBram Moolenaar" Undefined behavior was detected by ubsan with line continuation 3203478af67dSBram Moolenaar" after an empty line. 3204478af67dSBram Moolenaar"------------------------------------------------------------------------------- 3205478af67dSBram Moolenaarfunc Test_script_emty_line_continuation() 3206478af67dSBram Moolenaar 3207478af67dSBram Moolenaar \ 3208478af67dSBram Moolenaarendfunc 3209478af67dSBram Moolenaar 3210478af67dSBram Moolenaar"------------------------------------------------------------------------------- 3211863e80b4SBram Moolenaar" Test 97: bitwise functions {{{1 3212863e80b4SBram Moolenaar"------------------------------------------------------------------------------- 3213863e80b4SBram Moolenaarfunc Test_bitwise_functions() 3214863e80b4SBram Moolenaar " and 3215863e80b4SBram Moolenaar call assert_equal(127, and(127, 127)) 3216863e80b4SBram Moolenaar call assert_equal(16, and(127, 16)) 3217073e4b92SBram Moolenaar eval 127->and(16)->assert_equal(16) 3218863e80b4SBram Moolenaar call assert_equal(0, and(127, 128)) 3219863e80b4SBram Moolenaar call assert_fails("call and([], 1)", 'E745:') 3220863e80b4SBram Moolenaar call assert_fails("call and({}, 1)", 'E728:') 32215feabe00SBram Moolenaar if has('float') 32225feabe00SBram Moolenaar call assert_fails("call and(1.0, 1)", 'E805:') 3223863e80b4SBram Moolenaar call assert_fails("call and(1, 1.0)", 'E805:') 32245feabe00SBram Moolenaar endif 3225863e80b4SBram Moolenaar call assert_fails("call and(1, [])", 'E745:') 3226863e80b4SBram Moolenaar call assert_fails("call and(1, {})", 'E728:') 3227863e80b4SBram Moolenaar " or 3228863e80b4SBram Moolenaar call assert_equal(23, or(16, 7)) 3229863e80b4SBram Moolenaar call assert_equal(15, or(8, 7)) 3230073e4b92SBram Moolenaar eval 8->or(7)->assert_equal(15) 3231863e80b4SBram Moolenaar call assert_equal(123, or(0, 123)) 3232863e80b4SBram Moolenaar call assert_fails("call or([], 1)", 'E745:') 3233863e80b4SBram Moolenaar call assert_fails("call or({}, 1)", 'E728:') 32345feabe00SBram Moolenaar if has('float') 32355feabe00SBram Moolenaar call assert_fails("call or(1.0, 1)", 'E805:') 3236863e80b4SBram Moolenaar call assert_fails("call or(1, 1.0)", 'E805:') 32375feabe00SBram Moolenaar endif 3238863e80b4SBram Moolenaar call assert_fails("call or(1, [])", 'E745:') 3239863e80b4SBram Moolenaar call assert_fails("call or(1, {})", 'E728:') 3240863e80b4SBram Moolenaar " xor 3241863e80b4SBram Moolenaar call assert_equal(0, xor(127, 127)) 3242863e80b4SBram Moolenaar call assert_equal(111, xor(127, 16)) 3243073e4b92SBram Moolenaar eval 127->xor(16)->assert_equal(111) 3244863e80b4SBram Moolenaar call assert_equal(255, xor(127, 128)) 32455feabe00SBram Moolenaar if has('float') 3246863e80b4SBram Moolenaar call assert_fails("call xor(1.0, 1)", 'E805:') 32475feabe00SBram Moolenaar call assert_fails("call xor(1, 1.0)", 'E805:') 32485feabe00SBram Moolenaar endif 3249863e80b4SBram Moolenaar call assert_fails("call xor([], 1)", 'E745:') 3250863e80b4SBram Moolenaar call assert_fails("call xor({}, 1)", 'E728:') 3251863e80b4SBram Moolenaar call assert_fails("call xor(1, [])", 'E745:') 3252863e80b4SBram Moolenaar call assert_fails("call xor(1, {})", 'E728:') 3253863e80b4SBram Moolenaar " invert 3254863e80b4SBram Moolenaar call assert_equal(65408, and(invert(127), 65535)) 3255073e4b92SBram Moolenaar eval 127->invert()->and(65535)->assert_equal(65408) 3256863e80b4SBram Moolenaar call assert_equal(65519, and(invert(16), 65535)) 3257863e80b4SBram Moolenaar call assert_equal(65407, and(invert(128), 65535)) 32585feabe00SBram Moolenaar if has('float') 3259863e80b4SBram Moolenaar call assert_fails("call invert(1.0)", 'E805:') 32605feabe00SBram Moolenaar endif 3261863e80b4SBram Moolenaar call assert_fails("call invert([])", 'E745:') 3262863e80b4SBram Moolenaar call assert_fails("call invert({})", 'E728:') 3263863e80b4SBram Moolenaarendfunc 3264863e80b4SBram Moolenaar 32656f9a476bSBram Moolenaar" Test using bang after user command {{{1 32666f9a476bSBram Moolenaarfunc Test_user_command_with_bang() 32676f9a476bSBram Moolenaar command -bang Nieuw let nieuw = 1 32686f9a476bSBram Moolenaar Ni! 32696f9a476bSBram Moolenaar call assert_equal(1, nieuw) 32706f9a476bSBram Moolenaar unlet nieuw 32716f9a476bSBram Moolenaar delcommand Nieuw 32726f9a476bSBram Moolenaarendfunc 32736f9a476bSBram Moolenaar 3274b9adef79SBram Moolenaarfunc Test_script_expand_sfile() 3275b9adef79SBram Moolenaar let lines =<< trim END 3276b9adef79SBram Moolenaar func s:snr() 3277b9adef79SBram Moolenaar return expand('<sfile>') 3278b9adef79SBram Moolenaar endfunc 3279b9adef79SBram Moolenaar let g:result = s:snr() 3280b9adef79SBram Moolenaar END 3281b9adef79SBram Moolenaar call writefile(lines, 'Xexpand') 3282b9adef79SBram Moolenaar source Xexpand 3283b9adef79SBram Moolenaar call assert_match('<SNR>\d\+_snr', g:result) 3284b9adef79SBram Moolenaar source Xexpand 3285b9adef79SBram Moolenaar call assert_match('<SNR>\d\+_snr', g:result) 3286b9adef79SBram Moolenaar 3287b9adef79SBram Moolenaar call delete('Xexpand') 3288b9adef79SBram Moolenaar unlet g:result 3289b9adef79SBram Moolenaarendfunc 3290b9adef79SBram Moolenaar 3291ff697e6cSBram Moolenaarfunc Test_compound_assignment_operators() 3292ff697e6cSBram Moolenaar " Test for number 3293ff697e6cSBram Moolenaar let x = 1 3294ff697e6cSBram Moolenaar let x += 10 3295ff697e6cSBram Moolenaar call assert_equal(11, x) 3296ff697e6cSBram Moolenaar let x -= 5 3297ff697e6cSBram Moolenaar call assert_equal(6, x) 3298ff697e6cSBram Moolenaar let x *= 4 3299ff697e6cSBram Moolenaar call assert_equal(24, x) 3300ff697e6cSBram Moolenaar let x /= 3 3301ff697e6cSBram Moolenaar call assert_equal(8, x) 3302ff697e6cSBram Moolenaar let x %= 3 3303ff697e6cSBram Moolenaar call assert_equal(2, x) 3304ff697e6cSBram Moolenaar let x .= 'n' 3305ff697e6cSBram Moolenaar call assert_equal('2n', x) 3306ff697e6cSBram Moolenaar 3307e21c1580SBram Moolenaar " Test special cases: division or modulus with 0. 3308e21c1580SBram Moolenaar let x = 1 3309e21c1580SBram Moolenaar let x /= 0 3310e21c1580SBram Moolenaar call assert_equal(0x7FFFFFFFFFFFFFFF, x) 3311e21c1580SBram Moolenaar 3312e21c1580SBram Moolenaar let x = -1 3313e21c1580SBram Moolenaar let x /= 0 3314e21c1580SBram Moolenaar call assert_equal(-0x7FFFFFFFFFFFFFFF, x) 3315e21c1580SBram Moolenaar 3316e21c1580SBram Moolenaar let x = 0 3317e21c1580SBram Moolenaar let x /= 0 3318e21c1580SBram Moolenaar call assert_equal(-0x7FFFFFFFFFFFFFFF - 1, x) 3319e21c1580SBram Moolenaar 3320e21c1580SBram Moolenaar let x = 1 3321e21c1580SBram Moolenaar let x %= 0 3322e21c1580SBram Moolenaar call assert_equal(0, x) 3323e21c1580SBram Moolenaar 3324e21c1580SBram Moolenaar let x = -1 3325e21c1580SBram Moolenaar let x %= 0 3326e21c1580SBram Moolenaar call assert_equal(0, x) 3327e21c1580SBram Moolenaar 3328e21c1580SBram Moolenaar let x = 0 3329e21c1580SBram Moolenaar let x %= 0 3330e21c1580SBram Moolenaar call assert_equal(0, x) 3331e21c1580SBram Moolenaar 3332ff697e6cSBram Moolenaar " Test for string 3333ff697e6cSBram Moolenaar let x = 'str' 3334ff697e6cSBram Moolenaar let x .= 'ing' 3335ff697e6cSBram Moolenaar call assert_equal('string', x) 3336ff697e6cSBram Moolenaar let x += 1 3337ff697e6cSBram Moolenaar call assert_equal(1, x) 3338ff697e6cSBram Moolenaar 3339ff697e6cSBram Moolenaar if has('float') 3340ff697e6cSBram Moolenaar " Test for float 33415feabe00SBram Moolenaar let x -= 1.5 33425feabe00SBram Moolenaar call assert_equal(-0.5, x) 3343ff697e6cSBram Moolenaar let x = 0.5 3344ff697e6cSBram Moolenaar let x += 4.5 3345ff697e6cSBram Moolenaar call assert_equal(5.0, x) 3346ff697e6cSBram Moolenaar let x -= 1.5 3347ff697e6cSBram Moolenaar call assert_equal(3.5, x) 3348ff697e6cSBram Moolenaar let x *= 3.0 3349ff697e6cSBram Moolenaar call assert_equal(10.5, x) 3350ff697e6cSBram Moolenaar let x /= 2.5 3351ff697e6cSBram Moolenaar call assert_equal(4.2, x) 3352ff697e6cSBram Moolenaar call assert_fails('let x %= 0.5', 'E734') 3353ff697e6cSBram Moolenaar call assert_fails('let x .= "f"', 'E734') 33548b633135SBram Moolenaar let x = !3.14 33558b633135SBram Moolenaar call assert_equal(0.0, x) 3356ea04a6e8SBram Moolenaar 3357ea04a6e8SBram Moolenaar " integer and float operations 3358ea04a6e8SBram Moolenaar let x = 1 3359ea04a6e8SBram Moolenaar let x *= 2.1 3360ea04a6e8SBram Moolenaar call assert_equal(2.1, x) 3361ea04a6e8SBram Moolenaar let x = 1 3362ea04a6e8SBram Moolenaar let x /= 0.25 3363ea04a6e8SBram Moolenaar call assert_equal(4.0, x) 3364ea04a6e8SBram Moolenaar let x = 1 3365ea04a6e8SBram Moolenaar call assert_fails('let x %= 0.25', 'E734:') 3366ea04a6e8SBram Moolenaar let x = 1 3367ea04a6e8SBram Moolenaar call assert_fails('let x .= 0.25', 'E734:') 3368ea04a6e8SBram Moolenaar let x = 1.0 3369ea04a6e8SBram Moolenaar call assert_fails('let x += [1.1]', 'E734:') 3370ff697e6cSBram Moolenaar endif 3371ff697e6cSBram Moolenaar 3372ff697e6cSBram Moolenaar " Test for environment variable 3373ff697e6cSBram Moolenaar let $FOO = 1 3374ff697e6cSBram Moolenaar call assert_fails('let $FOO += 1', 'E734') 3375ff697e6cSBram Moolenaar call assert_fails('let $FOO -= 1', 'E734') 3376ff697e6cSBram Moolenaar call assert_fails('let $FOO *= 1', 'E734') 3377ff697e6cSBram Moolenaar call assert_fails('let $FOO /= 1', 'E734') 3378ff697e6cSBram Moolenaar call assert_fails('let $FOO %= 1', 'E734') 3379ff697e6cSBram Moolenaar let $FOO .= 's' 3380ff697e6cSBram Moolenaar call assert_equal('1s', $FOO) 3381ff697e6cSBram Moolenaar unlet $FOO 3382ff697e6cSBram Moolenaar 3383ff697e6cSBram Moolenaar " Test for option variable (type: number) 3384ff697e6cSBram Moolenaar let &scrolljump = 1 3385ff697e6cSBram Moolenaar let &scrolljump += 5 3386ff697e6cSBram Moolenaar call assert_equal(6, &scrolljump) 3387ff697e6cSBram Moolenaar let &scrolljump -= 2 3388ff697e6cSBram Moolenaar call assert_equal(4, &scrolljump) 3389ff697e6cSBram Moolenaar let &scrolljump *= 3 3390ff697e6cSBram Moolenaar call assert_equal(12, &scrolljump) 3391ff697e6cSBram Moolenaar let &scrolljump /= 2 3392ff697e6cSBram Moolenaar call assert_equal(6, &scrolljump) 3393ff697e6cSBram Moolenaar let &scrolljump %= 5 3394ff697e6cSBram Moolenaar call assert_equal(1, &scrolljump) 3395ff697e6cSBram Moolenaar call assert_fails('let &scrolljump .= "j"', 'E734') 3396ff697e6cSBram Moolenaar set scrolljump&vim 3397ff697e6cSBram Moolenaar 3398ff697e6cSBram Moolenaar " Test for register 3399ff697e6cSBram Moolenaar let @/ = 1 3400ff697e6cSBram Moolenaar call assert_fails('let @/ += 1', 'E734') 3401ff697e6cSBram Moolenaar call assert_fails('let @/ -= 1', 'E734') 3402ff697e6cSBram Moolenaar call assert_fails('let @/ *= 1', 'E734') 3403ff697e6cSBram Moolenaar call assert_fails('let @/ /= 1', 'E734') 3404ff697e6cSBram Moolenaar call assert_fails('let @/ %= 1', 'E734') 3405ff697e6cSBram Moolenaar let @/ .= 's' 3406ff697e6cSBram Moolenaar call assert_equal('1s', @/) 3407ff697e6cSBram Moolenaar let @/ = '' 3408ff697e6cSBram Moolenaarendfunc 3409ff697e6cSBram Moolenaar 34107e0868efSBram Moolenaarfunc Test_unlet_env() 34117e0868efSBram Moolenaar let $TESTVAR = 'yes' 34127e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 34137e0868efSBram Moolenaar call assert_fails('lockvar $TESTVAR', 'E940') 34147e0868efSBram Moolenaar call assert_fails('unlockvar $TESTVAR', 'E940') 34157e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 34167e0868efSBram Moolenaar if 0 34177e0868efSBram Moolenaar unlet $TESTVAR 34187e0868efSBram Moolenaar endif 34197e0868efSBram Moolenaar call assert_equal('yes', $TESTVAR) 34207e0868efSBram Moolenaar unlet $TESTVAR 34217e0868efSBram Moolenaar call assert_equal('', $TESTVAR) 34227e0868efSBram Moolenaarendfunc 34237e0868efSBram Moolenaar 3424c3e92c16SBram Moolenaarfunc Test_refcount() 3425c3e92c16SBram Moolenaar " Immediate values 3426c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(1)) 3427c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount('s')) 3428c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(v:true)) 3429c3e92c16SBram Moolenaar call assert_equal(0, test_refcount([])) 3430c3e92c16SBram Moolenaar call assert_equal(0, test_refcount({})) 3431c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(0zff)) 3432c3e92c16SBram Moolenaar call assert_equal(0, test_refcount({-> line('.')})) 3433c3e92c16SBram Moolenaar if has('float') 3434c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(0.1)) 3435c3e92c16SBram Moolenaar endif 3436c3e92c16SBram Moolenaar if has('job') 3437c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .']))) 3438c3e92c16SBram Moolenaar endif 3439c3e92c16SBram Moolenaar 3440c3e92c16SBram Moolenaar " No refcount types 3441c3e92c16SBram Moolenaar let x = 1 3442c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 3443c3e92c16SBram Moolenaar let x = 's' 3444c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 3445c3e92c16SBram Moolenaar let x = v:true 3446c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 3447c3e92c16SBram Moolenaar if has('float') 3448c3e92c16SBram Moolenaar let x = 0.1 3449c3e92c16SBram Moolenaar call assert_equal(-1, test_refcount(x)) 3450c3e92c16SBram Moolenaar endif 3451c3e92c16SBram Moolenaar 3452c3e92c16SBram Moolenaar " Check refcount 3453c3e92c16SBram Moolenaar let x = [] 3454c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(x)) 3455c3e92c16SBram Moolenaar 3456c3e92c16SBram Moolenaar let x = {} 3457ce90e36fSBram Moolenaar call assert_equal(1, x->test_refcount()) 3458c3e92c16SBram Moolenaar 3459c3e92c16SBram Moolenaar let x = 0zff 3460c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(x)) 3461c3e92c16SBram Moolenaar 3462c3e92c16SBram Moolenaar let X = {-> line('.')} 3463c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(X)) 3464c3e92c16SBram Moolenaar let Y = X 3465c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 3466c3e92c16SBram Moolenaar 3467c3e92c16SBram Moolenaar if has('job') 3468c3e92c16SBram Moolenaar let job = job_start([&shell, &shellcmdflag, 'echo .']) 3469c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job)) 3470c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job_getchannel(job))) 3471c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(job)) 3472c3e92c16SBram Moolenaar endif 3473c3e92c16SBram Moolenaar 3474c3e92c16SBram Moolenaar " Function arguments, copying and unassigning 3475c3e92c16SBram Moolenaar func ExprCheck(x, i) 3476c3e92c16SBram Moolenaar let i = a:i + 1 3477c3e92c16SBram Moolenaar call assert_equal(i, test_refcount(a:x)) 3478c3e92c16SBram Moolenaar let Y = a:x 3479c3e92c16SBram Moolenaar call assert_equal(i + 1, test_refcount(a:x)) 3480c3e92c16SBram Moolenaar call assert_equal(test_refcount(a:x), test_refcount(Y)) 3481c3e92c16SBram Moolenaar let Y = 0 3482c3e92c16SBram Moolenaar call assert_equal(i, test_refcount(a:x)) 3483c3e92c16SBram Moolenaar endfunc 3484c3e92c16SBram Moolenaar call ExprCheck([], 0) 3485c3e92c16SBram Moolenaar call ExprCheck({}, 0) 3486c3e92c16SBram Moolenaar call ExprCheck(0zff, 0) 3487c3e92c16SBram Moolenaar call ExprCheck({-> line('.')}, 0) 3488c3e92c16SBram Moolenaar if has('job') 3489c3e92c16SBram Moolenaar call ExprCheck(job, 1) 3490c3e92c16SBram Moolenaar call ExprCheck(job_getchannel(job), 1) 3491c3e92c16SBram Moolenaar call job_stop(job) 3492c3e92c16SBram Moolenaar endif 3493c3e92c16SBram Moolenaar delfunc ExprCheck 3494c3e92c16SBram Moolenaar 3495c3e92c16SBram Moolenaar " Regarding function 3496c3e92c16SBram Moolenaar func Func(x) abort 3497c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(function('Func'))) 3498c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func'))) 3499c3e92c16SBram Moolenaar endfunc 3500c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(function('Func'))) 3501c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(function('Func', [1]))) 3502c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func'))) 3503c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(funcref('Func', [1]))) 3504c3e92c16SBram Moolenaar let X = function('Func') 3505c3e92c16SBram Moolenaar let Y = X 3506c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(X)) 3507c3e92c16SBram Moolenaar let X = function('Func', [1]) 3508c3e92c16SBram Moolenaar let Y = X 3509c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 3510c3e92c16SBram Moolenaar let X = funcref('Func') 3511c3e92c16SBram Moolenaar let Y = X 3512c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 3513c3e92c16SBram Moolenaar let X = funcref('Func', [1]) 3514c3e92c16SBram Moolenaar let Y = X 3515c3e92c16SBram Moolenaar call assert_equal(2, test_refcount(X)) 3516c3e92c16SBram Moolenaar unlet X 3517c3e92c16SBram Moolenaar unlet Y 3518c3e92c16SBram Moolenaar call Func(1) 3519c3e92c16SBram Moolenaar delfunc Func 3520c3e92c16SBram Moolenaar 3521c3e92c16SBram Moolenaar " Function with dict 3522c3e92c16SBram Moolenaar func DictFunc() dict 3523c3e92c16SBram Moolenaar call assert_equal(3, test_refcount(self)) 3524c3e92c16SBram Moolenaar endfunc 3525c3e92c16SBram Moolenaar let d = {'Func': function('DictFunc')} 3526c3e92c16SBram Moolenaar call assert_equal(1, test_refcount(d)) 3527c3e92c16SBram Moolenaar call assert_equal(0, test_refcount(d.Func)) 3528c3e92c16SBram Moolenaar call d.Func() 3529c3e92c16SBram Moolenaar unlet d 3530c3e92c16SBram Moolenaar delfunc DictFunc 3531c3e92c16SBram Moolenaarendfunc 3532c3e92c16SBram Moolenaar 35339f6277bdSBram Moolenaar" Test for missing :endif, :endfor, :endwhile and :endtry {{{1 35349f6277bdSBram Moolenaarfunc Test_missing_end() 35359f6277bdSBram Moolenaar call writefile(['if 2 > 1', 'echo ">"'], 'Xscript') 35369f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E171:') 35379f6277bdSBram Moolenaar call writefile(['for i in range(5)', 'echo i'], 'Xscript') 35389f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E170:') 35399f6277bdSBram Moolenaar call writefile(['while v:true', 'echo "."'], 'Xscript') 35409f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E170:') 35419f6277bdSBram Moolenaar call writefile(['try', 'echo "."'], 'Xscript') 35429f6277bdSBram Moolenaar call assert_fails('source Xscript', 'E600:') 35439f6277bdSBram Moolenaar call delete('Xscript') 3544818fc9adSBram Moolenaar 3545818fc9adSBram Moolenaar " Using endfor with :while 3546818fc9adSBram Moolenaar let caught_e732 = 0 3547818fc9adSBram Moolenaar try 3548818fc9adSBram Moolenaar while v:true 3549818fc9adSBram Moolenaar endfor 3550818fc9adSBram Moolenaar catch /E732:/ 3551818fc9adSBram Moolenaar let caught_e732 = 1 3552818fc9adSBram Moolenaar endtry 3553818fc9adSBram Moolenaar call assert_equal(1, caught_e732) 3554818fc9adSBram Moolenaar 3555818fc9adSBram Moolenaar " Using endwhile with :for 3556818fc9adSBram Moolenaar let caught_e733 = 0 3557818fc9adSBram Moolenaar try 3558818fc9adSBram Moolenaar for i in range(1) 3559818fc9adSBram Moolenaar endwhile 3560818fc9adSBram Moolenaar catch /E733:/ 3561818fc9adSBram Moolenaar let caught_e733 = 1 3562818fc9adSBram Moolenaar endtry 3563818fc9adSBram Moolenaar call assert_equal(1, caught_e733) 3564818fc9adSBram Moolenaar 3565ee4e0c1eSBram Moolenaar " Using endfunc with :if 3566ee4e0c1eSBram Moolenaar call assert_fails('exe "if 1 | endfunc | endif"', 'E193:') 3567ee4e0c1eSBram Moolenaar 3568818fc9adSBram Moolenaar " Missing 'in' in a :for statement 3569818fc9adSBram Moolenaar call assert_fails('for i range(1) | endfor', 'E690:') 3570ea04a6e8SBram Moolenaar 3571ea04a6e8SBram Moolenaar " Incorrect number of variables in for 3572ea04a6e8SBram Moolenaar call assert_fails('for [i,] in range(3) | endfor', 'E475:') 35739f6277bdSBram Moolenaarendfunc 35749f6277bdSBram Moolenaar 35759f6277bdSBram Moolenaar" Test for deep nesting of if/for/while/try statements {{{1 35769f6277bdSBram Moolenaarfunc Test_deep_nest() 3577494e9069SBram Moolenaar CheckRunVimInTerminal 35789f6277bdSBram Moolenaar 35799f6277bdSBram Moolenaar let lines =<< trim [SCRIPT] 35809f6277bdSBram Moolenaar " Deep nesting of if ... endif 35819f6277bdSBram Moolenaar func Test1() 35829f6277bdSBram Moolenaar let @a = join(repeat(['if v:true'], 51), "\n") 35839f6277bdSBram Moolenaar let @a ..= "\n" 35849f6277bdSBram Moolenaar let @a ..= join(repeat(['endif'], 51), "\n") 35859f6277bdSBram Moolenaar @a 35869f6277bdSBram Moolenaar let @a = '' 35879f6277bdSBram Moolenaar endfunc 35889f6277bdSBram Moolenaar 35899f6277bdSBram Moolenaar " Deep nesting of for ... endfor 35909f6277bdSBram Moolenaar func Test2() 35919f6277bdSBram Moolenaar let @a = join(repeat(['for i in [1]'], 51), "\n") 35929f6277bdSBram Moolenaar let @a ..= "\n" 35939f6277bdSBram Moolenaar let @a ..= join(repeat(['endfor'], 51), "\n") 35949f6277bdSBram Moolenaar @a 35959f6277bdSBram Moolenaar let @a = '' 35969f6277bdSBram Moolenaar endfunc 35979f6277bdSBram Moolenaar 35989f6277bdSBram Moolenaar " Deep nesting of while ... endwhile 35999f6277bdSBram Moolenaar func Test3() 36009f6277bdSBram Moolenaar let @a = join(repeat(['while v:true'], 51), "\n") 36019f6277bdSBram Moolenaar let @a ..= "\n" 36029f6277bdSBram Moolenaar let @a ..= join(repeat(['endwhile'], 51), "\n") 36039f6277bdSBram Moolenaar @a 36049f6277bdSBram Moolenaar let @a = '' 36059f6277bdSBram Moolenaar endfunc 36069f6277bdSBram Moolenaar 36079f6277bdSBram Moolenaar " Deep nesting of try ... endtry 36089f6277bdSBram Moolenaar func Test4() 36099f6277bdSBram Moolenaar let @a = join(repeat(['try'], 51), "\n") 36109f6277bdSBram Moolenaar let @a ..= "\necho v:true\n" 36119f6277bdSBram Moolenaar let @a ..= join(repeat(['endtry'], 51), "\n") 36129f6277bdSBram Moolenaar @a 36139f6277bdSBram Moolenaar let @a = '' 36149f6277bdSBram Moolenaar endfunc 3615ee4e0c1eSBram Moolenaar 3616ee4e0c1eSBram Moolenaar " Deep nesting of function ... endfunction 3617ee4e0c1eSBram Moolenaar func Test5() 3618ee4e0c1eSBram Moolenaar let @a = join(repeat(['function X()'], 51), "\n") 3619ee4e0c1eSBram Moolenaar let @a ..= "\necho v:true\n" 3620ee4e0c1eSBram Moolenaar let @a ..= join(repeat(['endfunction'], 51), "\n") 3621ee4e0c1eSBram Moolenaar @a 3622ee4e0c1eSBram Moolenaar let @a = '' 3623ee4e0c1eSBram Moolenaar endfunc 36249f6277bdSBram Moolenaar [SCRIPT] 36259f6277bdSBram Moolenaar call writefile(lines, 'Xscript') 36269f6277bdSBram Moolenaar 36279f6277bdSBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'rows': 6}) 36289f6277bdSBram Moolenaar 36299f6277bdSBram Moolenaar " Deep nesting of if ... endif 36309f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test1()\n") 36316a2c5a7dSBram Moolenaar call TermWait(buf) 36329f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E579:', term_getline(buf, 5))}) 36339f6277bdSBram Moolenaar 36349f6277bdSBram Moolenaar " Deep nesting of for ... endfor 36359f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test2()\n") 36366a2c5a7dSBram Moolenaar call TermWait(buf) 36379f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))}) 36389f6277bdSBram Moolenaar 36399f6277bdSBram Moolenaar " Deep nesting of while ... endwhile 36409f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test3()\n") 36416a2c5a7dSBram Moolenaar call TermWait(buf) 36429f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))}) 36439f6277bdSBram Moolenaar 36449f6277bdSBram Moolenaar " Deep nesting of try ... endtry 36459f6277bdSBram Moolenaar call term_sendkeys(buf, ":call Test4()\n") 36466a2c5a7dSBram Moolenaar call TermWait(buf) 36479f6277bdSBram Moolenaar call WaitForAssert({-> assert_match('^E601:', term_getline(buf, 5))}) 36489f6277bdSBram Moolenaar 3649ee4e0c1eSBram Moolenaar " Deep nesting of function ... endfunction 3650ee4e0c1eSBram Moolenaar call term_sendkeys(buf, ":call Test5()\n") 36516a2c5a7dSBram Moolenaar call TermWait(buf) 3652ee4e0c1eSBram Moolenaar call WaitForAssert({-> assert_match('^E1058:', term_getline(buf, 4))}) 3653ee4e0c1eSBram Moolenaar call term_sendkeys(buf, "\<C-C>\n") 36546a2c5a7dSBram Moolenaar call TermWait(buf) 3655ee4e0c1eSBram Moolenaar 36569f6277bdSBram Moolenaar "let l = '' 36579f6277bdSBram Moolenaar "for i in range(1, 6) 36589f6277bdSBram Moolenaar " let l ..= term_getline(buf, i) . "\n" 36599f6277bdSBram Moolenaar "endfor 36609f6277bdSBram Moolenaar "call assert_report(l) 36619f6277bdSBram Moolenaar 36629f6277bdSBram Moolenaar call StopVimInTerminal(buf) 36639f6277bdSBram Moolenaar call delete('Xscript') 36649f6277bdSBram Moolenaarendfunc 36659f6277bdSBram Moolenaar 36668b633135SBram Moolenaar" Test for errors in converting to float from various types {{{1 36678b633135SBram Moolenaarfunc Test_float_conversion_errors() 36688b633135SBram Moolenaar if has('float') 36698b633135SBram Moolenaar call assert_fails('let x = 4.0 % 2.0', 'E804') 36708b633135SBram Moolenaar call assert_fails('echo 1.1[0]', 'E806') 36718b633135SBram Moolenaar call assert_fails('echo sort([function("min"), 1], "f")', 'E891:') 36728b633135SBram Moolenaar call assert_fails('echo 3.2 == "vim"', 'E892:') 36738b633135SBram Moolenaar call assert_fails('echo sort([[], 1], "f")', 'E893:') 36748b633135SBram Moolenaar call assert_fails('echo sort([{}, 1], "f")', 'E894:') 36758b633135SBram Moolenaar call assert_fails('echo 3.2 == v:true', 'E362:') 36768b633135SBram Moolenaar call assert_fails('echo 3.2 == v:none', 'E907:') 36778b633135SBram Moolenaar endif 36788b633135SBram Moolenaarendfunc 36798b633135SBram Moolenaar 36808e6cbb72SBram Moolenaar" invalid function names {{{1 368108f4157cSBram Moolenaarfunc Test_invalid_function_names() 368208f4157cSBram Moolenaar " function name not starting with capital 368308f4157cSBram Moolenaar let caught_e128 = 0 368408f4157cSBram Moolenaar try 368508f4157cSBram Moolenaar func! g:test() 368608f4157cSBram Moolenaar echo "test" 368708f4157cSBram Moolenaar endfunc 368808f4157cSBram Moolenaar catch /E128:/ 368908f4157cSBram Moolenaar let caught_e128 = 1 369008f4157cSBram Moolenaar endtry 369108f4157cSBram Moolenaar call assert_equal(1, caught_e128) 369208f4157cSBram Moolenaar 369308f4157cSBram Moolenaar " function name includes a colon 369408f4157cSBram Moolenaar let caught_e884 = 0 369508f4157cSBram Moolenaar try 369608f4157cSBram Moolenaar func! b:test() 369708f4157cSBram Moolenaar echo "test" 369808f4157cSBram Moolenaar endfunc 369908f4157cSBram Moolenaar catch /E884:/ 370008f4157cSBram Moolenaar let caught_e884 = 1 370108f4157cSBram Moolenaar endtry 370208f4157cSBram Moolenaar call assert_equal(1, caught_e884) 370308f4157cSBram Moolenaar 370408f4157cSBram Moolenaar " function name folowed by # 370508f4157cSBram Moolenaar let caught_e128 = 0 370608f4157cSBram Moolenaar try 370708f4157cSBram Moolenaar func! test2() "# 370808f4157cSBram Moolenaar echo "test2" 370908f4157cSBram Moolenaar endfunc 371008f4157cSBram Moolenaar catch /E128:/ 371108f4157cSBram Moolenaar let caught_e128 = 1 371208f4157cSBram Moolenaar endtry 371308f4157cSBram Moolenaar call assert_equal(1, caught_e128) 371408f4157cSBram Moolenaar 371508f4157cSBram Moolenaar " function name starting with/without "g:", buffer-local funcref. 371608f4157cSBram Moolenaar function! g:Foo(n) 371708f4157cSBram Moolenaar return 'called Foo(' . a:n . ')' 371808f4157cSBram Moolenaar endfunction 371908f4157cSBram Moolenaar let b:my_func = function('Foo') 372008f4157cSBram Moolenaar call assert_equal('called Foo(1)', b:my_func(1)) 372108f4157cSBram Moolenaar call assert_equal('called Foo(2)', g:Foo(2)) 372208f4157cSBram Moolenaar call assert_equal('called Foo(3)', Foo(3)) 372308f4157cSBram Moolenaar delfunc g:Foo 372408f4157cSBram Moolenaar 372508f4157cSBram Moolenaar " script-local function used in Funcref must exist. 372608f4157cSBram Moolenaar let lines =<< trim END 372708f4157cSBram Moolenaar func s:Testje() 372808f4157cSBram Moolenaar return "foo" 372908f4157cSBram Moolenaar endfunc 373008f4157cSBram Moolenaar let Bar = function('s:Testje') 373108f4157cSBram Moolenaar call assert_equal(0, exists('s:Testje')) 373208f4157cSBram Moolenaar call assert_equal(1, exists('*s:Testje')) 373308f4157cSBram Moolenaar call assert_equal(1, exists('Bar')) 373408f4157cSBram Moolenaar call assert_equal(1, exists('*Bar')) 373508f4157cSBram Moolenaar END 373608f4157cSBram Moolenaar call writefile(lines, 'Xscript') 373708f4157cSBram Moolenaar source Xscript 373808f4157cSBram Moolenaar call delete('Xscript') 373908f4157cSBram Moolenaarendfunc 374008f4157cSBram Moolenaar 37418e6cbb72SBram Moolenaar" substring and variable name {{{1 374208f4157cSBram Moolenaarfunc Test_substring_var() 374308f4157cSBram Moolenaar let str = 'abcdef' 374408f4157cSBram Moolenaar let n = 3 374508f4157cSBram Moolenaar call assert_equal('def', str[n:]) 374608f4157cSBram Moolenaar call assert_equal('abcd', str[:n]) 374708f4157cSBram Moolenaar call assert_equal('d', str[n:n]) 374808f4157cSBram Moolenaar unlet n 374908f4157cSBram Moolenaar let nn = 3 375008f4157cSBram Moolenaar call assert_equal('def', str[nn:]) 375108f4157cSBram Moolenaar call assert_equal('abcd', str[:nn]) 375208f4157cSBram Moolenaar call assert_equal('d', str[nn:nn]) 375308f4157cSBram Moolenaar unlet nn 375408f4157cSBram Moolenaar let b:nn = 4 375508f4157cSBram Moolenaar call assert_equal('ef', str[b:nn:]) 375608f4157cSBram Moolenaar call assert_equal('abcde', str[:b:nn]) 375708f4157cSBram Moolenaar call assert_equal('e', str[b:nn:b:nn]) 375808f4157cSBram Moolenaar unlet b:nn 375908f4157cSBram Moolenaarendfunc 376008f4157cSBram Moolenaar 37618e6cbb72SBram Moolenaar" Test using s: with a typed command {{{1 37628e6cbb72SBram Moolenaarfunc Test_typed_script_var() 37638e6cbb72SBram Moolenaar CheckRunVimInTerminal 37648e6cbb72SBram Moolenaar 37658e6cbb72SBram Moolenaar let buf = RunVimInTerminal('', {'rows': 6}) 37668e6cbb72SBram Moolenaar 37678e6cbb72SBram Moolenaar " Deep nesting of if ... endif 37688e6cbb72SBram Moolenaar call term_sendkeys(buf, ":echo get(s:, 'foo', 'x')\n") 37698e6cbb72SBram Moolenaar call TermWait(buf) 37708e6cbb72SBram Moolenaar call WaitForAssert({-> assert_match('^E116:', term_getline(buf, 5))}) 37718e6cbb72SBram Moolenaar 37728e6cbb72SBram Moolenaar call StopVimInTerminal(buf) 37738e6cbb72SBram Moolenaarendfunc 37748e6cbb72SBram Moolenaar 3775863e80b4SBram Moolenaar"------------------------------------------------------------------------------- 3776b544f3c8SBram Moolenaar" Modelines {{{1 37771f068233SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3778b544f3c8SBram Moolenaar"------------------------------------------------------------------------------- 3779