To: vim_dev@googlegroups.com Subject: Patch 7.4.2113 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2113 Problem: Test for undo is flaky. Solution: Turn it into a new style test. Use test_settime() to avoid flakyness. Files: src/Makefile, src/undo.c, src/testdir/test61.in, src/testdir/test61.ok, src/testdir/test_undo.vim, src/testdir/test_undolevels.vim, src/testdir/Make_all.mak, src/testdir/test_alot.vim *** ../vim-7.4.2112/src/Makefile 2016-07-28 22:22:39.982236402 +0200 --- src/Makefile 2016-07-29 16:06:22.203613953 +0200 *************** *** 2044,2050 **** test30 test31 test32 test33 test34 test36 test37 test38 test39 \ test40 test41 test42 test43 test44 test45 test46 test47 test48 test49 \ test50 test51 test52 test53 test54 test55 test56 test57 test58 test59 \ ! test60 test61 test62 test63 test64 test65 test66 test67 test68 test69 \ test70 test71 test72 test73 test74 test75 test76 test77 test78 test79 \ test80 test81 test82 test83 test84 test85 test86 test87 test88 test89 \ test90 test91 test92 test93 test94 test95 test97 test98 test99 \ --- 2044,2050 ---- test30 test31 test32 test33 test34 test36 test37 test38 test39 \ test40 test41 test42 test43 test44 test45 test46 test47 test48 test49 \ test50 test51 test52 test53 test54 test55 test56 test57 test58 test59 \ ! test60 test62 test63 test64 test65 test66 test67 test68 test69 \ test70 test71 test72 test73 test74 test75 test76 test77 test78 test79 \ test80 test81 test82 test83 test84 test85 test86 test87 test88 test89 \ test90 test91 test92 test93 test94 test95 test97 test98 test99 \ *************** *** 2119,2127 **** test_textobjects \ test_timers \ test_true_false \ ! test_undolevels \ ! test_usercommands \ test_unlet \ test_viminfo \ test_viml \ test_visual \ --- 2119,2127 ---- test_textobjects \ test_timers \ test_true_false \ ! test_undo \ test_unlet \ + test_usercommands \ test_viminfo \ test_viml \ test_visual \ *** ../vim-7.4.2112/src/undo.c 2016-07-16 14:46:51.135240543 +0200 --- src/undo.c 2016-07-29 14:08:44.674984507 +0200 *************** *** 534,540 **** uhp->uh_seq = ++curbuf->b_u_seq_last; curbuf->b_u_seq_cur = uhp->uh_seq; ! uhp->uh_time = time(NULL); uhp->uh_save_nr = 0; curbuf->b_u_time_cur = uhp->uh_time + 1; --- 534,540 ---- uhp->uh_seq = ++curbuf->b_u_seq_last; curbuf->b_u_seq_cur = uhp->uh_seq; ! uhp->uh_time = vim_time(); uhp->uh_save_nr = 0; curbuf->b_u_time_cur = uhp->uh_time + 1; *************** *** 2350,2356 **** else { if (dosec) ! closest = (long)(time(NULL) - starttime + 1); else if (dofile) closest = curbuf->b_u_save_nr_last + 2; else --- 2350,2356 ---- else { if (dosec) ! closest = (long)(vim_time() - starttime + 1); else if (dofile) closest = curbuf->b_u_save_nr_last + 2; else *************** *** 3104,3113 **** #ifdef HAVE_STRFTIME struct tm *curtime; ! if (time(NULL) - tt >= 100) { curtime = localtime(&tt); ! if (time(NULL) - tt < (60L * 60L * 12L)) /* within 12 hours */ (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime); else --- 3104,3113 ---- #ifdef HAVE_STRFTIME struct tm *curtime; ! if (vim_time() - tt >= 100) { curtime = localtime(&tt); ! if (vim_time() - tt < (60L * 60L * 12L)) /* within 12 hours */ (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime); else *************** *** 3117,3123 **** else #endif vim_snprintf((char *)buf, buflen, _("%ld seconds ago"), ! (long)(time(NULL) - tt)); } /* --- 3117,3123 ---- else #endif vim_snprintf((char *)buf, buflen, _("%ld seconds ago"), ! (long)(vim_time() - tt)); } /* *** ../vim-7.4.2112/src/testdir/test61.in 2015-08-11 18:33:43.074928052 +0200 --- src/testdir/test61.in 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,113 **** - 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 - :set nocp viminfo+=nviminfo - :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 --- 0 ---- *** ../vim-7.4.2112/src/testdir/test61.ok 2013-07-04 20:24:25.000000000 +0200 --- src/testdir/test61.ok 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,49 **** - 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 --- 0 ---- *** ../vim-7.4.2112/src/testdir/test_undo.vim 2016-07-29 16:14:04.163319393 +0200 --- src/testdir/test_undo.vim 2016-07-29 16:04:19.724750122 +0200 *************** *** 0 **** --- 1,204 ---- + " Tests for the 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. + + func Test_undotree() + exe "normal Aabc\" + set ul=100 + exe "normal Adef\" + set ul=100 + undo + let d = undotree() + call assert_true(d.seq_last > 0) + call assert_true(d.seq_cur > 0) + call assert_true(d.seq_cur < d.seq_last) + call assert_true(len(d.entries) > 0) + " TODO: check more members of d + + w! Xtest + call assert_equal(d.save_last + 1, undotree().save_last) + call delete('Xtest') + bwipe Xtest + endfunc + + func FillBuffer() + for i in range(1,13) + put=i + " Set 'undolevels' to split undo. + exe "setg ul=" . &g:ul + endfor + endfunc + + func Test_global_local_undolevels() + new one + set undolevels=5 + call FillBuffer() + " will only undo the last 5 changes, end up with 13 - (5 + 1) = 7 lines + earlier 10 + call assert_equal(5, &g:undolevels) + call assert_equal(-123456, &l:undolevels) + call assert_equal('7', getline('$')) + + new two + setlocal undolevels=2 + call FillBuffer() + " will only undo the last 2 changes, end up with 13 - (2 + 1) = 10 lines + earlier 10 + call assert_equal(5, &g:undolevels) + call assert_equal(2, &l:undolevels) + call assert_equal('10', getline('$')) + + setlocal ul=10 + call assert_equal(5, &g:undolevels) + call assert_equal(10, &l:undolevels) + + " Setting local value in "two" must not change local value in "one" + wincmd p + call assert_equal(5, &g:undolevels) + call assert_equal(-123456, &l:undolevels) + + new three + setglobal ul=50 + call assert_equal(50, &g:undolevels) + call assert_equal(-123456, &l:undolevels) + + " Drop created windows + set ul& + new + only! + endfunc + + func BackOne(expected) + call feedkeys('g-', 'xt') + call assert_equal(a:expected, getline(1)) + endfunc + + func Test_undo_del_chars() + " Setup a buffer without creating undo entries + new + set ul=-1 + call setline(1, ['123-456']) + set ul=100 + 1 + call test_settime(100) + + " Delete three characters and undo with g- + call feedkeys('x', 'xt') + call feedkeys('x', 'xt') + call feedkeys('x', 'xt') + call assert_equal('-456', getline(1)) + call BackOne('3-456') + call BackOne('23-456') + call BackOne('123-456') + call assert_fails("BackOne('123-456')") + + :" Delete three other characters and go back in time with g- + call feedkeys('$x', 'xt') + call feedkeys('x', 'xt') + call feedkeys('x', 'xt') + call assert_equal('123-', getline(1)) + call test_settime(101) + + call BackOne('123-4') + call BackOne('123-45') + " skips '123-456' because it's older + call BackOne('-456') + call BackOne('3-456') + call BackOne('23-456') + call BackOne('123-456') + call assert_fails("BackOne('123-456')") + normal 10g+ + call assert_equal('123-', getline(1)) + + :" Jump two seconds and go some seconds forward and backward + call test_settime(103) + call feedkeys("Aa\", 'xt') + call feedkeys("Ab\", 'xt') + call feedkeys("Ac\", 'xt') + call assert_equal('123-abc', getline(1)) + earlier 1s + call assert_equal('123-', getline(1)) + earlier 3s + call assert_equal('123-456', getline(1)) + later 1s + call assert_equal('123-', getline(1)) + later 1h + call assert_equal('123-abc', getline(1)) + + close! + endfunc + + func Test_undojoin() + new + call feedkeys("Goaaaa\", 'xt') + call feedkeys("obbbb\", 'xt') + call assert_equal(['aaaa', 'bbbb'], getline(2, '$')) + call feedkeys("u", 'xt') + call assert_equal(['aaaa'], getline(2, '$')) + call feedkeys("obbbb\", 'xt') + undojoin + " Note: next change must not be as if typed + call feedkeys("occcc\", 'x') + call assert_equal(['aaaa', 'bbbb', 'cccc'], getline(2, '$')) + call feedkeys("u", 'xt') + call assert_equal(['aaaa'], getline(2, '$')) + close! + endfunc + + func Test_undo_write() + split Xtest + call feedkeys("ione one one\", 'xt') + w! + call feedkeys("otwo\", 'xt') + call feedkeys("otwo\", 'xt') + w + call feedkeys("othree\", 'xt') + call assert_equal(['one one one', 'two', 'two', 'three'], getline(1, '$')) + earlier 1f + call assert_equal(['one one one', 'two', 'two'], getline(1, '$')) + earlier 1f + call assert_equal(['one one one'], getline(1, '$')) + earlier 1f + call assert_equal([''], getline(1, '$')) + later 1f + call assert_equal(['one one one'], getline(1, '$')) + later 1f + call assert_equal(['one one one', 'two', 'two'], getline(1, '$')) + later 1f + call assert_equal(['one one one', 'two', 'two', 'three'], getline(1, '$')) + + close! + call delete('Xtest') + bwipe! Xtest + endfunc + + func Test_insert_expr() + new + " calling setline() triggers undo sync + call feedkeys("oa\", 'xt') + call feedkeys("ob\", 'xt') + set ul=100 + call feedkeys("o1\a2\=setline('.','1234')\\\", 'x') + call assert_equal(['a', 'b', '120', '34'], getline(2, '$')) + call feedkeys("u", 'x') + call assert_equal(['a', 'b', '12'], getline(2, '$')) + call feedkeys("u", 'x') + call assert_equal(['a', 'b'], getline(2, '$')) + + call feedkeys("oc\", 'xt') + set ul=100 + call feedkeys("o1\a2\=setline('.','1234')\\\", 'x') + call assert_equal(['a', 'b', 'c', '120', '34'], getline(2, '$')) + call feedkeys("u", 'x') + call assert_equal(['a', 'b', 'c', '12'], getline(2, '$')) + + call feedkeys("od\", 'xt') + set ul=100 + call feedkeys("o1\a2\=string(123)\\", 'x') + call assert_equal(['a', 'b', 'c', '12', 'd', '12123'], getline(2, '$')) + call feedkeys("u", 'x') + call assert_equal(['a', 'b', 'c', '12', 'd'], getline(2, '$')) + + close! + endfunc *** ../vim-7.4.2112/src/testdir/test_undolevels.vim 2016-04-14 19:48:54.809601526 +0200 --- src/testdir/test_undolevels.vim 1970-01-01 01:00:00.000000000 +0100 *************** *** 1,48 **** - " Tests for 'undolevels' - - func FillBuffer() - for i in range(1,13) - put=i - " Set 'undolevels' to split undo. - exe "setg ul=" . &g:ul - endfor - endfunc - - func Test_global_local_undolevels() - new one - set undolevels=5 - call FillBuffer() - " will only undo the last 5 changes, end up with 13 - (5 + 1) = 7 lines - earlier 10 - call assert_equal(5, &g:undolevels) - call assert_equal(-123456, &l:undolevels) - call assert_equal('7', getline('$')) - - new two - setlocal undolevels=2 - call FillBuffer() - " will only undo the last 2 changes, end up with 13 - (2 + 1) = 10 lines - earlier 10 - call assert_equal(5, &g:undolevels) - call assert_equal(2, &l:undolevels) - call assert_equal('10', getline('$')) - - setlocal ul=10 - call assert_equal(5, &g:undolevels) - call assert_equal(10, &l:undolevels) - - " Setting local value in "two" must not change local value in "one" - wincmd p - call assert_equal(5, &g:undolevels) - call assert_equal(-123456, &l:undolevels) - - new three - setglobal ul=50 - call assert_equal(50, &g:undolevels) - call assert_equal(-123456, &l:undolevels) - - " Drop created windows - set ul& - new - only! - endfunc --- 0 ---- *** ../vim-7.4.2112/src/testdir/Make_all.mak 2016-07-24 17:32:41.877505078 +0200 --- src/testdir/Make_all.mak 2016-07-29 16:06:31.735525483 +0200 *************** *** 51,57 **** test56.out \ test57.out \ test60.out \ - test61.out \ test62.out \ test63.out \ test64.out \ --- 51,56 ---- *************** *** 188,193 **** --- 187,193 ---- test_stat.res \ test_syntax.res \ test_textobjects.res \ + test_undo.res \ test_usercommands.res \ test_viminfo.res \ test_viml.res \ *** ../vim-7.4.2112/src/testdir/test_alot.vim 2016-07-21 10:10:59.250942515 +0200 --- src/testdir/test_alot.vim 2016-07-29 12:12:08.219534910 +0200 *************** *** 36,41 **** source test_tagjump.vim source test_timers.vim source test_true_false.vim - source test_undolevels.vim source test_unlet.vim source test_window_cmd.vim --- 36,40 ---- *** ../vim-7.4.2112/src/version.c 2016-07-28 22:53:33.165059340 +0200 --- src/version.c 2016-07-29 16:06:50.895347637 +0200 *************** *** 760,761 **** --- 760,763 ---- { /* Add new patch number below this line */ + /**/ + 2113, /**/ -- How do you know when you have run out of invisible ink? /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///