VimPlugin: vader
From wikinotes
vader.vim is a vim plugin for testing vim itself, or vim plugins.
Documentation
github https://github.com/junegunn/vader.vim
Project Setup
Test in Filesystem
yourplugin/ tests/ test_filename1.vader test_filename2.vader ...Test names do not matter, but the directory structure must be flat . Tests are run using glob-matches.
Test-Runner
vim -n '+Vader tests/viml/*.vader' # interactive vim -n -c 'Vader! tests/viml/*.vader' > /dev/null # non-interactivesimple example
run-tests.sh
#!/usr/bin/bash # get dependencies test -d .test_deps || mkdir -p .test_deps test -e .test_deps/vader.vim/.git || git clone https://github.com/junegunn/vader.vim .test_deps/vader.vim test -e .test_deps/jellybeans.vim/.git || git clone https://github.com/nanotech/jellybeans.vim .test_deps/jellybeans.vim # run tests vim -Nu <(cat << EOF filetype off set rtp+=.test_deps/vader.vim set rtp+=.test_deps/jellybeans.vim set rtp+=. filetype plugin indent on syntax enable colorscheme jellybeans map <leader>q :q<CR> EOF) '+Vader tests/viml/*'featureful example
#!/usr/bin/env bash EXECUTABLE="$(basename "${BASH_SOURCE[0]}")" setup_colours() { fg_comment=$(tput setaf 8) fg_preview=$(tput setaf 3) fg_normal=$(tput sgr0) fg_header=$(tput setaf 4) } show_help() { setup_colours echo "${fg_preview}${EXECUTABLE} [-i] [TESTFILE [TESTFILE...]]${fg_normal}" echo echo "${fg_header}DESCRIPTION:${fg_normal}" echo " runs unittests (all by default)" echo echo "${fg_header}ARGUMENTS:${fg_normal}" echo " -i --interactive" echo " runs vader interactively (defaults to non-interactive)" echo echo "${fg_header}EXAMPLES:${fg_normal}" echo " ${fg_comment}# run all tests, non-interactively${fg_normal}" echo " ./${EXECUTABLE}" echo echo " ${fg_comment}# run all tests, interactively${fg_normal}" echo " ./${EXECUTABLE} -i" echo echo " ${fg_comment}# run single testfile, non-interactively${fg_normal}" echo " ./${EXECUTABLE} tests/viml/test_error.vader" echo echo " ${fg_comment}# run multiple testfiles, non-interactively${fg_normal}" echo " ./${EXECUTABLE} \\" echo " tests/viml/test_error.vader \\" echo " tests/viml/test_graphql.vader" echo } vimrc() { cat <<-END filetype off set rtp+=.test_deps/vader.vim set rtp+=.test_deps/jellybeans.vim set rtp+=. filetype plugin indent on syntax enable colorscheme jellybeans map <leader>q :q<CR> END } install_deps() { test -d .test_deps || mkdir -p .test_deps test -e .test_deps/vader.vim/.git || git clone https://github.com/junegunn/vader.vim .test_deps/vader.vim test -e .test_deps/jellybeans.vim/.git || git clone https://github.com/nanotech/jellybeans.vim .test_deps/jellybeans.vim } run_tests() { args=$@ if test -z "${args}" ; then default_tests='tests/*.vader' else default_tests="" fi if [[ "$interactive" == "1" ]] ; then vadercmd='+Vader ' vadercmd+=" $default_tests" vim -Nu <(echo "$(vimrc)") "$vadercmd ${args[@]}" else vadercmd='Vader! ' vadercmd+=" $default_tests" vim -Nu <(echo "$(vimrc)") -c "$vadercmd ${args[@]}" > /dev/null fi } main() { interactive=0 args=$@ while [ $# -gt 0 ] ; do case $1 in -h|--help) show_help exit 0 ;; -i|--interactive) interactive=1 args=( "${args[@]/$1}" ) shift ;; *) shift ;; esac done install_deps run_tests "${args[@]}" } main "$@"Test File
# NOTE: everything indented by 2x spaces && tabwidth=2 Before (setup name): :e foo :w abc :call cursor(1, 2) After (teardown name): :bdel foo # tests Execute (test foo returns foo): AssertEqual my_function("foo"), "foo" Execute (test bar returns bar): AssertEqual my_function("bar"), "bar"
Syntax
Vader.vim test blocks Vader.vim assertions