tests: Migrate legacy test 61.

This test is real time based as it also tests the `:earlier` and `:later`
commands with time arguments (using `:sleep`).  This can sometimes case the
test to fail on systems that are under heavy load or where the time interval
between creating the expected buffer state and the `:earlier` or `:later`
command that tries to jump to it changes.

To be system independent we use nvim's `:sleep` command and `wait()` for it in
the test suit.

The legacy vim test writes to test.out a lot with `:.w >>test.out`.  This
does currently not work in the lua test suite so the test is modernized to use
busted's assertions instead of the output file.

This test was treated special in the legacy Makefile but after the conversion
the related code can be removed.
This commit is contained in:
Lucas Hoffmann 2015-05-15 19:03:48 +02:00
parent a743297be2
commit 8c999a9d6c
4 changed files with 210 additions and 171 deletions

View File

@ -19,7 +19,7 @@ SCRIPTS := test_eval.out \
test46.out test47.out test48.out test49.out \
test52.out test53.out test55.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 \
test71.out test73.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"
$(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.
@/bin/sh -c "if test -f test.out; then \
if diff test.out $*.ok; then \

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,209 @@
-- 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.
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
describe('the undo tree', function()
setup(clear)
teardown(function()
os.remove('Xtest')
end)
it('is working', function()
-- Assert that no undo history is present.
eq({}, eval('undotree().entries'))
insert([[
123456789]])
-- Clear the undo history after the insertion (see :h clear-undo)
execute('let old_undolevels = &undolevels')
execute('set undolevels=-1')
feed('a <BS><Esc>')
execute('let &undolevels = old_undolevels')
execute('unlet old_undolevels')
eq({}, eval('undotree().entries'))
-- Delete three characters and undo.
feed('Gx')
execute('set ul=100')
feed('x')
execute('set ul=100')
feed('x')
eq('456789', eval('getline(".")'))
feed('g-')
eq('3456789', eval('getline(".")'))
feed('g-')
eq('23456789', eval('getline(".")'))
feed('g-')
eq('123456789', eval('getline(".")'))
feed('g-')
eq('123456789', eval('getline(".")'))
-- Delete three other characters and go back in time step by step.
feed('$x')
execute('set ul=100')
feed('x')
execute('set ul=100')
feed('x')
eq('123456', eval('getline(".")'))
execute('sleep 1')
wait()
feed('g-')
eq('1234567', eval('getline(".")'))
feed('g-')
eq('12345678', eval('getline(".")'))
feed('g-')
eq('456789', eval('getline(".")'))
feed('g-')
eq('3456789', eval('getline(".")'))
feed('g-')
eq('23456789', eval('getline(".")'))
feed('g-')
eq('123456789', eval('getline(".")'))
feed('g-')
eq('123456789', eval('getline(".")'))
feed('g-')
eq('123456789', eval('getline(".")'))
feed('10g+')
eq('123456', eval('getline(".")'))
-- Delay for three seconds and go some seconds forward and backward.
execute('sleep 2')
wait()
feed('Aa<esc>')
execute('set ul=100')
feed('Ab<esc>')
execute('set ul=100')
feed('Ac<esc>')
execute('set ul=100')
eq('123456abc', eval('getline(".")'))
execute('ear 1s')
eq('123456', eval('getline(".")'))
execute('ear 3s')
eq('123456789', eval('getline(".")'))
execute('later 1s')
eq('123456', eval('getline(".")'))
execute('later 1h')
eq('123456abc', eval('getline(".")'))
-- Test undojoin.
feed('Goaaaa<esc>')
execute('set ul=100')
feed('obbbb<esc>u')
eq('aaaa', eval('getline(".")'))
feed('obbbb<esc>')
execute('set ul=100')
execute('undojoin')
feed('occcc<esc>u')
-- TODO At this point the original test will write "aaaa" to test.out.
-- Why is the line "bbbb" here?
eq('bbbb', eval('getline(".")'))
execute('e! Xtest')
feed('ione one one<esc>')
execute('set ul=100')
execute('w!')
feed('otwo<esc>')
execute('set ul=100')
feed('otwo<esc>')
execute('set ul=100')
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 an empty line (the space is needed for helpers.dedent but
-- removed).
expect(' ')
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]])
execute('enew!')
feed('oa<esc>')
execute('set ul=100')
feed('ob<esc>')
execute('set ul=100')
feed([[o1<esc>a2<C-R>=setline('.','1234')<cr><esc>]])
expect([[
a
b
12034]])
feed('uu')
expect([[
a
b
1]])
feed('oc<esc>')
execute('set ul=100')
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('set ul=100')
feed('o1<esc>a2<C-R>=string(123)<cr><esc>')
expect([[
a
b
1
c
12
d
12123]])
-- TODO there is a difference between the original test and this test at
-- this point. The original tests expects the last line to go away after
-- the undo. I do not know why this should be the case as the "o" and "a"
-- above are seperate changes. I was able to confirm this manually with
-- vim and nvim. Both end up in this state (treat "o" and "a" as two
-- edits).
feed('u')
expect([[
a
b
1
c
12
d
1]])
end)
end)