diff options
author | Utkarsh Maheshwari <utkarshme96@gmail.com> | 2018-12-18 12:50:44 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2018-12-31 12:44:22 +0100 |
commit | ebe16cd9bdd214955469f4db4f1c4a2c11724b1d (patch) | |
tree | c16e24b07200ab5c6a34c7ee8d37e24f0a60b1ea | |
parent | 1f8afe15a4670b237a4e97d8038ddd75c7d9d227 (diff) | |
download | rneovim-ebe16cd9bdd214955469f4db4f1c4a2c11724b1d.tar.gz rneovim-ebe16cd9bdd214955469f4db4f1c4a2c11724b1d.tar.bz2 rneovim-ebe16cd9bdd214955469f4db4f1c4a2c11724b1d.zip |
multigrid: add multigrid screen tests
-rw-r--r-- | test/functional/terminal/helpers.lua | 10 | ||||
-rw-r--r-- | test/functional/terminal/tui_spec.lua | 2 | ||||
-rw-r--r-- | test/functional/ui/multigrid_spec.lua | 932 | ||||
-rw-r--r-- | test/functional/ui/screen.lua | 7 | ||||
-rw-r--r-- | test/functional/ui/wildmode_spec.lua | 2 |
5 files changed, 942 insertions, 11 deletions
diff --git a/test/functional/terminal/helpers.lua b/test/functional/terminal/helpers.lua index ae8d4704e4..7de0152de0 100644 --- a/test/functional/terminal/helpers.lua +++ b/test/functional/terminal/helpers.lua @@ -72,10 +72,10 @@ local function screen_setup(extra_rows, command, cols) if command == default_command then -- 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 = (' '):rep(cols + 1) + local empty_line = (' '):rep(cols) local expected = { - 'tty ready'..(' '):rep(cols - 8), - '{1: }' ..(' '):rep(cols), + 'tty ready'..(' '):rep(cols - 9), + '{1: }' ..(' '):rep(cols - 1), empty_line, empty_line, empty_line, @@ -85,8 +85,8 @@ local function screen_setup(extra_rows, command, cols) table.insert(expected, empty_line) end - table.insert(expected, '{3:-- TERMINAL --}' .. ((' '):rep(cols - 13))) - screen:expect(table.concat(expected, '\n')) + table.insert(expected, '{3:-- TERMINAL --}' .. ((' '):rep(cols - 14))) + screen:expect(table.concat(expected, '|\n')..'|') else -- This eval also acts as a wait(). if 0 == nvim('eval', "exists('b:terminal_job_id')") then diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua index a89fa85999..68652bfb7f 100644 --- a/test/functional/terminal/tui_spec.lua +++ b/test/functional/terminal/tui_spec.lua @@ -401,7 +401,7 @@ describe('tui FocusGained/FocusLost', function() -- Exit cmdline-mode. Redraws from timers/events are blocked during -- cmdline-mode, so the buffer won't be updated until we exit cmdline-mode. feed_data('\n') - screen:expect{any='lost'..(' '):rep(46)..'\ngained'} + screen:expect{any='lost'..(' '):rep(46)..'|\ngained'} end) end) diff --git a/test/functional/ui/multigrid_spec.lua b/test/functional/ui/multigrid_spec.lua new file mode 100644 index 0000000000..6a4d956404 --- /dev/null +++ b/test/functional/ui/multigrid_spec.lua @@ -0,0 +1,932 @@ +local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') +local spawn, set_session = helpers.spawn, helpers.set_session +local feed, command, insert = helpers.feed, helpers.command, helpers.insert +local eq = helpers.eq + +-- Note 1: +-- Global grid i.e. "grid 1" shows some unwanted elements because they are +-- not cleared when they are expected to be drawn over by window grids. + +describe('multigrid screen', function() + local screen + local nvim_argv = {helpers.nvim_prog, '-u', 'NONE', '-i', 'NONE', '-N', + '--cmd', 'set shortmess+=I background=light noswapfile belloff= noshowcmd noruler', + '--embed'} + + before_each(function() + local screen_nvim = spawn(nvim_argv) + set_session(screen_nvim) + screen = Screen.new() + screen:attach({ext_multigrid=true}) + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue1}, + [2] = {foreground = Screen.colors.Magenta}, + [3] = {foreground = Screen.colors.Brown, bold = true}, + [4] = {foreground = Screen.colors.SlateBlue}, + [5] = {bold = true, foreground = Screen.colors.SlateBlue}, + [6] = {foreground = Screen.colors.Cyan4}, + [7] = {bold = true}, + [8] = {underline = true, bold = true, foreground = Screen.colors.SlateBlue}, + [9] = {foreground = Screen.colors.SlateBlue, underline = true}, + [10] = {foreground = Screen.colors.Red}, + [11] = {bold = true, reverse = true}, + [12] = {reverse = true}, + [13] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey}, + }) + screen.win_position = {} + end) + + after_each(function() + screen:detach() + end) + + it('default initial screen', function() + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] }| + | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('positions windows correctly', function() + command('vsplit') + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {11:[No Name] }{12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]], nil, nil, function() + eq({ + [2] = { win = 1000, startrow = 0, startcol = 27, width = 26, height = 12 }, + [3] = { win = 1001, startrow = 0, startcol = 0, width = 26, height = 12 } + }, screen.win_position) + end) + command('wincmd l') + command('split') + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│}{11:[No Name] }| + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:[No Name] [No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 4 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]], nil, nil, function() + eq({ + [2] = { win = 1000, startrow = 7, startcol = 27, width = 26, height = 5 }, + [3] = { win = 1001, startrow = 0, startcol = 0, width = 26, height = 12 }, + [4] = { win = 1002, startrow = 0, startcol = 27, width = 26, height = 6 } + }, screen.win_position) + end) + command('wincmd h') + command('q') + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {11:[No Name] }| + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 4 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]], nil, nil, function() + eq({ + [2] = { win = 1000, startrow = 7, startcol = 0, width = 53, height = 5 }, + [4] = { win = 1002, startrow = 0, startcol = 0, width = 53, height = 6 } + }, screen.win_position) + end) + end) + + describe('split', function () + describe('horizontally', function () + it('allocates grids', function () + command('sp') + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + {11:[No Name] }| + | + | + | + | + | + {12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('resizes grids', function () + command('sp') + command('resize 8') + -- see "Note 1" for info about why there are three statuslines + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + {11:[No Name] }| + | + {11:[No Name] }| + | + | + | + {12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + ## grid 3 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('splits vertically', function() + command('sp') + command('vsp') + command('vsp') + screen:expect([[ + ## grid 1 + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {11:[No Name] }{12:[No Name] [No Name] }| + | + | + | + | + | + {12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 4 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 5 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + insert('hello') + screen:expect([[ + ## grid 1 + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {11:[No Name] [+] }{12:[No Name] [+] [No Name] [+] }| + | + | + | + | + | + {12:[No Name] [+] }| + | + ## grid 2 + hello | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + hello | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 4 + hello | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 5 + hell^o | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + it('closes splits', function () + command('sp') + command('q') + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + {11:[No Name] }| + | + | + | + | + | + {11:[No Name] }| + | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + end) + + describe('vertically', function () + it('allocates grids', function () + command('vsp') + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {11:[No Name] }{12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + it('resizes grids', function () + command('vsp') + command('vertical resize 10') + -- see "Note 1" for info about why there are two vseps + screen:expect([[ + ## grid 1 + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {12:│} {12:│} | + {11:<No Name] }{12:[No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + it('splits horizontally', function () + command('vsp') + command('sp') + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {11:[No Name] }{12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:[No Name] [No Name] }| + | + ## grid 2 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 4 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + insert('hello') + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {11:[No Name] [+] }{12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:[No Name] [+] [No Name] [+] }| + | + ## grid 2 + hello | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + hello | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 4 + hell^o | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + it('closes splits', function () + command('vsp') + command('q') + -- see "Note 1" for info about why there is a vsep + screen:expect([[ + ## grid 1 + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {12:│} | + {11:[No Name] }| + | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + end) + end) + + describe('on resize', function () + it('rebuilds all grids', function () + screen:try_resize(25, 6) + screen:expect([[ + ## grid 1 + | + | + | + | + {11:[No Name] }| + | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('has minimum width/height values', function() + screen:try_resize(1, 1) + screen:expect([[ + ## grid 1 + | + {11:[No Name] }| + | + ## grid 2 + ^ | + ]]) + + feed('<esc>:ls') + screen:expect([[ + ## grid 1 + | + {11:[No Name] }| + :ls^ | + ## grid 2 + | + ]]) + end) + end) + + describe('grid of smaller inner size', function() + it('is rendered correctly', function() + screen:try_resize_grid(2, 8, 5) + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] }| + | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + end) + + describe('grid of bigger inner size', function() + it('is rendered correctly', function() + screen:try_resize_grid(2, 80, 20) + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] }| + | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + end) + + describe('with resized grid', function() + before_each(function() + screen:try_resize_grid(2, 60, 20) + end) + it('gets written till grid width', function() + insert(('a'):rep(60).."\n") + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] [+] }| + | + ## grid 2 + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('wraps with grid width', function() + insert(('b'):rep(80).."\n") + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] [+] }| + | + ## grid 2 + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb| + bbbbbbbbbbbbbbbbbbbb | + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('displays messages with default grid width', function() + command('echomsg "this is a very very very very very very very very'.. + ' long message"') + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] }| + this is a very very very...ry very very long message | + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + + it('creates folds with grid width', function() + insert('this is a fold\nthis is inside fold\nthis is outside fold') + feed('kzfgg') + screen:expect([[ + ## grid 1 + | + | + | + | + | + | + | + | + | + | + | + | + {11:[No Name] [+] }| + | + ## grid 2 + {13:^+-- 2 lines: this is a fold································}| + this is outside fold | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]) + end) + end) +end) diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua index dfcb74b03f..218d0490f1 100644 --- a/test/functional/ui/screen.lua +++ b/test/functional/ui/screen.lua @@ -349,7 +349,6 @@ function Screen:expect(expected, attr_ids, attr_ignore) -- value. grid = dedent(grid:gsub('\n[ ]+$', ''), 0) for row in grid:gmatch('[^\n]+') do - row = row:sub(1, #row - 1) -- Last char must be the screen delimiter. table.insert(expected_rows, row) end end @@ -382,7 +381,7 @@ function Screen:expect(expected, attr_ids, attr_ignore) return ( 'Failed to match any screen lines.\n' .. 'Expected (anywhere): "' .. expected.any .. '"\n' - .. 'Actual:\n |' .. table.concat(actual_rows, '|\n |') .. '|\n\n') + .. 'Actual:\n |' .. table.concat(actual_rows, '\n |') .. '\n\n') end end @@ -402,8 +401,8 @@ function Screen:expect(expected, attr_ids, attr_ignore) actual_rows[i] = '*' .. actual_rows[i] return ( 'Row ' .. tostring(i) .. ' did not match.\n' - ..'Expected:\n |'..table.concat(msg_expected_rows, '|\n |')..'|\n' - ..'Actual:\n |'..table.concat(actual_rows, '|\n |')..'|\n\n'..[[ + ..'Expected:\n |'..table.concat(msg_expected_rows, '\n |')..'\n' + ..'Actual:\n |'..table.concat(actual_rows, '\n |')..'\n\n'..[[ To print the expect() call that would assert the current screen state, use screen:snapshot_util(). In case of non-deterministic failures, use screen:redraw_debug() to show all intermediate screen states. ]]) diff --git a/test/functional/ui/wildmode_spec.lua b/test/functional/ui/wildmode_spec.lua index 8931d9245b..ffe71cfadf 100644 --- a/test/functional/ui/wildmode_spec.lua +++ b/test/functional/ui/wildmode_spec.lua @@ -165,7 +165,7 @@ describe("'wildmenu'", function() feed([[:<Tab>]]) -- Invoke wildmenu. -- Check only the last 2 lines, because the shell output is -- system-dependent. - expect_stay_unchanged{any='! # & < = > @ > \n:!^'} + expect_stay_unchanged{any='! # & < = > @ > |\n:!^'} end) end) |