aboutsummaryrefslogtreecommitdiff
path: root/test/functional/ex_cmds
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/ex_cmds')
-rw-r--r--test/functional/ex_cmds/append_spec.lua54
-rw-r--r--test/functional/ex_cmds/cd_spec.lua152
-rw-r--r--test/functional/ex_cmds/oldfiles_spec.lua6
-rw-r--r--test/functional/ex_cmds/write_spec.lua38
-rw-r--r--test/functional/ex_cmds/wundo_spec.lua2
-rw-r--r--test/functional/ex_cmds/wviminfo_spec.lua2
6 files changed, 251 insertions, 3 deletions
diff --git a/test/functional/ex_cmds/append_spec.lua b/test/functional/ex_cmds/append_spec.lua
new file mode 100644
index 0000000000..2d5ab8e8c8
--- /dev/null
+++ b/test/functional/ex_cmds/append_spec.lua
@@ -0,0 +1,54 @@
+local helpers = require('test.functional.helpers')
+
+local eq = helpers.eq
+local feed = helpers.feed
+local clear = helpers.clear
+local funcs = helpers.funcs
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+
+before_each(function()
+ clear()
+ curbufmeths.set_lines(0, 1, true, { 'foo', 'bar', 'baz' })
+end)
+
+local buffer_contents = function()
+ return curbufmeths.get_lines(0, -1, false)
+end
+
+local cmdtest = function(cmd, prep, ret1)
+ describe(':' .. cmd, function()
+ it(cmd .. 's' .. prep .. ' the current line by default', function()
+ command(cmd .. '\nabc\ndef\n')
+ eq(ret1, buffer_contents())
+ end)
+ -- Used to crash because this invokes history processing which uses
+ -- hist_char2type which after fdb68e35e4c729c7ed097d8ade1da29e5b3f4b31
+ -- crashed.
+ it(cmd .. 's' .. prep .. ' the current line by default when feeding',
+ function()
+ feed(':' .. cmd .. '\nabc\ndef\n.\n')
+ eq(ret1, buffer_contents())
+ end)
+ -- This used to crash since that commit as well.
+ it('opens empty cmdline window', function()
+ local hisline = '" Some comment to be stored in history'
+ feed(':' .. hisline .. '<CR>')
+ feed(':' .. cmd .. '<CR>abc<CR>def<C-f>')
+ eq({ 'def' }, buffer_contents())
+ eq(hisline, funcs.histget(':', -2))
+ eq(cmd, funcs.histget(':'))
+ -- Test that command-line window was launched
+ eq('nofile', curbufmeths.get_option('buftype'))
+ eq('n', funcs.mode(1))
+ feed('<CR>')
+ eq('c', funcs.mode(1))
+ feed('.<CR>')
+ eq('n', funcs.mode(1))
+ eq(ret1, buffer_contents())
+ end)
+ end)
+end
+cmdtest('insert', ' before', { 'abc', 'def', 'foo', 'bar', 'baz' })
+cmdtest('append', ' after', { 'foo', 'abc', 'def', 'bar', 'baz' })
+cmdtest('change', '', { 'abc', 'def', 'bar', 'baz' })
diff --git a/test/functional/ex_cmds/cd_spec.lua b/test/functional/ex_cmds/cd_spec.lua
new file mode 100644
index 0000000000..69467632a4
--- /dev/null
+++ b/test/functional/ex_cmds/cd_spec.lua
@@ -0,0 +1,152 @@
+-- Specs for :cd, :tcd, :lcd and getcwd()
+
+local helpers = require('test.functional.helpers')
+local execute, eq, clear, eval, exc_exec =
+ helpers.execute, helpers.eq, helpers.clear, helpers.eval, helpers.exc_exec
+local lfs = require('lfs')
+
+-- These directories will be created for testing
+local directories = {
+ 'Xtest-functional-ex_cmds-cd_spec.1', -- Tab
+ 'Xtest-functional-ex_cmds-cd_spec.2', -- Window
+ 'Xtest-functional-ex_cmds-cd_spec.3', -- New global
+}
+
+-- Shorthand writing to get the current working directory
+local cwd = function() return eval('getcwd( )') end -- effective working dir
+local wcwd = function() return eval('getcwd( 0 )') end -- window dir
+local tcwd = function() return eval('getcwd(-1, 0)') end -- tab dir
+--local gcwd = function() return eval('getcwd(-1, -1)') end -- global dir
+
+-- Same, except these tell us if there is a working directory at all
+--local lwd = function() return eval('haslocaldir( )') end -- effective working dir
+local wlwd = function() return eval('haslocaldir( 0 )') end -- window dir
+local tlwd = function() return eval('haslocaldir(-1, 0)') end -- tab dir
+--local glwd = function() return eval('haslocaldir(-1, -1)') end -- global dir
+
+-- Test both the `cd` and `chdir` variants
+for _, cmd in ipairs {'cd', 'chdir'} do
+ describe(':*' .. cmd, function()
+ before_each(function()
+ clear()
+ for _, d in ipairs(directories) do
+ lfs.mkdir(d)
+ end
+ end)
+
+ after_each(function()
+ for _, d in ipairs(directories) do
+ lfs.rmdir(d)
+ end
+ end)
+
+ it('works', function()
+ -- Store the initial working directory
+ local globalDir = cwd()
+
+ -- Create a new tab first and verify that is has the same working dir
+ execute('tabnew')
+ eq(globalDir, cwd())
+ eq(globalDir, tcwd()) -- has no tab-local directory
+ eq(0, tlwd())
+ eq(globalDir, wcwd()) -- has no window-local directory
+ eq(0, wlwd())
+
+ -- Change tab-local working directory and verify it is different
+ execute('silent t' .. cmd .. ' ' .. directories[1])
+ eq(globalDir .. '/' .. directories[1], cwd())
+ eq(cwd(), tcwd()) -- working directory maches tab directory
+ eq(1, tlwd())
+ eq(cwd(), wcwd()) -- still no window-directory
+ eq(0, wlwd())
+
+ -- Create a new window in this tab to test `:lcd`
+ execute('new')
+ eq(1, tlwd()) -- Still tab-local working directory
+ eq(0, wlwd()) -- Still no window-local working directory
+ eq(globalDir .. '/' .. directories[1], cwd())
+ execute('silent l' .. cmd .. ' ../' .. directories[2])
+ eq(globalDir .. '/' .. directories[2], cwd())
+ eq(globalDir .. '/' .. directories[1], tcwd())
+ eq(1, wlwd())
+
+ -- Verify the first window still has the tab local directory
+ execute('wincmd w')
+ eq(globalDir .. '/' .. directories[1], cwd())
+ eq(globalDir .. '/' .. directories[1], tcwd())
+ eq(0, wlwd()) -- No window-local directory
+
+ -- Change back to initial tab and verify working directory has stayed
+ execute('tabnext')
+ eq(globalDir, cwd() )
+ eq(0, tlwd())
+ eq(0, wlwd())
+
+ -- Verify global changes don't affect local ones
+ execute('silent ' .. cmd .. ' ' .. directories[3])
+ eq(globalDir .. '/' .. directories[3], cwd())
+ execute('tabnext')
+ eq(globalDir .. '/' .. directories[1], cwd())
+ eq(globalDir .. '/' .. directories[1], tcwd())
+ eq(0, wlwd()) -- Still no window-local directory in this window
+
+ -- Unless the global change happened in a tab with local directory
+ execute('silent ' .. cmd .. ' ..')
+ eq(globalDir, cwd() )
+ eq(0 , tlwd())
+ eq(0 , wlwd())
+ -- Which also affects the first tab
+ execute('tabnext')
+ eq(globalDir, cwd())
+
+ -- But not in a window with its own local directory
+ execute('tabnext | wincmd w')
+ eq(globalDir .. '/' .. directories[2], cwd() )
+ eq(0 , tlwd())
+ eq(globalDir .. '/' .. directories[2], wcwd())
+ end)
+ end)
+end
+
+-- Test legal parameters for 'getcwd' and 'haslocaldir'
+for _, cmd in ipairs {'getcwd', 'haslocaldir'} do
+ describe(cmd..'()', function()
+ before_each(function()
+ clear()
+ end)
+
+ -- Test invalid argument types
+ local err474 = 'Vim(call):E474: Invalid argument'
+ it('fails on string', function()
+ eq(err474, exc_exec('call ' .. cmd .. '("some string")'))
+ end)
+ it('fails on float', function()
+ eq(err474, exc_exec('call ' .. cmd .. '(1.0)'))
+ end)
+ it('fails on list', function()
+ eq(err474, exc_exec('call ' .. cmd .. '([1, 2])'))
+ end)
+ it('fails on dictionary', function()
+ eq(err474, exc_exec('call ' .. cmd .. '({"key": "value"})'))
+ end)
+ it('fails on funcref', function()
+ eq(err474, exc_exec('call ' .. cmd .. '(function("tr"))'))
+ end)
+
+ -- Test invalid numbers
+ it('fails on number less than -1', function()
+ eq(err474, exc_exec('call ' .. cmd .. '(-2)'))
+ end)
+ local err5001 = 'Vim(call):E5001: Higher scope cannot be -1 if lower scope is >= 0.'
+ it('fails on -1 if previous arg is >=0', function()
+ eq(err5001, exc_exec('call ' .. cmd .. '(0, -1)'))
+ end)
+
+ -- Test wrong number of arguments
+ local err118 = 'Vim(call):E118: Too many arguments for function: ' .. cmd
+ it('fails to parse more than one argument', function()
+ eq(err118, exc_exec('call ' .. cmd .. '(0, 0, 0)'))
+ end)
+ end)
+end
+
diff --git a/test/functional/ex_cmds/oldfiles_spec.lua b/test/functional/ex_cmds/oldfiles_spec.lua
index dac6757a97..5bba1a0e7c 100644
--- a/test/functional/ex_cmds/oldfiles_spec.lua
+++ b/test/functional/ex_cmds/oldfiles_spec.lua
@@ -2,7 +2,7 @@ local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')
local buf, eq, execute = helpers.curbufmeths, helpers.eq, helpers.execute
-local feed, nvim_prog = helpers.feed, helpers.nvim_prog
+local feed, nvim_prog, wait = helpers.feed, helpers.nvim_prog, helpers.wait
local ok, set_session, spawn = helpers.ok, helpers.set_session, helpers.spawn
local shada_file = 'test.shada'
@@ -59,9 +59,13 @@ describe(':oldfiles!', function()
execute('edit testfile2')
filename2 = buf.get_name()
execute('wshada ' .. shada_file)
+ wait()
_clear()
execute('rshada! ' .. shada_file)
+ -- Ensure nvim is out of "Press ENTER..." screen
+ feed('<cr>')
+
-- Ensure v:oldfiles isn't busted. Since things happen so fast,
-- the ordering of v:oldfiles is unstable (it uses qsort() under-the-hood).
-- Let's verify the contents and the length of v:oldfiles before moving on.
diff --git a/test/functional/ex_cmds/write_spec.lua b/test/functional/ex_cmds/write_spec.lua
new file mode 100644
index 0000000000..d90b297ca8
--- /dev/null
+++ b/test/functional/ex_cmds/write_spec.lua
@@ -0,0 +1,38 @@
+-- Specs for :write
+
+local helpers = require('test.functional.helpers')
+local eq, eval, clear, write_file, execute, source =
+ helpers.eq, helpers.eval, helpers.clear, helpers.write_file,
+ helpers.execute, helpers.source
+
+describe(':write', function()
+ it('&backupcopy=auto preserves symlinks', function()
+ clear('set backupcopy=auto')
+ os.remove('test_bkc_file.txt')
+ os.remove('test_bkc_link.txt')
+ write_file('test_bkc_file.txt', 'content0')
+ execute("silent !ln -s test_bkc_file.txt test_bkc_link.txt")
+ source([[
+ edit test_bkc_link.txt
+ call setline(1, ['content1'])
+ write
+ ]])
+ eq(eval("['content1']"), eval("readfile('test_bkc_file.txt')"))
+ eq(eval("['content1']"), eval("readfile('test_bkc_link.txt')"))
+ end)
+
+ it('&backupcopy=no replaces symlink with new file', function()
+ clear('set backupcopy=no')
+ os.remove('test_bkc_file.txt')
+ os.remove('test_bkc_link.txt')
+ write_file('test_bkc_file.txt', 'content0')
+ execute("silent !ln -s test_bkc_file.txt test_bkc_link.txt")
+ source([[
+ edit test_bkc_link.txt
+ call setline(1, ['content1'])
+ write
+ ]])
+ eq(eval("['content0']"), eval("readfile('test_bkc_file.txt')"))
+ eq(eval("['content1']"), eval("readfile('test_bkc_link.txt')"))
+ end)
+end)
diff --git a/test/functional/ex_cmds/wundo_spec.lua b/test/functional/ex_cmds/wundo_spec.lua
index c3147e1c0f..969dfea3d9 100644
--- a/test/functional/ex_cmds/wundo_spec.lua
+++ b/test/functional/ex_cmds/wundo_spec.lua
@@ -24,6 +24,6 @@ describe('u_* functions', function()
'-c', 'set undodir=. undofile'})
set_session(session)
execute('echo "True"') -- Should not error out due to crashed Neovim
- session:exit(0)
+ session:close()
end)
end)
diff --git a/test/functional/ex_cmds/wviminfo_spec.lua b/test/functional/ex_cmds/wviminfo_spec.lua
index 207d94124f..21f14be62c 100644
--- a/test/functional/ex_cmds/wviminfo_spec.lua
+++ b/test/functional/ex_cmds/wviminfo_spec.lua
@@ -9,7 +9,7 @@ describe(':wshada', function()
before_each(function()
if session then
- session:exit(0)
+ session:close()
end
-- Override the default session because we need 'swapfile' for these tests.