mirror of
https://github.com/neovim/neovim.git
synced 2024-12-25 05:35:10 -07:00
e61228a214
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.
424 lines
21 KiB
Lua
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)
|