runtest.vim 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. " Make sure some options are set to sane defaults and output all messages in
  2. " English.
  3. " vint: -ProhibitSetNoCompatible
  4. set nocompatible nomore shellslash encoding=utf-8 shortmess+=WIF
  5. lang mess C
  6. " Initialize variables.
  7. let s:total_started = reltime()
  8. let s:fail = 0
  9. let s:done = 0
  10. let s:logs = []
  11. let s:gopath = $GOPATH
  12. if !exists('g:test_verbose')
  13. let g:test_verbose = 0
  14. endif
  15. " Source the passed test file.
  16. source %
  17. " cd into the folder of the test file.
  18. let s:cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
  19. let s:testfile = expand('%:t')
  20. execute s:cd . expand('%:p:h')
  21. " Export root path to vim-go dir.
  22. let g:vim_go_root = fnamemodify(getcwd(), ':p')
  23. " Get a list of all Test_ functions for the given file.
  24. redir @q
  25. silent function /^Test_
  26. redir END
  27. let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g'))
  28. " Iterate over all tests and execute them.
  29. for s:test in sort(s:tests)
  30. " Since we extract the tests from a regexp the "abort" keyword is also in the
  31. " list, which is not a test name :-)
  32. if s:test == 'abort'
  33. continue
  34. endif
  35. let s:started = reltime()
  36. if g:test_verbose is 1
  37. call add(s:logs, printf("=== RUN %s", s:test[:-3]))
  38. endif
  39. try
  40. exe 'call ' . s:test
  41. catch
  42. let v:errors += [v:exception]
  43. endtry
  44. " Restore GOPATH after each test.
  45. let $GOPATH = s:gopath
  46. let s:elapsed_time = substitute(reltimestr(reltime(s:started)), '^\s*\(.\{-}\)\s*$', '\1', '')
  47. let s:done += 1
  48. if len(v:errors) > 0
  49. let s:fail += 1
  50. call add(s:logs, printf("--- FAIL %s (%ss)", s:test[:-3], s:elapsed_time))
  51. call extend(s:logs, map(v:errors, '" ". v:val'))
  52. " Reset so we can capture failures of the next test.
  53. let v:errors = []
  54. else
  55. if g:test_verbose is 1
  56. call add(s:logs, printf("--- PASS %s (%ss)", s:test[:-3], s:elapsed_time))
  57. endif
  58. endif
  59. endfor
  60. " Create an empty fail to indicate that at least one test failed.
  61. if s:fail > 0
  62. split /tmp/vim-go-test/FAILED
  63. silent write
  64. endif
  65. let s:total_elapsed_time = substitute(reltimestr(reltime(s:total_started)), '^\s*\(.\{-}\)\s*$', '\1', '')
  66. " Add all messages (usually errors).
  67. redir => s:mess
  68. silent messages
  69. redir END
  70. let s:logs = s:logs + filter(split(s:mess, "\n"), 'v:val !~ "^Messages maintainer"')
  71. " Also store all internal messages from s:logs as well.
  72. silent! split /tmp/vim-go-test/test.tmp
  73. call append(line('$'), s:logs)
  74. call append(line('$'), printf("%s %s %s %ss / %s tests",
  75. \ (s:fail > 0 ? 'FAIL' : 'ok '),
  76. \ s:testfile,
  77. \ repeat(' ', 25 - len(s:testfile)),
  78. \ s:total_elapsed_time, s:done))
  79. if g:test_verbose is 0
  80. silent :g/^$/d
  81. endif
  82. silent! write
  83. " Our work here is done.
  84. qall!
  85. " vim:ts=2:sts=2:sw=2:et