diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-09-30 02:33:50 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-12-09 18:51:17 +0100 |
commit | 97204e1cef4f922cc1f8e67f8a1f2f695d7da826 (patch) | |
tree | dac7ed60f3f1f41a9a320da2b7b6774da202f26f /test/functional/ui/screen.lua | |
parent | 043f85210a06168e36f103950897e00918504f6f (diff) | |
download | rneovim-97204e1cef4f922cc1f8e67f8a1f2f695d7da826.tar.gz rneovim-97204e1cef4f922cc1f8e67f8a1f2f695d7da826.tar.bz2 rneovim-97204e1cef4f922cc1f8e67f8a1f2f695d7da826.zip |
os/shell: Throttle :! output, pulse "..." message.
Periodically skip :! spam. This is a "cheat" that works for all UIs and greatly
improves responsiveness when :! spams MB or GB of output:
:!yes
:!while true; do date; done
:!git grep ''
:grep -r '' *
After ~10KB of data is seen from a single :! invocation, output will be skipped
for ~1s and three dots "..." will pulse in the bottom-left. Thereafter the
behavior alternates at every:
* 10KB received
* ~1s throttled
This also avoids out-of-memory which could happen with large :! outputs.
Note: This commit does not change the behavior of execute(':!foo').
execute(':!foo') returns the string ':!foo^M', it captures *only* Vim
messages, *not* shell command output. Vim behaves the same way.
Use system('foo') for capturing shell command output.
Closes #1234
Helped-by: oni-link <knil.ino@gmail.com>
Diffstat (limited to 'test/functional/ui/screen.lua')
-rw-r--r-- | test/functional/ui/screen.lua | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua index ebe8af35eb..2581b36711 100644 --- a/test/functional/ui/screen.lua +++ b/test/functional/ui/screen.lua @@ -126,7 +126,7 @@ end do local spawn, nvim_prog = helpers.spawn, helpers.nvim_prog local session = spawn({nvim_prog, '-u', 'NONE', '-i', 'NONE', '-N', '--embed'}) - local status, rv = session:request('vim_get_color_map') + local status, rv = session:request('nvim_get_color_map') if not status then print('failed to get color map') os.exit(1) @@ -207,7 +207,15 @@ function Screen:try_resize(columns, rows) uimeths.try_resize(columns, rows) end -function Screen:expect(expected, attr_ids, attr_ignore, condition) +-- Asserts that `expected` eventually matches the screen state. +-- +-- expected: Expected screen state (string). +-- attr_ids: Text attribute definitions. +-- attr_ignore: Ignored text attributes. +-- condition: Function asserting some arbitrary condition. +-- any: true: Succeed if `expected` matches ANY screen line(s). +-- false (default): `expected` must match screen exactly. +function Screen:expect(expected, attr_ids, attr_ignore, condition, any) -- remove the last line and dedent expected = dedent(expected:gsub('\n[ ]+$', '')) local expected_rows = {} @@ -229,21 +237,34 @@ function Screen:expect(expected, attr_ids, attr_ignore, condition) for i = 1, self._height do actual_rows[i] = self:_row_repr(self._rows[i], ids, ignore) end - for i = 1, self._height do - if expected_rows[i] ~= actual_rows[i] then - local msg_expected_rows = {} - for j = 1, #expected_rows do - msg_expected_rows[j] = expected_rows[j] - end - msg_expected_rows[i] = '*' .. msg_expected_rows[i] - actual_rows[i] = '*' .. actual_rows[i] + + if any then + -- Search for `expected` anywhere in the screen lines. + local actual_screen_str = table.concat(actual_rows, '\n') + if nil == string.find(actual_screen_str, expected) then return ( - 'Row ' .. tostring(i) .. ' didn\'t match.\n' - .. 'Expected:\n|' .. table.concat(msg_expected_rows, '|\n|') .. '|\n' - .. 'Actual:\n|' .. table.concat(actual_rows, '|\n|') .. '|\n\n' .. [[ + 'Failed to match any screen lines.\n' + .. 'Expected (anywhere): "' .. expected .. '"\n' + .. 'Actual:\n |' .. table.concat(actual_rows, '|\n |') .. '|\n\n') + end + else + -- `expected` must match the screen lines exactly. + for i = 1, self._height do + if expected_rows[i] ~= actual_rows[i] then + local msg_expected_rows = {} + for j = 1, #expected_rows do + msg_expected_rows[j] = expected_rows[j] + end + msg_expected_rows[i] = '*' .. msg_expected_rows[i] + 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'..[[ To print the expect() call that would assert the current screen state, use screen:snaphot_util(). In case of non-deterministic failures, use screen:redraw_debug() to show all intermediate screen states. ]]) + end end end end) |