navi/tests/core.bash
2022-01-12 08:50:07 -03:00

86 lines
1.6 KiB
Bash

#!/usr/bin/env bash
# vim: filetype=sh
source "${NAVI_HOME}/scripts/install"
NEWLINE_CHAR="\036"
PASSED=0
FAILED=0
SKIPPED=0
SUITE=""
test::set_suite() {
SUITE="$*"
}
test::success() {
PASSED=$((PASSED+1))
log::success "Test passed!"
}
test::fail() {
FAILED=$((FAILED+1))
log::error "Test failed..."
return
}
test::skip() {
echo
log::note "${SUITE:-unknown} - ${1:-unknown}"
SKIPPED=$((SKIPPED+1))
log::warning "Test skipped..."
return
}
test::run() {
echo
log::note "${SUITE:-unknown} - ${1:-unknown}"
shift
"$@" && test::success || test::fail
}
test::_escape() {
tr '\n' "$NEWLINE_CHAR" | sed -E "s/[\s$(printf "$NEWLINE_CHAR") ]+$//g"
}
test::equals() {
local -r actual="$(cat)"
local -r expected="${1:-}"
local -r actual2="$(echo "$actual" | test::_escape)"
local -r expected2="$(echo "$expected" | test::_escape)"
if [[ "$actual2" != "$expected2" ]]; then
log::error "Expected '${expected}' but got '${actual}'"
return 2
fi
}
test::contains() {
local -r haystack="$(cat)"
local -r needle="${1:-}"
local -r haystack2="$(echo "$haystack" | test::_escape)"
local -r needle2="$(echo "$needle" | test::_escape)"
if [[ "$haystack2" != *"$needle2"* ]]; then
log::error "Expected '${haystack}' to include '${needle2}'"
return 2
fi
}
test::finish() {
echo
if [ $SKIPPED -gt 0 ]; then
log::warning "${SKIPPED} tests skipped!"
fi
if [ $FAILED -gt 0 ]; then
log::error "${PASSED} tests passed but ${FAILED} failed... :("
exit "${FAILED}"
else
log::success "All ${PASSED} tests passed! :)"
exit 0
fi
}