]> ocean-lang.org Git - ocean/blobdiff - csrc/oceani-tests.mdc
tests: restore coverage testing.
[ocean] / csrc / oceani-tests.mdc
index dfb753df6b900abb4fb5e78df710169b8ab6c879..87a7aa99a548b876a4ef5962b446d03f0ec74800 100644 (file)
@@ -38,8 +38,10 @@ 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 \
@@ -52,9 +54,16 @@ arguments separated from the name by commas.  For each test, there is a section
                    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 ;\
+                   ./oceani --noexec --print .tmp.code1 >> .tmp.code2 || exit 1;\
                    if ! cmp -s .tmp.code1 .tmp.code2; then \
                       echo " Failed"; diff -u .tmp.code1 .tmp.code2; exit 1 ; fi ; \
+                   echo -n "extra-newlines.. "; \
+                   sed -e 'i\
+                   ' .tmp.code1 > .tmp.code1a; \
+                   echo '``````' > .tmp.code2a ;\
+                   ./oceani --noexec --print .tmp.code1a >> .tmp.code2a || exit 1;\
+                   if ! cmp -s .tmp.code1 .tmp.code2a; then \
+                      echo " Failed"; diff -u .tmp.code1 .tmp.code2a; exit 1; fi ; \
                    echo -n "exec-after-print.. "; \
                    ./oceani .tmp.code1 $${1+"$$@"} > .tmp.have ; \
                    if ! cmp -s .tmp.want .tmp.have; then \
@@ -66,8 +75,9 @@ arguments separated from the name by commas.  For each test, there is a section
 
                ## test code
 
+               @for i in coverage/#*.gcda; do mv $$i coverage/$${i##*#}; done
                @gcov -o coverage oceani.mdc > /dev/null 2> /dev/null
-               @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage
+               @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage || true
                @ awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \
                    END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \
                         if (ran < (ran + skip) *0.94) exit(1) }' \
@@ -98,7 +108,6 @@ calculations on them.
 ###### test list
        oceani_tests += "valvar"
 
-
 ###### test: valvar
 
        program:
@@ -115,6 +124,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
@@ -122,6 +138,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
 
@@ -147,7 +164,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"
@@ -226,6 +243,16 @@ Now we need to test if/else and some different loops
                        print "Close enough"
                print "lower" if 355/113 < pi else "higher"
 
+               if pi > 3 then print "pi exceeds three"; else print "need more pie"
+               if (pi < 3) { print "not enough pi" } else { print "pi sufficient" }
+               for { i := 0; sum := 0 }
+               then { i = i+1 }
+               while i <= 10:
+                       sum = sum + i
+               else:
+                       pass
+                       print "sum 1..10 is", sum
+
 ###### output: cond_loop
        Success
         1 2 4 8 16 32 64
@@ -240,6 +267,9 @@ Now we need to test if/else and some different loops
        I won't calculate 20 / 9
        Close enough
        higher
+       pi exceeds three
+       pi sufficient
+       sum 1..10 is 55
 
 ## Say Hello
 
@@ -349,7 +379,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
@@ -586,8 +616,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:
@@ -738,7 +767,8 @@ various places that `type_err()` are called.
        .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:8: error: variable used but not declared: foo
+       .tmp.code:32:8: error: field reference attempted on none, 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.
@@ -749,12 +779,9 @@ various places that `type_err()` are called.
                print a, b, c
 
 ###### output: type_err4
-       .tmp.code:3:14: error: expected *unknown*type* (labels not permitted) but variable 'b' is label
-       .tmp.code:3:14: info: this is where 'b' was set to label
-       .tmp.code:3:16: error: expected label found number
-       .tmp.code:3:14: info: variable 'b' was set as label here.
-       .tmp.code:4:17: error: expected *unknown*type* (labels not permitted) but variable 'b' is label
-       .tmp.code:3:14: info: this is where 'b' was set to label
+       .tmp.code:3:14: error: variable used but not declared: b
+       .tmp.code:3:16: error: expected none found number
+       .tmp.code:3:14: info: variable 'b' was set as none here.
        oceani: type error in program - not running.
 
 ###### test list
@@ -786,9 +813,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:12: Syntax error in constant: :
 
 ## Test erroneous command line args
 
@@ -812,7 +838,6 @@ command list possible.
            ./coverage_oceani $${1+"$$@"} > /dev/null 2>&1 ;\
        done || true
 
-
 ###### test list
        oceani_special_tests += "cmd"
        oceani_special_tests += "cmd,-zyx"