VimPlugin: vader

From wikinotes
Revision as of 19:02, 7 January 2023 by Will (talk | contribs) (→‎Test File)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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-interactive

simple 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