1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 05:20:04 +08:00
SpaceVim/bundle/verilog/test/functions.vim

235 lines
6.8 KiB
VimL
Raw Normal View History

function! TestFold(...)
let fail = 0
let linenr = 4 "Start after header
if exists("a:1")
let index = a:1
else
let index = 0
endif
while linenr < line("$")
let line = getline(linenr)
let levels = substitute(line, '.\{-}<\(\d*\)>', '\1::', 'g')
let levels_list = split(levels, '::')
if len(line) == 0
" Empty lines can be used as separators and will have zero " folding
let level_expected=0
elseif index < 0 || (index >= len(levels_list))
" Abort if requested index is NOT available in the levels list
echo 'Invalid line format: (' . linenr . ')'
echo line
return 1
else
" Store expected indent level
let level_expected=levels_list[index]
endif
" Check indent level
let level = foldlevel(linenr)
if (level != level_expected)
let fail = 1
echo "Error: level=" . level . " level_expected=" . level_expected . " (" . linenr . ") >>>>" . line
endif
let linenr += 1
endwhile
if (fail == 1)
echo 'Fold test failed:'
echo 'g:verilog_syntax_fold_lst: ' . g:verilog_syntax_fold_lst
return 1
else
echo 'Fold test passed'
return 0
endif
endfunction
function! TestIndent()
let fail = 0
let fail_lines = ''
let linenr = 0
while linenr < line("$")
let linenr += 1
let line = getline(linenr)
let ind1 = indent(linenr)
execute 'normal! '.linenr.'gg=='
let ind2 = indent(linenr)
if ind1 != ind2
let fail = 1
if (fail_lines == '')
let fail_lines = linenr
else
let fail_lines = fail_lines.','.linenr
endif
endif
endwhile
if (fail == 1)
echo 'Indent test failed:'
echo fail_lines
return 1
else
echo 'Indent test passed'
return 0
endif
endfunction
function! TestEfm(tool, mode, search_uvm)
let expected_errors = 0
let expected_warnings = 0
let expected_lints = 0
let uvm_expected_errors = 0
let uvm_expected_warnings = 0
let uvm_expected_lints = 0
" Re-read test file
silent view test/errorformat.txt
" Obtain tool configuration from file
let config_found = 0
let linenr = 0
while linenr < line("$")
let linenr += 1
let line = getline(linenr)
" Tool config line
let tool_config = matchlist(line, '^### *' . tolower(a:tool) . ' E=\(\d\+\), *W=\(\d\+\)\(, *L=\(\d\+\)\)\?')
if len(tool_config) != 0
let expected_errors = tool_config[1]
if a:mode == 1
let expected_warnings = tool_config[2]
else
let expected_warnings = 0
endif
if a:mode <= 2
let expected_lints = tool_config[4]
else
let expected_lints = 0
endif
let config_found = 1
if !a:search_uvm
break
endif
endif
" UVM config line
let uvm_config = matchlist(line, '^### *UVM E=\(\d\+\), *W=\(\d\+\)\(, *L=\(\d\+\)\)\?')
if len(uvm_config) != 0
let uvm_expected_errors = uvm_config[1]
if len(uvm_config) > 1
let uvm_expected_warnings = uvm_config[2]
endif
if len(uvm_config) > 3
let uvm_expected_lints = uvm_config[4]
endif
let uvm_config_found = 1
if config_found
break
endif
endif
endwhile
if !config_found
echo 'Test for tool ' . tolower(a:tool) . ' was not found'
return 1
endif
" Calculate total expected errors
if a:search_uvm
let expected_errors += uvm_expected_errors
let expected_warnings += uvm_expected_warnings
let expected_lints += uvm_expected_lints
endif
" Setup 'errorformat' and 'makeprg'
call verilog#VerilogErrorFormat(a:tool, a:mode)
setlocal makeprg=cat\ %
" Populate quickfix window
silent! make!
redraw
" Check results
let errors = 0
let warnings = 0
let lints = 0
let qf_list = getqflist()
for qf_entry in qf_list
" Only check valid entries
if qf_entry.valid != 0
" Consider Fatal and matches without type as errors
if qf_entry.type == 'E' ||
\ qf_entry.type == 'F' ||
\ qf_entry.type == ''
let errors += 1
endif
if qf_entry.type == 'W'
let warnings += 1
endif
" Consider Info as lint
if qf_entry.type == 'L' ||
\ qf_entry.type == 'I'
let lints += 1
endif
endif
endfor
echo 'Results:'
echo ' Expected errors = ' . expected_errors . ', errors found = ' . errors
echo ' Expected warnings = ' . expected_warnings . ', warnings found = ' . warnings
echo ' Expected lints = ' . expected_lints . ', lints found = ' . lints
echo ' errorformat = ' . &errorformat
echo 'Quickfix contents:'
for qf_entry in qf_list
echo qf_entry
endfor
if errors == expected_errors && warnings == expected_warnings && lints == expected_lints
echo 'Error format test passed'
return 0
else
echo 'Error format test failed:'
return 1
endif
endfunction
function! TestSyntax(file_name, test_name)
let test_name=substitute(a:test_name, ',', '_', '')
if test_name == ""
let test_name="default"
endif
let ref_file_name='test/' . a:file_name . '.html'
let new_file_name='test/' . a:file_name . '.' . test_name . '.html'
execute 'silent view test/' . a:file_name
syntax enable
" Generate HTML version of the file
let g:html_line_ids=0
let g:html_number_lines=0
let g:html_no_progress=1
TOhtml
" Clean up resulting HTML to minimize differences with other
" versions of TOhtml script
1,/<body>/-1 delete
/<\/body>/+1,$ delete
%s/ id='vimCodeElement'//e
" Write final buffer
execute 'w! ' . new_file_name
bd!
" Compare with reference
silent let output = system('diff ' . ref_file_name . ' ' . new_file_name)
if output == ""
echo 'Syntax test "' . a:file_name . '" with folding ' . test_name . ' passed'
echo ''
return 0
else
echo '=====DIFF START====='
echo output
echo '=====DIFF END======='
echo 'Syntax test "' . a:file_name . '" with folding ' . test_name . ' failed'
echo ''
return 1
endif
endfunction
" vi: set expandtab softtabstop=4 shiftwidth=4: