X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=blobdiff_plain;f=csrc%2Foceani-tests.mdc;h=55e8477468518ee120591502b99ae489c5d94d95;hp=ab89bf27ccd52140f8b43a4a72c0ecf18d6d8ec0;hb=a9cd2fcd52ae4ba9c19f775221cc14d2745083b3;hpb=e74b53b80e4b2cdf846e9dd207180087e0b9c41b diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index ab89bf2..55e8477 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -54,14 +54,14 @@ 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;\ + ./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.. "; \ @@ -75,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) }' \ @@ -162,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"; @@ -188,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 @@ -213,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, @@ -221,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 @@ -235,7 +236,7 @@ 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: @@ -248,7 +249,7 @@ Now we need to test if/else and some different loops then { i = i+1 } while i <= 10: sum = sum + i - else: + else pass print "sum 1..10 is", sum @@ -281,14 +282,17 @@ Here I break it into two parts, keeping the array code separate. ###### test: sayhello - program A B astr bbool: + program ac av: + A := $av[1]; B := $av[2] + astr := av[3] + bbool := av[ac-1] == "True" 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. */ 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 @@ -297,7 +301,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 @@ -308,15 +312,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, @@ -330,25 +334,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: @@ -529,11 +533,15 @@ ad-hoc things array related. bools[1] = strings[2] <= "there" for i:=0; then i=i+1; while i<5: - print '', bools[i], + j ::= i + ra:[j]number + ra[i-1] = i*i + ra[6] = 42 // mustn't crash + print '', bools[i], ra[j-1], print ###### output: arrays - False True False False False + False 0 True 1 False 4 False 9 False 16 ## Structures @@ -544,10 +552,11 @@ Time to test if structure declarations and accesses work correctly. ###### test: structs - struct foo: - size:[3]number + const three ::= 3 + struct foo + size:[three]number name:string - active:Boolean + active:Boolean = True struct baz { a:number; b:Boolean; } @@ -559,11 +568,12 @@ 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 - info[i].active = nm == "jane" + if nm != "jane": + info[i].active = False for i:=0; then i=i+1; while i < 4: print info[i].name, info[i].active, info[i].size[0] @@ -709,7 +719,7 @@ various places that `type_err()` are called. ###### test: type_err3 - struct foo: + struct foo a: number b:string = "hello" @@ -721,11 +731,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" @@ -787,10 +797,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 @@ -804,7 +814,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: @@ -849,7 +859,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