X-Git-Url: https://ocean-lang.org/code/?a=blobdiff_plain;f=csrc%2Foceani-tests.mdc;h=a10d0271fab3291f8251de230891ad1c3312b07e;hb=4477bdf961f98ec3143743684eafba45a2e29287;hp=10a3b709daa49c5bc92122ee1d3eb0820561b285;hpb=4b606ddde48d77e17516373af8dc852df3b26651;p=ocean diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index 10a3b70..a10d027 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -38,32 +38,30 @@ arguments separated from the name by commas. For each test, there is a section tests:: oceani_test_suite oceani_test_suite: oceani coverage_oceani - @./parsergen --report --LR1 --tag Parser oceani.mdc | grep " - no conflicts" > /dev/null || \ - { echo "Grammar container conflicts, please review" ; exit 1; } + @echo -n Checking grammar ... + @./parsergen --report --LALR --tag Parser oceani.mdc | grep " - no conflicts" > /dev/null || \ + { echo "Grammar contains conflicts, please review" ; exit 1; } + @echo ok @rm -rf coverage; mkdir -p coverage @cp *.gcno coverage @for T in $(oceani_tests); do \ - echo -n "Test $$T ... "; \ + echo -n "Test $$T.. "; \ i="$$IFS"; IFS=,; set $$T; IFS="$$i"; t=$$1; shift; \ ./md2c oceani-tests.mdc "output: $$T" | grep -v '^#' > .tmp.want; \ ./oceani --section "test: $$t" oceani-tests.mdc $${1+"$$@"} > .tmp.have; \ if ! cmp -s .tmp.want .tmp.have; then \ echo "FAILED"; diff -u .tmp.want .tmp.have ; exit 1; fi ;\ - echo -n "passed ... "; \ - if ! valgrind --error-exitcode=1 --log-file=.tmp.valg ./oceani --section "test: $$t" oceani-tests.mdc $${1+"$$@"} \ - > /dev/null 2>&1 ; then \ - echo "valgrind FAILED"; cat .tmp.valg; exit 1; fi ; \ - if grep 'LEAK SUMMARY' .tmp.valg > /dev/null; then \ - echo "valgrind found LEAKS"; cat .tmp.valg ; exit 1 ; fi; \ - if grep 'in use at exit [1-9]' .tmp.valg > /dev/null; then \ - echo "valgrind found memory in use at exit"; cat .tmp.valg ; exit 1 ; fi; \ - echo -n "valgrind passed ... "; \ + echo -n "printing.. "; \ echo '``````' > .tmp.code1; echo '``````' > .tmp.code2 ;\ ./oceani --noexec --print --section "test: $$t" oceani-tests.mdc >> .tmp.code1; \ ./oceani --noexec --print .tmp.code1 >> .tmp.code2 ;\ if ! cmp -s .tmp.code1 .tmp.code2; then \ - echo "Printing Failed"; diff -u .tmp.code1 .tmp.code2; exit1 ; fi ; \ - echo "Printing passed"; \ + echo " Failed"; diff -u .tmp.code1 .tmp.code2; exit 1 ; fi ; \ + echo -n "exec-after-print.. "; \ + ./oceani .tmp.code1 $${1+"$$@"} > .tmp.have ; \ + if ! cmp -s .tmp.want .tmp.have; then \ + echo " FAILED"; diff -u .tmp.want .tmp.have; exit 1;fi; \ + echo " all passed"; \ ./coverage_oceani --print --section "test: $$t" oceani-tests.mdc $${1+"$$@"} > /dev/null ; \ ./coverage_oceani -tpbn --section "test: $$t" oceani-tests.mdc > /dev/null 2>&1; \ done @@ -74,10 +72,23 @@ arguments separated from the name by commas. For each test, there is a section @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage @ awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \ END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \ - if (ran < (ran + skip) *0.93) exit(1) }' \ + if (ran < (ran + skip) *0.94) exit(1) }' \ coverage/oceani.mdc.gcov @rm -f .tmp* + @for T in $(oceani_tests); do \ + echo -n "Valgrind $$T.. "; \ + i="$$IFS"; IFS=,; set $$T; IFS="$$i"; t=$$1; shift; \ + if ! valgrind --error-exitcode=1 --log-file=.tmp.valg ./oceani --section "test: $$t" oceani-tests.mdc $${1+"$$@"} \ + > /dev/null 2>&1 ; then \ + echo "FAILED"; cat .tmp.valg; exit 1; fi ; \ + if grep 'LEAK SUMMARY' .tmp.valg > /dev/null; then \ + echo "valgrind found LEAKS"; cat .tmp.valg ; exit 1 ; fi; \ + if grep 'in use at exit [1-9]' .tmp.valg > /dev/null; then \ + echo "valgrind found memory in use at exit"; cat .tmp.valg ; exit 1 ; fi; \ + echo " passed"; \ + done + coverage_oceani: oceani.c $(CC) $(CFLAGS) --coverage -fprofile-dir=coverage -o coverage_oceani oceani.c $(LDLIBS) @@ -89,7 +100,6 @@ calculations on them. ###### test list oceani_tests += "valvar" - ###### test: valvar program: @@ -106,6 +116,13 @@ calculations on them. aconst :: string = "unchanging" + // Check wrapping + print + a + b + + (a*2) + + b1 + + b + ###### output: valvar 23 12 35 11 276 1.91667 11 @@ -113,6 +130,7 @@ calculations on them. 23 12 12 -23 -12 12 False True True False False False This is a string field theory This is a string field theory + 81 Next we change the value of variables @@ -138,7 +156,7 @@ Now some contants ###### test: consts const: - pi ::= 3.1415926 + pi ::= 3.141 592 653 four ::= 2 + 2 ; five ::= 10/2 const pie ::= "I like Pie"; cake ::= "The cake is" @@ -154,6 +172,27 @@ Now some contants are there 5 ? 3.14159 I like Pie but The cake is a lie +Test merging of variables from multiple cases + +###### test list + oceani_tests += varmerge + +###### test: varmerge + + program: + for i:=0; then i=i+1; while i < 5: + switch i + case 0: num:="zero" + case 1: num:="one" + case 2: num:="two" + case 3: num:="three" + else: num:="many" + print num,", ", + print + +###### output: varmerge + zero , one , two , three , many , + ## Conditions and Loops Now we need to test if/else and some different loops @@ -217,12 +256,12 @@ The demonstration code presented in the interpreted is suitable for the test sui Here I break it into two parts, keeping the array code separate. ###### test list - oceani_tests += "sayhello,55,33" - oceani_tests += "sayhello,12,60" + oceani_tests += "sayhello,55,33,hello,True" + oceani_tests += "sayhello,12,60,there,False" ###### test: sayhello - program A B: + program A B astr bbool: print "Hello World, what lovely oceans you have!" /* When a variable is defined in both branches of an 'if', * and used afterwards, the variables are merged. @@ -269,6 +308,11 @@ Here I break it into two parts, keeping the array code separate. f2 = f3 print "" + if bbool: + print astr ++ " was the str" + else: + print "I found the str over " ++ astr + /* Binary search... */ for: lo:= 0; hi := 100 @@ -290,20 +334,22 @@ Here I break it into two parts, keeping the array code separate. case GiveUp: print "Closest I found was", mid -###### output: sayhello,55,33 +###### output: sayhello,55,33,hello,True Hello World, what lovely oceans you have! Is 55 bigger than 33 ? yes double 33 is 66 GCD of 55 and 33 is 11 Fibonacci: 1 1 2 3 5 8 13 21 34 55 89 144 + hello was the str Closest I found was 77.3438 -###### output: sayhello,12,60 +###### output: sayhello,12,60,there,False Hello World, what lovely oceans you have! Is 12 bigger than 60 ? no double 60 is 120 GCD of 12 and 60 is 12 Fibonacci: 1 1 2 3 5 8 13 21 34 55 89 144 + I found the str over there Closest I found was 77.3438 ###### test list @@ -312,7 +358,7 @@ Here I break it into two parts, keeping the array code separate. program: size::=55 list:[size]number - list[0] = 1234 + list[0] = 1_234 for i:=1; then i = i + 1; while i < size: n := list[i-1] * list[i-1] list[i] = (n / 100) % 10000 @@ -469,6 +515,46 @@ ad-hoc things array related. ###### output: arrays False True False False False +## Structures + +Time to test if structure declarations and accesses work correctly. + +###### test list + oceani_tests += structs + +###### test: structs + + struct foo: + size:[3]number + name:string + active:Boolean + + struct baz { a:number; b:Boolean; } + + program: + info:[4]foo + + for i:=0; then i=i+1; while i < 4: + switch i + case 2: nm:= "peter" + case 0: nm:= "bob" + case 1: nm:= "jane" + else: nm:= "janine" + + info[i].name = nm + info[i].size[0] = i*i + info[i].active = nm == "jane" + + for i:=0; then i=i+1; while i < 4: + print info[i].name, info[i].active, info[i].size[0] + +###### output: structs + + bob False 0 + jane True 1 + peter False 4 + janine False 9 + ## Test code with syntax errors Syntax errors aren't handled well yet - the result is almost always a @@ -509,8 +595,7 @@ separate file first, then run from there. if then else while do ###### output: syn1 - .tmp.code:3:11: error: unhandled parse error: then - oceani: no program found. + .tmp.code:3:11: Syntax error in statement: then ###### test: tokerr program: @@ -604,6 +689,10 @@ various places that `type_err()` are called. ###### test: type_err3 + struct foo: + a: number + b:string = "hello" + program: c := "hello" c = c + 1 @@ -629,30 +718,37 @@ various places that `type_err()` are called. a4[1] = True c = a2[3] + bar:foo + foo.c = 43 + print c.foo + ###### 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. + .tmp.code:8:12: error: expected number but variable 'c' is string + .tmp.code:7:8: info: this is where 'c' was set to string + .tmp.code:8:12: error: Arithmetic returns number but string expected + .tmp.code:7:8: info: variable 'c' was set as string here. + .tmp.code:9:24: error: Boolean operation found where string expected + .tmp.code:10:12: error: Comparison returns Boolean but string expected + .tmp.code:7:8: info: variable 'c' was set as string here. + .tmp.code:11:21: error: Concat returns string but number expected + .tmp.code:12:8: error: string cannot be indexed + .tmp.code:12:8: error: string cannot be indexed + .tmp.code:21:13: error: expected number found string + .tmp.code:17:16: error: expected number, found string + .tmp.code:24:8: error: cannot assign value of type [5]number + .tmp.code:25:13: error: expected [5]number but variable 'a3' is [10]number + .tmp.code:23:36: info: this is where 'a3' was set to [10]number + .tmp.code:25:8: error: cannot assign value of type [5]number + .tmp.code:26:13: error: expected [5]number but variable 'a4' is [5]string + .tmp.code:23:51: info: this is where 'a4' was set to [5]string + .tmp.code:26:8: error: cannot assign value of type [5]number + .tmp.code:27:16: error: expected number found string + .tmp.code:28:16: error: expected string found Boolean + .tmp.code:29:12: error: have number but need string + .tmp.code:7:8: info: variable 'c' was set as string here. + .tmp.code:32:8: error: field reference attempted on label, not a struct + .tmp.code:32:16: error: expected none found number + .tmp.code:33:14: error: field reference attempted on string, not a struct oceani: type error in program - not running. ###### test: type_err4 @@ -698,9 +794,8 @@ various places that `type_err()` are called. print foo, bar ###### output: type_err_const1 - .tmp.code:3:12: error: unhandled parse error: : - oceani: no program found. - + .tmp.code:3:12: Syntax error in constant: : + .tmp.code:4:8: Syntax error in constant: bar ## Test erroneous command line args @@ -724,7 +819,6 @@ command list possible. ./coverage_oceani $${1+"$$@"} > /dev/null 2>&1 ;\ done || true - ###### test list oceani_special_tests += "cmd" oceani_special_tests += "cmd,-zyx" @@ -747,4 +841,3 @@ command list possible. ###### output: cmd,--section,toast:nothing,oceani-tests.mdc oceani: cannot find section toast:nothing -