From c146cab6c123aa74cf5251241e62f6d5538e2207 Mon Sep 17 00:00:00 2001 From: David Brown Date: Sat, 16 Jul 2016 18:29:51 +0100 Subject: [PATCH] Add tests for ASH, SYSTEM.LSH and SYSTEM.ROT. --- makefile | 7 ++ src/test/confidence/language/TestLanguage.mod | 101 ++++++++++++++++++ src/test/confidence/language/expected | 1 + src/test/confidence/language/test.sh | 5 + .../confidence/language/updateassertions.pl | 16 +++ src/tools/make/vishap.make | 1 + 6 files changed, 131 insertions(+) create mode 100644 src/test/confidence/language/TestLanguage.mod create mode 100644 src/test/confidence/language/expected create mode 100644 src/test/confidence/language/test.sh create mode 100644 src/test/confidence/language/updateassertions.pl diff --git a/makefile b/makefile index 076a2218..811ecefc 100644 --- a/makefile +++ b/makefile @@ -192,6 +192,13 @@ uninstall: configuration +# confidence: Run a set of confidence tests +confidence: configuration + @make -f src/tools/make/vishap.make -s confidence + + + + # --- Bootstrap C source generation and reversion --- diff --git a/src/test/confidence/language/TestLanguage.mod b/src/test/confidence/language/TestLanguage.mod new file mode 100644 index 00000000..11aa3f5d --- /dev/null +++ b/src/test/confidence/language/TestLanguage.mod @@ -0,0 +1,101 @@ +MODULE TestLanguage; + +IMPORT SYSTEM, Console; + +PROCEDURE Shift; +VAR c: CHAR; b: SYSTEM.BYTE; s,t,u: SHORTINT; h,i,j,k: INTEGER; l,m,n: LONGINT; +(* + Aritmetic shift always returns type LONGINT. Defined as x * 2**n. + LSH and ROT produces results of the same type as the value being shifted. +*) +BEGIN + (* Positive LSH shifts and ROTs without overflow *) + + i := 0; m := 1; + WHILE i < SIZE(LONGINT)*8 DO + l := 1; l := SYSTEM.LSH(l,i); ASSERT(l = m, 16); + l := 1; l := SYSTEM.ROT(l,i); ASSERT(l = m, 17); + m := m * 2; INC(i); + END; + + i := 0; k := 1; + WHILE i < SIZE(INTEGER)*8 DO + j := 1; j := SYSTEM.LSH(j,i); ASSERT(j = k, 23); + j := 1; j := SYSTEM.ROT(j,i); ASSERT(j = k, 24); + k := k * 2; INC(i); + END; + + i := 0; t := 1; + WHILE i < SIZE(SHORTINT)*8 DO + s := 1; s := SYSTEM.LSH(s,i); ASSERT(s = t, 30); + s := 1; s := SYSTEM.ROT(s,i); ASSERT(s = t, 31); + t := t * 2; INC(i); + END; + + (* Negative LSH shifts and ROTs without overflow *) + + i := -1; m := 1; m := SYSTEM.LSH(m, SIZE(LONGINT)*8 - 2); n := m*2; + WHILE i > -SIZE(LONGINT)*8 DO + l := n; l := SYSTEM.LSH(l,i); ASSERT(l = m, 39); + l := n; l := SYSTEM.ROT(l,i); ASSERT(l = m, 40); + m := m DIV 2; DEC(i); + END; + + i := -1; k := 1; k := SYSTEM.LSH(k, SIZE(INTEGER)*8 - 2); h := k*2; + WHILE i > -SIZE(INTEGER)*8 DO + j := h; j := SYSTEM.LSH(j,i); ASSERT(j = k, 46); + j := h; j := SYSTEM.ROT(j,i); ASSERT(j = k, 47); + k := k DIV 2; DEC(i); + END; + + i := -1; t := 1; t := SYSTEM.LSH(t, SIZE(SHORTINT)*8 - 2); u := t*2; + WHILE i > -SIZE(SHORTINT)*8 DO + s := u; s := SYSTEM.LSH(s,i); ASSERT(s = t, 53); + s := u; s := SYSTEM.ROT(s,i); ASSERT(s = t, 54); + t := t DIV 2; DEC(i); + END; + + (* Positive ASHs of a negative number *) + + i := 0; m := 1; m := SYSTEM.LSH(m, SIZE(LONGINT)*8 - 1); n := m; + WHILE i > -SIZE(LONGINT)*8 DO + l := n; l := ASH(l,i); ASSERT(l = m, 62); + m := m DIV 2; DEC(i); + END; + + i := 0; j := 1; j := SYSTEM.LSH(j, SIZE(INTEGER)*8 - 1); k := j; + WHILE i > -SIZE(INTEGER)*8 DO + l := ASH(j,i); ASSERT(l = LONG(k), 68); + k := k DIV 2; DEC(i); + END; + + i := 0; s := 1; s := SYSTEM.LSH(s, SIZE(SHORTINT)*8 - 1); t := s; + WHILE i > -SIZE(SHORTINT)*8 DO + l := ASH(s,i); ASSERT(l = LONG(LONG(t)), 74); + t := t DIV 2; DEC(i); + END; + + (* Positive ASHs of a positive number *) + + i := 0; m := 1; m := SYSTEM.LSH(m, SIZE(LONGINT)*8 - 2); n := m; + WHILE i > 1-SIZE(LONGINT)*8 DO + l := n; l := ASH(l,i); ASSERT(l = m, 82); + m := m DIV 2; DEC(i); + END; + + + + (* Also need tests that bits that are shifted / rotated off the end + are zeroed or wrapped correctly. *) + + (* Also need full tests for CHAR, and poossibly SYSTEM.BYTE. Here's a simple one *) + + c := 1X; c := SYSTEM.LSH(c,2); c := SYSTEM.ROT(c,-2); ASSERT(c=1X, 93); + b := 1; b := SYSTEM.LSH(b,2); b := SYSTEM.ROT(b,-2); ASSERT(SYSTEM.VAL(INTEGER,b)=1, 94); + +END Shift; + +BEGIN + Shift; + Console.String("Language tests successful."); Console.Ln; +END TestLanguage. diff --git a/src/test/confidence/language/expected b/src/test/confidence/language/expected new file mode 100644 index 00000000..041933c1 --- /dev/null +++ b/src/test/confidence/language/expected @@ -0,0 +1 @@ +Language tests successful. diff --git a/src/test/confidence/language/test.sh b/src/test/confidence/language/test.sh new file mode 100644 index 00000000..18d8e9cf --- /dev/null +++ b/src/test/confidence/language/test.sh @@ -0,0 +1,5 @@ +. ../testenv.sh +# Generate mixed source and assembly code listing +voc TestLanguage.mod -m +./TestLanguage >result +. ../testresult.sh diff --git a/src/test/confidence/language/updateassertions.pl b/src/test/confidence/language/updateassertions.pl new file mode 100644 index 00000000..70b8063f --- /dev/null +++ b/src/test/confidence/language/updateassertions.pl @@ -0,0 +1,16 @@ +#!perl -w +use strict; +use warnings; + +my ($fn) = @ARGV; + +open MOD,$fn // die "Could not open $fn."; +while () { + if (/^(.*)ASSERT\((.*?)(, +[0-9]+)\)(.*$)/) { + print $1, "ASSERT($2, $.)", $4, "\n"; + } else { + print $_; + } +} + +close MOD; diff --git a/src/tools/make/vishap.make b/src/tools/make/vishap.make index ac7b5b24..818e96f4 100644 --- a/src/tools/make/vishap.make +++ b/src/tools/make/vishap.make @@ -377,6 +377,7 @@ sourcechanges: confidence: @printf "\n\n--- Confidence tests ---\n\n" cd src/test/confidence/hello; ./test.sh "$(INSTALLDIR)" + cd src/test/confidence/language; ./test.sh "$(INSTALLDIR)" if [ "$(PLATFORM)" != "windows" ] ; then cd src/test/confidence/signal; ./test.sh "$(INSTALLDIR)"; fi cd src/test/confidence/lola; ./test.sh "$(INSTALLDIR)" cd src/test/confidence/arrayassignment; ./test.sh "$(INSTALLDIR)"