From 22e6272b1a5ddb0f10626d202de9ffb8e57897d0 Mon Sep 17 00:00:00 2001 From: Israel Chauca Fuentes Date: Sun, 9 Apr 2017 15:39:11 -0400 Subject: [PATCH] Migrate testing to tcltest + expect --- Makefile | 10 ++- test/Makefile | 22 +++-- test/_setup.vim | 119 ++------------------------ test/all.tcl | 18 ++++ test/autoclose_matchpairs.vim | 146 -------------------------------- test/autoclose_quotes.vim | 109 ------------------------ test/eol_marker.test | 49 +++++++++++ test/eol_marker.vim | 48 ----------- test/expand_cr.test | 92 ++++++++++++++++++++ test/expand_cr.vim | 127 ---------------------------- test/expand_space.test | 48 +++++++++++ test/expand_space.vim | 46 ---------- test/helper.tcl | 125 +++++++++++++++++++++++++++ test/pairs.test | 153 ++++++++++++++++++++++++++++++++++ test/quotes.test | 107 ++++++++++++++++++++++++ test/test.exp | 20 +++++ 16 files changed, 634 insertions(+), 605 deletions(-) create mode 100644 test/all.tcl delete mode 100644 test/autoclose_matchpairs.vim delete mode 100644 test/autoclose_quotes.vim create mode 100644 test/eol_marker.test delete mode 100644 test/eol_marker.vim create mode 100644 test/expand_cr.test delete mode 100644 test/expand_cr.vim create mode 100644 test/expand_space.test delete mode 100644 test/expand_space.vim create mode 100644 test/helper.tcl create mode 100644 test/pairs.test create mode 100644 test/quotes.test create mode 100755 test/test.exp diff --git a/Makefile b/Makefile index 88148a2..00577e2 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,15 @@ .DEFAULT: test -test_files := $(filter-out _setup.vim,$(wildcard test/*.vim)) +test_files := $(wildcard test/*.test) +short_targets := $(patsubst test/%,%,$(test_files)) -.PHONY: all test $(test_files) +.PHONY: monitor test $(test_files) $(short_targets) test: $(MAKE) -C test -$(test_files): +monitor: + $(MAKE) -C test monitor + +$(test_files) $(short_targets): $(MAKE) -C test $(patsubst test/%,%,$@) diff --git a/test/Makefile b/test/Makefile index 2288e7c..990ac1e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,16 +1,14 @@ -all: build/runVimTests - time build/runVimTests/bin/runVimTests.sh -0 . +test_files := $(wildcard *.test) -build/runVimTests: build/VimTAP - git clone https://github.com/inkarkat/runVimTests $@ +.PHONY: all monitor $(test_files) -# Use VimTAP as directory name, as used with runVimTestsSetup.vim. -build/VimTAP: - git clone https://github.com/inkarkat/vimtap $@ - -test_files := $(filter-out _setup.vim,$(wildcard *.vim)) - -.PHONY: $(test_files) +all: + time tclsh all.tcl $(test_files): - time build/runVimTests/bin/runVimTests.sh -0 $@ + time tclsh $@ + printf "\a" + +monitor: + fswatch -o ../autoload/*.vim ../plugin/*.vim *.test \ + | xargs -n1 -I\{\} time tclsh all.tcl || printf "\a" diff --git a/test/_setup.vim b/test/_setup.vim index 2993be8..63788e0 100644 --- a/test/_setup.vim +++ b/test/_setup.vim @@ -1,120 +1,11 @@ -" function! DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" - Runs a single test. -" - Add 1 to vimtap#Plan(). -" -" function! DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every pair. -" - Add 7 to vimtap#Plan(). -" -" function! DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every quote. -" - Add 5 to vimtap#Plan(). - -let &rtp = expand(':p:h:h') . ',' . &rtp . ',' . expand(':p:h:h') . '/after' set bs=2 set hidden +set noshowmode set whichwrap=[] +set noswapfile +let &hl = join(map(split(&hl, ','), 'substitute(v:val, '':.\+'', ''n'', ''g'')'), ',') +let &rtp = expand(':p:h:h') . ',' . &rtp . ',' . expand(':p:h:h') . '/after' let g:delimitMate_pairs = ['()','{}','[]','<>','¿?','¡!',',:'] let g:delimitMate_quotes = ['"', "'", '`', '«', '|'] ru plugin/delimitMate.vim -let runVimTests = expand(':p:h').'/build/runVimTests' -if isdirectory(runVimTests) - let &rtp = runVimTests . ',' . &rtp -endif -let vimTAP = expand(':p:h').'/build/VimTAP' -if isdirectory(vimTAP) - let &rtp = vimTAP . ',' . &rtp -endif - -function! s:setup_buffer(buf_content) - "silent DelimitMateReload "call delimitMate#setup() - silent %d_ - if !empty(a:buf_content) - call setline(1, a:buf_content) - call feedkeys("gg0", 'ntx') - endif -endfunction - -"function! DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" Runs a single test (add 1 to vimtap#Plan()) -function! DMTest_single(setup, typed, expected, ...) - if type(a:setup) == v:t_list - let setup = copy(a:setup) - else - let setup = [a:setup] - endif - if type(a:expected) == v:t_list - let expected = copy(a:expected) - else - let expected = [a:expected] - endif - let skip_expr = a:0 && !empty(a:1) ? a:1 : 0 - let todo_expr = a:0 > 1 && !empty(a:2) ? a:2 : 0 - if vimtap#Skip(1, !eval(skip_expr), skip_expr) - return - elseif eval(todo_expr) - call vimtap#Todo(1) - endif - call s:setup_buffer(setup) - echom strtrans(a:typed) - call feedkeys(a:typed, 'mt') - call test_disable_char_avail(1) - call feedkeys('', 'x') - call feedkeys('', 'x') - call test_disable_char_avail(0) - call vimtap#Is(getline(1,'$'), expected, strtrans(a:typed)) -endfunction - -function! s:do_set(pat, sub, set, setup, typed, expected, ...) - let skip_expr = get(a:, '1', '') - let todo_expr = get(a:, '2', '') - let escaped = '\.*^$' - for elem in a:set - if type(a:setup) == v:t_list - let setup = copy(a:setup) - else - let setup = [a:setup] - endif - if type(a:expected) == v:t_list - let expected = copy(a:expected) - else - let expected = [a:expected] - endif - if strchars(elem) > 1 - "let [left, right] = map(split(elem, '\zs'), 'escape(v:val, escaped)') - let left = escape(strcharpart(elem, 0, 1), escaped) - let right = escape(strcharpart(elem, 1, 1), escaped) - let sub = a:sub - else - let quote = escape(elem, escaped) - let sub = eval(a:sub) - endif - call map(setup, "substitute(v:val, a:pat, sub, 'g')") - let typed = substitute(a:typed, a:pat, sub, 'g') - call map(expected, "substitute(v:val, a:pat, sub, 'g')") - call DMTest_single(setup, typed, expected, skip_expr, todo_expr) - endfor -endfunction - -"function! DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" Runs one test for every pair (add 7 to vimtap#Plan()) -function! DMTest_pairs(setup, typed, expected, ...) - let skip_expr = get(a:, '1', '') - let todo_expr = get(a:, '2', '') - let pairs = delimitMate#option('pairs') - let pat = '[()]' - let sub = '\=submatch(0) == "(" ? left : right' - return s:do_set(pat, sub, pairs, a:setup, a:typed, a:expected, skip_expr, todo_expr) -endfunction - -"function! DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" Runs one test for every quote (add 5 to vimtap#Plan()) -function! DMTest_quotes(setup, typed, expected, ...) - let skip_expr = get(a:, '1', '') - let todo_expr = get(a:, '2', '') - let quotes = delimitMate#option('quotes') - let pat = "'" - let sub = 'quote' - return s:do_set(pat, sub, quotes, a:setup, a:typed, a:expected, skip_expr, todo_expr) -endfunction -" vim: sw=2 et +au VimEnter * echom 'Start test' diff --git a/test/all.tcl b/test/all.tcl new file mode 100644 index 0000000..bf907a7 --- /dev/null +++ b/test/all.tcl @@ -0,0 +1,18 @@ +package require tcltest 2 +namespace import -force ::tcltest::* +configure {*}$argv -testdir [file dir [info script]] + +# Hook to determine if any of the tests failed. Then we can exit with +# proper exit code: 0=all passed, 1=one or more failed +proc tcltest::cleanupTestsHook {} { + variable numTests + upvar 2 testFileFailures crashed + set ::exitCode [expr {$numTests(Failed) > 0}] + if {[info exists crashed]} { + set ::exitCode [expr {$::exitCode || [llength $crashed]}] + } +} + +runAllTests +puts "\a" +exit $exitCode diff --git a/test/autoclose_matchpairs.vim b/test/autoclose_matchpairs.vim deleted file mode 100644 index 0cdeed6..0000000 --- a/test/autoclose_matchpairs.vim +++ /dev/null @@ -1,146 +0,0 @@ -" call DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" - Runs a single test. -" - Add 1 to vimtap#Plan(). -" -" call DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every pair. -" - Add 7 to vimtap#Plan(). -" -" call DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every quote. -" - Add 5 to vimtap#Plan(). - -call vimtest#StartTap() - -call vimtap#Plan(239) - - -let g:delimitMate_matchpairs = '(:),{:},[:],<:>,¿:?,¡:!,,::' -let g:delimitMate_autoclose = 1 -call DMTest_pairs('', "i(", "()") - -call DMTest_pairs('()', "a\", "") - -call DMTest_pairs('()', "a)x", "()x") - -"call DMTest_pairs('', "((\gx", "(())x") -call DMTest_pairs('', "i(x\u", "") - -call DMTest_pairs('', "i@(x", "@(x)") - -call DMTest_pairs('@#', "a(x", "@(x)#") - -call DMTest_pairs('\', "a(x", '\(x') - -call DMTest_pairs('(\)', "la)x", '(\)x)') - -call DMTest_pairs('"abc"', "ifoo(", 'foo("abc"') - -"call DMTest_pairs('', "(\x", "()x") - -let g:delimitMate_autoclose = 0 -call DMTest_pairs('', "i(x", "(x") - -call DMTest_pairs('', "i()x", "(x)") - -call DMTest_pairs('', "i())x", "()x") - -call DMTest_pairs('', "i()\x", "x") - -call DMTest_pairs('', "i@()x", "@(x)") - -call DMTest_pairs('@#', "a()x", "@(x)#") - -let g:delimitMate_autoclose = 1 -" Handle backspace gracefully. -set backspace= -call DMTest_pairs('', "i(\a\x", "(x)") - -set backspace=2 -" closing parens removes characters. #133 -call DMTest_pairs('(a)', "a)", "()a)") - -" Expand iabbreviations -iabb def ghi -" Not sure how to make it work on the test -call DMTest_single('', "idef(", "ghi()", 0, 1) -iunabb def - -call DMTest_pairs("abc а", "$i(", "abc (а") - -call DMTest_pairs("abc ñ", "$i(", "abc (ñ") - -call DMTest_pairs("abc $", "$i(", "abc ($") - -call DMTest_pairs("abc £", "$i(", "abc (£") - -call DMTest_pairs("abc d", "$i(", "abc (d") - -call DMTest_pairs("abc .", "$i(", "abc ().") - -call DMTest_pairs("abc ", "$i(", "abc () ") - -call DMTest_pairs("abc (", "$i(", "abc ((") - -" Play nice with undo. -call DMTest_pairs('', "ia\u(c)b\u", "a") - -" TODO: way to jump over one or several closing chars -call DMTest_single('()', 'a\x', '()x', 0, 1) - -call DMTest_single('{()}', 'la\x', '{()}x', 0, 1) - -let g:delimitMate_balance_pairs = 0 -call DMTest_pairs('ab cd)', "la(x", 'ab(x) cd)') -" Issue #229 -call DMTest_pairs('((ab cd)', "$i)x", '((ab cd)x') - -let g:delimitMate_balance_pairs = 1 -call DMTest_pairs('ab cd)', "la(x", 'ab(x cd)') -" Issue #229 -call DMTest_pairs('((ab cd)', "$i)x", '((ab cd)x)') -unlet g:delimitMate_balance_pairs - -" Issue #220 -let g:delimitMate_jump_next = 0 -call DMTest_pairs('()', 'a)', '())') -unlet g:delimitMate_jump_next - -" Issues #207 and #223 -let g:delimitMate_jump_long = 1 -call DMTest_single('{[(foobar)]}', 'fbi)x', '{[(foobar)x]}') - -" Issues #207 and #223 -call DMTest_single('{[(foobar)]}', 'fbi]x', '{[(foobar)]x}') -unlet g:delimitMate_jump_long - -" Issues #207 and #223 -let g:delimitMate_jump_all = 1 -call DMTest_single('{[(foobar)]}', 'fbix', '{[(foobar)]}x', 0, 1) -unlet g:delimitMate_jump_all - -let g:delimitMate_jump_back = 1 -call DMTest_pairs('', 'i()x', '()x') -unlet g:delimitMate_jump_back - -" Disable on syntax groups -new -syntax on -set ft=vim -let g:delimitMate_excluded_regions = ['String'] -call DMTest_pairs('echo " "', "f\"la(", 'echo " ( "') -unlet g:delimitMate_excluded_regions - -filetype indent plugin on -set ft=php -" Issue #160 -call DMTest_single('\\", '.", 'abc foo(x)foo(x)', 0, 1) - -call vimtest#Quit() -" vim: sw=2 et diff --git a/test/autoclose_quotes.vim b/test/autoclose_quotes.vim deleted file mode 100644 index e14848c..0000000 --- a/test/autoclose_quotes.vim +++ /dev/null @@ -1,109 +0,0 @@ -" call DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" - Runs a single test. -" - Add 1 to vimtap#Plan(). -" -" call DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every pair. -" - Add 7 to vimtap#Plan(). -" -" call DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every quote. -" - Add 5 to vimtap#Plan(). - -call vimtest#StartTap() - -call vimtap#Plan(147) - - -let g:delimitMate_autoclose = 1 -call DMTest_quotes('', "i'x", "'x'") - -call DMTest_quotes('', "i'x\u", "") - -call DMTest_quotes('', "i''x", "''x") - -call DMTest_quotes("''", "a\x", "x") - -"call DMTest_quotes('', "'\gx", "''x") -" This will fail for double quote. -call DMTest_quotes('', "i'\"x", "'\"x\"'", 'a:typed =~ "i\"\"x"') - -call DMTest_quotes('', "i@'x", "@'x'") - -call DMTest_quotes('@#', "a'x", "@'x'#") - -"call DMTest_quotes('', "'\x", "''x") -call DMTest_quotes('abc', "A'", "abc'") - -call DMTest_quotes('abc\', "A'x", "abc\\'x") - -call DMTest_quotes('', "au'Привет'", "u'Привет'") - -call DMTest_quotes('', "au'string'", "u'string'") - -let g:delimitMate_autoclose = 0 -call DMTest_quotes('', "a'x", "'x") - -call DMTest_quotes('', "a''x", "'x'") - -call DMTest_quotes('', "a'''x", "''x") - -call DMTest_quotes('', "a''\x", "x") - -call DMTest_quotes('', "a@''x", "@'x'") - -call DMTest_quotes('@#', "a''x", "@'x'#") - -let g:delimitMate_autoclose = 1 -" Handle backspace gracefully. -set backspace= -call DMTest_quotes('', "a'\a\x", "'x'") - -set backspace=2 -"set cpo=ces$ -"call DMTest_quotes('', "'x", "'x'") -" Make sure smart quote works beyond first column. -call DMTest_quotes(' ', "a'x", " 'x'") - -" smart quote, check fo char on the right. -call DMTest_quotes('a b', "la'", "a 'b") - -" Make sure we jump over a quote on the right. #89. -call DMTest_quotes('', "a('test'x", "('test'x)") - -" Duplicate whole line when inserting quote at bol #105 -call DMTest_quotes('}', "i'", "''}") - -call DMTest_quotes("'abc ", "A'", "'abc '") - -call DMTest_quotes("''abc ", "A'", "''abc ''") - -" Nesting quotes: -let g:delimitMate_nesting_quotes = delimitMate#option('quotes') -call DMTest_quotes("''", "A'x", "'''x'''") - -call DMTest_quotes("'''", "A'x", "''''x''''") - -call DMTest_quotes('', "i''x", "''x") - -call DMTest_quotes('', "i'x", "'x'") - -unlet g:delimitMate_nesting_quotes -" expand iabbreviations -iabb def ghi -call DMTest_single('', 'idef"', 'ghi"') - -iunabb def -""call DMTest_quotes('', "i'\\", "''") -" Double quote starts a comment in viml -set ft=vim -call DMTest_single('', 'i"', '"') - -syntax on -" Allow quote to exit from string when disabled by syntax group. -call DMTest_quotes("'abc'", "$i'x", "'abc'x") - -set ft= - -call vimtest#Quit() -" vim: sw=2 et diff --git a/test/eol_marker.test b/test/eol_marker.test new file mode 100644 index 0000000..352c1d4 --- /dev/null +++ b/test/eol_marker.test @@ -0,0 +1,49 @@ +# singleTest name desc setup input result vimCmds? skipScript? +# +# - desc can be empty and input would be used. +# - vimCmds is a list of ex commands. +# - skipScript will be evaluated in the scope of the function "single" and it +# should return a keywowd such as toDo, badTest or other as listed in the +# docs for tcltest. e.g.: +# {expr "[string first {i'} \"${input}\"] > -1 ? {emptyTest} : {}"} +# see tcltest documentation for other values. + +# Get some help: +source helper.tcl + +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +lappend vimCmds {let g:delimitMate_eol_marker = ';'} +lappend vimCmds {let g:delimitMate_insert_eol_marker = 0} + +single ins_eol_marker_0-1 {} "" "i(" "()" ${vimCmds} + +single ins_eol_marker_0-2 {} "" "i(\rx" "(\nx\n)" ${vimCmds} + +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +lappend vimCmds {let g:delimitMate_eol_marker = ';'} +lappend vimCmds {let g:delimitMate_insert_eol_marker = 1} +single ins_eol_marker_1-1 {} "" "i(" "();" ${vimCmds} + +single ins_eol_marker_1-2 {} " a" "0i(" "() a" ${vimCmds} + +single ins_eol_marker_1-3 {} "" "i(\rx" "(\nx\n);" ${vimCmds} + +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +lappend vimCmds {let g:delimitMate_eol_marker = ';'} +lappend vimCmds {let g:delimitMate_insert_eol_marker = 2} +single ins_eol_marker_2-1 {} "" "i(" "()" ${vimCmds} + +single ins_eol_marker_2-2 {} "" "i(\rx" "(\nx\n);" ${vimCmds} + +# Issue #195 +single issue_195-1 {} "" "i{(\rx" "{(\nx\n)}" ${vimCmds} + +# Issue #195 +single issue_195-2 {} ";" "I{(\rx" "{(\nx\n)};" ${vimCmds} + + + +################################################################ +# This gives nice statistics and cleans up the mess left behind. +cleanupTests +# vim: set filetype=tcl et sw=2 sts=0 ts=8: diff --git a/test/eol_marker.vim b/test/eol_marker.vim deleted file mode 100644 index ed8203f..0000000 --- a/test/eol_marker.vim +++ /dev/null @@ -1,48 +0,0 @@ -" call DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" - Runs a single test. -" - Add 1 to vimtap#Plan(). -" -" call DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every pair. -" - Add 7 to vimtap#Plan(). -" -" call DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every quote. -" - Add 5 to vimtap#Plan(). - -call vimtest#StartTap() -call vimtap#Plan(10) - -let g:delimitMate_expand_cr = 1 -let g:delimitMate_eol_marker = ';' -" NOTE: Do not forget to update the plan ^ -let g:delimitMate_insert_eol_marker = 0 - -call DMTest_single('', 'i(', '()') - -call DMTest_single('', "i(\x", ['(', 'x', ')']) - -let g:delimitMate_insert_eol_marker = 1 -call DMTest_single('', 'i(', '();') - -call DMTest_single(' a', 'i(', '() a') - -call DMTest_single('', "i(\x", ['(', 'x', ');']) - -let g:delimitMate_insert_eol_marker = 2 -call DMTest_single('', 'i(', '()') - -call DMTest_single('', "i(\x", ['(', 'x', ');']) - -" Issue #195 -call DMTest_single('', "i{(\x", ['{(', 'x', ')}']) - -" Issue #195 -call DMTest_single('', "i;\{(\x", ['{(', 'x', ')};']) - -" Issue #195 -call DMTest_single('', "i\{(\x", ['{(', 'x', ')};'], 0, 1) - -" End: quit vim. -call vimtest#Quit() -" vim: sw=2 et diff --git a/test/expand_cr.test b/test/expand_cr.test new file mode 100644 index 0000000..3a614cf --- /dev/null +++ b/test/expand_cr.test @@ -0,0 +1,92 @@ +# singleTest name desc setup input result vimCmds? skipScript? +# +# - desc can be empty and input would be used. +# - vimCmds is a list of ex commands. +# - skipScript will be evaluated in the scope of the function "single" and it +# should return a keywowd such as toDo, badTest or other as listed in the +# docs for tcltest. e.g.: +# {expr "[string first {i'} \"${input}\"] > -1 ? {emptyTest} : {}"} +# see tcltest documentation for other values. + +# Get some help: +source helper.tcl + +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +#"let g:delimitMate_eol_marker = ';' +lappend vimCmds {filetype indent on} +lappend vimCmds {set bs=2 et sts=4 sw=4 ft=javascript} +single javascript-1 {} "\$(document).ready(function() {})" "f{a\rx" \ + "\$(document).ready(function() {\n x\n})" ${vimCmds} + +# Issue #95 +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +lappend vimCmds {let b:delimitMate_jump_expansion = 1} +set skipScript {string cat toDo} +single issue_95 {} "" "i(\rtest)x" "(\ntest\n)x" ${vimCmds} ${skipScript} + +# Remove CR expansion on BS +set skipScript {string cat toDo} +single bs {} "" "i(\r\bx" "(x)" ${vimCmds} ${skipScript} + +# Consider indentation with BS inside an empty CR expansion. +single bs_indentation {} "" "i( \r\b\bx" "(x)" ${vimCmds} + +# Conflict with indentation settings (cindent). Issue #95 +lappend vimCmds {se cindent} +single issue_95 {} "sub foo {\n while (1) {\n\n }\n}" "3Gi\bx" \ + "sub foo {\n while (1) {x}\n}" ${vimCmds} + +single nested_expansion-1 {} "sub foo {\n while (1) {\n bar\n }\n}" \ + "3GA}x" "sub foo {\n while (1) {\n bar\n }x\n}" ${vimCmds} + +single nested_expansion-2 {} "sub foo {\n while (1) {\n bar\n }\n}" \ + "3GA{x" "sub foo {\n while (1) {\n bar{x}\n }\n}" ${vimCmds} + +single bracketed {} "\"{bracketed}" "\033A\"x" "\"{bracketed}\"x" ${vimCmds} + +# Syntax folding enabled by autocmd breaks expansion. +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +lappend vimCmds {se cindent} +lappend vimCmds {set bs=2 et sts=4 sw=4} +lappend vimCmds {autocmd InsertEnter let w:fdm=&foldmethod \ + | setl foldmethod=manual} +lappend vimCmds {autocmd InsertLeave let &foldmethod = w:fdm} +lappend vimCmds {set foldmethod=marker} +lappend vimCmds {set foldmarker={,}} +lappend vimCmds {set foldlevel=0} +lappend vimCmds {set backspace=2} +single folding {} "" "iabc {\rx" "abc {\n x\n}" ${vimCmds} + +# expand_cr != 2} +set vimCmds [list {let g:delimitMate_expand_cr = 1}] +lappend vimCmds {se cindent} +lappend vimCmds {set bs=2 et sts=4 sw=4 ft=javascript} +lappend vimCmds {let b:delimitMate_jump_expansion = 1} +single axpand_cr_no_2 {} "abc(def)" "\$i\rx" "abc(def\n x)" ${vimCmds} + +# expand_cr == 2 +set vimCmds [list {let g:delimitMate_expand_cr = 2}] +lappend vimCmds {se cindent} +lappend vimCmds {set bs=2 et sts=4 sw=4 ft=javascript} +lappend vimCmds {let b:delimitMate_jump_expansion = 1} +single expand_cr_2 {} "abc(def)" "\$i\rx" "abc(def\n x\n )" ${vimCmds} + +# Play nice with smartindent +set vimCmds [list {let g:delimitMate_expand_cr = 2}] +lappend vimCmds {let b:delimitMate_jump_expansion = 1} +lappend vimCmds {set smartindent} +single smartindent-1 {} "" "i{\rx" "{\n x\n}" ${vimCmds} + +single quotes-1 {} "" "i\" x" {" x"} ${vimCmds} + +single quotes-2 {} "" "i\"\rx" "\"\nx\"" ${vimCmds} + +lappend vimCmds {let g:delimitMate_expand_inside_quotes = 1} +single quotes-3 {} "" "i\"\nx" "\"\nx\n\"" ${vimCmds} + + + +################################################################ +# This gives nice statistics and cleans up the mess left behind. +cleanupTests +# vim: set filetype=tcl et sw=2 sts=0 ts=8: diff --git a/test/expand_cr.vim b/test/expand_cr.vim deleted file mode 100644 index 17875ed..0000000 --- a/test/expand_cr.vim +++ /dev/null @@ -1,127 +0,0 @@ -" call DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" - Runs a single test. -" - Add 1 to vimtap#Plan(). -" -" call DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every pair. -" - Add 7 to vimtap#Plan(). -" -" call DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every quote. -" - Add 5 to vimtap#Plan(). - -call vimtest#StartTap() -call vimtap#Plan(27) - - -let g:delimitMate_expand_cr = 1 -"let g:delimitMate_eol_marker = ';' -filetype indent on -set bs=2 et sts=4 sw=4 ft=javascript -call DMTest_single('$(document).ready(function() {})', - \ "31|i\x", - \ ["$(document).ready(function() {", " x", "})"]) - -" Issue #95 -new -let b:delimitMate_jump_expansion = 1 -call DMTest_single('', - \ "i(\test)x", - \ ['(', 'test', ')x']) - -" Remove CR expansion on BS -call DMTest_single('', - \ "i(\\x", - \ ['(x)']) - -" Consider indentation with BS inside an empty CR expansion. -call DMTest_single('', "i( \\\x", '(x)') - -" Conflict with indentation settings (cindent). Issue #95 -se cindent - -call DMTest_single( - \ ['sub foo {', - \ ' while (1) {', - \ '', - \ ' }', - \ '}'], - \ "3Gi\x", - \ ['sub foo {', - \ ' while (1) {x}', - \ '}']) - -call DMTest_single( - \ ['sub foo {', - \ ' while (1) {', - \ ' bar', - \ ' }', - \ '}'], - \ "3GA}x", - \ ['sub foo {', - \ ' while (1) {', - \ ' bar', - \ ' }x', - \ '}']) - -call DMTest_single( - \ ['sub foo {', - \ ' while (1) {', - \ ' bar', - \ ' }', - \ '}'], - \ "3GA{x", - \ ['sub foo {', - \ ' while (1) {', - \ ' bar{x}', - \ ' }', - \ '}']) - -call DMTest_single('"{bracketed}', "\A\"x", '"{bracketed}"x') - -" Syntax folding enabled by autocmd breaks expansion. -new -autocmd InsertEnter let w:fdm=&foldmethod | setl foldmethod=manual -autocmd InsertLeave let &foldmethod = w:fdm -set foldmethod=marker -set foldmarker={,} -set foldlevel=0 -set backspace=2 -call DMTest_single('', - \ "iabc {\x", - \ ['abc {', - \ ' x', - \ '}']) -:bp - -" expand_cr != 2 -call DMTest_single('abc(def)', - \ "i\$i\x", - \ ['abc(def', - \ ' x)']) - -" expand_cr == 2 -let g:delimitMate_expand_cr = 2 -call DMTest_single('abc(def)', - \ "$i\x", - \ ['abc(def', - \ ' x', - \ ' )']) - -" Play nice with smartindent -set all& -set whichwrap=[] -set bs=2 -set smartindent -call DMTest_single('', "i{\x", ['{', ' x', '}']) - -call DMTest_quotes('', "i' x", "' x'") - -call DMTest_quotes('', "i'\x", ["'", "x'"]) - -let g:delimitMate_expand_inside_quotes = 1 - -call DMTest_quotes('', "i'\x", ["'", "x", "'"]) - -call vimtest#Quit() -" vim: sw=2 et diff --git a/test/expand_space.test b/test/expand_space.test new file mode 100644 index 0000000..d56eef6 --- /dev/null +++ b/test/expand_space.test @@ -0,0 +1,48 @@ +# singleTest name desc setup input result vimCmds? skipScript? +# +# - desc can be empty and input would be used. +# - vimCmds is a list of ex commands. +# - skipScript will be evaluated in the scope of the function "single" and it +# should return a keywowd such as toDo, badTest or other as listed in the +# docs for tcltest. e.g.: +# {expr "[string first {i'} \"${input}\"] > -1 ? {emptyTest} : {}"} +# see tcltest documentation for other values. + +# Get some help: +source helper.tcl + +set vimCmds [list {let g:delimitMate_expand_space = 1}] +lappend vimCmds {let g:delimitMate_autoclose = 1} + +pairs pairs-1 {} "" "i( x" "( x )" ${vimCmds} + +pairs pairs-2 {} "( )" "la\bx" "(x)" ${vimCmds} + +pairs pairs-3 {} "" "iabc x" "abc x" ${vimCmds} + +quotes quotes-1 {} "" "i' x" "' x'" ${vimCmds} + +lappend vimCmds {let g:delimitMate_expand_inside_quotes = 1} +quotes quotes-2 {} "" "i' x" "' x '" ${vimCmds} + +quotes quotes-3 {} "" "i' \bx" "'x'" ${vimCmds} + +set skipScript {string cat quoteBug} +lappend vimCmds {let g:delimitMate_autoclose = 0} +quotes quotes-4 {} "abc\\" "A'' x" "abc\\'' x '" ${vimCmds} ${skipScript} + +# Issue #95 +lappend vimCmds {let b:delimitMate_jump_expansion = 1} +set skipScript {string cat toDo} +pairs issue_95 {} "" "i( test)x" "( test )x" ${vimCmds} ${skipScript} + +pairs pairs-4 {} "" "i() \bx" "(x)" ${vimCmds} + +quotes quotes-5 {} "" "i'' \bx" "'x'" ${vimCmds} + + + +################################################################ +# This gives nice statistics and cleans up the mess left behind. +cleanupTests +# vim: set filetype=tcl et sw=2 sts=0 ts=8: diff --git a/test/expand_space.vim b/test/expand_space.vim deleted file mode 100644 index 1ef1f00..0000000 --- a/test/expand_space.vim +++ /dev/null @@ -1,46 +0,0 @@ -" call DMTest_single(setup, typed, expected[, skip_expr[, todo_expr]]) -" - Runs a single test. -" - Add 1 to vimtap#Plan(). -" -" call DMTest_pairs(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every pair. -" - Add 7 to vimtap#Plan(). -" -" call DMTest_quotes(setup, typed, expected, [skip_expr[, todo_expr]]) -" - Runs one test for every quote. -" - Add 5 to vimtap#Plan(). - -call vimtest#StartTap() - -call vimtap#Plan(60) - - -let g:delimitMate_expand_space = 1 - -let g:delimitMate_autoclose = 1 -call DMTest_pairs('', "i(\x", "( x )") - -call DMTest_pairs('( )', "la\x", "(x)") - -call DMTest_pairs('', "iabc x", "abc x") - -call DMTest_quotes('', "i' x", "' x'") - -let g:delimitMate_expand_inside_quotes = 1 -call DMTest_quotes('', "i' x", "' x '") - -call DMTest_quotes('', "i' \x", "'x'") - -call DMTest_quotes('abc\', "A'' x", "abc\\'' x '") - -" Issue #95 -let b:delimitMate_jump_expansion = 1 -call DMTest_pairs('', "i( test)x", '( test )x') - -let g:delimitMate_autoclose = 0 -call DMTest_pairs('', "i()\\x", "(x)") - -call DMTest_quotes('', "i'' \x", "'x'") - -call vimtest#Quit() -" vim: sw=2 et diff --git a/test/helper.tcl b/test/helper.tcl new file mode 100644 index 0000000..78db987 --- /dev/null +++ b/test/helper.tcl @@ -0,0 +1,125 @@ +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest 2 + namespace import -force ::tcltest::* +} + +configure -verbose {body error skip} +#configure -verbose {start msec pass body error skip} + +set charMap [list \ + "\"" "\\\"" \ + "\$" "\\$" \ + "\[" "\\\[" \ + "\]" "\\\]" \ + "\\" "\\\\" \ + "{" "\\{" \ + "}" "\\}" \ + ] + +# In order to skip a test pass a script that, when evaluated, returns emptyTest +# for tests that can not pass, or knownBug for ToDo features. e.g.: +# {expr "[string first {i'} \"${input}\"] > -1 ? {emptyTest} : {}"} +# see tcltest documentation for other values. + +proc single {name desc setup input result \ + {vimCmds {}} \ + {constr {}} \ + } { + set fnamePrefix "test_${name}" + global charMap + makeFile ${setup} "${fnamePrefix}.in" + makeFile {} "${fnamePrefix}.out" + makeFile [join ${vimCmds} "\n"] "${fnamePrefix}.vim" + set input [string map ${charMap} ${input}] + #puts [lindex ${vimCmds} 0] + set optCharMap [list {[} {\[} {]} {\]}] + set vimArgs [lmap option ${vimCmds} \ + {string cat " -c \"[string map $charMap ${option}]\""}] + set body [string cat " + exec -- ./test.exp \"${fnamePrefix}\" \"${input}\" + return \[viewFile \"${fnamePrefix}.out\"\] + " ] + #puts ${body} + if {[string length ${desc}] eq 0} { + set desc ${input} + } + if {[string length ${constr}] ne 0} { + #puts ${constr} + set constr [eval ${constr}] + #puts ${constr} + } + set name "${name}: \"${setup}\", \"${desc}\" ->" + #puts $desc + #puts $name + test ${name} \ + ${desc} \ + -body ${body} \ + -constraints ${constr} \ + -result ${result} +} + +proc multi {items evalScript name desc setup input result \ + {vimCmds {}} \ + {constr {}} \ + } { + global charMap + set minor 0 + foreach item $items { + incr minor + eval ${evalScript} + foreach var {desc setup input result} { + set "the_${var}" [string map ${aCharMap} [expr "$${var}"]] + } + set the_name "${name}.${minor}" + single \ + ${the_name} \ + ${the_desc} \ + ${the_setup} \ + ${the_input} \ + ${the_result} \ + ${vimCmds} \ + ${constr} \ + } +} + +proc quotes {name desc setup input result \ + {vimCmds {}} \ + {constr {}} \ + } { + set quotes [list {'} \" {`} {«} {|}] + set mapScript {set aCharMap [list "'" ${item}]} + multi \ + ${quotes} \ + ${mapScript} \ + ${name} \ + ${desc} \ + ${setup} \ + ${input} \ + ${result} \ + ${vimCmds} \ + ${constr} \ +} + +proc pairs {name desc setup input result \ + {vimCmds {}} \ + {constr {}} \ + } { + set pairs [list () \{\} \[\] <> ¿? ¡! ,:] + set mapScript { + set left [string index ${item} 0] + set right [string index ${item} 1] + set aCharMap [list ( ${left} ) ${right}] + } + multi \ + ${pairs} \ + ${mapScript} \ + ${name} \ + ${desc} \ + ${setup} \ + ${input} \ + ${result} \ + ${vimCmds} \ + ${constr} \ +} + +# vim: set filetype=tcl et sw=2 sts=0 ts=8: diff --git a/test/pairs.test b/test/pairs.test new file mode 100644 index 0000000..1247968 --- /dev/null +++ b/test/pairs.test @@ -0,0 +1,153 @@ +# singleTest name desc setup input result vimCmds? skipScript? +# +# - desc can be empty and input would be used. +# - vimCmds is a list of ex commands. +# - skipScript will be evaluated in the scope of the function "single" and it +# should return a keywowd such as toDo, badTest or other as listed in the +# docs for tcltest. e.g.: +# {expr "[string first {i'} \"${input}\"] > -1 ? {emptyTest} : {}"} +# see tcltest documentation for other values. + +# Get some help: +source helper.tcl + +set vimCmds [list ] +pairs autoclose-1 {} {} "i(" "()" + +pairs autoclose-2 {} {()} "a\b" "" + +pairs autoclose-3 {} "()" "a)x" "()x" + +set skipScript {string cat {toDo}} +single jump_all {} "" "((x" "(())x" {} ${skipScript} + +pairs undo {} "" "i(x\033u" "" + +pairs autoclose-4 {} "" "i@(x" "@(x)" + +pairs autoclose-5 {} "@#" "a(x" "@(x)#" + +pairs autoclose-6 {} "\\" "a(x" "\\(x" + +pairs autoclose-7 {} "(\\)" "la)x" "(\\)x)" + +pairs autoclose-8 {} {"abc"} "ifoo(" "foo(\"abc\"" + +set vimCmds [list {let g:delimitMate_autoclose = 0}] +pairs noautoclose-1 {} "" "i(x" "(x" ${vimCmds} + +pairs noautoclose-2 {} "" "i()x" "(x)" ${vimCmds} + +pairs noautoclose-3 {} "" "i())x" "()x" ${vimCmds} + +pairs noautoclose-4 {} "" "i()\bx" "x" ${vimCmds} + +pairs noautoclose-5 {} "" "i@()x" "@(x)" ${vimCmds} + +pairs noautoclose-6 {} "@#" "a()x" "@(x)#" ${vimCmds} + +#" Handle backspace gracefully. +set vimCmds [list {set backspace=}] +pairs bad_bs {} "" "i(\033a\bx" "(x)" ${vimCmds} + +set vimCmds [list ] + +# closing parens removes characters. #133 +pairs autoclose-9 {} "(a)" "a)" "()a)" ${vimCmds} + +# Expand iabbreviations +set vimCmds [list {iabb def ghi}] +# Not sure how to make it work on the test +pairs iabbr {} "" "idef(" "ghi()" ${vimCmds} + +set vimCmds [list ] + +pairs autoclose-10 {} {abc а} {$i(} {abc (а} ${vimCmds} + +pairs autoclose-11 {} "abc ñ" "\$i(" "abc (ñ" ${vimCmds} + +pairs autoclose-12 {} "abc \$" "\$i(" "abc (\$" ${vimCmds} + +pairs autoclose-13 {} "abc £" "\$i(" "abc (£" ${vimCmds} + +pairs autoclose-14 {} "abc d" "\$i(" "abc (d" ${vimCmds} + +pairs autoclose-15 {} "abc ." "\$i(" "abc ()." ${vimCmds} + +pairs autoclose-16 {} "abc " "\$i(" "abc () " ${vimCmds} + +pairs autoclose-17 {} "abc (" "\$i(" "abc ((" ${vimCmds} + +# Play nice with undo. +pairs undo {} "" "ia\007u(c)b\033u" "a" ${vimCmds} + +# TODO: way to jump over one or several closing chars +set skipScript {string cat {toDo}} +single jump_to {} "()" "a\x" "()x" ${vimCmds} ${skipScript} + +single jump_to {} "{()}" "la\\x" "{()}x" ${vimCmds} ${skipScript} + +set vimCmds [list {let g:delimitMate_balance_pairs = 0}] +pairs no_balance_pairs-1 {} "ab cd)" "la(x" "ab(x) cd)" ${vimCmds} + +# Issue #229 +pairs issue_229-1 {} "((ab cd)" "\$i)x" "((ab cd)x" ${vimCmds} + +set vimCmds [list ] + +set vimCmds [list {let g:delimitMate_balance_pairs = 1}] +pairs issue_229-2 {} "ab cd)" "la(x" "ab(x cd)" ${vimCmds} + +# Issue #229 +pairs issue_229-3 {} "((ab cd)" "\$i)x" "((ab cd)x)" ${vimCmds} + +# Issue #220 +set vimCmds [list {let g:delimitMate_jump_next = 0}] +pairs issue_220-1 {} "()" "a)" "())" ${vimCmds} + +# Issues #207 and #223 +set vimCmds [list {let g:delimitMate_jump_long = 1}] +pairs jump_long-1 {} "{\[(foobar)\]}" "fbi)x" "{\[(foobar)x\]}" ${vimCmds} + +# Issues #207 and #223 +set skipScript {expr "[string first {[[foobar]]} \"${setup}\"] > -1 \ + ? {badTest} : {}"} +single jump_long-2 {} "{\[(foobar)\]}" "fbi\]x" "{\[(foobar)\]x}" ${vimCmds} ${skipScript} + +# Issues #207 and #223 +set skipScript {string cat {toDo}} +set vimCmds [list {let g:delimitMate_jump_all = 1}] +single issues_207_223 {} "{\[(foobar)\]}" "fbix" "{\[(foobar)\]}x" \ + ${vimCmds} ${skipScript} + +set vimCmds [list {let g:delimitMate_jump_back = 1}] +pairs jump_back {} "" "i()x" "()x" ${vimCmds} + +# Disable on syntax groups +set vimCmds [list {syntax on}] +lappend vimCmds {set ft=vim} +lappend vimCmds {let g:delimitMate_excluded_regions = ['String']} +pairs ignore_syntax {} {echo " "} "f\"la(" {echo " ( "} ${vimCmds} + +#" Issue #160 +set vimCmds [list {filetype indent plugin on}] +lappend vimCmds {set ft=php} +set skipScript {string cat {toDo}} +single issue_160 {} " -1 ? {emptyTest} : {}"} +# see tcltest documentation for other values. + +# Get some help: +source helper.tcl + +quotes autoclose-1 {} {} "i'x" "'x'" + +quotes autoclose-2 {} {} "i'x\033u" {} + +quotes autoclose-3 {} {} {i''x} {''x} + +quotes autoclose-4 {} {''} "a\bx" {x} + +set skipScript {expr "[string first {i\"} \"${input}\"] > -1 ? {badTest} : {}"} +quotes autoclose-5 {} "" "i'x\"" "'x\"'" {} ${skipScript} + +quotes autoclose-6 {} {} "i@'x" "@'x'" + +quotes autoclose-7 {} {@#} "a'x" "@'x'#" + +#quotes autoclose-8 {} {} "'\x" "''x" + +single autoclose-8 {} {abc'} "A'" "abc'" {} {string cat toDo} + +quotes autoclose-9 {} "abc\\" "A'x" {abc\'x} + +quotes autoclose-10 {} {} "au'Привет'" "u'Привет'" + +quotes autoclose-11 {} {} "au'string'" "u'string'" + +set vimCmds [list {let g:delimitMate_autoclose = 0}] +quotes noautoclose-1 {} {} "a'x" "'x" ${vimCmds} + +quotes noautoclose-2 {} {} "a''x" "'x'" ${vimCmds} + +quotes noautoclose-3 {} {} "a'''x" "''x" ${vimCmds} + +quotes noautoclose-4 {} {} "a''\bx" "x" ${vimCmds} + +quotes noautoclose-5 {} {} "a@''x" "@'x'" ${vimCmds} + +quotes noautoclose-6 {} "@#" "a''x" "@'x'#" ${vimCmds} + +set vimCmds [list {let g:delimitMate_autoclose = 1}] +# Handle backspace gracefully. +lappend vimCmds {set backspace=} +quotes badBS-1 {} {} "a'\033a\bx" "'x'" ${vimCmds} + +set vimCmds [list {set cpo=ces$}] +quotes cpo {} {} "a'x" "'x'" ${vimCmds} + +# Make sure smart quote works beyond first column. +quotes beyond_first_column {} { } "a'x" " 'x'" + +# smart quote, check fo char on the right. +quotes smart_quote-1 {} "a b" "la'" "a 'b" + +# Make sure we jump over a quote on the right. #89. +quotes autoclose-12 {} {} "a('test'x" "('test'x)" + +# Duplicate whole line when inserting quote at bol #105 +quotes autoclose-13 {} "}" "i'" "''}" + +quotes autoclose-14 {} "'abc " "A'" "'abc '" + +quotes autoclose-15 {} "''abc " "A'" "''abc ''" + +# Nesting quotes: +set vimCmds [list {let g:delimitMate_nesting_quotes = delimitMate#option('quotes')}] +quotes nesting-1 {} "''" "A'x" "'''x'''" ${vimCmds} + +quotes nesting-2 {} "'''" "A'x" "''''x''''" ${vimCmds} + +quotes nesting-3 {} {} "i''x" "''x" ${vimCmds} + +quotes nesting-4 {} {} "i'x" "'x'" ${vimCmds} + +set vimCmds [list] + +# expand iabbreviations +set vimCmds [list {iabb def ghi}] +single iabbr {} {} {idef"} {ghi"} ${vimCmds} + +set vimCmds [list] + +quotes autoclose-16 {} {} "i'\n\b" "''" + +# Double quote starts a comment in viml +set vimCmds [list {set ft=vim}] +single vim_comment {} {} {i"} {"} ${vimCmds} + +#" Allow quote to exit from string when disabled by syntax group. +set vimCmds [list {syntax on}] +quotes disabled_syntax {} "'abc'" "\$i'x" "'abc'x" ${vimCmds} + +# -------- +# This gives nice statistics and cleans up the mess left behind. +cleanupTests +# vim: set filetype=tcl et sw=2 sts=0 ts=8: diff --git a/test/test.exp b/test/test.exp new file mode 100755 index 0000000..8c22a15 --- /dev/null +++ b/test/test.exp @@ -0,0 +1,20 @@ +#!/usr/bin/env expect -f + +set testName [lindex $argv 0] +set filein "${testName}.in" +set fileout "${testName}.out" +set input [lindex $argv 1] + +set timeout 2 +spawn env TERM=dumb vim -N -i NONE -u _setup.vim -S "${testName}.vim" -- ${filein} +match_max 100000 +expect -exact "Start test" +foreach char [split ${input} {}] { + send -- "${char}" + sleep .01 +} +send -- " " +sleep .01 +send -- ":w! ${fileout}\r" +send -- ":qa!\r" +expect eof