X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=blobdiff_plain;f=csrc%2Foceani-tests.mdc;h=e3739ed940802dd324eebc14fec1eefdc03c8be4;hp=5366bf92ddf60e1045c5b0ed3a9bc6bee6cc560f;hb=1dd9f61bbc7e8890b5407ba084793817e55fe502;hpb=5b077f5f80cd36fed3b006dd5b0b1cc9025c1b22 diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index 5366bf9..e3739ed 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -54,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 \ @@ -68,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) }' \ @@ -155,7 +163,7 @@ Now some contants oceani_tests += "consts" ###### test: consts - const: + const pi ::= 3.141 592 653 four ::= 2 + 2 ; five ::= 10/2 const pie ::= "I like Pie"; @@ -181,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 @@ -206,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, @@ -214,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 @@ -228,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 @@ -249,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 @@ -268,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 @@ -277,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 @@ -288,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, @@ -310,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: @@ -524,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 @@ -539,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 @@ -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" @@ -767,10 +788,10 @@ various places that `type_err()` are called. 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 @@ -784,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: @@ -793,7 +814,7 @@ various places that `type_err()` are called. ###### output: type_err_const1 .tmp.code:3:12: Syntax error in constant: : - .tmp.code:4:8: Syntax error in constant: bar + .tmp.code:4:12: Syntax error in constant: : ## Test erroneous command line args @@ -829,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