0
0
mirror of https://github.com/vim/vim.git synced 2025-10-26 09:14:23 -04:00
Files
vim/src/testdir/test_compiler.vim
Christian Brabandt b0905e269d patch 9.1.1524: tests: too many imports in the test suite
Problem:  tests: too many imports in the test suite
Solution: Clean up the imported scripts

Most tests make use of check.vim, so let's just source it once in
runtest.vim instead of having each test manually source it.

runtest.vim already sources shared.vim, which again sources
view_util.vim, so we don't need to source those two common
dependencies in all the other tests

And then check.vim sources term_util.vim already, so we can in addition
drop sourcing it explicitly in each single test script.

Note: test_expand_func.vim had to be updated to account for the changed
number of sourced files.

And finally check.vim uses line-continuation so let's also explicitly
enable line continuation via the 'cpo' option value.

related: #17677

Signed-off-by: Christian Brabandt <cb@256bit.org>
2025-07-07 20:39:29 +02:00

738 lines
29 KiB
VimL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

" Test the :compiler command
func Test_compiler()
CheckExecutable perl
CheckFeature quickfix
let save_LC_ALL = $LC_ALL
let $LC_ALL= "C"
" %:S does not work properly with 'shellslash' set
let save_shellslash = &shellslash
set noshellslash
e Xfoo.pl
" Play nice with other tests.
defer setqflist([])
compiler perl
call assert_equal('perl', b:current_compiler)
call assert_fails('let g:current_compiler', 'E121:')
let verbose_efm = execute('verbose set efm')
call assert_match('Last set from .*[/\\]compiler[/\\]perl.vim ', verbose_efm)
" Not using the global value
call assert_notequal('', &l:efm)
call setline(1, ['#!/usr/bin/perl -w', 'use strict;', 'my $foo=1'])
w!
call feedkeys(":make\<CR>\<CR>", 'tx')
call assert_fails('clist', 'E42:')
call setline(1, ['#!/usr/bin/perl -w', 'use strict;', '$foo=1'])
w!
call feedkeys(":make\<CR>\<CR>", 'tx')
let a=execute('clist')
call assert_match('\n \d\+ Xfoo.pl:3: Global symbol "$foo" '
\ . 'requires explicit package name', a)
compiler make
call assert_fails('let b:current_compiler', 'E121:')
call assert_fails('let g:current_compiler', 'E121:')
let verbose_efm = execute('verbose set efm')
call assert_match('Last set from .*[/\\]compiler[/\\]make.vim ', verbose_efm)
compiler! perl
call assert_equal('perl', b:current_compiler)
call assert_equal('perl', g:current_compiler)
let verbose_efm = execute('verbose set efm')
call assert_match('Last set from .*[/\\]compiler[/\\]perl.vim ', verbose_efm)
call assert_equal(verbose_efm, execute('verbose setglobal efm'))
" Using the global value
call assert_equal('', &l:efm)
compiler! make
call assert_fails('let b:current_compiler', 'E121:')
call assert_fails('let g:current_compiler', 'E121:')
let verbose_efm = execute('verbose set efm')
call assert_match('Last set from .*[/\\]compiler[/\\]make.vim ', verbose_efm)
call assert_equal(verbose_efm, execute('verbose setglobal efm'))
" Using the global value
call assert_equal('', &l:efm)
let &shellslash = save_shellslash
call delete('Xfoo.pl')
bw!
let $LC_ALL = save_LC_ALL
endfunc
func GetCompilerNames()
return glob('$VIMRUNTIME/compiler/*.vim', 0, 1)
\ ->map({i, v -> substitute(v, '.*[\\/]\([a-zA-Z0-9_\-]*\).vim', '\1', '')})
\ ->sort()
endfunc
func Test_compiler_without_arg()
let runtime = substitute($VIMRUNTIME, '\\', '/', 'g')
let a = split(execute('compiler'))
let exp = GetCompilerNames()
call assert_match(runtime .. '/compiler/' .. exp[0] .. '.vim$', a[0])
call assert_match(runtime .. '/compiler/' .. exp[1] .. '.vim$', a[1])
call assert_match(runtime .. '/compiler/' .. exp[-1] .. '.vim$', a[-1])
endfunc
" Test executing :compiler from the command line, not from a script
func Test_compiler_commandline()
call system(GetVimCommandClean() .. ' --not-a-term -c "compiler gcc" -c "call writefile([b:current_compiler], ''XcompilerOut'')" -c "quit"')
call assert_equal(0, v:shell_error)
call assert_equal(["gcc"], readfile('XcompilerOut'))
call delete('XcompilerOut')
endfunc
func Test_compiler_completion()
let clist = GetCompilerNames()->join(' ')
call feedkeys(":compiler \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_match('^"compiler ' .. clist .. '$', @:)
call feedkeys(":compiler p\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_match('"compiler pandoc pbx perl\( p[a-z_]\+\)\+ pyunit', @:)
call feedkeys(":compiler! p\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_match('"compiler! pandoc pbx perl\( p[a-z_]\+\)\+ pyunit', @:)
endfunc
func Test_compiler_error()
let g:current_compiler = 'abc'
call assert_fails('compiler doesnotexist', 'E666:')
call assert_equal('abc', g:current_compiler)
call assert_fails('compiler! doesnotexist', 'E666:')
unlet! g:current_compiler
endfunc
func s:SpotBugsParseFilterMakePrg(dirname, makeprg)
let result = {}
let result.sourcepath = ''
let result.classfiles = []
" Get the argument after the rightmost occurrence of "-sourcepath".
let offset = strridx(a:makeprg, '-sourcepath')
if offset < 0
return result
endif
let offset += 1 + strlen('-sourcepath')
let result.sourcepath = matchstr(strpart(a:makeprg, offset), '.\{-}\ze[ \t]')
let offset += 1 + strlen(result.sourcepath)
" Get the class file arguments, dropping the pathname prefix.
let offset = stridx(a:makeprg, a:dirname, offset)
if offset < 0
return result
endif
while offset > -1
let candidate = matchstr(a:makeprg, '[^ \t]\{-}\.class\>', offset)
if empty(candidate)
break
endif
call add(result.classfiles, candidate)
let offset = stridx(a:makeprg, a:dirname, (1 + strlen(candidate) + offset))
endwhile
call sort(result.classfiles)
return result
endfunc
func Test_compiler_spotbugs_makeprg()
let save_shellslash = &shellslash
set shellslash
call assert_true(mkdir('Xspotbugs/src/tests/α/β/γ/δ', 'pR'))
call assert_true(mkdir('Xspotbugs/tests/α/β/γ/δ', 'pR'))
let lines =<< trim END
// EOL comment. /*
abstract class
𐌂1 /* Multiline comment. */ {
/* Multiline comment. */ // EOL comment. /*
static final String COMMENT_A_LIKE = "/*";
{ new Object() {/* Try globbing. */}; }
static { interface 𐌉𐌉1 {} }
static class 𐌂11 { interface 𐌉𐌉2 {} }
}
/* Multiline comment. */ // EOL comment. /*
final class 𐌂2 {
public static void main(String... aa) {
record 𐌓() {}
enum 𐌄 {}
}
} // class
END
" THE EXPECTED RESULTS.
let results = {}
let results['Xspotbugs/src/tests/𐌂1.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/𐌂1.java',
\ ':p:h:S')},
\ 'classfiles': sort([
\ 'Xspotbugs/tests/𐌂1$1.class',
\ 'Xspotbugs/tests/𐌂1$1𐌉𐌉1.class',
\ 'Xspotbugs/tests/𐌂1$𐌂11$𐌉𐌉2.class',
\ 'Xspotbugs/tests/𐌂1$𐌂11.class',
\ 'Xspotbugs/tests/𐌂1.class',
\ 'Xspotbugs/tests/𐌂2$1𐌄.class',
\ 'Xspotbugs/tests/𐌂2$1𐌓.class',
\ 'Xspotbugs/tests/𐌂2.class']),
\ }
" No class file for an empty source file even with "-Xpkginfo:always".
let results['Xspotbugs/src/tests/package-info.java'] = {
\ 'Sourcepath': {-> ''},
\ 'classfiles': [],
\ }
let results['Xspotbugs/src/tests/α/𐌂1.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/𐌂1.java',
\ ':p:h:h:S')},
\ 'classfiles': sort([
\ 'Xspotbugs/tests/α/𐌂1$1.class',
\ 'Xspotbugs/tests/α/𐌂1$1𐌉𐌉1.class',
\ 'Xspotbugs/tests/α/𐌂1$𐌂11$𐌉𐌉2.class',
\ 'Xspotbugs/tests/α/𐌂1$𐌂11.class',
\ 'Xspotbugs/tests/α/𐌂1.class',
\ 'Xspotbugs/tests/α/𐌂2$1𐌄.class',
\ 'Xspotbugs/tests/α/𐌂2$1𐌓.class',
\ 'Xspotbugs/tests/α/𐌂2.class']),
\ }
let results['Xspotbugs/src/tests/α/package-info.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/package-info.java',
\ ':p:h:S')},
\ 'classfiles': ['Xspotbugs/tests/α/package-info.class'],
\ }
let results['Xspotbugs/src/tests/α/β/𐌂1.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/β/𐌂1.java',
\ ':p:h:h:h:S')},
\ 'classfiles': sort([
\ 'Xspotbugs/tests/α/β/𐌂1$1.class',
\ 'Xspotbugs/tests/α/β/𐌂1$1𐌉𐌉1.class',
\ 'Xspotbugs/tests/α/β/𐌂1$𐌂11$𐌉𐌉2.class',
\ 'Xspotbugs/tests/α/β/𐌂1$𐌂11.class',
\ 'Xspotbugs/tests/α/β/𐌂1.class',
\ 'Xspotbugs/tests/α/β/𐌂2$1𐌄.class',
\ 'Xspotbugs/tests/α/β/𐌂2$1𐌓.class',
\ 'Xspotbugs/tests/α/β/𐌂2.class']),
\ }
let results['Xspotbugs/src/tests/α/β/package-info.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/β/package-info.java',
\ ':p:h:S')},
\ 'classfiles': ['Xspotbugs/tests/α/β/package-info.class'],
\ }
let results['Xspotbugs/src/tests/α/β/γ/𐌂1.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/β/γ/𐌂1.java',
\ ':p:h:h:h:h:S')},
\ 'classfiles': sort([
\ 'Xspotbugs/tests/α/β/γ/𐌂1$1.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂1$1𐌉𐌉1.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂1$𐌂11$𐌉𐌉2.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂1$𐌂11.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂1.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂2$1𐌄.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂2$1𐌓.class',
\ 'Xspotbugs/tests/α/β/γ/𐌂2.class']),
\ }
let results['Xspotbugs/src/tests/α/β/γ/package-info.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/β/γ/package-info.java',
\ ':p:h:S')},
\ 'classfiles': ['Xspotbugs/tests/α/β/γ/package-info.class'],
\ }
let results['Xspotbugs/src/tests/α/β/γ/δ/𐌂1.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/β/γ/δ/𐌂1.java',
\ ':p:h:h:h:h:h:S')},
\ 'classfiles': sort([
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂1$1.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂1$1𐌉𐌉1.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂1$𐌂11$𐌉𐌉2.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂1$𐌂11.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂1.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂2$1𐌄.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂2$1𐌓.class',
\ 'Xspotbugs/tests/α/β/γ/δ/𐌂2.class']),
\ }
let results['Xspotbugs/src/tests/α/β/γ/δ/package-info.java'] = {
\ 'Sourcepath': {-> fnamemodify('Xspotbugs/src/tests/α/β/γ/δ/package-info.java',
\ ':p:h:S')},
\ 'classfiles': ['Xspotbugs/tests/α/β/γ/δ/package-info.class'],
\ }
" MAKE CLASS FILES DISCOVERABLE!
let g:spotbugs_properties = {
\ 'sourceDirPath': ['src/tests'],
\ 'classDirPath': ['tests'],
\ }
call assert_true(has_key(s:SpotBugsParseFilterMakePrg('Xspotbugs', ''), 'sourcepath'))
call assert_true(has_key(s:SpotBugsParseFilterMakePrg('Xspotbugs', ''), 'classfiles'))
" Write 45 mock-up class files for 10 source files.
for [class_dir, src_dir, package] in [
\ ['Xspotbugs/tests/', 'Xspotbugs/src/tests/', ''],
\ ['Xspotbugs/tests/α/', 'Xspotbugs/src/tests/α/', 'package α;'],
\ ['Xspotbugs/tests/α/β/', 'Xspotbugs/src/tests/α/β/', 'package α.β;'],
\ ['Xspotbugs/tests/α/β/γ/', 'Xspotbugs/src/tests/α/β/γ/', 'package α.β.γ;'],
\ ['Xspotbugs/tests/α/β/γ/δ/', 'Xspotbugs/src/tests/α/β/γ/δ/', 'package α.β.γ.δ;']]
for class_file in ['𐌂1$1.class', '𐌂1$1𐌉𐌉1.class', '𐌂1$𐌂11$𐌉𐌉2.class',
\ '𐌂1$𐌂11.class', '𐌂1.class', '𐌂2$1𐌄.class', '𐌂2$1𐌓.class', '𐌂2.class']
call writefile(0zcafe.babe.0000.0041, class_dir .. class_file)
endfor
call writefile(0zcafe.babe.0000.0041, class_dir .. 'package-info.class')
" Write Java source files.
let type_file = src_dir .. '𐌂1.java'
call writefile(insert(copy(lines), package), type_file)
let package_file = src_dir .. 'package-info.java'
call writefile([package], src_dir .. 'package-info.java')
" Note that using "off" for the first _outer_ iteration is preferable
" because only then "hlexists()" may be 0 (see "compiler/spotbugs.vim").
for s in ['off', 'on']
execute 'syntax ' .. s
execute 'edit ' .. type_file
compiler spotbugs
let result = s:SpotBugsParseFilterMakePrg('Xspotbugs', &l:makeprg)
call assert_equal(results[type_file].Sourcepath(), result.sourcepath)
call assert_equal(results[type_file].classfiles, result.classfiles)
bwipeout
execute 'edit ' .. package_file
compiler spotbugs
let result = s:SpotBugsParseFilterMakePrg('Xspotbugs', &l:makeprg)
call assert_equal(results[package_file].Sourcepath(), result.sourcepath)
call assert_equal(results[package_file].classfiles, result.classfiles)
bwipeout
endfor
endfor
let &shellslash = save_shellslash
endfunc
func s:SpotBugsBeforeFileTypeTryPluginAndClearCache(state)
" Ponder over "extend(spotbugs#DefaultProperties(), g:spotbugs_properties)"
" in "ftplugin/java.vim".
let g:spotbugs#state = a:state
runtime autoload/spotbugs.vim
endfunc
func Test_compiler_spotbugs_properties()
let save_shellslash = &shellslash
set shellslash
setlocal makeprg=
filetype plugin on
call assert_true(mkdir('Xspotbugs/src', 'pR'))
call assert_true(mkdir('Xspotbugs/tests', 'pR'))
let type_file = 'Xspotbugs/src/𐌄.java'
let test_file = 'Xspotbugs/tests/𐌄$.java'
call writefile(['enum 𐌄{}'], type_file)
call writefile(['class 𐌄${}'], test_file)
" TEST INTEGRATION WITH A BOGUS COMPILER PLUGIN.
if !filereadable($VIMRUNTIME .. '/compiler/foo.vim') && !executable('foo')
let g:spotbugs_properties = {'compiler': 'foo'}
" XXX: In case this "if" block is no longer first.
call s:SpotBugsBeforeFileTypeTryPluginAndClearCache({
\ 'compiler': g:spotbugs_properties.compiler,
\ })
execute 'edit ' .. type_file
call assert_equal('java', &l:filetype)
" This variable will indefinitely keep the compiler name.
call assert_equal('foo', g:spotbugs#state.compiler)
" The "compiler" entry should be gone after FileType and default entries
" should only appear for a supported compiler.
call assert_false(has_key(g:spotbugs_properties, 'compiler'))
call assert_true(empty(g:spotbugs_properties))
" Query default implementations.
call assert_true(exists('*spotbugs#DefaultProperties'))
call assert_true(exists('*spotbugs#DefaultPreCompilerAction'))
call assert_true(exists('*spotbugs#DefaultPreCompilerTestAction'))
call assert_true(empty(spotbugs#DefaultProperties()))
" Get a ":message".
redir => out
call spotbugs#DefaultPreCompilerAction()
redir END
call assert_equal('Not supported: "foo"', out[stridx(out, 'Not') :])
" Get a ":message".
redir => out
call spotbugs#DefaultPreCompilerTestAction()
redir END
call assert_equal('Not supported: "foo"', out[stridx(out, 'Not') :])
" No ":autocmd"s without one of "PreCompiler*Action", "PostCompilerAction".
call assert_false(exists('#java_spotbugs'))
bwipeout
endif
let s:spotbugs_results = {
\ 'preActionDone': 0,
\ 'preTestActionDone': 0,
\ 'preTestLocalActionDone': 0,
\ 'postActionDone': 0,
\ 'preCommandArguments': '',
\ 'preTestCommandArguments': '',
\ 'postCommandArguments': '',
\ }
defer execute('unlet s:spotbugs_results')
func! g:SpotBugsPreAction() abort
let s:spotbugs_results.preActionDone = 1
" XXX: Notify the spotbugs compiler about success or failure.
cc
endfunc
defer execute('delfunction g:SpotBugsPreAction')
func! g:SpotBugsPreTestAction() abort
let s:spotbugs_results.preTestActionDone = 1
" XXX: Let see compilation fail.
throw 'Oops'
endfunc
defer execute('delfunction g:SpotBugsPreTestAction')
func! g:SpotBugsPreTestLocalAction() abort
let s:spotbugs_results.preTestLocalActionDone = 1
" XXX: Notify the spotbugs compiler about success or failure.
cc
endfunc
defer execute('delfunction g:SpotBugsPreTestLocalAction')
func! g:SpotBugsPostAction() abort
let s:spotbugs_results.postActionDone = 1
endfunc
defer execute('delfunction g:SpotBugsPostAction')
func! g:SpotBugsPreCommand(arguments) abort
let s:spotbugs_results.preActionDone = 1
let s:spotbugs_results.preCommandArguments = a:arguments
" XXX: Notify the spotbugs compiler about success or failure.
cc
endfunc
defer execute('delfunction g:SpotBugsPreCommand')
func! g:SpotBugsPreTestCommand(arguments) abort
let s:spotbugs_results.preTestActionDone = 1
let s:spotbugs_results.preTestCommandArguments = a:arguments
" XXX: Notify the spotbugs compiler about success or failure.
cc
endfunc
defer execute('delfunction g:SpotBugsPreTestCommand')
func! g:SpotBugsPostCommand(arguments) abort
let s:spotbugs_results.postActionDone = 1
let s:spotbugs_results.postCommandArguments = a:arguments
endfunc
defer execute('delfunction g:SpotBugsPostCommand')
func! g:SpotBugsPostCompilerActionExecutor(action) abort
try
" XXX: Notify the spotbugs compiler about success or failure.
cc
catch /\<E42:/
execute a:action
endtry
endfunc
defer execute('delfunction g:SpotBugsPostCompilerActionExecutor')
" TEST INTEGRATION WITH A SUPPORTED COMPILER PLUGIN.
if filereadable($VIMRUNTIME .. '/compiler/maven.vim')
let save_PATH = $PATH
if !executable('mvn')
if has('win32')
let $PATH = 'Xspotbugs;' .. $PATH
" This is what ":help executable()" suggests.
call writefile([], 'Xspotbugs/mvn.cmd')
else
let $PATH = 'Xspotbugs:' .. $PATH
call writefile([], 'Xspotbugs/mvn')
call setfperm('Xspotbugs/mvn', 'rwx------')
endif
endif
let g:spotbugs_properties = {
\ 'compiler': 'maven',
\ 'PreCompilerAction': function('g:SpotBugsPreAction'),
\ 'PreCompilerTestAction': function('g:SpotBugsPreTestAction'),
\ 'PostCompilerAction': function('g:SpotBugsPostAction'),
\ }
" XXX: In case this is a runner-up ":edit".
call s:SpotBugsBeforeFileTypeTryPluginAndClearCache({
\ 'compiler': g:spotbugs_properties.compiler,
\ })
execute 'edit ' .. type_file
call assert_equal('java', &l:filetype)
call assert_equal('maven', g:spotbugs#state.compiler)
call assert_false(has_key(g:spotbugs_properties, 'compiler'))
call assert_false(empty(g:spotbugs_properties))
" Query default implementations.
call assert_true(exists('*spotbugs#DefaultProperties'))
call assert_equal(sort([
\ 'PreCompilerAction',
\ 'PreCompilerTestAction',
\ 'PostCompilerAction',
\ 'sourceDirPath',
\ 'classDirPath',
\ 'testSourceDirPath',
\ 'testClassDirPath',
\ ]),
\ sort(keys(spotbugs#DefaultProperties())))
" Some ":autocmd"s with one of "PreCompiler*Action", "PostCompilerAction".
call assert_true(exists('#java_spotbugs'))
call assert_true(exists('#java_spotbugs#Syntax'))
call assert_true(exists('#java_spotbugs#User'))
call assert_equal(2, exists(':SpotBugsDefineBufferAutocmd'))
SpotBugsDefineBufferAutocmd SigUSR1 User SigUSR1 User SigUSR1 User
call assert_true(exists('#java_spotbugs#SigUSR1'))
call assert_true(exists('#java_spotbugs#Syntax'))
call assert_true(exists('#java_spotbugs#User'))
call assert_equal(2, exists(':SpotBugsRemoveBufferAutocmd'))
SpotBugsRemoveBufferAutocmd SigUSR1 User SigUSR1 User UserGettingBored
call assert_false(exists('#java_spotbugs#SigUSR1'))
call assert_true(exists('#java_spotbugs#Syntax'))
call assert_true(exists('#java_spotbugs#User'))
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionDone = 0
let s:spotbugs_results.postActionDone = 0
doautocmd java_spotbugs Syntax
call assert_false(exists('#java_spotbugs#Syntax'))
" No match: "type_file !~# 'src/main/java'".
call assert_false(s:spotbugs_results.preActionDone)
" No match: "type_file !~# 'src/test/java'".
call assert_false(s:spotbugs_results.preTestActionDone)
" No pre-match, no post-action.
call assert_false(s:spotbugs_results.postActionDone)
" Without a match, confirm that ":compiler spotbugs" has NOT run.
call assert_true(empty(&l:makeprg))
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionDone = 0
let s:spotbugs_results.postActionDone = 0
" Update path entries. (Note that we cannot use just "src" because there
" is another "src" directory nearer the filesystem root directory, i.e.
" "vim/vim/src/testdir/Xspotbugs/src", and "s:DispatchAction()" (see
" "ftplugin/java.vim") will match "vim/vim/src/testdir/Xspotbugs/tests"
" against "src".)
let g:spotbugs_properties.sourceDirPath = ['Xspotbugs/src']
let g:spotbugs_properties.classDirPath = ['Xspotbugs/src']
let g:spotbugs_properties.testSourceDirPath = ['tests']
let g:spotbugs_properties.testClassDirPath = ['tests']
doautocmd java_spotbugs User
" No match: "type_file !~# 'src/main/java'" (with old "*DirPath" values
" cached).
call assert_false(s:spotbugs_results.preActionDone)
" No match: "type_file !~# 'src/test/java'" (with old "*DirPath" values
" cached).
call assert_false(s:spotbugs_results.preTestActionDone)
" No pre-match, no post-action.
call assert_false(s:spotbugs_results.postActionDone)
" Without a match, confirm that ":compiler spotbugs" has NOT run.
call assert_true(empty(&l:makeprg))
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionDone = 0
let s:spotbugs_results.postActionDone = 0
" XXX: Re-build ":autocmd"s from scratch with new values applied.
doautocmd FileType
call assert_true(exists('b:spotbugs_syntax_once'))
doautocmd java_spotbugs User
" A match: "type_file =~# 'Xspotbugs/src'" (with new "*DirPath" values
" cached).
call assert_true(s:spotbugs_results.preActionDone)
" No match: "type_file !~# 'tests'" (with new "*DirPath" values cached).
call assert_false(s:spotbugs_results.preTestActionDone)
" For a pre-match, a post-action.
call assert_true(s:spotbugs_results.postActionDone)
" With a match, confirm that ":compiler spotbugs" has run.
if has('win32')
call assert_match('^spotbugs\.bat\s', &l:makeprg)
else
call assert_match('^spotbugs\s', &l:makeprg)
endif
bwipeout
setlocal makeprg=
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionDone = 0
let s:spotbugs_results.preTestLocalActionDone = 0
let s:spotbugs_results.postActionDone = 0
execute 'edit ' .. test_file
" Prepare a buffer-local, incomplete variant of properties, relying on
" "ftplugin/java.vim" to take care of merging in unique entries, if any,
" from "g:spotbugs_properties".
let b:spotbugs_properties = {
\ 'PreCompilerTestAction': function('g:SpotBugsPreTestLocalAction'),
\ }
call assert_equal('java', &l:filetype)
call assert_true(exists('#java_spotbugs'))
call assert_true(exists('#java_spotbugs#Syntax'))
call assert_true(exists('#java_spotbugs#User'))
call assert_fails('doautocmd java_spotbugs Syntax', 'Oops')
call assert_false(exists('#java_spotbugs#Syntax'))
" No match: "test_file !~# 'Xspotbugs/src'".
call assert_false(s:spotbugs_results.preActionDone)
" A match: "test_file =~# 'tests'".
call assert_true(s:spotbugs_results.preTestActionDone)
call assert_false(s:spotbugs_results.preTestLocalActionDone)
" No action after pre-failure (the thrown "Oops" doesn't qualify for ":cc").
call assert_false(s:spotbugs_results.postActionDone)
" No ":compiler spotbugs" will be run after pre-failure.
call assert_true(empty(&l:makeprg))
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionDone = 0
let s:spotbugs_results.preTestLocalActionDone = 0
let s:spotbugs_results.postActionDone = 0
" XXX: Re-build ":autocmd"s from scratch with buffer-local values applied.
doautocmd FileType
call assert_true(exists('b:spotbugs_syntax_once'))
doautocmd java_spotbugs User
" No match: "test_file !~# 'Xspotbugs/src'".
call assert_false(s:spotbugs_results.preActionDone)
" A match: "test_file =~# 'tests'".
call assert_true(s:spotbugs_results.preTestLocalActionDone)
call assert_false(s:spotbugs_results.preTestActionDone)
" For a pre-match, a post-action.
call assert_true(s:spotbugs_results.postActionDone)
" With a match, confirm that ":compiler spotbugs" has run.
if has('win32')
call assert_match('^spotbugs\.bat\s', &l:makeprg)
else
call assert_match('^spotbugs\s', &l:makeprg)
endif
setlocal makeprg=
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionDone = 0
let s:spotbugs_results.preTestLocalActionDone = 0
let s:spotbugs_results.postActionDone = 0
let s:spotbugs_results.preCommandArguments = ''
let s:spotbugs_results.preTestCommandArguments = ''
let s:spotbugs_results.postCommandArguments = ''
" XXX: Compose the assigned "*Command"s with the default Maven "*Action"s.
let b:spotbugs_properties = {
\ 'compiler': 'maven',
\ 'DefaultPreCompilerTestCommand': function('g:SpotBugsPreTestCommand'),
\ 'DefaultPreCompilerCommand': function('g:SpotBugsPreCommand'),
\ 'DefaultPostCompilerCommand': function('g:SpotBugsPostCommand'),
\ 'PostCompilerActionExecutor': function('g:SpotBugsPostCompilerActionExecutor'),
\ 'augroupForPostCompilerAction': 'java_spotbugs_test',
\ 'sourceDirPath': ['Xspotbugs/src'],
\ 'classDirPath': ['Xspotbugs/src'],
\ 'testSourceDirPath': ['tests'],
\ 'testClassDirPath': ['tests'],
\ }
unlet g:spotbugs_properties
" XXX: Re-build ":autocmd"s from scratch with buffer-local values applied.
call s:SpotBugsBeforeFileTypeTryPluginAndClearCache({
\ 'compiler': b:spotbugs_properties.compiler,
\ 'commands': {
\ 'DefaultPreCompilerTestCommand':
\ b:spotbugs_properties.DefaultPreCompilerTestCommand,
\ 'DefaultPreCompilerCommand':
\ b:spotbugs_properties.DefaultPreCompilerCommand,
\ 'DefaultPostCompilerCommand':
\ b:spotbugs_properties.DefaultPostCompilerCommand,
\ },
\ })
doautocmd FileType
call assert_equal('maven', g:spotbugs#state.compiler)
call assert_equal(sort([
\ 'DefaultPreCompilerTestCommand',
\ 'DefaultPreCompilerCommand',
\ 'DefaultPostCompilerCommand',
\ ]),
\ sort(keys(g:spotbugs#state.commands)))
call assert_true(exists('b:spotbugs_syntax_once'))
doautocmd java_spotbugs User
" No match: "test_file !~# 'Xspotbugs/src'".
call assert_false(s:spotbugs_results.preActionDone)
call assert_true(empty(s:spotbugs_results.preCommandArguments))
" A match: "test_file =~# 'tests'".
call assert_true(s:spotbugs_results.preTestActionDone)
call assert_equal('test-compile', s:spotbugs_results.preTestCommandArguments)
" For a pre-match, a post-action.
call assert_true(s:spotbugs_results.postActionDone)
call assert_equal('%:S', s:spotbugs_results.postCommandArguments)
" With a match, confirm that ":compiler spotbugs" has run.
if has('win32')
call assert_match('^spotbugs\.bat\s', &l:makeprg)
else
call assert_match('^spotbugs\s', &l:makeprg)
endif
setlocal makeprg=
let s:spotbugs_results.preActionDone = 0
let s:spotbugs_results.preTestActionOtherDone = 0
let s:spotbugs_results.preTestLocalActionDone = 0
let s:spotbugs_results.postActionDone = 0
let s:spotbugs_results.preCommandArguments = ''
let s:spotbugs_results.preTestCommandArguments = ''
let s:spotbugs_results.postCommandArguments = ''
" When "PostCompilerActionExecutor", "Pre*Action" and/or "Pre*TestAction",
" and "Post*Action" are available, "#java_spotbugs_post" must be defined.
call assert_true(exists('#java_spotbugs_post'))
call assert_true(exists('#java_spotbugs_post#User'))
call assert_false(exists('#java_spotbugs_post#ShellCmdPost'))
call assert_false(exists('#java_spotbugs_test#ShellCmdPost'))
" Re-link a Funcref on the fly.
func! g:SpotBugsPreTestCommand(arguments) abort
let s:spotbugs_results.preTestActionOtherDone = 1
let s:spotbugs_results.preTestCommandArguments = a:arguments
" Define a once-only ":autocmd" for "#java_spotbugs_test#ShellCmdPost".
doautocmd java_spotbugs_post User
" XXX: Do NOT use ":cc" to notify the spotbugs compiler about success or
" failure, and assume the transfer of control to a ShellCmdPost command.
endfunc
doautocmd java_spotbugs User
" No match: "test_file !~# 'Xspotbugs/src'".
call assert_false(s:spotbugs_results.preActionDone)
call assert_true(empty(s:spotbugs_results.preCommandArguments))
" A match: "test_file =~# 'tests'".
call assert_true(s:spotbugs_results.preTestActionOtherDone)
call assert_equal('test-compile', s:spotbugs_results.preTestCommandArguments)
" For a pre-match, no post-action (without ":cc") UNLESS a ShellCmdPost
" event is consumed whose command will invoke "PostCompilerActionExecutor"
" and the latter will accept a post-compiler action argument.
call assert_false(s:spotbugs_results.postActionDone)
call assert_true(exists('#java_spotbugs_test#ShellCmdPost'))
doautocmd ShellCmdPost
call assert_false(exists('#java_spotbugs_test#ShellCmdPost'))
call assert_true(s:spotbugs_results.postActionDone)
call assert_equal('%:S', s:spotbugs_results.postCommandArguments)
" With a match, confirm that ":compiler spotbugs" has run.
if has('win32')
call assert_match('^spotbugs\.bat\s', &l:makeprg)
else
call assert_match('^spotbugs\s', &l:makeprg)
endif
bwipeout
setlocal makeprg=
let $PATH = save_PATH
endif
filetype plugin off
setlocal makeprg=
let &shellslash = save_shellslash
endfunc
" vim: shiftwidth=2 sts=2 expandtab