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 36c0662466SBram Moolenaar" For consistency run all tests with 'nocompatible' set. 37c0662466SBram Moolenaar" This also enables use of line continuation. 38c0662466SBram Moolenaarset nocp viminfo+=nviminfo 39c0662466SBram Moolenaar 40c0662466SBram Moolenaar" Avoid stopping at the "hit enter" prompt 41c0662466SBram Moolenaarset nomore 42c0662466SBram Moolenaar 43c0662466SBram Moolenaar" Output all messages in English. 44c0662466SBram Moolenaarlang mess C 45c0662466SBram Moolenaar 4628fb79dbSBram Moolenaarlet s:srcdir = expand('%:p:h:h') 4728fb79dbSBram Moolenaar 4828fb79dbSBram Moolenaar" Support function: get the alloc ID by name. 4928fb79dbSBram Moolenaarfunction GetAllocId(name) 5028fb79dbSBram Moolenaar exe 'split ' . s:srcdir . '/alloc.h' 51*065ee9aeSBram Moolenaar let top = search('typedef enum') 52*065ee9aeSBram Moolenaar if top == 0 53*065ee9aeSBram Moolenaar call add(v:errors, 'typedef not found in alloc.h') 54*065ee9aeSBram Moolenaar endif 5528fb79dbSBram Moolenaar let lnum = search('aid_' . a:name . ',') 5628fb79dbSBram Moolenaar if lnum == 0 5728fb79dbSBram Moolenaar call add(v:errors, 'Alloc ID ' . a:name . ' not defined') 5828fb79dbSBram Moolenaar endif 5928fb79dbSBram Moolenaar close 60*065ee9aeSBram Moolenaar return lnum - top - 1 6128fb79dbSBram Moolenaarendfunc 6228fb79dbSBram Moolenaar 6328fb79dbSBram Moolenaar 6443345546SBram Moolenaar" Source the test script. First grab the file name, in case the script 6543345546SBram Moolenaar" navigates away. 6643345546SBram Moolenaarlet testname = expand('%') 674686b323SBram Moolenaarlet done = 0 684686b323SBram Moolenaarlet fail = 0 694686b323SBram Moolenaarlet errors = [] 70096c8bb4SBram Moolenaarlet messages = [] 71a2cce863SBram Moolenaarif expand('%') =~ 'test_viml.vim' 72a2cce863SBram Moolenaar " this test has intentional errors, don't use try/catch. 73a2cce863SBram Moolenaar source % 74a2cce863SBram Moolenaarelse 754686b323SBram Moolenaar try 7643345546SBram Moolenaar source % 774686b323SBram Moolenaar catch 784686b323SBram Moolenaar let fail += 1 794686b323SBram Moolenaar call add(errors, 'Caught exception: ' . v:exception . ' @ ' . v:throwpoint) 804686b323SBram Moolenaar endtry 81a2cce863SBram Moolenaarendif 8243345546SBram Moolenaar 8343345546SBram Moolenaar" Locate Test_ functions and execute them. 8443345546SBram Moolenaarredir @q 8543345546SBram Moolenaarfunction /^Test_ 8643345546SBram Moolenaarredir END 8743345546SBram Moolenaarlet tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) 8843345546SBram Moolenaar 89cfc0a350SBram Moolenaar" Execute the tests in alphabetical order. 90cfc0a350SBram Moolenaar for test in sort(tests) 9143345546SBram Moolenaar if exists("*SetUp") 9243345546SBram Moolenaar call SetUp() 9343345546SBram Moolenaar endif 9443345546SBram Moolenaar 95096c8bb4SBram Moolenaar call add(messages, 'Executing ' . test) 9643345546SBram Moolenaar let done += 1 9743345546SBram Moolenaar try 9843345546SBram Moolenaar exe 'call ' . test 9943345546SBram Moolenaar catch 10043345546SBram Moolenaar let fail += 1 10143345546SBram Moolenaar call add(v:errors, 'Caught exception in ' . test . ': ' . v:exception . ' @ ' . v:throwpoint) 10243345546SBram Moolenaar endtry 10343345546SBram Moolenaar 10443345546SBram Moolenaar if len(v:errors) > 0 10543345546SBram Moolenaar let fail += 1 10643345546SBram Moolenaar call add(errors, 'Found errors in ' . test . ':') 10743345546SBram Moolenaar call extend(errors, v:errors) 10843345546SBram Moolenaar let v:errors = [] 10943345546SBram Moolenaar endif 11043345546SBram Moolenaar 11143345546SBram Moolenaar if exists("*TearDown") 11243345546SBram Moolenaar call TearDown() 11343345546SBram Moolenaar endif 11443345546SBram Moolenaarendfor 11543345546SBram Moolenaar 11643345546SBram Moolenaarif fail == 0 11743345546SBram Moolenaar " Success, create the .res file so that make knows it's done. 118de0ad40cSBram Moolenaar exe 'split ' . fnamemodify(testname, ':r') . '.res' 11943345546SBram Moolenaar write 12043345546SBram Moolenaarendif 12143345546SBram Moolenaar 12243345546SBram Moolenaarif len(errors) > 0 12343345546SBram Moolenaar " Append errors to test.log 12443345546SBram Moolenaar split test.log 12543345546SBram Moolenaar call append(line('$'), '') 12643345546SBram Moolenaar call append(line('$'), 'From ' . testname . ':') 12743345546SBram Moolenaar call append(line('$'), errors) 12843345546SBram Moolenaar write 12943345546SBram Moolenaarendif 13043345546SBram Moolenaar 131096c8bb4SBram Moolenaarlet message = 'Executed ' . done . (done > 1 ? ' tests': ' test') 132096c8bb4SBram Moolenaarecho message 133096c8bb4SBram Moolenaarcall add(messages, message) 13443345546SBram Moolenaarif fail > 0 135096c8bb4SBram Moolenaar let message = fail . ' FAILED' 136096c8bb4SBram Moolenaar echo message 137096c8bb4SBram Moolenaar call add(messages, message) 13843345546SBram Moolenaarendif 13943345546SBram Moolenaar 140096c8bb4SBram Moolenaar" Append messages to "messages" 141096c8bb4SBram Moolenaarsplit messages 142096c8bb4SBram Moolenaarcall append(line('$'), '') 143096c8bb4SBram Moolenaarcall append(line('$'), 'From ' . testname . ':') 144096c8bb4SBram Moolenaarcall append(line('$'), messages) 145096c8bb4SBram Moolenaarwrite 146096c8bb4SBram Moolenaar 14743345546SBram Moolenaarqall! 148