diff --git a/autoload/gitgutter/sign.vim b/autoload/gitgutter/sign.vim index 6bd5efa..7e1218d 100644 --- a/autoload/gitgutter/sign.vim +++ b/autoload/gitgutter/sign.vim @@ -171,3 +171,9 @@ function! gitgutter#sign#next_sign_id() abort let s:next_sign_id += 1 return next_id endfunction + + +" Only for testing. +function! gitgutter#sign#reset() + let s:next_sign_id = s:first_sign_id +endfunction diff --git a/test/=fixture=.txt b/test/=fixture=.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test/README.markdown b/test/README.markdown deleted file mode 100644 index 2be0c37..0000000 --- a/test/README.markdown +++ /dev/null @@ -1,30 +0,0 @@ -## Testing vim-gitgutter - -### Run the tests - -```sh -$ cd test -$ ./test -``` - -### Add a new test - -- Add a test file named like `testFoo.vim`. It should have this structure: - -```viml -source helper.vim -call Setup() - -" test code here -``` - -- Run the tests. -- Inspect output (in `foo.actual`) from the new test. If good, copy it to `foo.expected`. -- Run the tests to ensure new test's output is verified. -- Commit changes. - -### Limitations - -- Currently tests are done by writing out a file and comparing it to a known good one. -- There's no support for assertions within the testcase code. - diff --git a/test/addLines.expected b/test/addLines.expected deleted file mode 100644 index 8e2c2ec..0000000 --- a/test/addLines.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=2 id=3000 name=GitGutterLineAdded diff --git a/test/addLinesFish.expected b/test/addLinesFish.expected deleted file mode 100644 index 8e2c2ec..0000000 --- a/test/addLinesFish.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=2 id=3000 name=GitGutterLineAdded diff --git a/test/ambiguousFile.expected b/test/ambiguousFile.expected deleted file mode 100644 index 1cd4e89..0000000 --- a/test/ambiguousFile.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=5 id=3000 name=GitGutterLineModified diff --git a/test/fileAddedToGit.expected b/test/fileAddedToGit.expected deleted file mode 100644 index bfd8eeb..0000000 --- a/test/fileAddedToGit.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fileAddedToGit.tmp: - line=1 id=3000 name=GitGutterLineAdded diff --git a/test/filenameWithEquals.expected b/test/filenameWithEquals.expected deleted file mode 100644 index a78b977..0000000 --- a/test/filenameWithEquals.expected +++ /dev/null @@ -1,5 +0,0 @@ - ---- Signs --- -Signs for =fixture=.txt: - line=1 id=3000 name=GitGutterLineAdded - line=2 id=3001 name=GitGutterLineAdded diff --git a/test/filenameWithSquareBrackets.expected b/test/filenameWithSquareBrackets.expected deleted file mode 100644 index 18f3022..0000000 --- a/test/filenameWithSquareBrackets.expected +++ /dev/null @@ -1,5 +0,0 @@ - ---- Signs --- -Signs for fix[tu]re.txt: - line=1 id=3000 name=GitGutterLineAdded - line=2 id=3001 name=GitGutterLineAdded diff --git a/test/fix[tu]re.txt b/test/fix[tu]re.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test/followSymlink.expected b/test/followSymlink.expected deleted file mode 100644 index 8f8fb4a..0000000 --- a/test/followSymlink.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for symlink: - line=5 id=3000 name=GitGutterLineRemoved diff --git a/test/helper.vim b/test/helper.vim deleted file mode 100644 index aaccf39..0000000 --- a/test/helper.vim +++ /dev/null @@ -1,27 +0,0 @@ -set runtimepath+=../ -source ../plugin/gitgutter.vim - -function! Setup() - edit! fixture.txt - sign unplace * -endfunction - -function! DumpSigns(filename) - execute 'redir! > ' a:filename.'.actual' - silent execute 'sign place' - redir END -endfunction - -function! DumpGitDiff(filename) - call system('git diff fixture.txt > '.a:filename.'.actual') -endfunction - -function! DumpGitDiffStaged(filename) - call system('git diff --staged fixture.txt > '.a:filename.'.actual') -endfunction - -function! Dump(text, filename) - let msg = type(a:text) == 1 ? split(a:text, '\n') : a:text - call writefile(msg, a:filename.'.actual', 'a') -endfunction - diff --git a/test/hunkHunkOutsideNoopStageGitDiffStaged.expected b/test/hunkHunkOutsideNoopStageGitDiffStaged.expected deleted file mode 100644 index e69de29..0000000 diff --git a/test/hunkHunkOutsideNoopUndoGitDiffStaged.expected b/test/hunkHunkOutsideNoopUndoGitDiffStaged.expected deleted file mode 100644 index e69de29..0000000 diff --git a/test/hunkOutsideNoopStageSigns.expected b/test/hunkOutsideNoopStageSigns.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/hunkOutsideNoopStageSigns.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/hunkOutsideNoopUndoSigns.expected b/test/hunkOutsideNoopUndoSigns.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/hunkOutsideNoopUndoSigns.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/hunkStageGitDiff.expected b/test/hunkStageGitDiff.expected deleted file mode 100644 index 6f6a7fa..0000000 --- a/test/hunkStageGitDiff.expected +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/test/fixture.txt b/test/fixture.txt -index f5c6aff..ae8e546 100644 ---- a/test/fixture.txt -+++ b/test/fixture.txt -@@ -2,7 +2,7 @@ a - b - c - d --e -+*e - f - g - h diff --git a/test/hunkStageNearbyGitDiff.expected b/test/hunkStageNearbyGitDiff.expected deleted file mode 100644 index 6a0b7f0..0000000 --- a/test/hunkStageNearbyGitDiff.expected +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/test/fixture.txt b/test/fixture.txt -index 53b13df..8fdfda7 100644 ---- a/test/fixture.txt -+++ b/test/fixture.txt -@@ -1,5 +1,8 @@ - a - b -+x -+y -+z - c - e - f diff --git a/test/hunkStageNearbyGitDiffStaged.expected b/test/hunkStageNearbyGitDiffStaged.expected deleted file mode 100644 index 8806576..0000000 --- a/test/hunkStageNearbyGitDiffStaged.expected +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/test/fixture.txt b/test/fixture.txt -index f5c6aff..53b13df 100644 ---- a/test/fixture.txt -+++ b/test/fixture.txt -@@ -1,7 +1,6 @@ - a - b - c --d - e - f - g diff --git a/test/hunkStageNearbySigns.expected b/test/hunkStageNearbySigns.expected deleted file mode 100644 index edfebd2..0000000 --- a/test/hunkStageNearbySigns.expected +++ /dev/null @@ -1,6 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=3 id=3000 name=GitGutterLineAdded - line=4 id=3001 name=GitGutterLineAdded - line=5 id=3002 name=GitGutterLineAdded diff --git a/test/hunkStageSigns.expected b/test/hunkStageSigns.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/hunkStageSigns.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/hunkUndoGitDiff.expected b/test/hunkUndoGitDiff.expected deleted file mode 100644 index e69de29..0000000 diff --git a/test/hunkUndoNearbyGitDiff.expected b/test/hunkUndoNearbyGitDiff.expected deleted file mode 100644 index d480c7b..0000000 --- a/test/hunkUndoNearbyGitDiff.expected +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/test/fixture.txt b/test/fixture.txt -index f5c6aff..3fbde56 100644 ---- a/test/fixture.txt -+++ b/test/fixture.txt -@@ -1,5 +1,8 @@ - a - b -+x -+y -+z - c - d - e diff --git a/test/hunkUndoNearbySigns.expected b/test/hunkUndoNearbySigns.expected deleted file mode 100644 index edfebd2..0000000 --- a/test/hunkUndoNearbySigns.expected +++ /dev/null @@ -1,6 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=3 id=3000 name=GitGutterLineAdded - line=4 id=3001 name=GitGutterLineAdded - line=5 id=3002 name=GitGutterLineAdded diff --git a/test/hunkUndoSigns.expected b/test/hunkUndoSigns.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/hunkUndoSigns.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/keepAlt.expected b/test/keepAlt.expected deleted file mode 100644 index feee7b5..0000000 --- a/test/keepAlt.expected +++ /dev/null @@ -1,3 +0,0 @@ -buffer: fixture.txt -altbuffer: -altbuffer: diff --git a/test/keepModified.expected b/test/keepModified.expected deleted file mode 100644 index 57a1bbf..0000000 --- a/test/keepModified.expected +++ /dev/null @@ -1,2 +0,0 @@ -modified: 1 -modified: 1 diff --git a/test/keepOpMarks.expected b/test/keepOpMarks.expected deleted file mode 100644 index ed6b8c3..0000000 --- a/test/keepOpMarks.expected +++ /dev/null @@ -1,4 +0,0 @@ -'[ mark: 0,6,1,0 -'] mark: 0,6,2,0 -'[ mark: 0,6,1,0 -'] mark: 0,6,2,0 diff --git a/test/modifyLines.expected b/test/modifyLines.expected deleted file mode 100644 index 91ad42c..0000000 --- a/test/modifyLines.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=1 id=3000 name=GitGutterLineModified diff --git a/test/noModifications.expected b/test/noModifications.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/noModifications.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/orphanedSigns.expected b/test/orphanedSigns.expected deleted file mode 100644 index 1beeb65..0000000 --- a/test/orphanedSigns.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=6 id=3001 name=GitGutterLineAdded diff --git a/test/removeFirstLines.expected b/test/removeFirstLines.expected deleted file mode 100644 index 1cbfd76..0000000 --- a/test/removeFirstLines.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=1 id=3000 name=GitGutterLineRemovedFirstLine diff --git a/test/removeLines.expected b/test/removeLines.expected deleted file mode 100644 index 94d8ee4..0000000 --- a/test/removeLines.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=4 id=3000 name=GitGutterLineRemoved diff --git a/test/runner.vim b/test/runner.vim new file mode 100644 index 0000000..630693c --- /dev/null +++ b/test/runner.vim @@ -0,0 +1,162 @@ +" +" Adapted from https://github.com/vim/vim/blob/master/src/testdir/runtest.vim +" +" When debugging tests it can help to write debug output: +" call Log('oh noes') +" + +function RunTest(test) + if exists("*SetUp") + call SetUp() + endif + + try + execute 'call '.a:test + catch + call Exception() + let s:errored = 1 + endtry + + if exists("*TearDown") + call TearDown() + endif +endfunction + +function Log(msg) + if type(a:msg) == type('') + call add(s:messages, a:msg) + elseif type(a:msg) == type([]) + call extend(s:messages, a:msg) + else + call add(v:errors, 'Exception: unsupported type: '.type(a:msg)) + endif +endfunction + +function Exception() + call add(v:errors, v:throwpoint.'..'.'Exception: '.v:exception) +endfunction + +" Shuffles list in place. +function Shuffle(list) + " Fisher-Yates-Durstenfeld-Knuth + let n = len(a:list) + if n < 2 + return a:list + endif + for i in range(0, n-2) + let j = Random(0, n-i-1) + let e = a:list[i] + let a:list[i] = a:list[i+j] + let a:list[i+j] = e + endfor + return a:list +endfunction + +" Returns a pseudorandom integer i such that 0 <= i <= max +function Random(min, max) + if has('unix') + let i = system('echo $RANDOM') " 0 <= i <= 32767 + else + let i = system('echo %RANDOM%') " 0 <= i <= 32767 + endif + return i * (a:max - a:min + 1) / 32768 + a:min +endfunction + +function FriendlyName(test_name) + return substitute(a:test_name[5:-3], '_', ' ', 'g') +endfunction + +function Align(left, right) + if type(a:right) == type([]) + let result = [] + for s in a:right + if empty(result) + call add(result, printf('%-'.s:indent.'S', a:left).s) + else + call add(result, printf('%-'.s:indent.'S', '').s) + endif + endfor + return result + endif + + return printf('%-'.s:indent.'S', a:left).a:right +endfunction + +let g:testname = expand('%') +let s:errored = 0 +let s:done = 0 +let s:fail = 0 +let s:errors = 0 +let s:messages = [] +let s:indent = '' + +call Log(g:testname.':') + +" Source the test script. +try + source % +catch + let s:errors += 1 + call Exception() +endtry + +" Locate the test functions. +set nomore +redir @q +silent function /^Test_ +redir END +let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g')) + +" If there is another argument, filter test-functions' names against it. +if argc() > 1 + let s:tests = filter(s:tests, 'v:val =~ argv(1)') +endif + +let s:indent = max(map(copy(s:tests), {_, val -> len(FriendlyName(val))})) + +" Run the tests in random order. +for test in Shuffle(s:tests) + call RunTest(test) + let s:done += 1 + + let friendly_name = FriendlyName(test) + if len(v:errors) == 0 + call Log(Align(friendly_name, ' - ok')) + else + if s:errored + let s:errors += 1 + let s:errored = 0 + else + let s:fail += 1 + endif + call Log(Align(friendly_name, ' - not ok')) + + let i = 0 + for error in v:errors + if i != 0 + call Log(Align('',' ! ----')) + endif + for trace in reverse(split(error, '\.\.')) + call Log(Align('', ' ! '.trace)) + endfor + let i += 1 + endfor + + let v:errors = [] + endif +endfor + +let summary = [ + \ s:done.( s:done == 1 ? ' test' : ' tests'), + \ s:errors.(s:errors == 1 ? ' error' : ' errors'), + \ s:fail.( s:fail == 1 ? ' failure' : ' failures'), + \ ] +call Log('') +call Log(join(summary, ', ')) + +split messages.log +call append(line('$'), s:messages) +write + +qall! + diff --git a/test/signColumnAlways.expected b/test/signColumnAlways.expected deleted file mode 100644 index aeda456..0000000 --- a/test/signColumnAlways.expected +++ /dev/null @@ -1,4 +0,0 @@ - ---- Signs --- -Signs for fixture.txt: - line=9999 id=2999 name=GitGutterDummy diff --git a/test/test b/test/test index 5c2d877..6247a05 100755 --- a/test/test +++ b/test/test @@ -2,49 +2,18 @@ VIM="/Applications/MacVim.app/Contents/MacOS/Vim -v" -status=0 +$VIM -u NONE -U NONE -N \ + --cmd 'set rtp+=../' \ + --cmd 'let g:gitgutter_async=0' \ + --cmd 'source ../plugin/gitgutter.vim' \ + -S runner.vim \ + test_*.vim \ + $* -# Execute the tests. -for editor in "$VIM" nvim; do - - for testcase in test*.vim; do - $editor -N -u NONE --cmd 'let g:gitgutter_async=0' -S $testcase -c 'quit!' - - git reset HEAD fixture.txt > /dev/null - git checkout fixture.txt - done - - # Verify the results. - echo "$editor:" - echo - - count_ok=0 - count_fail=0 - - for expected in *.expected; do - name=${expected%.*} - actual=$name.actual - - if diff $expected $actual; then - count_ok=$((count_ok + 1)) - echo "$name ok" - rm $actual - else - count_fail=$((count_fail + 1)) - echo "$name failed" - fi - done - - # Print results. - echo - echo "$((count_ok + count_fail)) tests" - echo "$count_ok ok" - echo "$count_fail failed" - echo - - status=$(($status + $count_fail)) - -done +cat messages.log +grep -q "0 errors, 0 failures" messages.log +status=$? +rm messages.log exit $status diff --git a/test/testAddLines.vim b/test/testAddLines.vim deleted file mode 100644 index 6b0ec4a..0000000 --- a/test/testAddLines.vim +++ /dev/null @@ -1,6 +0,0 @@ -source helper.vim -call Setup() - -normal ggo* -write -call DumpSigns('addLines') diff --git a/test/testAddLinesFish.vim b/test/testAddLinesFish.vim deleted file mode 100644 index f1c6bab..0000000 --- a/test/testAddLinesFish.vim +++ /dev/null @@ -1,7 +0,0 @@ -set shell=/usr/local/bin/fish -source helper.vim -call Setup() - -normal ggo* -write -call DumpSigns('addLinesFish') diff --git a/test/testEditAmbiguousFile.vim b/test/testEditAmbiguousFile.vim deleted file mode 100644 index 693ecf7..0000000 --- a/test/testEditAmbiguousFile.vim +++ /dev/null @@ -1,9 +0,0 @@ -source helper.vim -call Setup() - -normal 5Gi* -call system('git checkout -b fixture.txt') -write -call DumpSigns('ambiguousFile') - -call system('git checkout - && git branch -d fixture.txt') diff --git a/test/testFileAddedToGit.vim b/test/testFileAddedToGit.vim deleted file mode 100644 index 91a2c14..0000000 --- a/test/testFileAddedToGit.vim +++ /dev/null @@ -1,12 +0,0 @@ -source helper.vim - -let tmpfile = 'fileAddedToGit.tmp' -call system('touch '.tmpfile) -call system('git add '.tmpfile) -execute 'edit '.tmpfile -normal ihello -write -call DumpSigns('fileAddedToGit') - -call system('git reset HEAD '.tmpfile) -call system('rm '.tmpfile) diff --git a/test/testFilenameWithEquals.vim b/test/testFilenameWithEquals.vim deleted file mode 100644 index 082ff02..0000000 --- a/test/testFilenameWithEquals.vim +++ /dev/null @@ -1,12 +0,0 @@ -source helper.vim - -edit =fixture=.txt -normal ggo* -try - write - write - call DumpSigns('filenameWithEquals') -finally - call system('git reset HEAD =fixture=.txt') - call system('git checkout =fixture=.txt') -endtry diff --git a/test/testFilenameWithSquareBrackets.vim b/test/testFilenameWithSquareBrackets.vim deleted file mode 100644 index 85ae889..0000000 --- a/test/testFilenameWithSquareBrackets.vim +++ /dev/null @@ -1,9 +0,0 @@ -source helper.vim - -edit fix[tu]re.txt -normal ggo* -write -call DumpSigns('filenameWithSquareBrackets') - -call system('git reset HEAD fix[tu]re.txt') -call system('git checkout fix[tu]re.txt') diff --git a/test/testFollowSymlink.vim b/test/testFollowSymlink.vim deleted file mode 100644 index fda33ec..0000000 --- a/test/testFollowSymlink.vim +++ /dev/null @@ -1,10 +0,0 @@ -source helper.vim - -let tmpfile = 'symlink' -call system('ln -nfs fixture.txt '.tmpfile) -execute 'edit '.tmpfile -execute '6d' -write -call DumpSigns('followSymlink') - -call system('rm '.tmpfile) diff --git a/test/testHunkOutsideNoop.vim b/test/testHunkOutsideNoop.vim deleted file mode 100644 index 6601e6d..0000000 --- a/test/testHunkOutsideNoop.vim +++ /dev/null @@ -1,13 +0,0 @@ -source helper.vim -call Setup() - -normal 5G - -execute 'GitGutterStageHunk' -call DumpSigns('hunkOutsideNoopStageSigns') -call DumpGitDiffStaged('hunkHunkOutsideNoopStageGitDiffStaged') - -execute 'GitGutterUndoHunk' -call DumpSigns('hunkOutsideNoopUndoSigns') -call DumpGitDiffStaged('hunkHunkOutsideNoopUndoGitDiffStaged') - diff --git a/test/testHunkStage.vim b/test/testHunkStage.vim deleted file mode 100644 index 6acf19e..0000000 --- a/test/testHunkStage.vim +++ /dev/null @@ -1,13 +0,0 @@ -source helper.vim -call Setup() - -set shell=foo - -normal 5Gi* -execute 'GitGutterStageHunk' - -call assert_equal('foo', &shell) " NOTE: current test runner ignores v:errors so this line has no effect - -set shell=/bin/bash -call DumpSigns('hunkStageSigns') -call DumpGitDiffStaged('hunkStageGitDiff') diff --git a/test/testHunkStageNearbyHunk.vim b/test/testHunkStageNearbyHunk.vim deleted file mode 100644 index 9939103..0000000 --- a/test/testHunkStageNearbyHunk.vim +++ /dev/null @@ -1,10 +0,0 @@ -source helper.vim -call Setup() - -execute "normal! 2Gox\y\z" -normal 2jdd -normal k -execute 'GitGutterStageHunk' -call DumpSigns('hunkStageNearbySigns') -call DumpGitDiff('hunkStageNearbyGitDiff') -call DumpGitDiffStaged('hunkStageNearbyGitDiffStaged') diff --git a/test/testHunkUndo.vim b/test/testHunkUndo.vim deleted file mode 100644 index 2afc8fa..0000000 --- a/test/testHunkUndo.vim +++ /dev/null @@ -1,12 +0,0 @@ -source helper.vim -call Setup() - -set shell=foo - -normal 5Gi* -execute 'GitGutterUndoHunk' - -call assert_equal('foo', &shell) " NOTE: current test runner ignores v:errors so this line has no effect -set shell=/bin/bash -call DumpSigns('hunkUndoSigns') -call DumpGitDiffStaged('hunkUndoGitDiff') diff --git a/test/testHunkUndoNearbyHunk.vim b/test/testHunkUndoNearbyHunk.vim deleted file mode 100644 index 5721f2d..0000000 --- a/test/testHunkUndoNearbyHunk.vim +++ /dev/null @@ -1,9 +0,0 @@ -source helper.vim -call Setup() - -execute "normal! 2Gox\y\z" -normal 2jdd -normal k -execute 'GitGutterUndoHunk' -call DumpSigns('hunkUndoNearbySigns') -call DumpGitDiff('hunkUndoNearbyGitDiff') diff --git a/test/testKeepAlt.vim b/test/testKeepAlt.vim deleted file mode 100644 index 303ff0f..0000000 --- a/test/testKeepAlt.vim +++ /dev/null @@ -1,12 +0,0 @@ -source helper.vim -call Setup() - -enew -execute "normal! \" -call Dump('buffer: '.bufname(''), 'keepAlt') -call Dump('altbuffer: '.bufname('#'), 'keepAlt') - -normal ggx -doautocmd CursorHold -call Dump('altbuffer: '.bufname('#'), 'keepAlt') - diff --git a/test/testKeepModified.vim b/test/testKeepModified.vim deleted file mode 100644 index acb687f..0000000 --- a/test/testKeepModified.vim +++ /dev/null @@ -1,8 +0,0 @@ -source helper.vim -call Setup() - -normal 5Go* -call Dump("modified: ".getbufvar('', '&modified'), 'keepModified') -doautocmd CursorHold -call Dump("modified: ".getbufvar('', '&modified'), 'keepModified') - diff --git a/test/testKeepOpMarks.vim b/test/testKeepOpMarks.vim deleted file mode 100644 index 1175c80..0000000 --- a/test/testKeepOpMarks.vim +++ /dev/null @@ -1,10 +0,0 @@ -source helper.vim -call Setup() - -normal 5Go* -call Dump("'[ mark: ".join(getpos("'["), ','), 'keepOpMarks') -call Dump("'] mark: ".join(getpos("']"), ','), 'keepOpMarks') -doautocmd CursorHold -call Dump("'[ mark: ".join(getpos("'["), ','), 'keepOpMarks') -call Dump("'] mark: ".join(getpos("']"), ','), 'keepOpMarks') - diff --git a/test/testModifyLines.vim b/test/testModifyLines.vim deleted file mode 100644 index d4a3d01..0000000 --- a/test/testModifyLines.vim +++ /dev/null @@ -1,6 +0,0 @@ -source helper.vim -call Setup() - -normal ggi* -write -call DumpSigns('modifyLines') diff --git a/test/testNoModifications.vim b/test/testNoModifications.vim deleted file mode 100644 index 909639f..0000000 --- a/test/testNoModifications.vim +++ /dev/null @@ -1,4 +0,0 @@ -source helper.vim -call Setup() - -call DumpSigns('noModifications') diff --git a/test/testOrphanedSigns.vim b/test/testOrphanedSigns.vim deleted file mode 100644 index 35992d2..0000000 --- a/test/testOrphanedSigns.vim +++ /dev/null @@ -1,8 +0,0 @@ -source helper.vim -call Setup() - -execute "normal 5GoX\Y" -write -execute '6d' -write -call DumpSigns('orphanedSigns') diff --git a/test/testRemoveFirstLines.vim b/test/testRemoveFirstLines.vim deleted file mode 100644 index 4a29a73..0000000 --- a/test/testRemoveFirstLines.vim +++ /dev/null @@ -1,6 +0,0 @@ -source helper.vim -call Setup() - -execute '1d' -write -call DumpSigns('removeFirstLines') diff --git a/test/testRemoveLines.vim b/test/testRemoveLines.vim deleted file mode 100644 index 23d672b..0000000 --- a/test/testRemoveLines.vim +++ /dev/null @@ -1,6 +0,0 @@ -source helper.vim -call Setup() - -execute '5d' -write -call DumpSigns('removeLines') diff --git a/test/testSignColumnAlways.vim b/test/testSignColumnAlways.vim deleted file mode 100644 index ff3eb94..0000000 --- a/test/testSignColumnAlways.vim +++ /dev/null @@ -1,7 +0,0 @@ -source helper.vim -call Setup() - -let g:gitgutter_sign_column_always=1 -write - -call DumpSigns('signColumnAlways') diff --git a/test/testUntrackedFileOutsideRepo.vim b/test/testUntrackedFileOutsideRepo.vim deleted file mode 100644 index f473d35..0000000 --- a/test/testUntrackedFileOutsideRepo.vim +++ /dev/null @@ -1,6 +0,0 @@ -source helper.vim - -let tmpfile = tempname() -call system('touch '.tmpfile) -execute 'edit '.tmpfile -call DumpSigns('untrackedFileOutsideRepo') diff --git a/test/testUntrackedFileSquareBracketsWithinRepo.vim b/test/testUntrackedFileSquareBracketsWithinRepo.vim deleted file mode 100644 index b1fd48a..0000000 --- a/test/testUntrackedFileSquareBracketsWithinRepo.vim +++ /dev/null @@ -1,10 +0,0 @@ -source helper.vim - -let tmpfile = '[un]trackedFileWithinRepo.tmp' -call system('touch '.tmpfile) -execute 'edit '.tmpfile -normal ggo* -doautocmd CursorHold -call DumpSigns('untrackedFileSquareBracketsWithinRepo') - -call system('rm '.tmpfile) diff --git a/test/testUntrackedFileWithinRepo.vim b/test/testUntrackedFileWithinRepo.vim deleted file mode 100644 index 4fdd48e..0000000 --- a/test/testUntrackedFileWithinRepo.vim +++ /dev/null @@ -1,10 +0,0 @@ -source helper.vim - -let tmpfile = 'untrackedFileWithinRepo.tmp' -call system('touch '.tmpfile) -execute 'edit '.tmpfile -normal ggo* -doautocmd CursorHold -call DumpSigns('untrackedFileWithinRepo') - -call system('rm '.tmpfile) diff --git a/test/test_gitgutter.vim b/test/test_gitgutter.vim new file mode 100644 index 0000000..1a65ed8 --- /dev/null +++ b/test/test_gitgutter.vim @@ -0,0 +1,400 @@ +let s:current_dir = expand('%:p:h') +let s:test_repo = s:current_dir.'/test-repo' +let s:bufnr = bufnr('') + +" +" Helpers +" + +function s:signs(filename) + redir => signs + silent execute 'sign place' + redir END + + let signs = split(signs, '\n') + + " filter out signs for this test file + " assumes a:filename's signs are last set listed + let i = index(signs, 'Signs for '.a:filename.':') + let signs = (i > -1 ? signs[i+1:] : []) + + call map(signs, {_, v -> substitute(v, ' ', '', '')}) + + return signs +endfunction + +function s:git_diff() + return split(system('git diff -U0 fixture.txt'), '\n') +endfunction + +function s:git_diff_staged() + return split(system('git diff -U0 --staged fixture.txt'), '\n') +endfunction + + +" +" SetUp / TearDown +" + +function SetUp() + call system("git init ".s:test_repo. + \ " && cd ".s:test_repo. + \ " && cp ../fixture.txt .". + \ " && git add . && git commit -m 'initial'") + execute ':cd' s:test_repo + edit! fixture.txt + call gitgutter#sign#reset() +endfunction + +function TearDown() + " delete all buffers except this one + " TODO: move to runner.vim, accounting for multiple test files + if s:bufnr > 1 + silent! execute '1,'.s:bufnr-1.'bdelete!' + endif + silent! execute s:bufnr+1.',$bdelete!' + + execute ':cd' s:current_dir + call system("rm -rf ".s:test_repo) +endfunction + +" +" The tests +" + +function Test_add_lines() + normal ggo* + write + + let expected = ["line=2 id=3000 name=GitGutterLineAdded"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_add_lines_fish() + let _shell = &shell + set shell=/usr/local/bin/fish + + normal ggo* + write + + let expected = ["line=2 id=3000 name=GitGutterLineAdded"] + call assert_equal(expected, s:signs('fixture.txt')) + + let &shell = _shell +endfunction + + +function Test_modify_lines() + normal ggi* + write + + let expected = ["line=1 id=3000 name=GitGutterLineModified"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_remove_lines() + execute '5d' + write + + let expected = ["line=4 id=3000 name=GitGutterLineRemoved"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_remove_first_lines() + execute '1d' + write + + let expected = ["line=1 id=3000 name=GitGutterLineRemovedFirstLine"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_edit_file_with_same_name_as_a_branch() + normal 5Gi* + call system('git checkout -b fixture.txt') + write + + let expected = ["line=5 id=3000 name=GitGutterLineModified"] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_file_added_to_git() + let tmpfile = 'fileAddedToGit.tmp' + call system('touch '.tmpfile.' && git add '.tmpfile) + execute 'edit '.tmpfile + normal ihello + write + + let expected = ["line=1 id=3000 name=GitGutterLineAdded"] + call assert_equal(expected, s:signs('fileAddedToGit.tmp')) +endfunction + + +function Test_filename_with_equals() + call system('touch =fixture=.txt && git add =fixture=.txt') + edit =fixture=.txt + normal ggo* + write + + let expected = [ + \ 'line=1 id=3000 name=GitGutterLineAdded', + \ 'line=2 id=3001 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('=fixture=.txt')) +endfunction + + +function Test_filename_with_square_brackets() + call system('touch fix[tu]re.txt && git add fix[tu]re.txt') + edit fix[tu]re.txt + normal ggo* + write + + let expected = [ + \ 'line=1 id=3000 name=GitGutterLineAdded', + \ 'line=2 id=3001 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('fix[tu]re.txt')) +endfunction + + +" FIXME: this test fails when it is the first (or only) test to be run +function Test_follow_symlink() + let tmp = 'symlink' + call system('ln -nfs fixture.txt '.tmp) + execute 'edit '.tmp + 6d + write + + let expected = ['line=5 id=3000 name=GitGutterLineRemoved'] + call assert_equal(expected, s:signs('symlink')) +endfunction + + +function Test_keep_alt() + enew + execute "normal! \" + + call assert_equal('fixture.txt', bufname('')) + call assert_equal('', bufname('#')) + + normal ggx + doautocmd CursorHold + + call assert_equal('', bufname('#')) +endfunction + + +function Test_keep_modified() + normal 5Go* + call assert_equal(1, getbufvar('', '&modified')) + + doautocmd CursorHold + + call assert_equal(1, getbufvar('', '&modified')) +endfunction + + +function Test_keep_op_marks() + normal 5Go* + call assert_equal([0,6,1,0], getpos("'[")) + call assert_equal([0,6,2,0], getpos("']")) + + doautocmd CursorHold + + call assert_equal([0,6,1,0], getpos("'[")) + call assert_equal([0,6,2,0], getpos("']")) +endfunction + + +function Test_no_modifications() + call assert_equal([], s:signs('fixture.txt')) +endfunction + + +function Test_orphaned_signs() + execute "normal 5GoX\Y" + write + 6d + write + + let expected = ['line=6 id=3001 name=GitGutterLineAdded'] + call assert_equal(expected, s:signs('fixture.txt')) +endfunction + + +function Test_sign_column_always() + let g:gitgutter_sign_column_always=1 + write + + let expected = ['line=9999 id=2999 name=GitGutterDummy'] + call assert_equal(expected, s:signs('fixture.txt')) + + let g:gitgutter_sign_column_always=0 +endfunction + + +function Test_untracked_file_outside_repo() + let tmp = tempname() + call system('touch '.tmp) + execute 'edit '.tmp + + call assert_equal([], s:signs(tmp)) +endfunction + + +function Test_untracked_file_within_repo() + let tmp = 'untrackedFileWithinRepo.tmp' + call system('touch '.tmp) + execute 'edit '.tmp + normal ggo* + doautocmd CursorHold + + call assert_equal([], s:signs(tmp)) + + call system('rm '.tmp) +endfunction + + +function Test_untracked_file_square_brackets_within_repo() + let tmp = '[un]trackedFileWithinRepo.tmp' + call system('touch '.tmp) + execute 'edit '.tmp + normal ggo* + doautocmd CursorHold + + call assert_equal([], s:signs(tmp)) + + call system('rm '.tmp) +endfunction + + +function Test_hunk_outside_noop() + normal 5G + GitGutterStageHunk + + call assert_equal([], s:signs('fixture.txt')) + call assert_equal([], s:git_diff()) + call assert_equal([], s:git_diff_staged()) + + GitGutterUndoHunk + + call assert_equal([], s:signs('fixture.txt')) + call assert_equal([], s:git_diff()) + call assert_equal([], s:git_diff_staged()) +endfunction + + +function Test_hunk_stage() + let _shell = &shell + set shell=foo + + normal 5Gi* + GitGutterStageHunk + + call assert_equal('foo', &shell) + let &shell = _shell + + call assert_equal([], s:signs('fixture.txt')) + + call assert_equal([], s:git_diff()) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index f5c6aff..ae8e546 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -5 +5 @@ d', + \ '-e', + \ '+*e' + \ ] + call assert_equal(expected, s:git_diff_staged()) +endfunction + + +function Test_hunk_stage_nearby_hunk() + execute "normal! 2Gox\y\z" + normal 2jdd + normal k + GitGutterStageHunk + + let expected = [ + \ 'line=3 id=3000 name=GitGutterLineAdded', + \ 'line=4 id=3001 name=GitGutterLineAdded', + \ 'line=5 id=3002 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('fixture.txt')) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index 53b13df..8fdfda7 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -2,0 +3,3 @@ b', + \ '+x', + \ '+y', + \ '+z', + \ ] + call assert_equal(expected, s:git_diff()) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index f5c6aff..53b13df 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -4 +3,0 @@ c', + \ '-d', + \ ] + call assert_equal(expected, s:git_diff_staged()) +endfunction + + +function Test_hunk_undo() + let _shell = &shell + set shell=foo + + normal 5Gi* + GitGutterUndoHunk + write " write file so we can verify git diff (--staged) + + call assert_equal('foo', &shell) + let &shell = _shell + + call assert_equal([], s:signs('fixture.txt')) + call assert_equal([], s:git_diff()) + call assert_equal([], s:git_diff_staged()) +endfunction + + +function Test_undo_nearby_hunk() + execute "normal! 2Gox\y\z" + normal 2jdd + normal k + GitGutterUndoHunk + write " write file so we can verify git diff (--staged) + + let expected = [ + \ 'line=3 id=3000 name=GitGutterLineAdded', + \ 'line=4 id=3001 name=GitGutterLineAdded', + \ 'line=5 id=3002 name=GitGutterLineAdded' + \ ] + call assert_equal(expected, s:signs('fixture.txt')) + + let expected = [ + \ 'diff --git a/fixture.txt b/fixture.txt', + \ 'index f5c6aff..3fbde56 100644', + \ '--- a/fixture.txt', + \ '+++ b/fixture.txt', + \ '@@ -2,0 +3,3 @@ b', + \ '+x', + \ '+y', + \ '+z', + \ ] + call assert_equal(expected, s:git_diff()) + + call assert_equal([], s:git_diff_staged()) +endfunction diff --git a/test/untrackedFileOutsideRepo.expected b/test/untrackedFileOutsideRepo.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/untrackedFileOutsideRepo.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/untrackedFileSquareBracketsWithinRepo.expected b/test/untrackedFileSquareBracketsWithinRepo.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/untrackedFileSquareBracketsWithinRepo.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs --- diff --git a/test/untrackedFileWithinRepo.expected b/test/untrackedFileWithinRepo.expected deleted file mode 100644 index aa8cd86..0000000 --- a/test/untrackedFileWithinRepo.expected +++ /dev/null @@ -1,2 +0,0 @@ - ---- Signs ---