runnvim.vim 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. let s:logger = {'d_events': []}
  2. function s:logger.on_stdout(id, data, event)
  3. call add(self.d_events, [a:event, a:data])
  4. endfunction
  5. let s:logger.on_stderr = s:logger.on_stdout
  6. function s:logger.on_exit(id, data, event)
  7. call add(self.d_events, [a:event, ['']])
  8. endfunction
  9. let s:logger.env = #{VIMRUNTIME: $VIMRUNTIME}
  10. let s:logger.term = v:true
  11. " Replace non-printable chars by special sequence, or "<%x>".
  12. let s:escaped_char = {"\n": '\n', "\r": '\r', "\t": '\t'}
  13. function! s:escape_non_printable(char) abort
  14. let r = get(s:escaped_char, a:char)
  15. return r is 0 ? printf('<%x>', char2nr(a:char)) : r
  16. endfunction
  17. function Main()
  18. let argc = +$NVIM_TEST_ARGC
  19. let args = []
  20. for i in range(argc)
  21. call add(args, eval("$NVIM_TEST_ARG" . i))
  22. endfor
  23. set lines=25
  24. set columns=80
  25. enew
  26. let job = jobstart(args, s:logger)
  27. let results = jobwait([job], 5 * 60 * 1000)
  28. " TODO(ZyX-I): Get colors
  29. let screen = getline(1, '$')
  30. call jobstop(job) " kills the job always.
  31. bwipeout!
  32. let stringified_events = map(s:logger.d_events,
  33. \'v:val[0] . ": " . ' .
  34. \'join(map(v:val[1], '.
  35. \ '''substitute(v:val, '.
  36. \ '"\\v\\C(\\p@!.|\\<)", '.
  37. \ '"\\=s:escape_non_printable(submatch(0))", '.
  38. \ '"g")''), '.
  39. \ '''\n'')')
  40. call setline(1, [
  41. \ 'Job exited with code ' . results[0],
  42. \ printf('Screen (%u lines)', len(screen)),
  43. \ repeat('=', 80),
  44. \] + screen + [
  45. \ repeat('=', 80),
  46. \ printf('Events (%u lines):', len(stringified_events)),
  47. \ repeat('=', 80),
  48. \] + stringified_events + [
  49. \ repeat('=', 80),
  50. \])
  51. write
  52. if results[0] != 0
  53. cquit
  54. else
  55. qall
  56. endif
  57. endfunction
  58. call Main()