mirror of
https://github.com/neovim/neovim.git
synced 2025-10-17 15:21:47 +00:00
Merge #2851 'tests: Migrate legacy test 61.'.
This commit is contained in:
@@ -19,7 +19,7 @@ SCRIPTS := test_eval.out \
|
|||||||
test46.out test47.out test48.out test49.out \
|
test46.out test47.out test48.out test49.out \
|
||||||
test52.out test53.out test55.out \
|
test52.out test53.out test55.out \
|
||||||
test57.out test58.out test59.out \
|
test57.out test58.out test59.out \
|
||||||
test61.out test62.out test63.out test64.out \
|
test62.out test63.out test64.out \
|
||||||
test68.out test69.out \
|
test68.out test69.out \
|
||||||
test71.out test73.out \
|
test71.out test73.out \
|
||||||
test79.out test80.out \
|
test79.out test80.out \
|
||||||
@@ -126,15 +126,6 @@ test1.out: .gdbinit test1.in
|
|||||||
@-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
|
@-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
|
||||||
$(RUN_VIM) $*.in
|
$(RUN_VIM) $*.in
|
||||||
|
|
||||||
# For flaky tests retry one time.
|
|
||||||
@/bin/sh -c "if test -f test.out -a $* = test61; then \
|
|
||||||
if diff test.out $*.ok; then \
|
|
||||||
echo flaky test ok first time; \
|
|
||||||
else rm -rf $*.failed $(RM_ON_RUN); \
|
|
||||||
$(RUN_VIM) $*.in; \
|
|
||||||
fi; \
|
|
||||||
fi"
|
|
||||||
|
|
||||||
# Check if the test.out file matches test.ok.
|
# Check if the test.out file matches test.ok.
|
||||||
@/bin/sh -c "if test -f test.out; then \
|
@/bin/sh -c "if test -f test.out; then \
|
||||||
if diff test.out $*.ok; then \
|
if diff test.out $*.ok; then \
|
||||||
|
@@ -1,112 +0,0 @@
|
|||||||
Tests for undo tree.
|
|
||||||
Since this script is sourced we need to explicitly break changes up in
|
|
||||||
undo-able pieces. Do that by setting 'undolevels'.
|
|
||||||
Also tests :earlier and :later.
|
|
||||||
|
|
||||||
STARTTEST
|
|
||||||
:echo undotree().entries
|
|
||||||
ENDTEST
|
|
||||||
|
|
||||||
STARTTEST
|
|
||||||
:" Delete three characters and undo
|
|
||||||
Gx:set ul=100
|
|
||||||
x:set ul=100
|
|
||||||
x:.w! test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
:"
|
|
||||||
:/^111/w >>test.out
|
|
||||||
:" Delete three other characters and go back in time step by step
|
|
||||||
$x:set ul=100
|
|
||||||
x:set ul=100
|
|
||||||
x:.w >>test.out
|
|
||||||
:sleep 1
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
g-:.w >>test.out
|
|
||||||
10g+:.w >>test.out
|
|
||||||
:"
|
|
||||||
:/^222/w >>test.out
|
|
||||||
:" Delay for three seconds and go some seconds forward and backward
|
|
||||||
:sleep 2
|
|
||||||
Aa:set ul=100
|
|
||||||
Ab:set ul=100
|
|
||||||
Ac:set ul=100
|
|
||||||
:.w >>test.out
|
|
||||||
:ear 1s
|
|
||||||
:.w >>test.out
|
|
||||||
:ear 3s
|
|
||||||
:.w >>test.out
|
|
||||||
:later 1s
|
|
||||||
:.w >>test.out
|
|
||||||
:later 1h
|
|
||||||
:.w >>test.out
|
|
||||||
:"
|
|
||||||
:" test undojoin
|
|
||||||
Goaaaa:set ul=100
|
|
||||||
obbbbu:.w >>test.out
|
|
||||||
obbbb:set ul=100
|
|
||||||
:undojoin
|
|
||||||
occccu:.w >>test.out
|
|
||||||
:e! Xtest
|
|
||||||
ione one one:set ul=100
|
|
||||||
:w!
|
|
||||||
otwo:set ul=100
|
|
||||||
otwo:set ul=100
|
|
||||||
:w
|
|
||||||
othree:earlier 1f
|
|
||||||
:" expect "one one one\ntwo\ntwo"
|
|
||||||
:%yank a
|
|
||||||
:earlier 1f
|
|
||||||
:" expect "one one one"
|
|
||||||
:%yank b
|
|
||||||
:earlier 1f
|
|
||||||
:" expect empty line
|
|
||||||
:%yank c
|
|
||||||
:later 1f
|
|
||||||
:" expect "one one one"
|
|
||||||
:%yank d
|
|
||||||
:later 1f
|
|
||||||
:" expect "one one one\ntwo\ntwo"
|
|
||||||
:%yank e
|
|
||||||
:later 1f
|
|
||||||
:" expect "one one one\ntwo\ntwo\nthree"
|
|
||||||
ggO---:0put e
|
|
||||||
ggO---:0put d
|
|
||||||
ggO---:0put c
|
|
||||||
ggO---:0put b
|
|
||||||
ggO---:0put a
|
|
||||||
ggO---:w >>test.out
|
|
||||||
:so small.vim
|
|
||||||
:enew!
|
|
||||||
oa
|
|
||||||
:set ul=100
|
|
||||||
ob
|
|
||||||
:set ul=100
|
|
||||||
o1a2=setline('.','1234')
|
|
||||||
|
|
||||||
uu:"
|
|
||||||
oc
|
|
||||||
:set ul=100
|
|
||||||
o1a2=setline('.','1234')
|
|
||||||
|
|
||||||
u:"
|
|
||||||
od
|
|
||||||
:set ul=100
|
|
||||||
o1a2=string(123)
|
|
||||||
u:"
|
|
||||||
:%w >>test.out
|
|
||||||
:qa!
|
|
||||||
ENDTEST
|
|
||||||
|
|
||||||
1111 -----
|
|
||||||
2222 -----
|
|
||||||
|
|
||||||
123456789
|
|
@@ -1,49 +0,0 @@
|
|||||||
456789
|
|
||||||
3456789
|
|
||||||
23456789
|
|
||||||
123456789
|
|
||||||
123456789
|
|
||||||
1111 -----
|
|
||||||
123456
|
|
||||||
1234567
|
|
||||||
12345678
|
|
||||||
456789
|
|
||||||
3456789
|
|
||||||
23456789
|
|
||||||
123456789
|
|
||||||
123456789
|
|
||||||
123456789
|
|
||||||
123456
|
|
||||||
2222 -----
|
|
||||||
123456abc
|
|
||||||
123456
|
|
||||||
123456789
|
|
||||||
123456
|
|
||||||
123456abc
|
|
||||||
aaaa
|
|
||||||
aaaa
|
|
||||||
---
|
|
||||||
one one one
|
|
||||||
two
|
|
||||||
two
|
|
||||||
---
|
|
||||||
one one one
|
|
||||||
---
|
|
||||||
|
|
||||||
---
|
|
||||||
one one one
|
|
||||||
---
|
|
||||||
one one one
|
|
||||||
two
|
|
||||||
two
|
|
||||||
---
|
|
||||||
one one one
|
|
||||||
two
|
|
||||||
two
|
|
||||||
three
|
|
||||||
|
|
||||||
a
|
|
||||||
b
|
|
||||||
c
|
|
||||||
12
|
|
||||||
d
|
|
279
test/functional/legacy/061_undo_tree_spec.lua
Normal file
279
test/functional/legacy/061_undo_tree_spec.lua
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
-- Tests for undo tree and :earlier and :later.
|
||||||
|
|
||||||
|
local helpers = require('test.functional.helpers')
|
||||||
|
local feed, insert, source, eq, eval, clear, execute, expect, wait =
|
||||||
|
helpers.feed, helpers.insert, helpers.source, helpers.eq, helpers.eval,
|
||||||
|
helpers.clear, helpers.execute, helpers.expect, helpers.wait
|
||||||
|
|
||||||
|
local function expect_empty_buffer()
|
||||||
|
-- The space will be removed by helpers.dedent but is needed as dedent will
|
||||||
|
-- throw an error if it can not find the common indent of the given lines.
|
||||||
|
return expect(' ')
|
||||||
|
end
|
||||||
|
local function expect_line(line)
|
||||||
|
return eq(line, eval('getline(".")'))
|
||||||
|
end
|
||||||
|
local function write_file(name, text)
|
||||||
|
local file = io.open(name, 'w')
|
||||||
|
file:write(text)
|
||||||
|
file:flush()
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
describe('undo:', function()
|
||||||
|
before_each(clear)
|
||||||
|
teardown(function()
|
||||||
|
os.remove('Xtest.source')
|
||||||
|
end)
|
||||||
|
|
||||||
|
describe(':earlier and :later', function()
|
||||||
|
before_each(function()
|
||||||
|
os.remove('Xtest')
|
||||||
|
end)
|
||||||
|
teardown(function()
|
||||||
|
os.remove('Xtest')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('work with time specifications and g- and g+', function()
|
||||||
|
-- We write the test text to a file in order to prevent nvim to record
|
||||||
|
-- the inserting of the text into the undo history.
|
||||||
|
write_file('Xtest', '\n123456789\n')
|
||||||
|
|
||||||
|
|
||||||
|
-- `:earlier` and `:later` are (obviously) time-sensitive, so this test
|
||||||
|
-- sometimes fails if the system is under load. It is wrapped in a local
|
||||||
|
-- function to allow multiple attempts.
|
||||||
|
local function test_earlier_later()
|
||||||
|
clear()
|
||||||
|
execute('e Xtest')
|
||||||
|
-- Assert that no undo history is present.
|
||||||
|
eq({}, eval('undotree().entries'))
|
||||||
|
-- Delete three characters and undo.
|
||||||
|
feed('Gxxx')
|
||||||
|
expect_line('456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('3456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('23456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('123456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('123456789')
|
||||||
|
|
||||||
|
-- Delete three other characters and go back in time step by step.
|
||||||
|
feed('$xxx')
|
||||||
|
expect_line('123456')
|
||||||
|
execute('sleep 1')
|
||||||
|
wait()
|
||||||
|
feed('g-')
|
||||||
|
expect_line('1234567')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('12345678')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('3456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('23456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('123456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('123456789')
|
||||||
|
feed('g-')
|
||||||
|
expect_line('123456789')
|
||||||
|
feed('10g+')
|
||||||
|
expect_line('123456')
|
||||||
|
|
||||||
|
-- Delay for two seconds and go some seconds forward and backward.
|
||||||
|
execute('sleep 2')
|
||||||
|
wait()
|
||||||
|
feed('Aa<esc>')
|
||||||
|
feed('Ab<esc>')
|
||||||
|
feed('Ac<esc>')
|
||||||
|
expect_line('123456abc')
|
||||||
|
execute('earlier 1s')
|
||||||
|
expect_line('123456')
|
||||||
|
execute('earlier 3s')
|
||||||
|
expect_line('123456789')
|
||||||
|
execute('later 1s')
|
||||||
|
expect_line('123456')
|
||||||
|
execute('later 1h')
|
||||||
|
expect_line('123456abc')
|
||||||
|
end
|
||||||
|
local success, result = false, ''
|
||||||
|
for i = 1, 2 do
|
||||||
|
success, result = pcall(test_earlier_later)
|
||||||
|
if success then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- We did not return in the loop so there was an error or failure.
|
||||||
|
-- We now try to run the test again but will not catch further errors,
|
||||||
|
-- so the user will see them.
|
||||||
|
test_earlier_later()
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('work with file write specifications', function()
|
||||||
|
feed('ione one one<esc>')
|
||||||
|
execute('w Xtest')
|
||||||
|
feed('otwo<esc>')
|
||||||
|
feed('otwo<esc>')
|
||||||
|
execute('w')
|
||||||
|
feed('othree<esc>')
|
||||||
|
execute('earlier 1f')
|
||||||
|
expect([[
|
||||||
|
one one one
|
||||||
|
two
|
||||||
|
two]])
|
||||||
|
execute('earlier 1f')
|
||||||
|
expect('one one one')
|
||||||
|
execute('earlier 1f')
|
||||||
|
expect_empty_buffer()
|
||||||
|
execute('later 1f')
|
||||||
|
expect('one one one')
|
||||||
|
execute('later 1f')
|
||||||
|
expect([[
|
||||||
|
one one one
|
||||||
|
two
|
||||||
|
two]])
|
||||||
|
execute('later 1f')
|
||||||
|
expect([[
|
||||||
|
one one one
|
||||||
|
two
|
||||||
|
two
|
||||||
|
three]])
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('scripts produce one undo block for all changes by default', function()
|
||||||
|
source([[
|
||||||
|
normal Aaaaa
|
||||||
|
normal obbbb
|
||||||
|
normal occcc
|
||||||
|
]])
|
||||||
|
expect([[
|
||||||
|
aaaa
|
||||||
|
bbbb
|
||||||
|
cccc]])
|
||||||
|
feed('u')
|
||||||
|
expect_empty_buffer()
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('setting undolevel can break change blocks (inside scripts)', function()
|
||||||
|
-- We need to use source() in order to test this, as interactive changes
|
||||||
|
-- are not grouped.
|
||||||
|
source([[
|
||||||
|
normal Aaaaa
|
||||||
|
set ul=100
|
||||||
|
normal obbbb
|
||||||
|
set ul=100
|
||||||
|
normal occcc
|
||||||
|
]])
|
||||||
|
expect([[
|
||||||
|
aaaa
|
||||||
|
bbbb
|
||||||
|
cccc]])
|
||||||
|
feed('u')
|
||||||
|
expect([[
|
||||||
|
aaaa
|
||||||
|
bbbb]])
|
||||||
|
feed('u')
|
||||||
|
expect('aaaa')
|
||||||
|
feed('u')
|
||||||
|
expect_empty_buffer()
|
||||||
|
end)
|
||||||
|
|
||||||
|
it(':undojoin can join change blocks inside scripts', function()
|
||||||
|
feed('Goaaaa<esc>')
|
||||||
|
feed('obbbb<esc>u')
|
||||||
|
expect_line('aaaa')
|
||||||
|
source([[
|
||||||
|
normal obbbb
|
||||||
|
set ul=100
|
||||||
|
undojoin
|
||||||
|
normal occcc
|
||||||
|
]])
|
||||||
|
feed('u')
|
||||||
|
expect_line('aaaa')
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('undoing pastes from the expression register is working', function()
|
||||||
|
local normal_commands = 'o1\x1ba2\x12=string(123)\n\x1b'
|
||||||
|
write_file('Xtest.source', normal_commands)
|
||||||
|
|
||||||
|
feed('oa<esc>')
|
||||||
|
feed('ob<esc>')
|
||||||
|
feed([[o1<esc>a2<C-R>=setline('.','1234')<cr><esc>]])
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
12034]])
|
||||||
|
feed('uu')
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1]])
|
||||||
|
feed('oc<esc>')
|
||||||
|
feed([[o1<esc>a2<C-R>=setline('.','1234')<cr><esc>]])
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1
|
||||||
|
c
|
||||||
|
12034]])
|
||||||
|
feed('u')
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1
|
||||||
|
c
|
||||||
|
12]])
|
||||||
|
feed('od<esc>')
|
||||||
|
execute('so! Xtest.source')
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1
|
||||||
|
c
|
||||||
|
12
|
||||||
|
d
|
||||||
|
12123]])
|
||||||
|
feed('u')
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1
|
||||||
|
c
|
||||||
|
12
|
||||||
|
d]])
|
||||||
|
-- The above behaviour was tested in the legacy vim test because the
|
||||||
|
-- legacy tests were executed with ':so!'. The behavior differs for
|
||||||
|
-- interactive use (even in vim, where the result was the same):
|
||||||
|
feed(normal_commands)
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1
|
||||||
|
c
|
||||||
|
12
|
||||||
|
d
|
||||||
|
12123]])
|
||||||
|
feed('u')
|
||||||
|
expect([[
|
||||||
|
|
||||||
|
a
|
||||||
|
b
|
||||||
|
1
|
||||||
|
c
|
||||||
|
12
|
||||||
|
d
|
||||||
|
1]])
|
||||||
|
end)
|
||||||
|
end)
|
Reference in New Issue
Block a user