update 10 deep embedding
[ap2015.git] / a10 / mart / skeleton10.icl
index 5a671cb..685874c 100644 (file)
@@ -2,36 +2,47 @@
 // Charlie Gerhardus s3050009\r
 module skeleton10\r
 \r
-import iTasks._Framework.Generic,\r
-       Data.Functor, Control.Applicative, Control.Monad, Data.Map, StdMisc,\r
-       StdInt\r
-//import qualified iTasks\r
 import qualified Text\r
 from Text import class Text, instance Text String\r
-//from StdFunc import o\r
-//import qualified Data.List as List\r
-import StdGeneric, StdOverloaded, StdBool, StdString\r
-//import StdArray, StdOverloaded, StdOrdList, StdTuple, StdString, StdBool, StdMisc\r
+import StdOverloaded, StdBool, StdString, StdEnum, StdList\r
 \r
-:: TestState = {s :: Int, f :: Int}\r
-:: Test :== TestState -> (TestState -> [String]) -> [String]\r
+:: TestState = {s :: Int, f :: Int, p :: [String]}\r
+:: Test :== (TestState -> TestState)\r
 :: Match a \r
        = Is (Match a)\r
        | Not (Match a)\r
        | Either (Match a) (Match a)\r
        | LessThen a\r
-       | IsEqual a\r
+       | EqualTo a\r
 \r
-eval :: a (Match a) -> Bool | gEq{|*|}, qLess{|*|} a\r
+eval :: a (Match a) -> Bool | ==, < a\r
 eval x (Is y) = eval x y\r
-eval x (IsEqual y) = x === y\r
+eval x (EqualTo y) = x == y\r
 eval x (LessThen y) = x < y\r
 eval x (Not y) = not (eval x y)\r
 eval x (Either y1 y2) = eval x y1 || eval x y2\r
 \r
-assertThat :: String x (Match x) -> String\r
-assertThat s x y = case eval x y of\r
-       True = "Success: " +++ s\r
-       _ = "Fail: " +++ s\r
+show :: (Match a) [String] -> [String] | toString a\r
+show (Is x) l = ["(Is ":show x [")":l]]\r
+show (EqualTo x) l = ["(EqualTo ", toString x,")":l]\r
+show (LessThen x) l = ["LessThen ", toString x,")":l]\r
+show (Not x) l = ["Not ":show x [")":l]]\r
+show (Either x1 x2) l = ["Either (":show x1 [")(":show x2 [")":l]]]\r
 \r
-Start = assertThat "Hello Wordl" (1+1) (IsEqual 2)\r
+assertThat :: String a (Match a) -> Test | ==, <, toString a\r
+assertThat str x y = \st=:{f,s,p}.if (eval x y)\r
+       {st & s=s+1}\r
+       {st & f=f+1, p=p++[toString (f+1),": AssertThat ",str," ":show y [")\n"]]}\r
+\r
+test :: Test -> String\r
+test t = 'Text'.concat ["passes=", toString s, ", fails=", toString f, "\n":p]\r
+       where {f,s,p}=t {s=0, f=0, p=[]}\r
+\r
+instance * Test where\r
+       (*) s1 s2 = \st.let st`=s1 st in s2 st`\r
+\r
+Start = test (t1 * t2 * t3)\r
+       where\r
+               t1 = assertThat "(2*2)" (2*2) (Is (EqualTo (2+2)))\r
+               t2 = assertThat "(3*3)" (3*3) (Is (EqualTo (3+3)))\r
+               t3 = assertThat "(length [0..3])" (length [0..3]) (Not (EqualTo 4))\r