mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
API: Test: Setup basic test infrastructure
- Add a 'expect' utility script that can run simple API tests using clients developed for any platform. - Extend travis build matrix to run API tests using the python client and valgrind. This script can be used to write API tests without having to manage nvim's lifetime: - It starts a single nvim instance listening on a known socket - Invokes the test runner, which should connect to NEOVIM_LISTEN_ADDRESS - The nvim instance started by the script provides a `BeforeEachTest` function, which should be called before each test to reset nvim to a clean state. - It takes care of shutting down nvim once the tests are finished. As explained [here](https://github.com/neovim/neovim/pull/737#issuecomment-43941520), it's not possible to fully reset nvim to it's initial state, but the `BeforeEachTest` function should be enough for most test cases. Tests requiring a fully clean nvim instance should take care of starting/stopping nvim.
This commit is contained in:
86
scripts/run-api-tests.exp
Executable file
86
scripts/run-api-tests.exp
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env expect
|
||||
|
||||
if {$argc < 2} {
|
||||
puts "Need commands for running the tests and for starting nvim"
|
||||
exit 1
|
||||
}
|
||||
|
||||
set timeout 10
|
||||
set run_tests [split [lindex $argv 0] " "]
|
||||
set run_nvim [split [lindex $argv 1] " "]
|
||||
|
||||
# don't echo to stdout
|
||||
log_user 0
|
||||
# set NEOVIM_LISTEN_ADDRESS, so nvim will listen on a known socket
|
||||
set env(NEOVIM_LISTEN_ADDRESS) "/tmp/nvim-[exec date +%s%N].sock"
|
||||
# start nvim
|
||||
spawn {*}$run_nvim
|
||||
# save the job descriptor
|
||||
set nvim_id $spawn_id
|
||||
# Reset function that can be invoked by test runners to put nvim in a cleaner
|
||||
# state
|
||||
send {
|
||||
:function BeforeEachTest()
|
||||
set all&
|
||||
redir => groups
|
||||
silent augroup
|
||||
redir END
|
||||
for group in split(groups)
|
||||
exe 'augroup '.group
|
||||
autocmd!
|
||||
augroup NONE
|
||||
exe 'augroup! '.group
|
||||
endfor
|
||||
tabnew
|
||||
let curbufnum = eval(bufnr('%'))
|
||||
redir => buflist
|
||||
silent ls!
|
||||
redir END
|
||||
let bufnums = []
|
||||
for buf in split(buflist, '\n')
|
||||
let bufnum = eval(split(buf, '[ u]')[0])
|
||||
if bufnum != curbufnum
|
||||
call add(bufnums, bufnum)
|
||||
endif
|
||||
endfor
|
||||
if len(bufnums) > 0
|
||||
exe 'silent bwipeout! '.join(bufnums, ' ')
|
||||
endif
|
||||
silent tabonly
|
||||
for k in keys(g:)
|
||||
exe 'unlet g:'.k
|
||||
endfor
|
||||
filetype plugin indent off
|
||||
mapclear
|
||||
mapclear!
|
||||
abclear
|
||||
comclear
|
||||
endfunction
|
||||
:echo "read"."y"
|
||||
}
|
||||
# wait until nvim is ready
|
||||
expect "ready"
|
||||
# run tests
|
||||
spawn {*}$run_tests
|
||||
set tests_id $spawn_id
|
||||
set status 1
|
||||
# listen for test output in the background
|
||||
expect_background {
|
||||
* {
|
||||
# show test output to the user
|
||||
send_user -- $expect_out(buffer)
|
||||
}
|
||||
eof {
|
||||
# collect the exit status code
|
||||
set spawn_id $tests_id
|
||||
catch wait result
|
||||
set status [lindex $result 3]
|
||||
set spawn_id $nvim_id
|
||||
# quit nvim
|
||||
send ":qa!\r"
|
||||
}
|
||||
}
|
||||
# switch back nvim and wait until it exits
|
||||
set spawn_id $nvim_id
|
||||
expect eof
|
||||
exit $status
|
||||
Reference in New Issue
Block a user