143345546SBram Moolenaar" This script is sourced while editing the .vim file with the tests. 243345546SBram Moolenaar" When the script is successful the .res file will be created. 343345546SBram Moolenaar" Errors are appended to the test.log file. 443345546SBram Moolenaar" 543345546SBram Moolenaar" The test script may contain anything, only functions that start with 643345546SBram Moolenaar" "Test_" are special. These will be invoked and should contain assert 743345546SBram Moolenaar" functions. See test_assert.vim for an example. 843345546SBram Moolenaar" 943345546SBram Moolenaar" It is possible to source other files that contain "Test_" functions. This 1043345546SBram Moolenaar" can speed up testing, since Vim does not need to restart. But be careful 1143345546SBram Moolenaar" that the tests do not interfere with each other. 1243345546SBram Moolenaar" 1343345546SBram Moolenaar" If an error cannot be detected properly with an assert function add the 1443345546SBram Moolenaar" error to the v:errors list: 1543345546SBram Moolenaar" call add(v:errors, 'test foo failed: Cannot find xyz') 1643345546SBram Moolenaar" 1743345546SBram Moolenaar" If preparation for each Test_ function is needed, define a SetUp function. 1843345546SBram Moolenaar" It will be called before each Test_ function. 1943345546SBram Moolenaar" 2043345546SBram Moolenaar" If cleanup after each Test_ function is needed, define a TearDown function. 2143345546SBram Moolenaar" It will be called after each Test_ function. 2243345546SBram Moolenaar 2343345546SBram Moolenaar" Without the +eval feature we can't run these tests, bail out. 244686b323SBram Moolenaarso small.vim 2543345546SBram Moolenaar 2643345546SBram Moolenaar" Check that the screen size is at least 24 x 80 characters. 2743345546SBram Moolenaarif &lines < 24 || &columns < 80 2843345546SBram Moolenaar let error = 'Screen size too small! Tests require at least 24 lines with 80 characters' 2943345546SBram Moolenaar echoerr error 3043345546SBram Moolenaar split test.log 3143345546SBram Moolenaar $put =error 3243345546SBram Moolenaar w 3343345546SBram Moolenaar cquit 3443345546SBram Moolenaarendif 3543345546SBram Moolenaar 3643345546SBram Moolenaar" Source the test script. First grab the file name, in case the script 3743345546SBram Moolenaar" navigates away. 3843345546SBram Moolenaarlet testname = expand('%') 394686b323SBram Moolenaarlet done = 0 404686b323SBram Moolenaarlet fail = 0 414686b323SBram Moolenaarlet errors = [] 42*096c8bb4SBram Moolenaarlet messages = [] 434686b323SBram Moolenaartry 4443345546SBram Moolenaar source % 454686b323SBram Moolenaarcatch 464686b323SBram Moolenaar let fail += 1 474686b323SBram Moolenaar call add(errors, 'Caught exception: ' . v:exception . ' @ ' . v:throwpoint) 484686b323SBram Moolenaarendtry 4943345546SBram Moolenaar 5043345546SBram Moolenaar" Locate Test_ functions and execute them. 5143345546SBram Moolenaarredir @q 5243345546SBram Moolenaarfunction /^Test_ 5343345546SBram Moolenaarredir END 5443345546SBram Moolenaarlet tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) 5543345546SBram Moolenaar 5643345546SBram Moolenaarfor test in tests 5743345546SBram Moolenaar if exists("*SetUp") 5843345546SBram Moolenaar call SetUp() 5943345546SBram Moolenaar endif 6043345546SBram Moolenaar 61*096c8bb4SBram Moolenaar call add(messages, 'Executing ' . test) 6243345546SBram Moolenaar let done += 1 6343345546SBram Moolenaar try 6443345546SBram Moolenaar exe 'call ' . test 6543345546SBram Moolenaar catch 6643345546SBram Moolenaar let fail += 1 6743345546SBram Moolenaar call add(v:errors, 'Caught exception in ' . test . ': ' . v:exception . ' @ ' . v:throwpoint) 6843345546SBram Moolenaar endtry 6943345546SBram Moolenaar 7043345546SBram Moolenaar if len(v:errors) > 0 7143345546SBram Moolenaar let fail += 1 7243345546SBram Moolenaar call add(errors, 'Found errors in ' . test . ':') 7343345546SBram Moolenaar call extend(errors, v:errors) 7443345546SBram Moolenaar let v:errors = [] 7543345546SBram Moolenaar endif 7643345546SBram Moolenaar 7743345546SBram Moolenaar if exists("*TearDown") 7843345546SBram Moolenaar call TearDown() 7943345546SBram Moolenaar endif 8043345546SBram Moolenaarendfor 8143345546SBram Moolenaar 8243345546SBram Moolenaarif fail == 0 8343345546SBram Moolenaar " Success, create the .res file so that make knows it's done. 84de0ad40cSBram Moolenaar exe 'split ' . fnamemodify(testname, ':r') . '.res' 8543345546SBram Moolenaar write 8643345546SBram Moolenaarendif 8743345546SBram Moolenaar 8843345546SBram Moolenaarif len(errors) > 0 8943345546SBram Moolenaar " Append errors to test.log 9043345546SBram Moolenaar split test.log 9143345546SBram Moolenaar call append(line('$'), '') 9243345546SBram Moolenaar call append(line('$'), 'From ' . testname . ':') 9343345546SBram Moolenaar call append(line('$'), errors) 9443345546SBram Moolenaar write 9543345546SBram Moolenaarendif 9643345546SBram Moolenaar 97*096c8bb4SBram Moolenaarlet message = 'Executed ' . done . (done > 1 ? ' tests': ' test') 98*096c8bb4SBram Moolenaarecho message 99*096c8bb4SBram Moolenaarcall add(messages, message) 10043345546SBram Moolenaarif fail > 0 101*096c8bb4SBram Moolenaar let message = fail . ' FAILED' 102*096c8bb4SBram Moolenaar echo message 103*096c8bb4SBram Moolenaar call add(messages, message) 10443345546SBram Moolenaarendif 10543345546SBram Moolenaar 106*096c8bb4SBram Moolenaar" Append messages to "messages" 107*096c8bb4SBram Moolenaarsplit messages 108*096c8bb4SBram Moolenaarcall append(line('$'), '') 109*096c8bb4SBram Moolenaarcall append(line('$'), 'From ' . testname . ':') 110*096c8bb4SBram Moolenaarcall append(line('$'), messages) 111*096c8bb4SBram Moolenaarwrite 112*096c8bb4SBram Moolenaar 11343345546SBram Moolenaarqall! 114