From ecf0ed40119116755e163ca8f20e37e279286082 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 6 May 2019 18:54:40 +1000 Subject: [PATCH] oceani-tests: add tests for various type errors. Now we have test coverage for all tok_err and type_err calls, and have exceeded 85% total. Signed-off-by: NeilBrown --- csrc/oceani-tests.mdc | 114 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index d0b1419..bd40b2d 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -68,7 +68,7 @@ arguments separated from the name by commas. For each test, there is a section @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage @ awk '/^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \ END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \ - if (ran < (ran + skip) *0.8) exit(1) }' \ + if (ran < (ran + skip) *0.85) exit(1) }' \ coverage/oceani.mdc.gcov @rm -f .tmp* @@ -453,6 +453,9 @@ separate file first, then run from there. zzsize := 4 zz:[zzsize]string // size must be constant, use ::= + // These numbers should be bad in all contexts: FIXME + aa:[00123]number + ###### output: tokerr .tmp.code:3:13: error: unsupported number suffix: 1i .tmp.code:4:11: error: unsupported number suffix: 2i @@ -466,6 +469,115 @@ separate file first, then run from there. .tmp.code:14:11: error: undefined type: unknown .tmp.code:15:12: error: name undeclared: unknowable .tmp.code:17:12: error: array size must be a constant: zzsize + .tmp.code:20:12: error: unrecognised number: 00123 + +## Tests for type errors + +Type error don't cause parsing to abort, so we can fit many in the +one test program. Some type errors are found during the parse, others +during type analysis which doesn't run if parsing failed. So we cannot +fit everything in one. + +These programs were generated by looking for the +various places that `type_err()` are called. + +###### test list + oceani_failing_tests += type_err1 type_err2 type_err3 + +###### test: type_err1 + + program: + print "hello" ++ 5, 5 ++ "hello" + + b ::= 3 + b = b + 1 + + if 3 * 4 and not True: print "Weird" + +###### output: type_err1 + .tmp.code:3:25: error: expected string found number + .tmp.code:3:28: error: expected string found number + .tmp.code:6:8: error: Cannot assign to a constant: b + .tmp.code:5:8: info: name was defined as a constant here + .tmp.code:6:8: error: Cannot assign to a constant: b + .tmp.code:5:8: info: name was defined as a constant here + .tmp.code:8:11: error: Arithmetic returns number but Boolean expected + oceani: type error in program - not running. + +###### test: type_err2 + + program: + a := 1 + a := 2 + a ::= 3 + a:number = 4 + a ::number = 5 + c: + +###### output: type_err2 + .tmp.code:4:8: error: variable 'a' redeclared + .tmp.code:3:8: info: this is where 'a' was first declared + .tmp.code:5:8: error: variable 'a' redeclared + .tmp.code:3:8: info: this is where 'a' was first declared + .tmp.code:6:8: error: variable 'a' redeclared + .tmp.code:3:8: info: this is where 'a' was first declared + .tmp.code:7:8: error: variable 'a' redeclared + .tmp.code:3:8: info: this is where 'a' was first declared + .tmp.code:8:8: Variable declared with no type or value: c + +###### test: type_err3 + + program: + c := "hello" + c = c + 1 + c = "hello" ++ (True and False) + c = 4 < 5 + print 45 + ( "Hello" ++ "there") + c[5] = 1 + + while: + use 1 + use True + use "Hello" + do: + print + case 1: print "one" + case "Hello": print "Hello" + + a1:[5]number; a2:[5]number; a3:[10]number; a4:[5]string + a1 = a2 + a1 = a3 + a1 = a4 + a1[2] = "hello" + a4[1] = True + c = a2[3] + +###### output: type_err3 + .tmp.code:4:12: error: expected number but variable 'c' is string + .tmp.code:3:8: info: this is where 'c' was set to string + .tmp.code:4:12: error: Arithmetic returns number but string expected + .tmp.code:3:8: info: variable 'c' was set as string here. + .tmp.code:5:24: error: Boolean operation found where string expected + .tmp.code:6:12: error: Comparison returns Boolean but string expected + .tmp.code:3:8: info: variable 'c' was set as string here. + .tmp.code:7:21: error: Concat returns string but number expected + .tmp.code:8:8: error: string cannot be indexed + .tmp.code:8:8: error: string cannot be indexed + .tmp.code:17:13: error: expected number found string + .tmp.code:13:16: error: expected number, found string + .tmp.code:20:8: error: cannot assign value of type [5]number + .tmp.code:21:13: error: expected [5]number but variable 'a3' is [10]number + .tmp.code:19:36: info: this is where 'a3' was set to [10]number + .tmp.code:21:8: error: cannot assign value of type [5]number + .tmp.code:22:13: error: expected [5]number but variable 'a4' is [5]string + .tmp.code:19:51: info: this is where 'a4' was set to [5]string + .tmp.code:22:8: error: cannot assign value of type [5]number + .tmp.code:23:16: error: expected number found string + .tmp.code:24:16: error: expected string found Boolean + .tmp.code:25:12: error: have number but need string + .tmp.code:3:8: info: variable 'c' was set as string here. + oceani: type error in program - not running. + ## Test erroneous command line args -- 2.43.0