Merge branch 'unit_testing'
dc / build (push) Failing after 36s Details

This commit is contained in:
Marco Cetica 2024-03-01 10:33:04 +01:00
commit d6c54436f5
Signed by: marco
GPG Key ID: 45060A949E90D0FD
45 changed files with 832 additions and 1 deletions

View File

@ -16,3 +16,6 @@ jobs:
mkdir build && cd build
cmake ..
make
- name: Run unit tests
run: |
./utest.sh tests

View File

@ -15,3 +15,6 @@ jobs:
mkdir build && cd build
cmake ..
make
- name: Run unit tests
run: |
./utest.sh tests

View File

@ -83,6 +83,13 @@ $> sudo pacman -U dc-<VERSION>-1-x86_64.pkg.tar.zst
You can find the binaries on the release page or on the `bin` folder
of this repository.
## Unit tests
This repository as well as the CI pipeline provides unit tests for the
program's features. To run them, issue the following command:
```sh
$> ./utest.sh tests
```
## Usage
dc can be used in three different ways:

2
man.md
View File

@ -295,7 +295,7 @@ The previous of the register becomes inaccessible, thus it follows the LIFO poli
**L**`r`
Pop the value off the top of register _r_'s stack and push it onto the main stack. The previous value in register _r_'s stack, if any,
is now accessible via the **b**r command.
is now accessible via the **l**r command.
## Register(Array)
Arrays support random access through an index. You can store a value in an array and retrieve it later.

19
tests/test_acos Normal file
View File

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

19
tests/test_asin Normal file
View File

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

19
tests/test_atan Normal file
View File

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

10
tests/test_clear Normal file
View File

@ -0,0 +1,10 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="Cannot print empty stack"
ACTUAL=$("$PROGRAM" -e '5 4 c p' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

19
tests/test_cos Normal file
View File

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

21
tests/test_count_digits Normal file
View File

@ -0,0 +1,21 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="4"
ACTUAL=$("$PROGRAM" -e '5430 Z p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test with floats
PROGRAM="$PWD/build/dc"
EXPECTED="4"
ACTUAL=$("$PROGRAM" -e '54.30 Z p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test with strings
PROGRAM="$PWD/build/dc"
EXPECTED="11"
ACTUAL=$("$PROGRAM" -e '[ Hello World ] Z p')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

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:

9
tests/test_dump Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="25 20 15 10 5"
ACTUAL=$("$PROGRAM" -e '5 10 15 20 25 f' | tr '\n' ' ' | sed 's/ $/\n/')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_dup Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="2"
ACTUAL=$("$PROGRAM" -e '5 d z p')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_e Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="2.718281828459045"
ACTUAL=$("$PROGRAM" -e '15 k e p')
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:

19
tests/test_fact Normal file
View File

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

19
tests/test_fix Normal file
View File

@ -0,0 +1,19 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="3.14159"
ACTUAL=$("$PROGRAM" -e '5 k pi p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test default precision
EXPECTED="0"
ACTUAL=$("$PROGRAM" -e 'K p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test invalid precision
EXPECTED="Precision must be a non-negative number"
ACTUAL=$("$PROGRAM" -e '-1 k' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

21
tests/test_irdx Normal file
View File

@ -0,0 +1,21 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
# Test default input base
EXPECTED="10"
ACTUAL=$("$PROGRAM" -e 'I p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test new, valid input base
EXPECTED="10"
ACTUAL=$("$PROGRAM" -e '2 i 1010 p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test new, invalid input base
EXPECTED="Input base must be a number within the range 2-16(inclusive)"
ACTUAL=$("$PROGRAM" -e '1 i' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

31
tests/test_lreg Normal file
View File

@ -0,0 +1,31 @@
#!/bin/sh
test_load() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 sA lA p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty register
EXPECTED="0"
ACTUAL=$("$PROGRAM" -e 'lA p' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
test_uppercase_load() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 sA LA p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty register
EXPECTED="Register 'A' is undefined"
ACTUAL=$("$PROGRAM" -e 'LA' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
utest() {
test_load
test_uppercase_load
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_meq Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="24"
ACTUAL=$("$PROGRAM" -e '[ 4 ! p ] sA 0 0 =A x')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_mgeq Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="24"
ACTUAL=$("$PROGRAM" -e '[ 4 ! p ] sA 1 1 >=A x')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_mgt Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="24"
ACTUAL=$("$PROGRAM" -e '[ 4 ! p ] sA 0 1 >A x')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_mleq Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="24"
ACTUAL=$("$PROGRAM" -e '[ 4 ! p ] sA 5 5 <=A x')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_mlt Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="24"
ACTUAL=$("$PROGRAM" -e '[ 4 ! p ] sA 1 -1 <A x')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_mneq Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="24"
ACTUAL=$("$PROGRAM" -e '[ 4 ! p ] sA 0 1 !=A x')
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:

21
tests/test_ordx Normal file
View File

@ -0,0 +1,21 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
# Test default output base
EXPECTED="10"
ACTUAL=$("$PROGRAM" -e 'O p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test new, valid output base
EXPECTED="Fh"
ACTUAL=$("$PROGRAM" -e '16 o 15 p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test new, invalid output base
EXPECTED="'o' accepts either BIN, OCT, DEC or HEX bases"
ACTUAL=$("$PROGRAM" -e '9 o' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_pi Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="3.141592653589793"
ACTUAL=$("$PROGRAM" -e '15 k pi p')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

9
tests/test_pop Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 10 R p')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

95
tests/test_prt Normal file
View File

@ -0,0 +1,95 @@
#!/bin/sh
test_print() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="Cannot print empty stack"
ACTUAL=$("$PROGRAM" -e 'p' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="foo"
ACTUAL=$("$PROGRAM" -e '[ foo ] p' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
test_print_bin() {
PROGRAM="$PWD/build/dc"
EXPECTED="1111b"
ACTUAL=$("$PROGRAM" -e '15 pb')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="Cannot print empty stack"
ACTUAL=$("$PROGRAM" -e 'pb' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="This output radix requires integer values"
ACTUAL=$("$PROGRAM" -e '[ foo ] pb' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
test_print_hex() {
PROGRAM="$PWD/build/dc"
EXPECTED="Fh"
ACTUAL=$("$PROGRAM" -e '15 ph')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="Cannot print empty stack"
ACTUAL=$("$PROGRAM" -e 'ph' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="This output radix requires integer values"
ACTUAL=$("$PROGRAM" -e '[ foo ] ph' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
test_print_oct() {
PROGRAM="$PWD/build/dc"
EXPECTED="17o"
ACTUAL=$("$PROGRAM" -e '15 po')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="Cannot print empty stack"
ACTUAL=$("$PROGRAM" -e 'po' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="This output radix requires integer values"
ACTUAL=$("$PROGRAM" -e '[ foo ] po' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
test_print_no_newline() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 P')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="Cannot print empty stack"
ACTUAL=$("$PROGRAM" -e 'P' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test non numerical values
EXPECTED="foo"
ACTUAL=$("$PROGRAM" -e '[ foo ] P' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
utest() {
test_print
test_print_no_newline
test_print_bin
test_print_hex
test_print_oct
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

14
tests/test_rarr Normal file
View File

@ -0,0 +1,14 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="500"
ACTUAL=$("$PROGRAM" -e '10 d 500 r :A ;A p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="This operation requires one value"
ACTUAL=$("$PROGRAM" -e ';A' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

20
tests/test_sin Normal file
View File

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

24
tests/test_sqrt Normal file
View File

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

36
tests/test_sreg Normal file
View File

@ -0,0 +1,36 @@
#!/bin/sh
test_store() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 sA lA p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="This operation does not work on empty stack"
ACTUAL=$("$PROGRAM" -e 'sA' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
# Test auxiliary stack policy
EXPECTED="The stack of register 'A' is empty"
ACTUAL=$("$PROGRAM" -e "5 sA 6 sA LA LA" 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
test_uppercase_store() {
PROGRAM="$PWD/build/dc"
EXPECTED="6"
ACTUAL=$("$PROGRAM" -e '5 SA 6 SA lA p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="This operation does not work on empty stack"
ACTUAL=$("$PROGRAM" -e 'SA' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
utest() {
test_store
test_uppercase_store
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

15
tests/test_stack_size Normal file
View File

@ -0,0 +1,15 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="4"
ACTUAL=$("$PROGRAM" -e '5 4 3 1 z p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
PROGRAM="$PWD/build/dc"
EXPECTED="0"
ACTUAL=$("$PROGRAM" -e 'z p')
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:

9
tests/test_swap Normal file
View File

@ -0,0 +1,9 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="5"
ACTUAL=$("$PROGRAM" -e '5 10 r p')
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

19
tests/test_tan Normal file
View File

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

8
tests/test_unr Normal file
View File

@ -0,0 +1,8 @@
#!/bin/sh
utest() {
EXPECTED="Unrecognized option"
ACTUAL=$("$PROGRAM" -e '(' 2>&1) || true
assert_eq "$EXPECTED" "$ACTUAL"
}
# vim: ts=4 sw=4 softtabstop=4 expandtab:

14
tests/test_warr Normal file
View File

@ -0,0 +1,14 @@
#!/bin/sh
utest() {
PROGRAM="$PWD/build/dc"
EXPECTED="6"
ACTUAL=$("$PROGRAM" -e '5 0 :A 6 0 :A 0 ;A p')
assert_eq "$EXPECTED" "$ACTUAL"
# Test empty stack
EXPECTED="This operation requires two values"
ACTUAL=$("$PROGRAM" -e ':A' 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: