Added tests for 'math' class

This commit is contained in:
Marco Cetica 2024-02-28 16:17:43 +01:00
parent bc558c02e1
commit 51777de716
Signed by: marco
GPG Key ID: 45060A949E90D0FD
9 changed files with 247 additions and 0 deletions

24
tests/test_div Normal file
View File

@ -0,0 +1,24 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="128"
ACTUAL=$("$PROGRAM" -e '256 2 / p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'/' requires two operands"
ACTUAL=$("$PROGRAM" -e '/' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'/' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 /' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test division by zero
EXPECTED="Cannot divide by zero"
ACTUAL=$("$PROGRAM" -e '5 0 /' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

21
tests/test_divmod Normal file
View File

@ -0,0 +1,21 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED_X="1"
EXPECTED_Y="2"
read -r ACTUAL_X ACTUAL_Y <<< $(dc -e '15 7 ~ p R p' | tr '\n' ' ')
assert_eq "$EXPECTED_X" "$ACTUAL_X"
assert_eq "$EXPECTED_Y" "$ACTUAL_Y"
# Test empty stack
EXPECTED="'~' requires two operands"
ACTUAL="$(dc -e '~' 2>&1)" || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'~' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 ~' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

19
tests/test_exp Normal file
View File

@ -0,0 +1,19 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="25"
ACTUAL=$("$PROGRAM" -e '5 2 ^ p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'^' requires two operands"
ACTUAL=$("$PROGRAM" -e '^' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'^' requires numeric values"
ACTUAL=$("$PROGRAM" -e '5 [ foo ] ^' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

24
tests/test_mod Normal file
View File

@ -0,0 +1,24 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="1"
ACTUAL=$("$PROGRAM" -e '6 5 % p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'%' requires two operands"
ACTUAL=$("$PROGRAM" -e '%' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'%' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 %' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test division by zero
EXPECTED="Cannot divide by zero"
ACTUAL=$("$PROGRAM" -e '5 0 %' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

19
tests/test_modexp Normal file
View File

@ -0,0 +1,19 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="445"
ACTUAL=$("$PROGRAM" -e '4 13 497 | p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'|' requires three operands"
ACTUAL=$("$PROGRAM" -e '|' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'|' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 4 |' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

20
tests/test_mul Normal file
View File

@ -0,0 +1,20 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="18"
ACTUAL=$("$PROGRAM" -e '6 3 * p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'*' requires two operands"
ACTUAL=$("$PROGRAM" -e '*' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'*' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 *' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

20
tests/test_sub Normal file
View File

@ -0,0 +1,20 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="-1"
ACTUAL=$("$PROGRAM" -e '-5 -4 - p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'-' requires two operands"
ACTUAL=$("$PROGRAM" -e '-' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'-' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 -' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

20
tests/test_sum Normal file
View File

@ -0,0 +1,20 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="9"
ACTUAL=$("$PROGRAM" -e '5 4 + p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="'+' requires two operands"
ACTUAL=$("$PROGRAM" -e '+' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="'+' requires numeric values"
ACTUAL=$("$PROGRAM" -e '[ foo ] 5 +' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

80
utest.sh Executable file
View File

@ -0,0 +1,80 @@
#!/bin/sh -e
# μTest: modular testing framework written in POSIX sh
# Developed by Marco Cetica 2024 <email@marcocetica.com
#
### Assert functions ###
assert_eq() {
[ "$1" = "$2" ] && return 0;
printf "Assertion failed('%s == %s')\n" "$1" "$2"
return 1
}
assert_neq() {
[ "$1" != "$2" ] && return 0;
printf "Assertion failed('%s != %s')\n" "$1" "$2"
return 1
}
assert_t() {
assert_eq "$1" true
return "$?"
}
assert_f() {
assert_eq "$1" false
return "$?"
}
assert_gt() {
[ "$1" -gt "$2" ] && return 0;
printf "Assertion failed('%s > %s')\n" "$1" "$2"
return 1
}
assert_ge() {
[ "$1" -ge "$2" ] && return 0;
printf "Assertion failed('%s >= %s')\n" "$1" "$2"
return 1
}
assert_lt() {
[ "$1" -lt "$2" ] && return 0;
printf "Assertion failed('%s < %s')\n" "$1" "$2"
return 1
}
assert_le() {
[ "$1" -le "$2" ] && return 0;
printf "Assertion failed('%s <= %s')\n" "$1" "$2"
return 1
}
######
# Check whether tests directory is specified and exists
[ "$#" -ne 1 ] && { echo "Specify tests directory"; exit 1; } || TESTS_DIR="$1"
[ ! -d "$TESTS_DIR" ] && { echo "'$TESTS_DIR' directory not found"; exit 1; }
# Count number of test files
count_files() { echo "$#"; }
NUM_TESTS=$(count_files "$TESTS_DIR"/test_*)
IDX=1
# Execute all tests from $TESTS_DIR in ascending order
for test_file in $(printf "%s\n" "$TESTS_DIR"/test_* | sort -n -t '_' -k 2); do
if [ -f "$test_file" ]; then
printf "[%s/%s] - Running '%s'...\n" "$IDX" "$NUM_TESTS" "$test_file"
# shellcheck source=tests/test_1
. "$test_file"
utest
IDX=$((IDX+1))
fi
done
# vim: ts=4 sw=4 softtabstop=4 expandtab: