test: Add basic tests for the TUI

The tests use `termopen` to spawn nvim and verify the TUI.
This commit is contained in:
Thiago de Arruda 2015-10-01 15:03:40 -03:00
parent 2182cd6081
commit 5d185c7772
3 changed files with 134 additions and 21 deletions

View File

@ -1,7 +1,7 @@
local helpers = require('test.functional.helpers') local helpers = require('test.functional.helpers')
local Screen = require('test.functional.ui.screen') local Screen = require('test.functional.ui.screen')
local nvim_dir = helpers.nvim_dir local nvim_dir = helpers.nvim_dir
local execute, nvim = helpers.execute, helpers.nvim local execute, nvim, wait = helpers.execute, helpers.nvim, helpers.wait
local function feed_data(data) local function feed_data(data)
nvim('set_var', 'term_data', data) nvim('set_var', 'term_data', data)
@ -31,13 +31,15 @@ local function clear_attrs() feed_termcode('[0;10m') end
local function enable_mouse() feed_termcode('[?1002h') end local function enable_mouse() feed_termcode('[?1002h') end
local function disable_mouse() feed_termcode('[?1002l') end local function disable_mouse() feed_termcode('[?1002l') end
local default_command = '["'..nvim_dir..'/tty-test'..'"]'
local function screen_setup(extra_height) local function screen_setup(extra_height, command)
nvim('command', 'highlight TermCursor cterm=reverse') nvim('command', 'highlight TermCursor cterm=reverse')
nvim('command', 'highlight TermCursorNC ctermbg=11') nvim('command', 'highlight TermCursorNC ctermbg=11')
nvim('set_var', 'terminal_scrollback_buffer_size', 10) nvim('set_var', 'terminal_scrollback_buffer_size', 10)
if not extra_height then extra_height = 0 end if not extra_height then extra_height = 0 end
if not command then command = default_command end
local screen = Screen.new(50, 7 + extra_height) local screen = Screen.new(50, 7 + extra_height)
screen:set_default_attr_ids({ screen:set_default_attr_ids({
[1] = {reverse = true}, -- focused cursor [1] = {reverse = true}, -- focused cursor
@ -56,25 +58,29 @@ local function screen_setup(extra_height)
-- tty-test puts the terminal into raw mode and echoes all input. tests are -- tty-test puts the terminal into raw mode and echoes all input. tests are
-- done by feeding it with terminfo codes to control the display and -- done by feeding it with terminfo codes to control the display and
-- verifying output with screen:expect. -- verifying output with screen:expect.
execute('enew | call termopen(["'..nvim_dir..'/tty-test"]) | startinsert') execute('enew | call termopen('..command..') | startinsert')
-- wait for "tty ready" to be printed before each test or the terminal may if command == default_command then
-- still be in canonical mode(will echo characters for example) -- wait for "tty ready" to be printed before each test or the terminal may
-- -- still be in canonical mode(will echo characters for example)
local empty_line = ' ' --
local expected = { local empty_line = ' '
'tty ready ', local expected = {
'{1: } ', 'tty ready ',
empty_line, '{1: } ',
empty_line, empty_line,
empty_line, empty_line,
empty_line, empty_line,
} empty_line,
for i = 1, extra_height do }
table.insert(expected, empty_line) for i = 1, extra_height do
end table.insert(expected, empty_line)
end
table.insert(expected, '-- TERMINAL -- ') table.insert(expected, '-- TERMINAL -- ')
screen:expect(table.concat(expected, '\n')) screen:expect(table.concat(expected, '\n'))
else
wait()
end
return screen return screen
end end

View File

@ -0,0 +1,106 @@
-- Some sanity checks for the TUI using the builtin terminal emulator
-- as a simple way to send keys and assert screen state.
local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')
local thelpers = require('test.functional.terminal.helpers')
local feed = thelpers.feed_data
local execute = helpers.execute
describe('tui', function()
local screen
before_each(function()
helpers.clear()
screen = thelpers.screen_setup(0, '["'..helpers.nvim_prog..'", "-u", "NONE", "--cmd", "set noswapfile"]')
screen.timeout = 30000 -- pasting can be really slow in the TUI
screen:expect([[
{1: } |
~ |
~ |
~ |
[No Name] |
|
-- TERMINAL -- |
]])
end)
after_each(function()
screen:detach()
end)
it('accepts basic utf-8 input', function()
feed('iabc\ntest1\ntest2')
screen:expect([[
abc |
test1 |
test2{1: } |
~ |
[No Name] [+] |
-- INSERT -- |
-- TERMINAL -- |
]])
feed('\x1b')
screen:expect([[
abc |
test1 |
test{1:2} |
~ |
[No Name] [+] |
|
-- TERMINAL -- |
]])
end)
it('automatically sends <Paste> for bracketed paste sequences', function()
feed('i\x1b[200~')
screen:expect([[
{1: } |
~ |
~ |
~ |
[No Name] |
-- INSERT (paste) -- |
-- TERMINAL -- |
]])
feed('pasted from terminal')
screen:expect([[
pasted from terminal{1: } |
~ |
~ |
~ |
[No Name] [+] |
-- INSERT (paste) -- |
-- TERMINAL -- |
]])
feed('\x1b[201~')
screen:expect([[
pasted from terminal{1: } |
~ |
~ |
~ |
[No Name] [+] |
-- INSERT -- |
-- TERMINAL -- |
]])
end)
it('can handle arbitrarily long bursts of input', function()
execute('set ruler')
local t = {}
for i = 1, 3000 do
t[i] = 'item ' .. tostring(i)
end
feed('i\x1b[200~')
feed(table.concat(t, '\n'))
feed('\x1b[201~')
screen:expect([[
item 2997 |
item 2998 |
item 2999 |
item 3000{1: } |
[No Name] [+] 3000,10 Bot|
-- INSERT -- |
-- TERMINAL -- |
]])
end)
end)

View File

@ -163,6 +163,7 @@ function Screen.new(width, height)
height = 14 height = 14
end end
local self = setmetatable({ local self = setmetatable({
timeout = default_screen_timeout,
title = '', title = '',
icon = '', icon = '',
bell = false, bell = false,
@ -248,7 +249,7 @@ function Screen:wait(check, timeout)
return true return true
end end
run(nil, notification_cb, nil, timeout or default_screen_timeout) run(nil, notification_cb, nil, timeout or self.timeout)
if not checked then if not checked then
err = check() err = check()
end end