]> ocean-lang.org Git - ocean/blobdiff - csrc/oceani-tests.mdc
oceani: Add functions
[ocean] / csrc / oceani-tests.mdc
index 5d1119785ea11760170e6fb180d6b32d4df5eb63..d9be788450c88baf56d37a6e613b18fb31e88dff 100644 (file)
@@ -80,7 +80,7 @@ arguments separated from the name by commas.  For each test, there is a section
                @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage || true
                @[ -n "$$SKIP_COVERAGE_CHECK" ] || awk '/NOTEST/ { next } /^ *[1-9]/ {ran+=1} /^ *###/ {skip+=1} \
                    END {printf "coverage: %6.2f%%\n", ran * 100 / (ran + skip); \
-                        if (ran < (ran + skip) *0.96) exit(1) }' \
+                        if (ran < (ran + skip) *0.968) exit(1) }' \
                        coverage/oceani.mdc.gcov
                @rm -f .tmp*
 
@@ -110,9 +110,7 @@ calculations on them.
 
 ###### test: valvar
 
-       func main
-               argv:[argc::]string
-       do
+       func main(argv:[argc::]string)
                a := 23; b:=12 ; b1 := -b
                print a, b, a+b, a-b, a*b, a/b, a%b
                print a<b, a<=b, a>b, a>=b, a<a, a==b, a==a
@@ -613,6 +611,42 @@ Time to test if structure declarations and accesses work correctly.
        peter False 4
        janine False 9
 
+## Functions
+
+Test functions.  They don't return anything, so we need to get them to print
+
+###### test list
+       oceani_tests += functions
+
+###### test: functions
+
+       func test1 then
+               t: Boolean
+       do
+               if t:
+                       print "true"
+
+       func noarg
+       do
+               pass
+
+       func test(n:number; s:string)
+               if n >= 1:
+                       print n,s,
+                       test(n-1, "."++s)
+               else
+                       print "done"
+       func main()
+               for i:=0; then i = i + 1; while i < 5:
+                       test(i, " ")
+
+###### output: functions
+       done
+       1  done
+       2  1 . done
+       3  2 . 1 .. done
+       4  3 . 2 .. 1 ... done
+
 ## Test code with syntax errors
 
 Syntax errors aren't handled well yet - the result is almost always a
@@ -833,7 +867,7 @@ various places that `type_err()` are called.
        oceani: type error in program - not running.
 
 ###### test list
-       oceani_failing_tests += type_err_const type_err_const1 missing_program
+       oceani_failing_tests += type_err_const type_err_const1 missing_program bad_main
 
 ###### test: type_err_const
        const
@@ -856,9 +890,10 @@ various places that `type_err()` are called.
        .tmp.code:4:8: info: this is where 'bar' was first declared
        .tmp.code:8:8: error: variable 'foo' redeclared
        .tmp.code:3:8: info: this is where 'foo' was first declared
+       .tmp.code:12:5: error: function 'main' redeclared
+       .tmp.code:7:5: info: this is where 'main' was first declared
        .tmp.code:13:8: error: variable 'foo' redeclared
        .tmp.code:3:8: info: this is where 'foo' was first declared
-       .tmp.code:13:8: "main" defined a second time
 
 ###### test: type_err_const1
        const
@@ -879,6 +914,74 @@ various places that `type_err()` are called.
 ###### output: missing_program
        oceani: no main function found.
 
+###### test: bad_main
+       func main(foo:string)
+               print foo
+
+###### output: bad_main
+       .tmp.code:??:??: error: expected  argv but variable 'foo' is string
+       .tmp.code:??:??: info: this is where 'NOTVAR' was set to string
+       oceani: main has wrong type.
+
+Test for type errors with functions
+
+###### test list
+       oceani_failing_tests += func_err_args func_err_redeclare
+
+###### test: func_err_args
+
+       func test1(a:number; b:string; c:[3]Boolean)
+               print a, b, c[1]
+
+       func test2(a:number; b:string; c:[3]Boolean)
+               print a, b, c[1]
+
+       func main()
+               truth:[3]Boolean
+               truth[1] = True
+               test1(1,"hello")
+               test1("hello",1)
+               test1(1, "two", truth)
+               test1(1, 2, truth)
+               test1(1, "lo", truth, 4)
+               print test(), test1(1,2,3)
+               if test1 == test2:
+                       pass
+
+###### output: func_err_args
+       .tmp.code:11:14: error: insufficient arguments to function.
+       .tmp.code:12:14: error: expected number found string
+       .tmp.code:12:22: error: expected string found number
+       .tmp.code:12:14: error: insufficient arguments to function.
+       .tmp.code:14:17: error: expected string found number
+       .tmp.code:15:14: error: too many arguments to function.
+       .tmp.code:16:14: error: attempt to call a non-function.
+       .tmp.code:16:32: error: expected string found number
+       .tmp.code:16:28: error: insufficient arguments to function.
+       .tmp.code:17:20: error: expected  func but variable 'test2' is  func
+       .tmp.code:??:??: info: this is where 'NOTVAR' was set to  func
+       oceani: type error in program - not running.
+
+###### test: func_err_redeclare
+
+       func test1(a:number; b:string; c:[3]Boolean)
+               print a, b, c[1]
+
+       func test1
+       do
+               pass
+
+       func test1 then
+               b:Boolean
+       do
+               pass
+
+###### output: func_err_redeclare
+       .tmp.code:5:5: error: function 'test1' redeclared
+       .tmp.code:2:5: info: this is where 'test1' was first declared
+       .tmp.code:9:5: error: function 'test1' redeclared
+       .tmp.code:2:5: info: this is where 'test1' was first declared
+
 ## Test erroneous command line args
 
 To improve coverage, we want to test correct handling of strange command