| " Test the :compiler command |
| |
| source check.vim |
| source shared.vim |
| |
| 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 |