Compare commits
12 Commits
2bfe01232f
...
d6c54436f5
Author | SHA1 | Date |
---|---|---|
Marco Cetica | d6c54436f5 | |
Marco Cetica | 748956622e | |
Marco Cetica | 62ccddafc9 | |
Marco Cetica | 2f6abbec69 | |
Marco Cetica | 24b26d2154 | |
Marco Cetica | 7e7c4c08d6 | |
Marco Cetica | 5d65d4f3b1 | |
Marco Cetica | e61a7debfa | |
Marco Cetica | f7932f9566 | |
Marco Cetica | beee6a98d0 | |
Marco Cetica | f2292c2598 | |
Marco Cetica | 51777de716 |
|
@ -16,3 +16,6 @@ jobs:
|
|||
mkdir build && cd build
|
||||
cmake ..
|
||||
make
|
||||
- name: Run unit tests
|
||||
run: |
|
||||
./utest.sh tests
|
||||
|
|
|
@ -15,3 +15,6 @@ jobs:
|
|||
mkdir build && cd build
|
||||
cmake ..
|
||||
make
|
||||
- name: Run unit tests
|
||||
run: |
|
||||
./utest.sh tests
|
||||
|
|
|
@ -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
2
man.md
|
@ -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.
|
||||
|
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
Loading…
Reference in New Issue