tests: add Forth tests

Modest first step
This commit is contained in:
Virgil Dupras 2020-03-19 15:43:48 -04:00
parent b335e538b4
commit f0cbda1f2e
7 changed files with 62 additions and 2 deletions

View File

@ -8,9 +8,13 @@
// in sync with glue.asm // in sync with glue.asm
#define RAMSTART 0x900 #define RAMSTART 0x900
#define STDIO_PORT 0x00 #define STDIO_PORT 0x00
// This binary is also used for automated tests and those tests, when
// failing, send a non-zero value to RET_PORT to indicate failure
#define RET_PORT 0x01
static int running; static int running;
static FILE *fp; static FILE *fp;
static int retcode = 0;
static uint8_t iord_stdio() static uint8_t iord_stdio()
{ {
@ -30,6 +34,12 @@ static void iowr_stdio(uint8_t val)
} }
} }
static void iowr_ret(uint8_t val)
{
retcode = val;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
bool tty = false; bool tty = false;
@ -61,6 +71,7 @@ int main(int argc, char *argv[])
m->ramstart = RAMSTART; m->ramstart = RAMSTART;
m->iord[STDIO_PORT] = iord_stdio; m->iord[STDIO_PORT] = iord_stdio;
m->iowr[STDIO_PORT] = iowr_stdio; m->iowr[STDIO_PORT] = iowr_stdio;
m->iowr[RET_PORT] = iowr_ret;
// initialize memory // initialize memory
for (int i=0; i<sizeof(KERNEL); i++) { for (int i=0; i<sizeof(KERNEL); i++) {
m->mem[i] = KERNEL[i]; m->mem[i] = KERNEL[i];
@ -78,5 +89,5 @@ int main(int argc, char *argv[])
emul_printdebug(); emul_printdebug();
} }
fclose(fp); fclose(fp);
return 0; return retcode;
} }

View File

@ -194,3 +194,7 @@ PC! c a -- Spit c to port a
PC@ a -- c Fetch c from port a PC@ a -- c Fetch c from port a
WORD -- a Read one word from buffered input and push its addr WORD -- a Read one word from buffered input and push its addr
There are also ascii const emitters:
LF
SPC

View File

@ -5,3 +5,6 @@
1 + 1 +
AGAIN AGAIN
; ;
: LF 10 EMIT ;
: SPC 32 EMIT ;

View File

@ -2,8 +2,9 @@ EMULDIR = ../emul
.PHONY: run .PHONY: run
run: run:
$(MAKE) -C $(EMULDIR) zasm/zasm zasm/avra runbin/runbin shell/shell $(MAKE) -C $(EMULDIR) zasm/zasm zasm/avra runbin/runbin shell/shell forth/forth
cd unit && ./runtests.sh cd unit && ./runtests.sh
cd zasm && ./runtests.sh cd zasm && ./runtests.sh
cd avra && ./runtests.sh cd avra && ./runtests.sh
cd shell && ./runtests.sh cd shell && ./runtests.sh
cd forth && ./runtests.sh

9
tests/forth/harness.fs Normal file
View File

@ -0,0 +1,9 @@
( Forth testing harness
"#" means "assert". We stop at first failure, indicating
the failure through IO on port 1 )
: fail SPC ." failed" LF 1 1 PC! BYE ;
: # SKIP? fail SPC ." pass" LF ;
: #eq 2DUP SWAP . SPC '=' EMIT SPC . '?' EMIT = # ;

27
tests/forth/runtests.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/sh -e
BASE=../..
EXEC="${BASE}/emul/forth/forth"
FDIR="${BASE}/forth"
TMP=$(mktemp)
chk() {
echo "Running test $1"
cat harness.fs $1 > ${TMP}
if ! ${EXEC} ${TMP}; then
exit 1
fi
}
if [ ! -z $1 ]; then
chk $1
exit 0
fi
# those tests run without any builtin
for fn in test_*.fs; do
chk "${fn}"
done
echo "All tests passed!"
rm ${TMP}

5
tests/forth/test_ari.fs Normal file
View File

@ -0,0 +1,5 @@
48 13 + 61 #eq
48 13 - 35 #eq
48 13 * 624 #eq
48 13 / 3 #eq
48 13 MOD 9 #eq