xref: /vim-8.2.3635/src/testdir/runtest.vim (revision c0662466)
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
36*c0662466SBram Moolenaar" For consistency run all tests with 'nocompatible' set.
37*c0662466SBram Moolenaar" This also enables use of line continuation.
38*c0662466SBram Moolenaarset nocp viminfo+=nviminfo
39*c0662466SBram Moolenaar
40*c0662466SBram Moolenaar" Avoid stopping at the "hit enter" prompt
41*c0662466SBram Moolenaarset nomore
42*c0662466SBram Moolenaar
43*c0662466SBram Moolenaar" Output all messages in English.
44*c0662466SBram Moolenaarlang mess C
45*c0662466SBram Moolenaar
4643345546SBram Moolenaar" Source the test script.  First grab the file name, in case the script
4743345546SBram Moolenaar" navigates away.
4843345546SBram Moolenaarlet testname = expand('%')
494686b323SBram Moolenaarlet done = 0
504686b323SBram Moolenaarlet fail = 0
514686b323SBram Moolenaarlet errors = []
52096c8bb4SBram Moolenaarlet messages = []
534686b323SBram Moolenaartry
5443345546SBram Moolenaar  source %
554686b323SBram Moolenaarcatch
564686b323SBram Moolenaar  let fail += 1
574686b323SBram Moolenaar  call add(errors, 'Caught exception: ' . v:exception . ' @ ' . v:throwpoint)
584686b323SBram Moolenaarendtry
5943345546SBram Moolenaar
6043345546SBram Moolenaar" Locate Test_ functions and execute them.
6143345546SBram Moolenaarredir @q
6243345546SBram Moolenaarfunction /^Test_
6343345546SBram Moolenaarredir END
6443345546SBram Moolenaarlet tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g'))
6543345546SBram Moolenaar
6643345546SBram Moolenaarfor test in tests
6743345546SBram Moolenaar  if exists("*SetUp")
6843345546SBram Moolenaar    call SetUp()
6943345546SBram Moolenaar  endif
7043345546SBram Moolenaar
71096c8bb4SBram Moolenaar  call add(messages, 'Executing ' . test)
7243345546SBram Moolenaar  let done += 1
7343345546SBram Moolenaar  try
7443345546SBram Moolenaar    exe 'call ' . test
7543345546SBram Moolenaar  catch
7643345546SBram Moolenaar    let fail += 1
7743345546SBram Moolenaar    call add(v:errors, 'Caught exception in ' . test . ': ' . v:exception . ' @ ' . v:throwpoint)
7843345546SBram Moolenaar  endtry
7943345546SBram Moolenaar
8043345546SBram Moolenaar  if len(v:errors) > 0
8143345546SBram Moolenaar    let fail += 1
8243345546SBram Moolenaar    call add(errors, 'Found errors in ' . test . ':')
8343345546SBram Moolenaar    call extend(errors, v:errors)
8443345546SBram Moolenaar    let v:errors = []
8543345546SBram Moolenaar  endif
8643345546SBram Moolenaar
8743345546SBram Moolenaar  if exists("*TearDown")
8843345546SBram Moolenaar    call TearDown()
8943345546SBram Moolenaar  endif
9043345546SBram Moolenaarendfor
9143345546SBram Moolenaar
9243345546SBram Moolenaarif fail == 0
9343345546SBram Moolenaar  " Success, create the .res file so that make knows it's done.
94de0ad40cSBram Moolenaar  exe 'split ' . fnamemodify(testname, ':r') . '.res'
9543345546SBram Moolenaar  write
9643345546SBram Moolenaarendif
9743345546SBram Moolenaar
9843345546SBram Moolenaarif len(errors) > 0
9943345546SBram Moolenaar  " Append errors to test.log
10043345546SBram Moolenaar  split test.log
10143345546SBram Moolenaar  call append(line('$'), '')
10243345546SBram Moolenaar  call append(line('$'), 'From ' . testname . ':')
10343345546SBram Moolenaar  call append(line('$'), errors)
10443345546SBram Moolenaar  write
10543345546SBram Moolenaarendif
10643345546SBram Moolenaar
107096c8bb4SBram Moolenaarlet message = 'Executed ' . done . (done > 1 ? ' tests': ' test')
108096c8bb4SBram Moolenaarecho message
109096c8bb4SBram Moolenaarcall add(messages, message)
11043345546SBram Moolenaarif fail > 0
111096c8bb4SBram Moolenaar  let message = fail . ' FAILED'
112096c8bb4SBram Moolenaar  echo message
113096c8bb4SBram Moolenaar  call add(messages, message)
11443345546SBram Moolenaarendif
11543345546SBram Moolenaar
116096c8bb4SBram Moolenaar" Append messages to "messages"
117096c8bb4SBram Moolenaarsplit messages
118096c8bb4SBram Moolenaarcall append(line('$'), '')
119096c8bb4SBram Moolenaarcall append(line('$'), 'From ' . testname . ':')
120096c8bb4SBram Moolenaarcall append(line('$'), messages)
121096c8bb4SBram Moolenaarwrite
122096c8bb4SBram Moolenaar
12343345546SBram Moolenaarqall!
124