neovim/test/functional/legacy/excmd_spec.lua
bfredl e61228a214 fix(tests): needing two calls to setup a screen is cringe
Before calling "attach" a screen object is just a dummy container for
(row, col) values whose purpose is to be sent as part of the "attach"
function call anyway.

Just create the screen in an attached state directly. Keep the complete
(row, col, options) config together. It is still completely valid to
later detach and re-attach as needed, including to another session.
2024-11-14 12:40:57 +01:00

424 lines
21 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local clear = n.clear
local command = n.command
local exec = n.exec
local expect_exit = n.expect_exit
local feed = n.feed
local fn = n.fn
local read_file = t.read_file
local eq = t.eq
local write_file = t.write_file
local is_os = t.is_os
describe(':confirm command dialog', function()
local screen
local function start_new()
clear()
screen = Screen.new(75, 20)
end
-- Test for the :confirm command dialog
-- oldtest: Test_confirm_cmd()
it('works', function()
write_file('Xfoo', 'foo1\n')
write_file('Xbar', 'bar1\n')
-- Test for saving all the modified buffers
start_new()
exec([[
set nomore
new Xfoo
call setline(1, 'foo2')
new Xbar
call setline(1, 'bar2')
wincmd b
]])
feed(':confirm qall\n')
screen:expect([[
bar2 |
{1:~ }|*5
{2:Xbar [+] }|
foo2 |
{1:~ }|*4
{2:Xfoo [+] }|
|
{1:~ }|*2
{3: }|
:confirm qall |
{6:Save changes to "Xbar"?} |
{6:[Y]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: }^ |
]])
expect_exit(1000, feed, 'A')
eq('foo2\n', read_file('Xfoo'))
eq('bar2\n', read_file('Xbar'))
-- Test for discarding all the changes to modified buffers
start_new()
exec([[
set nomore
new Xfoo
call setline(1, 'foo3')
new Xbar
call setline(1, 'bar3')
wincmd b
]])
feed(':confirm qall\n')
screen:expect([[
bar3 |
{1:~ }|*5
{2:Xbar [+] }|
foo3 |
{1:~ }|*4
{2:Xfoo [+] }|
|
{1:~ }|*2
{3: }|
:confirm qall |
{6:Save changes to "Xbar"?} |
{6:[Y]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: }^ |
]])
expect_exit(1000, feed, 'D')
eq('foo2\n', read_file('Xfoo'))
eq('bar2\n', read_file('Xbar'))
-- Test for saving and discarding changes to some buffers
start_new()
exec([[
set nomore
new Xfoo
call setline(1, 'foo4')
new Xbar
call setline(1, 'bar4')
wincmd b
]])
feed(':confirm qall\n')
screen:expect([[
bar4 |
{1:~ }|*5
{2:Xbar [+] }|
foo4 |
{1:~ }|*4
{2:Xfoo [+] }|
|
{1:~ }|*2
{3: }|
:confirm qall |
{6:Save changes to "Xbar"?} |
{6:[Y]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: }^ |
]])
feed('N')
screen:expect([[
bar4 |
{1:~ }|*5
{2:Xbar [+] }|
foo4 |
{1:~ }|*4
{2:Xfoo [+] }|
|
{3: }|
:confirm qall |
{6:Save changes to "Xbar"?} |
|
{6:Save changes to "Xfoo"?} |
{6:[Y]es, (N)o, (C)ancel: }^ |
]])
expect_exit(1000, feed, 'Y')
eq('foo4\n', read_file('Xfoo'))
eq('bar2\n', read_file('Xbar'))
os.remove('Xfoo')
os.remove('Xbar')
end)
-- oldtest: Test_confirm_cmd_cancel()
it('can be cancelled', function()
-- Test for closing a window with a modified buffer
start_new()
screen:try_resize(75, 10)
exec([[
set nohidden nomore
new
call setline(1, 'abc')
]])
feed(':confirm close\n')
screen:expect([[
abc |
{1:~ }|*3
{3:[No Name] [+] }|
|
{3: }|
:confirm close |
{6:Save changes to "Untitled"?} |
{6:[Y]es, (N)o, (C)ancel: }^ |
]])
feed('C')
screen:expect([[
^abc |
{1:~ }|*3
{3:[No Name] [+] }|
|
{1:~ }|*2
{2:[No Name] }|
|
]])
feed(':confirm close\n')
screen:expect([[
abc |
{1:~ }|*3
{3:[No Name] [+] }|
|
{3: }|
:confirm close |
{6:Save changes to "Untitled"?} |
{6:[Y]es, (N)o, (C)ancel: }^ |
]])
feed('N')
screen:expect([[
^ |
{1:~ }|*8
|
]])
end)
-- oldtest: Test_confirm_q_wq()
it('works with :q and :wq', function()
write_file('Xfoo', 'foo')
start_new()
screen:try_resize(75, 8)
exec([[
set hidden nomore
call setline(1, 'abc')
edit Xfoo
set nofixendofline
]])
feed(':confirm q\n')
screen:expect([[
foo |
{1:~ }|*3
{3: }|
:confirm q |
{6:Save changes to "Untitled"?} |
{6:[Y]es, (N)o, (C)ancel: }^ |
]])
feed('C')
screen:expect([[
^abc |
{1:~ }|*6
|
]])
command('edit Xfoo')
feed(':confirm wq\n')
screen:expect([[
foo |
{1:~ }|*3
{3: }|
"Xfoo" [noeol] 1L, 3B written |
{6:Save changes to "Untitled"?} |
{6:[Y]es, (N)o, (C)ancel: }^ |
]])
feed('C')
screen:expect([[
^abc |
{1:~ }|*6
"Xfoo" [noeol] 1L, 3B written |
]])
os.remove('Xfoo')
end)
-- oldtest: Test_confirm_write_ro()
it('works when writing a read-only file', function()
write_file('Xconfirm_write_ro', 'foo\n')
start_new()
screen:try_resize(75, 8)
exec([[
set ruler
set nobackup ff=unix cmdheight=2
edit Xconfirm_write_ro
norm Abar
]])
-- Try to write with 'ro' option.
feed(':set ro | confirm w\n')
screen:expect([[
foobar |
{1:~ }|*2
{3: }|
:set ro | confirm w |
{6:'readonly' option is set for "Xconfirm_write_ro".} |
{6:Do you wish to write anyway?} |
{6:(Y)es, [N]o: }^ |
]])
feed('N')
screen:expect([[
fooba^r |
{1:~ }|*5
|
1,6 All |
]])
eq('foo\n', read_file('Xconfirm_write_ro'))
feed(':confirm w\n')
screen:expect([[
foobar |
{1:~ }|*2
{3: }|
:confirm w |
{6:'readonly' option is set for "Xconfirm_write_ro".} |
{6:Do you wish to write anyway?} |
{6:(Y)es, [N]o: }^ |
]])
feed('Y')
if is_os('win') then
screen:expect([[
foobar |
{1:~ }|
{3: }|
:confirm w |
{6:'readonly' option is set for "Xconfirm_write_ro".} |
{6:Do you wish to write anyway?} |
"Xconfirm_write_ro" [unix] 1L, 7B written |
{6:Press ENTER or type command to continue}^ |
]])
else
screen:expect([[
foobar |
{1:~ }|
{3: }|
:confirm w |
{6:'readonly' option is set for "Xconfirm_write_ro".} |
{6:Do you wish to write anyway?} |
"Xconfirm_write_ro" 1L, 7B written |
{6:Press ENTER or type command to continue}^ |
]])
end
eq('foobar\n', read_file('Xconfirm_write_ro'))
feed('<CR>') -- suppress hit-enter prompt
-- Try to write with read-only file permissions.
fn.setfperm('Xconfirm_write_ro', 'r--r--r--')
feed(':set noro | silent undo | confirm w\n')
screen:expect([[
foobar |
{1:~ }|
{3: }|
:set noro | silent undo | confirm w |
{6:File permissions of "Xconfirm_write_ro" are read-only.} |
{6:It may still be possible to write it.} |
{6:Do you wish to try?} |
{6:(Y)es, [N]o: }^ |
]])
feed('Y')
if is_os('win') then
screen:expect([[
foobar |
{3: }|
:set noro | silent undo | confirm w |
{6:File permissions of "Xconfirm_write_ro" are read-only.} |
{6:It may still be possible to write it.} |
{6:Do you wish to try?} |
"Xconfirm_write_ro" [unix] 1L, 4B written |
{6:Press ENTER or type command to continue}^ |
]])
else
screen:expect([[
foobar |
{3: }|
:set noro | silent undo | confirm w |
{6:File permissions of "Xconfirm_write_ro" are read-only.} |
{6:It may still be possible to write it.} |
{6:Do you wish to try?} |
"Xconfirm_write_ro" 1L, 4B written |
{6:Press ENTER or type command to continue}^ |
]])
end
eq('foo\n', read_file('Xconfirm_write_ro'))
feed('<CR>') -- suppress hit-enter prompt
os.remove('Xconfirm_write_ro')
end)
-- oldtest: Test_confirm_write_partial_file()
it('works when writing a partial file', function()
write_file('Xwrite_partial', 'a\nb\nc\nd\n')
start_new()
screen:try_resize(75, 8)
exec([[
set ruler
set nobackup ff=unix cmdheight=2
edit Xwrite_partial
]])
feed(':confirm 2,3w\n')
screen:expect([[
a |
b |
c |
d |
{3: }|
:confirm 2,3w |
{6:Write partial file?} |
{6:(Y)es, [N]o: }^ |
]])
feed('N')
screen:expect([[
^a |
b |
c |
d |
{1:~ }|*2
|
1,1 All |
]])
eq('a\nb\nc\nd\n', read_file('Xwrite_partial'))
os.remove('Xwrite_partial')
feed(':confirm 2,3w\n')
screen:expect([[
a |
b |
c |
d |
{3: }|
:confirm 2,3w |
{6:Write partial file?} |
{6:(Y)es, [N]o: }^ |
]])
feed('Y')
if is_os('win') then
screen:expect([[
a |
b |
c |
{3: }|
:confirm 2,3w |
{6:Write partial file?} |
"Xwrite_partial" [New][unix] 2L, 4B written |
{6:Press ENTER or type command to continue}^ |
]])
else
screen:expect([[
a |
b |
c |
{3: }|
:confirm 2,3w |
{6:Write partial file?} |
"Xwrite_partial" [New] 2L, 4B written |
{6:Press ENTER or type command to continue}^ |
]])
end
eq('b\nc\n', read_file('Xwrite_partial'))
os.remove('Xwrite_partial')
end)
end)