1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 07:40:05 +08:00
SpaceVim/bundle/neomake/tests/tempfiles.vader

792 lines
26 KiB
Plaintext
Raw Normal View History

2020-06-13 14:06:35 +08:00
Include: include/setup.vader
Execute (Neomake uses temporary file for unsaved buffer):
Save g:neomake_verbose
let g:neomake_verbose = 3
new
norm iline1
norm oline2
let maker = {
\ 'exe': 'cat',
\ 'append_file': 1,
\ 'errorformat': '%m',
\ 'tempfile_enabled': 1,
\ 'default_entry_type': '',
\ }
call neomake#Make(1, [maker])
if neomake#has_async_support()
let make_info = values(neomake#GetStatus().make_info)[0]
let temp_file = make_info.tempfiles[0]
AssertEqual fnamemodify(temp_file, ':h:h'), fnamemodify(tempname(), ':h')
AssertEqual getfperm(temp_file), 'rw-------'
NeomakeTestsWaitForFinishedJobs
endif
AssertNeomakeMessage '\vSkipped 2 entries without bufnr: .*\.', 3
AssertEqualQf getloclist(0), [{
\ 'lnum': 0,
\ 'bufnr': 0,
\ 'col': 0,
\ 'valid': 1,
\ 'vcol': 0,
\ 'nr': -1,
\ 'type': '',
\ 'pattern': '',
\ 'text': 'line1'},
\ {
\ 'lnum': 0,
\ 'bufnr': 0,
\ 'col': 0,
\ 'valid': 1,
\ 'vcol': 0,
\ 'nr': -1,
\ 'type': '',
\ 'pattern': '',
\ 'text': 'line2'}]
if neomake#has_async_support()
AssertEqual filereadable(temp_file), 0, 'temp_file was removed'
AssertNeomakeMessage 'Removing temporary file: "'.temp_file.'".'
else
AssertEqual len(filter(copy(g:neomake_test_messages), "v:val[1] =~# '^Removing temporary file:'")), 1, 'msg found'
endif
bwipe!
Execute (Uses temporary file for unreadable buffer):
new
file doesnotexist
set ft=neomake_tests
let b:neomake_neomake_tests_enabled_makers = ['true']
let b:neomake_neomake_tests_true_tempfile_enabled = 1
if exists('*setfperm')
let s:validated = 0
function! s:validate_tempfile()
let s:validated = 1
let tempfile = g:neomake_hook_context.jobinfo.tempfile
AssertEqual getfperm(tempfile), 'rw-------'
endfunction
augroup neomake_tests
au User NeomakeJobFinished call s:validate_tempfile()
augroup END
endif
RunNeomake
AssertNeomakeMessage '\v^Using tempfile for unreadable buffer: "(.*)"', 3
let tempfile_name = g:neomake_test_matchlist[1]
AssertEqual fnamemodify(tempfile_name, ':t'), printf(
\ '.doesnotexist@neomake_%d_%d', getpid(), neomake#GetStatus().last_make_id)
AssertEqual fnamemodify(tempfile_name, ':h'), getcwd()
if exists('*setfperm')
AssertEqual s:validated, 1
endif
bwipe
Execute (Uses permissions of original file):
if !exists('*setfperm')
NeomakeTestsSkip 'no setfperm support.'
else
new
let fname = tempname()
call writefile([], fname)
call setfperm(fname, '---rw----')
exe 'edit '.fname
silent normal! O
set ft=neomake_tests
let b:neomake_neomake_tests_enabled_makers = ['true']
let b:neomake_neomake_tests_true_tempfile_enabled = 1
let s:validated = 0
function! s:validate_tempfile()
let tempfile = g:neomake_hook_context.jobinfo.tempfile
AssertEqual getfperm(tempfile), '---rw----'
let s:validated = 1
endfunction
augroup neomake_tests
au User NeomakeJobFinished call s:validate_tempfile()
augroup END
RunNeomake
AssertNeomakeMessage '\v^Using tempfile for modified buffer: "(.*)"', 3
let tempfile_name = g:neomake_test_matchlist[1]
AssertEqual glob(tempfile_name), ''
AssertEqual s:validated, 1
AssertEqual v:warningmsg, 'W10: Warning: Changing a readonly file'
let v:warningmsg = ''
bwipe!
endif
Execute (Only 2nd maker uses temporary file):
call g:NeomakeSetupAutocmdWrappers()
new
file doesnotexist.ext.ext2
let maker1 = {
\ 'exe': 'true',
\ 'name': 'true_maker',
\ 'errorformat': '%m',
\ 'append_file': 0,
\ 'tempfile_enabled': 1,
\ }
let maker2 = copy(maker1)
let maker2.append_file = 1
let maker3 = copy(maker1)
let fname = fnamemodify(bufname('%'), ':p')
call neomake#Make(1, [maker1, maker2, maker3])
let make_id = neomake#GetStatus().last_make_id
let bufnr = bufnr('%')
AssertNeomakeMessage '\v^Using tempfile for unreadable buffer: "(.*)"', 3
let tempfile_name = g:neomake_test_matchlist[1]
AssertEqual fnamemodify(tempfile_name, ':t'), printf(
\ '.doesnotexist.ext.ext2@neomake_%d_%d.ext2', getpid(), neomake#GetStatus().last_make_id)
NeomakeTestsWaitForFinishedJobs
AssertEqual len(g:neomake_test_finished), 1
AssertEqual len(g:neomake_test_jobfinished), 3
bwipe
Execute (Maker can specify temporary file to use via fn):
Save g:neomake_test_tempfile
let g:neomake_test_tempfile = tempname() . '/injected/with/subdir'
let maker = {
\ 'exe': 'true',
\ }
function! maker.fn(jobinfo) abort dict
let self.tempfile_name = g:neomake_test_tempfile
endfunction
new
file unreadable_and_modified
normal! iline1
let bufnr = bufnr('%')
let maker = neomake#GetMaker(maker)
AssertEqual maker.args, []
let jobinfo = NeomakeTestsFakeJobinfo()
call maker.fn(jobinfo)
AssertEqual maker.args, []
call maker._get_argv(jobinfo)
AssertEqual maker.args, []
AssertEqual maker.tempfile_name, g:neomake_test_tempfile
AssertNeomakeMessage '\m^Using tempfile for modified buffer: "'.g:neomake_test_tempfile.'"', 3, jobinfo
Assert filereadable(g:neomake_test_tempfile), 'tempfile has been created'
let make_info = values(neomake#GetStatus().make_info)[0]
AssertEqual make_info.tempfiles, [maker.tempfile_name]
AssertEqual readfile(g:neomake_test_tempfile), ['line1']
bwipe!
Execute (Maker can use '-' as temporary filename):
let maker = {
\ 'exe': 'true',
\ 'tempfile_name': '-',
\ }
new
let maker = neomake#GetMaker(maker)
let jobinfo = NeomakeTestsFakeJobinfo()
if neomake#has_async_support()
AssertEqual maker._get_argv(jobinfo), ['true', '-']
else
AssertEqual maker._get_argv(jobinfo), 'true -'
endif
AssertNeomakeMessage 'Using tempfile for unnamed buffer: "-".', 3
Assert !has_key(jobinfo, 'supports_stdin')
AssertEqual jobinfo.tempfile, fnamemodify('-', ':p')
CallNeomake 1, [maker]
AssertNeomakeMessage printf('Removing temporary file: "%s".', jobinfo.tempfile)
bwipe
Execute (Maker cannot use '-' as tempfile_name (with supports_stdin)):
let maker = {
\ 'exe': 'true',
\ 'supports_stdin': 1,
\ 'tempfile_name': '-',
\ }
new
let maker = neomake#GetMaker(maker)
let jobinfo = NeomakeTestsFakeJobinfo()
if neomake#has_async_support()
AssertEqual maker._get_argv(jobinfo), ['true', '-']
else
AssertEqual maker._get_argv(jobinfo), 'true -'
endif
AssertNeomakeMessage 'Using stdin for unnamed buffer (-).', 3
AssertEqual jobinfo.uses_stdin, 1
Assert !has_key(jobinfo, 'tempfile')
CallNeomake 1, [maker]
bwipe
Execute (Maker can use '' as tempfile_name (with supports_stdin)):
let maker = {
\ 'exe': 'true',
\ 'supports_stdin': 1,
\ 'tempfile_name': '',
\ }
new
let maker = neomake#GetMaker(maker)
let jobinfo = NeomakeTestsFakeJobinfo()
if neomake#has_async_support()
AssertEqual maker._get_argv(jobinfo), ['true']
else
AssertEqual maker._get_argv(jobinfo), 'true'
endif
AssertNeomakeMessage 'Using stdin for unnamed buffer ().', 3
AssertEqual jobinfo.uses_stdin, 1
Assert !has_key(jobinfo, 'tempfile')
bwipe
Execute (Previously existing temporary dir is kept):
let tempname = tempname()
call mkdir(tempname, '', 0700)
let tempfile_name = tempname.'/injected/with/subdir and spaces'
let maker = {
\ 'exe': 'true',
\ 'tempfile_name': tempfile_name,
\ }
new
normal! iline1
call neomake#Make(1, [maker])
if neomake#has_async_support()
Assert filereadable(tempfile_name), 'tempfile has been created'
AssertEqual readfile(tempfile_name), ['line1']
endif
AssertNeomakeMessage 'Using tempfile for unnamed buffer: "'.tempfile_name.'".', 3
NeomakeTestsWaitForFinishedJobs
if neomake#has_async_support()
AssertNeomakeMessage printf("Starting async job: true '%s'.", tempfile_name)
else
AssertNeomakeMessage printf("Starting [string]: true '%s'.", tempfile_name)
endif
AssertNeomakeMessage 'Removing temporary file: "'.tempfile_name.'".'
Assert !filereadable(tempfile_name), 'tempfile has been removed'
Assert isdirectory(tempname), 'tempfile dir has not been removed'
if v:version >= 705 || (v:version == 704 && has('patch1107'))
Assert !isdirectory(tempname.'/injected'), 'first created tempfile dir has been removed'
else
Assert isdirectory(tempname.'/injected'), 'tempfile dirs are not removed'
endif
bwipe!
Execute (maker._get_argv uses jobinfo for bufnr):
let maker = neomake#GetMaker({'name': 'my_maker', 'append_file': 1})
new
let b:neomake_tempfile_enabled = 1
let bufnr = bufnr('%')
let jobinfo = NeomakeTestsFakeJobinfo()
call maker._get_argv(jobinfo)
let make_info = values(neomake#GetStatus().make_info)[0]
Assert !empty(make_info.tempfiles), 'make_info has tempfiles'
let jobinfo = NeomakeTestsFakeJobinfo()
let maker = neomake#GetMaker({'name': 'my_maker', 'append_file': 1})
edit tests/fixtures/errors.py
call maker._get_argv(jobinfo)
Assert !has_key(jobinfo, 'tempfile_name')
wincmd p
let jobinfo = NeomakeTestsFakeJobinfo()
let jobinfo.bufnr = bufnr
let expected = ['my_maker', fnameescape(fnamemodify(bufname(bufnr), ':.'))]
if neomake#has_async_support()
AssertEqual expected, maker._get_argv(jobinfo)
else
AssertEqual join(expected), maker._get_argv(jobinfo)
endif
wincmd p
bwipe
Execute (_get_fname_for_buffer handles modified buffer with disabled tempfiles):
new
let bufname = 'tests/fixtures/a filename with spaces'
edit tests/fixtures/a\ filename\ with\ spaces
let b:neomake_tempfile_enabled = 0
set modified
let maker = neomake#GetMaker({})
let jobinfo = NeomakeTestsFakeJobinfo()
let caught = 0
try
call maker._get_fname_for_buffer(jobinfo)
catch
let caught = 1
AssertEqual v:exception, 'Neomake: skip_job: buffer is modified, but temporary files are disabled.'
endtry
AssertEqual caught, 1
bwipe!
Execute (_get_fname_for_buffer does not add trailing newline):
new
let maker = neomake#GetMaker({})
let jobinfo = NeomakeTestsFakeJobinfo()
let b:neomake_tempfile_enabled = 1
call maker._get_fname_for_buffer(jobinfo)
let make_info = values(neomake#GetStatus().make_info)[0]
let temp_file = make_info.tempfiles[0]
AssertEqual readfile(make_info.tempfiles[0]), []
let jobinfo = NeomakeTestsFakeJobinfo()
let make_info = values(neomake#GetStatus().make_info)[0]
normal! iline1
call maker._get_fname_for_buffer(jobinfo)
AssertEqual readfile(make_info.tempfiles[0]), ['line1']
bwipe!
Execute (same tempfile is used for all jobs (serialized)):
if NeomakeAsyncTestsSetup()
new
let maker = NeomakeTestsCommandMaker('echo_file', 'cat')
let maker.append_file = 1
let maker2 = NeomakeTestsCommandMaker('echo_file', 'cat')
let maker2.append_file = 1
let maker2.tempfile_name = tempname()
let b:neomake_tempfile_enabled = 1
let b:neomake_serialize = 1
normal! iline1
AssertEqual len(g:neomake_test_jobfinished), 0
call neomake#Make(1, [maker, g:sleep_maker, maker2, maker, g:sleep_maker])
let make_info = values(neomake#GetStatus().make_info)[0]
NeomakeTestsWaitForNextFinishedJob
normal! oline2
NeomakeTestsWaitForNextFinishedJob
AssertNotEqual make_info.tempfiles, [maker2.tempfile_name]
AssertEqual readfile(make_info.tempfiles[0]), readfile(maker2.tempfile_name)
NeomakeTestsWaitForFinishedJobs
AssertEqual len(g:neomake_test_jobfinished), 5
AssertEqual [
\ 'cat '.make_info.tempfiles[0],
\ 'sleep .05; echo slept',
\ 'cat '.maker2.tempfile_name,
\ 'cat '.make_info.tempfiles[0],
\ 'sleep .05; echo slept'], map(copy(g:neomake_test_jobfinished),
\ 'v:val.jobinfo.argv[-1]')
AssertEqual map(getloclist(0), 'v:val.text'),
\ ['line1', 'slept', 'line1', 'line1', 'slept']
bwipe!
endif
Execute (same tempfile contents is used for all jobs):
if NeomakeAsyncTestsSetup()
new
let b:neomake_serialize = 1
let b:neomake_tempfile_enabled = 1
let maker1 = {'name': 'maker1', 'exe': 'cat', 'append_file': 1}
let maker2 = {'name': 'maker2', 'exe': 'cat', 'append_file': 1}
Save g:maker2_tempfile
let g:maker2_tempfile = tempname()
function! maker2.InitForJob(jobinfo)
let self.tempfile_name = g:maker2_tempfile
endfunction
Save g:maker2_tempfile_contents, g:global_tempfile_contents
augroup neomake_tests
autocmd User NeomakeJobFinished
\ let m = g:neomake_hook_context.jobinfo.maker
\ | if m.name == 'maker2'
\ | let g:maker2_tempfile_contents = readfile(m.tempfile_name)
\ | endif
autocmd User NeomakeFinished
\ let make_info = values(neomake#GetStatus().make_info)[0]
\ | let g:global_tempfile_contents = readfile(make_info.tempfiles[0])
augroup END
normal! iline1
call neomake#Make(1, [maker1, maker2])
let make_info = values(neomake#GetStatus().make_info)[0]
normal! oline2
let g:neomake_test_messages = []
NeomakeTestsWaitForFinishedJobs
let jobinfo1 = g:neomake_test_jobfinished[0].jobinfo
let jobinfo2 = g:neomake_test_jobfinished[1].jobinfo
AssertEqual len(g:neomake_test_jobfinished), 2
AssertNeomakeMessage 'Using tempfile for unnamed buffer: "'.g:maker2_tempfile.'".'
let bound_maker2 = g:neomake_test_jobfinished[1].jobinfo.maker
AssertEqual bound_maker2.tempfile_name, g:maker2_tempfile
AssertNotEqual make_info.tempfiles[0], bound_maker2.tempfile_name
AssertEqual g:global_tempfile_contents, g:maker2_tempfile_contents
AssertEqual make_info.tempfiles, [jobinfo1.filename, jobinfo2.filename]
AssertEqual make_info.tempfiles, [jobinfo1.tempfile, jobinfo2.tempfile]
AssertEqual map(getloclist(0), 'v:val.text'), ['line1', 'line1']
bwipe!
endif
Execute (First maker uses actual file, 2nd modified tempfile):
if NeomakeAsyncTestsSetup()
new
edit tests/fixtures/a\ filename\ with\ spaces
let b:neomake_serialize = 1
let maker1 = {'name': 'maker1', 'exe': 'cat', 'append_file': 1}
let maker2 = {'name': 'maker2', 'exe': 'cat', 'append_file': 1}
let maker2.tempfile_name = tempname()
Save g:maker2_tempfile_contents, g:global_tempfile_contents
augroup neomake_tests
autocmd User NeomakeJobFinished
\ let m = g:neomake_hook_context.jobinfo.maker
\ | if m.name == 'maker2'
\ | let g:maker2_tempfile_contents = readfile(m.tempfile_name)
\ | endif
autocmd User NeomakeFinished
\ let make_info = values(neomake#GetStatus().make_info)[0]
\ | let g:global_tempfile_contents = readfile(make_info.tempfiles[0])
augroup END
let b:neomake_tempfile_enabled = 1
let b:neomake_serialize = 1
call neomake#Make(1, [maker1, maker2])
normal! oline2
let make_info = values(neomake#GetStatus().make_info)[0]
let g:neomake_test_messages = []
NeomakeTestsWaitForFinishedJobs
let jobinfo1 = g:neomake_test_jobfinished[0].jobinfo
let jobinfo2 = g:neomake_test_jobfinished[1].jobinfo
Assert !has_key(jobinfo1, 'tempfile'), 'Job 1 has no tempfile'
AssertEqual len(g:neomake_test_jobfinished), 2
AssertNeomakeMessage 'Using tempfile for modified buffer: "'.maker2.tempfile_name.'".'
let bound_maker2 = g:neomake_test_jobfinished[1].jobinfo.maker
AssertEqual bound_maker2.tempfile_name, maker2.tempfile_name
AssertEqual make_info.tempfiles, [bound_maker2.tempfile_name]
AssertEqual g:global_tempfile_contents, g:maker2_tempfile_contents
AssertEqual make_info.tempfiles, [jobinfo2.filename]
AssertEqual make_info.tempfiles, [jobinfo2.tempfile]
AssertEqual map(getloclist(0), 'v:val.text'), ['line1', 'line1', 'line2']
bwipe!
endif
Execute (Existing bufnr is kept with tempfiles):
let maker = NeomakeTestsCommandMaker('echo-error', "printf '%s:1:error'")
let maker.errorformat = '%f:%l:%m'
let maker.append_file = 1
new
let bufnr = bufnr('%')
let b:neomake_tempfile_enabled = 1
call neomake#Make(1, [maker])
NeomakeTestsWaitForFinishedJobs
AssertNeomakeMessage '\v^Using tempfile for unnamed buffer: "(.*)".$'
AssertEqualQf getloclist(0), [{
\ 'lnum': 1, 'bufnr': bufnr, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1,
\ 'type': 'W', 'pattern': '', 'text': 'error'}]
let tempfile_name = g:neomake_test_matchlist[1]
Assert !bufexists(tempfile_name), 'temporary buffer has been removed'
bwipe
Execute (Temporary buffer is not wiped if opened):
Save g:neomake_verbose
let g:neomake_verbose = 3
let maker = NeomakeTestsCommandMaker('echo-error', 'printf ''%s:1:error\nanother_file:2:another_error''')
let maker.errorformat = '%f:%l:%m'
let maker.append_file = 1
new
let bufnr = bufnr('%')
let tempfile_bufnr = bufnr + 1
let b:neomake_tempfile_enabled = 1
let jobinfo = neomake#Make({'enabled_makers': [maker]})[0]
" Open the tempfile in a new buffer.
new
AssertNeomakeMessage '\v^Using tempfile for unnamed buffer: "(.*)".$'
let tempfile_name = g:neomake_test_matchlist[1]
Assert !bufexists(tempfile_name), 'temporary buffer does not exist yet'
exe 'e' tempfile_name
NeomakeTestsWaitForFinishedJobs
wincmd p
let unlisted_bufnr = bufnr('^another_file$')
AssertNotEqual unlisted_bufnr, -1
AssertEqualQf getloclist(0), [
\ {'lnum': 1, 'bufnr': bufnr, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1,
\ 'type': 'W', 'pattern': '', 'text': 'error'},
\ {'lnum': 2, 'bufnr': unlisted_bufnr, 'col': 0, 'valid': 1, 'vcol': 0,
\ 'nr': -1, 'type': 'W', 'pattern': '', 'text': 'another_error'}]
Assert bufexists(tempfile_name), 'temporary buffer has not been wiped'
bwipe
exe 'bwipe' tempfile_name
exe 'bwipe' unlisted_bufnr
AssertNeomakeMessageAbsent '\VModified list entry'
AssertNeomakeMessage printf(
\ 'Used bufnr from temporary buffer %d (%s) for 1 entries: 1.',
\ tempfile_bufnr, tempfile_name), 3
AssertNeomakeMessage 'WARN: seen entries with bufnr different from jobinfo.bufnr ('.bufnr.'): {'''.unlisted_bufnr.''': 1}, current bufnr: '.bufnr.'.'
Execute (unlisted buffers created for tempfiles get wiped):
if NeomakeAsyncTestsSetup()
new
let maker1 = NeomakeTestsCommandMaker('echo_file 1', 'cat')
let maker1.append_file = 1
let maker1.tempfile_name = tempname()
let maker1.errorformat = '%f: %m'
let maker2 = NeomakeTestsCommandMaker('echo_file 2', 'cat')
let maker2.append_file = 1
let maker2.tempfile_name = tempname()
let maker2.errorformat = '%m: %f'
let b:neomake_tempfile_enabled = 1
let b:neomake_serialize = 1
call setline(1, maker1.tempfile_name.': '.maker2.tempfile_name)
call NeomakeTestsSetVimMessagesMarker()
call neomake#Make(1, [maker1, maker2])
let make_info = values(neomake#GetStatus().make_info)[0]
NeomakeTestsWaitForFinishedJobs
AssertEqual len(g:neomake_test_jobfinished), 2
AssertEqual [
\ 'cat '.maker1.tempfile_name,
\ 'cat '.maker2.tempfile_name], map(copy(g:neomake_test_jobfinished),
\ 'v:val.jobinfo.argv[-1]')
AssertEqual map(getloclist(0), 'v:val.text'),
\ [maker2.tempfile_name, maker1.tempfile_name]
AssertNeomakeMessage printf(
\ '\vUsed bufnr from temporary buffer (\d+) \(%s\) for 1 entries: 1.',
\ maker1.tempfile_name)
let buf1 = g:neomake_test_matchlist[1]
AssertNeomakeMessage printf(
\ '\vUsed bufnr from temporary buffer (\d+) \(%s\) for 1 entries: 1.',
\ maker2.tempfile_name)
let buf2 = g:neomake_test_matchlist[1]
AssertNeomakeMessage printf('Wiping out 2 unlisted/remapped buffers: [%d, %d].', buf1, buf2), 3
AssertEqual NeomakeTestsGetVimMessages(), []
Assert !bufexists(maker1.tempfile_name)
Assert !bufexists(maker2.tempfile_name)
bwipe!
endif
Execute (Handles tempfiles for bufnames with brackets):
let maker = NeomakeTestsCommandMaker('echo-error', "echo 1:msg")
let maker.errorformat = '%l:%m %f'
let maker.append_file = 1
new
exe 'file \[fname-with-brackets\]'
let bufnr = bufnr('%')
let b:neomake_tempfile_enabled = 1
call neomake#Make(1, [maker])
NeomakeTestsWaitForFinishedJobs
AssertNeomakeMessage '\v^Using tempfile for unreadable buffer: "(.*)".$'
let tempfile_name = g:neomake_test_matchlist[1]
let tempfile_relname = fnamemodify(tempfile_name, ':.')
Assert stridx(tempfile_name, getcwd().neomake#utils#Slash().'.[fname-with-brackets]') == 0, 'tempfile_name is correct'
let tempfile_bufnr = bufnr+1
AssertNeomakeMessage printf(
\ 'Used bufnr from temporary buffer %d (%s) for 1 entries: 1.',
\ tempfile_bufnr, tempfile_relname)
AssertNeomakeMessage printf(
\ 'Wiping out 1 unlisted/remapped buffers: [%d].', tempfile_bufnr)
AssertEqualQf getloclist(0), [{
\ 'lnum': 1, 'bufnr': bufnr, 'col': 0, 'valid': 1, 'vcol': 0, 'nr': -1,
\ 'type': 'W', 'pattern': '', 'text': 'msg'}]
Assert !bufexists(tempfile_bufnr), 'temporary buffer has been removed'
bwipe
Execute (Uses temporary dir for non-writable directory):
new
file /non-writable-dir/file
let b:neomake_tempfile_enabled = 1
norm! iline1
CallNeomake 1, [extend(copy(g:true_maker), {'uses_filename': 1})]
AssertNeomakeMessage 'Running makers: true-maker.', 3
AssertNeomakeMessage 'Using temporary directory for non-writable parent directory.', 3
bwipe!
Execute (Expands % in cwd according to actual file):
let tmpdir = tempname()
call mkdir(tmpdir, 'p', 0550)
new
exe 'file '.tmpdir.'/file'
let b:neomake_tempfile_enabled = 1
norm! iline1
let maker = {'exe': 'pwd', 'cwd': '%:h', 'uses_filename': 1, 'append_file': 0}
CallNeomake 1, [maker]
AssertNeomakeMessage 'Using temporary directory for non-writable parent directory.', 3
AssertNeomakeMessage printf('cwd: %s (changed).', tmpdir)
AssertEqual map(getloclist(0), 'v:val.text'), [tmpdir]
bwipe!
Execute (Expands % in args according to actual file, and replaces %t with tempfile (list)):
let tmpdir = tempname()
call mkdir(tmpdir, 'p', 0550)
new
exe 'file '.tmpdir.'/file'
let b:neomake_tempfile_enabled = 1
norm! iline1
let maker = {'exe': 'printf', 'args': ['%s\n', '%:h', '%t'], 'uses_filename': 1, 'append_file': 0}
CallNeomake 1, [maker]
AssertNeomakeMessage 'Using temporary directory for non-writable parent directory.', 3
AssertNeomakeMessage '\v^Using tempfile for modified buffer: "(.*)"', 3
let tempfile_name = g:neomake_test_matchlist[1]
AssertEqual map(getloclist(0), 'v:val.text'), [tmpdir, tempfile_name]
bwipe!
Execute (Does not expand % in args as string):
let tmpdir = tempname()
call mkdir(tmpdir, 'p', 0550)
new
exe 'file '.tmpdir.'/file'
let b:neomake_tempfile_enabled = 1
norm! iline1
let maker = {'exe': 'printf', 'args': '%s %:h', 'uses_filename': 1, 'append_file': 0}
CallNeomake 1, [maker]
AssertNeomakeMessage 'Using temporary directory for non-writable parent directory.', 3
AssertEqual map(getloclist(0), 'v:val.text'), ['%:h']
bwipe!
Execute (Warns when removal of tempfiles fails):
if neomake#has_async_support()
new
let maker = {'exe': 'true'}
call neomake#Make(1, [maker])
AssertNeomakeMessage '\v^Using tempfile for unnamed buffer: "(.*)"', 3
let tempfile_name = g:neomake_test_matchlist[1]
call delete(tempfile_name)
NeomakeTestsWaitForFinishedJobs
AssertNeomakeMessage printf('Failed to remove temporary file: "%s" (-1).', tempfile_name), 1
bwipe
else
NeomakeTestsSkip 'no async support.'
endif
Execute (Filemode maker with tempfile_enabled=0 gets not run on modified buffer):
call g:NeomakeSetupAutocmdWrappers()
new
file fname
set modified
let maker1 = {'name': 'maker1', 'exe': 'true', 'tempfile_enabled': 0}
let maker2 = {'name': 'maker2', 'exe': 'true'}
CallNeomake 1, [maker1, maker2]
AssertEqual len(g:neomake_test_finished), 1
AssertEqual len(g:neomake_test_jobfinished), 1
AssertNeomakeMessage 'Skipping job: buffer is modified, but temporary files are disabled.', 3
bwipe!
Execute (Massages tempfile buffer with file_mode=0 and append_file=1):
new
let maker = {'exe': 'echo', 'args': ['error']}
let maker.errorformat = '%m %f'
let maker.append_file = 1
CallNeomake 0, [maker]
AssertNeomakeMessage '\VUsing tempfile for unnamed buffer:', 3
AssertEqual map(getqflist(), '[v:val.text, v:val.bufnr]'), [['error', bufnr('%')]]
bwipe
Execute (Maps/sets bufnr via filename from temporary file):
new
let maker = {'exe': 'echo', 'args': ['']}
function maker.process_output(context)
let tempfile = a:context.output[0][1:]
return [{'filename': tempfile, 'lnum': 1, 'text': 'err'}]
endfunction
CallNeomake 1, [maker]
AssertEqual map(getloclist(0), '[v:val.bufnr, v:val.lnum, v:val.text]'),
\ [[bufnr('%'), 1, 'err']]
AssertNeomakeMessage 'Mapped 1 bufnrs from temporary files.', 3
bwipe
Execute (tempfile_dir can be configured: unnamed buffer):
let slash = neomake#utils#Slash()
let maker = neomake#GetMaker({'tempfile_enabled': 1})
let temp_base = fnamemodify(tempname(), ':h')
new
" Unnamed buffer gets tempfile based on tempname().
let fname = maker._get_tempfilename(NeomakeTestsFakeJobinfo())
AssertEqual fnamemodify(fname, ':t'), 'neomaketmp.'
AssertEqual fname[:len(temp_base)-1], temp_base
" Dir can be configured globally.
let b:neomake_tempfile_dir = '/custom/global/dir'
let fname = maker._get_tempfilename(NeomakeTestsFakeJobinfo())
AssertEqual fname, '/custom/global/dir/neomaketmp.'
" Dir can be configured per buffer.
let b:neomake_tempfile_dir = '/custom/buffer/dir'
let fname = maker._get_tempfilename(NeomakeTestsFakeJobinfo())
AssertEqual fname, '/custom/buffer/dir/neomaketmp.'
bwipe
Execute (tempfile_dir can be configured: named buffer):
let slash = neomake#utils#Slash()
let maker = neomake#GetMaker({'tempfile_enabled': 1})
new
file buffer_name.foo.ext
" Dir can be configured globally.
let b:neomake_tempfile_dir = '/custom/global/dir'
let fname = maker._get_tempfilename(NeomakeTestsFakeJobinfo())
AssertEqual fname, '/custom/global/dir/buffer_name.foo.ext'
" Dir can be configured per buffer.
let b:neomake_tempfile_dir = '/custom/buffer/dir'
let fname = maker._get_tempfilename(NeomakeTestsFakeJobinfo())
AssertEqual fname, '/custom/buffer/dir/buffer_name.foo.ext'
bwipe
Execute (tempfile_dir gets expanded):
let slash = neomake#utils#Slash()
let maker = neomake#GetMaker({'tempfile_enabled': 1})
new
file buffer_name.foo.ext
let b:neomake_tempfile_dir = '/custom%:p:h'
let fname = maker._get_tempfilename(NeomakeTestsFakeJobinfo())
AssertEqual fname, '/custom'.getcwd().slash.'buffer_name.foo.ext'
bwipe