|
1 | 1 | local t = require('test.testutil') |
2 | 2 | local n = require('test.functional.testnvim')() |
3 | | -local tt = require('test.functional.testterm') |
| 3 | +local Screen = require('test.functional.ui.screen') |
4 | 4 | local uv = vim.uv |
5 | 5 |
|
6 | 6 | local clear, command, testprg = n.clear, n.command, n.testprg |
@@ -202,12 +202,81 @@ describe('autocmd TextChangedT,WinResized', function() |
202 | 202 | before_each(clear) |
203 | 203 |
|
204 | 204 | it('TextChangedT works', function() |
205 | | - command('autocmd TextChangedT * ++once let g:called = 1') |
206 | | - tt.setup_screen() |
207 | | - tt.feed_data('a') |
| 205 | + local screen = Screen.new(50, 7) |
| 206 | + screen:set_default_attr_ids({ |
| 207 | + [1] = { bold = true }, |
| 208 | + [31] = { foreground = Screen.colors.Gray100, background = Screen.colors.DarkGreen }, |
| 209 | + [32] = { |
| 210 | + foreground = Screen.colors.Gray100, |
| 211 | + bold = true, |
| 212 | + background = Screen.colors.DarkGreen, |
| 213 | + }, |
| 214 | + }) |
| 215 | + |
| 216 | + local term, term_unfocused = exec_lua(function() |
| 217 | + -- Split windows before opening terminals so TextChangedT doesn't fire an additional time due |
| 218 | + -- to the inner terminal being resized (which is usually deferred too). |
| 219 | + vim.cmd.vnew() |
| 220 | + local term_unfocused = vim.api.nvim_open_term(0, {}) |
| 221 | + vim.cmd.wincmd 'p' |
| 222 | + local term = vim.api.nvim_open_term(0, {}) |
| 223 | + vim.cmd.startinsert() |
| 224 | + return term, term_unfocused |
| 225 | + end) |
| 226 | + eq('t', eval('mode()')) |
| 227 | + |
| 228 | + exec_lua(function() |
| 229 | + _G.n_triggered = 0 |
| 230 | + vim.api.nvim_create_autocmd('TextChanged', { |
| 231 | + callback = function() |
| 232 | + _G.n_triggered = _G.n_triggered + 1 |
| 233 | + end, |
| 234 | + }) |
| 235 | + _G.t_triggered = 0 |
| 236 | + vim.api.nvim_create_autocmd('TextChangedT', { |
| 237 | + callback = function() |
| 238 | + _G.t_triggered = _G.t_triggered + 1 |
| 239 | + end, |
| 240 | + }) |
| 241 | + end) |
| 242 | + |
| 243 | + api.nvim_chan_send(term, 'a') |
| 244 | + retry(nil, nil, function() |
| 245 | + eq(1, exec_lua('return _G.t_triggered')) |
| 246 | + end) |
| 247 | + api.nvim_chan_send(term, 'b') |
208 | 248 | retry(nil, nil, function() |
209 | | - eq(1, api.nvim_get_var('called')) |
| 249 | + eq(2, exec_lua('return _G.t_triggered')) |
210 | 250 | end) |
| 251 | + |
| 252 | + -- Not triggered by changes in a non-current terminal. |
| 253 | + api.nvim_chan_send(term_unfocused, 'hello') |
| 254 | + screen:expect([[ |
| 255 | + hello │ab^ | |
| 256 | + │ |*4 |
| 257 | + {31:[Scratch] [-] }{32:[Scratch] [-] }| |
| 258 | + {1:-- TERMINAL --} | |
| 259 | + ]]) |
| 260 | + eq(2, exec_lua('return _G.t_triggered')) |
| 261 | + |
| 262 | + -- Not triggered by unflushed redraws. |
| 263 | + api.nvim__redraw({ valid = false, flush = false }) |
| 264 | + eq(2, exec_lua('return _G.t_triggered')) |
| 265 | + |
| 266 | + -- Not triggered when not in terminal mode. |
| 267 | + command('stopinsert') |
| 268 | + eq('n', eval('mode()')) |
| 269 | + eq(2, exec_lua('return _G.t_triggered')) |
| 270 | + eq(0, exec_lua('return _G.n_triggered')) -- Nothing we did was in Normal mode yet. |
| 271 | + |
| 272 | + api.nvim_chan_send(term, 'c') |
| 273 | + screen:expect([[ |
| 274 | + hello │a^bc | |
| 275 | + │ |*4 |
| 276 | + {31:[Scratch] [-] }{32:[Scratch] [-] }| |
| 277 | + | |
| 278 | + ]]) |
| 279 | + eq(1, exec_lua('return _G.n_triggered')) -- Happened in Normal mode. |
211 | 280 | end) |
212 | 281 |
|
213 | 282 | it('no crash when deleting terminal buffer', function() |
|
0 commit comments