]> ocean-lang.org Git - ocean/blobdiff - csrc/oceani-tests.mdc
oceani: updates for new approach to parsing indents.
[ocean] / csrc / oceani-tests.mdc
index 04b9458dbf422cc4659fcc8596cba089a66043c9..e3739ed940802dd324eebc14fec1eefdc03c8be4 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:
@@ -154,8 +163,8 @@ Now some contants
        oceani_tests += "consts"
 
 ###### test: consts
-       const:
-               pi ::= 3.1415926
+       const
+               pi ::= 3.141 592 653
                four ::= 2 + 2 ; five ::= 10/2
        const pie ::= "I like Pie";
                cake ::= "The cake is"
@@ -180,12 +189,12 @@ Test merging of variables from multiple cases
 
        program:
                for i:=0; then i=i+1; while i < 5:
-                       switch i
+                       switch i:
                                case 0: num:="zero"
                                case 1: num:="one"
                                case 2: num:="two"
                                case 3: num:="three"
-                               else:   num:="many"
+                               else    num:="many"
                        print num,", ",
                print
 
@@ -205,7 +214,7 @@ Now we need to test if/else and some different loops
                a := 4
                if a < 5:
                        print "Success"
-               else:
+               else
                        print "Failure"
                for b:=1; then b=b+b; while b < 100:
                        print '', b,
@@ -213,12 +222,12 @@ Now we need to test if/else and some different loops
                // Newtons method for square root of 2
                target ::= 2
                guess := target
-               for:
+               for
                        count: number = 0
-               while:
+               while
                        current := guess * guess
                        use +(current - target) > 0.000000001
-               do:
+               do
                        guess = (guess + (target / guess) ) / 2
                        print count, guess
                        count = count + 1
@@ -227,13 +236,23 @@ Now we need to test if/else and some different loops
                for j:=0; then j = j+3 ; while j < 10:
                        if j != 0 and then 20 / j > 3:
                                print "20 /", j," =", 20 / j
-                       else:
+                       else
                                print "I won't calculate 20 /", j
                pi ::= 3.1415926535897
                if 355/113 == pi or else +(pi - 355/113) < 0.001:
                        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
@@ -248,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
 
@@ -267,7 +289,7 @@ Here I break it into two parts, keeping the array code separate.
                 */
                if A > B:
                        bigger := "yes"
-               else:
+               else
                        bigger := "no"
                print "Is", A, "bigger than", B,"? ", bigger
                /* If a variable is not used after the 'if', no
@@ -276,7 +298,7 @@ Here I break it into two parts, keeping the array code separate.
                if A > B * 2:
                        double:string = "yes"
                        print A, "is more than twice", B, "?", double
-               else:
+               else
                        double := B*2
                        print "double", B, "is", double
 
@@ -287,15 +309,15 @@ Here I break it into two parts, keeping the array code separate.
                        while a != b:
                                if a < b:
                                        b = b - a
-                               else:
+                               else
                                        a = a - b
                        print "GCD of", A, "and", B,"is", a
                else if a <= 0:
                        print a, "is not positive, cannot calculate GCD"
-               else:
+               else
                        print b, "is not positive, cannot calculate GCD"
 
-               for:
+               for
                        togo := 10
                        f1 := 1; f2 := 1
                        print "Fibonacci:", f1,f2,
@@ -309,25 +331,25 @@ Here I break it into two parts, keeping the array code separate.
 
                if bbool:
                        print astr ++ " was the str"
-               else:
+               else
                        print "I found the str over " ++ astr
 
                /* Binary search... */
-               for:
+               for
                        lo:= 0; hi := 100
                        target := 77
-               while:
+               while
                        mid := (lo + hi) / 2
                        if mid == target:
                                use Found
                        if mid < target:
                                lo = mid
-                       else:
+                       else
                                hi = mid
                        if hi - lo < 1:
                                use GiveUp
                        use True
-               do: pass
+               do pass
                case Found:
                        print "Yay, I found", target
                case GiveUp:
@@ -357,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
@@ -523,7 +545,7 @@ Time to test if structure declarations and accesses work correctly.
 
 ###### test: structs
 
-       struct foo:
+       struct foo
                size:[3]number
                name:string
                active:Boolean
@@ -538,7 +560,7 @@ Time to test if structure declarations and accesses work correctly.
                        case 2: nm:= "peter"
                        case 0: nm:= "bob"
                        case 1: nm:= "jane"
-                       else: nm:= "janine"
+                       else    nm:= "janine"
 
                        info[i].name = nm
                        info[i].size[0] = i*i
@@ -594,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:
@@ -689,7 +710,7 @@ various places that `type_err()` are called.
 
 ###### test: type_err3
 
-       struct foo:
+       struct foo
                a: number
                b:string = "hello"
 
@@ -701,11 +722,11 @@ various places that `type_err()` are called.
                print 45 + ( "Hello" ++ "there")
                c[5] = 1
 
-               while:
+               while
                        use 1
                        use True
                        use "Hello"
-               do:
+               do
                        print
                case 1: print "one"
                case "Hello": print "Hello"
@@ -746,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.
@@ -757,22 +779,19 @@ 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
        oceani_failing_tests += type_err_const type_err_const1
 
 ###### test: type_err_const
-       const:
+       const
                foo :: number = 45
                bar ::= "string" + 56
-       const:
+       const
                bar ::= "baz"
        program:
                foo := 4
@@ -786,7 +805,7 @@ various places that `type_err()` are called.
        .tmp.code:3:8: info: this is where 'foo' was first declared
 
 ###### test: type_err_const1
-       const:
+       const
                foo : number = 45
                bar := "string"
        program:
@@ -794,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
 
@@ -820,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"
@@ -833,7 +850,7 @@ command list possible.
 
 ###### output: cmd,-zyx
        ./oceani: invalid option -- 'z'
-       Usage: oceani --trace --print --noexec --brackets--section=SectionName prog.ocn
+       Usage: oceani --trace --print --noexec --brackets --section=SectionName prog.ocn
 
 ###### output: cmd,nofile
        oceani: cannot open nofile