c38b398138bfa8a2d9fa1e919774f1d46a313314
[ap2015.git] / a10 / mart / skeleton10.icl
1 // Mart Lubbers s4109503
2 // Charlie Gerhardus s3050009
3 module skeleton10
4
5 import qualified Text
6 from Text import class Text, instance Text String
7 import StdOverloaded, StdBool, StdString, StdEnum, StdList
8
9 :: TestState = {s :: Int, f :: Int, p :: [String]}
10 :: TestResult :== (Bool, [String])
11 :: Test :== TestState -> TestState
12
13 class Testable a | Eq, Ord, toString a
14
15 instance * Test where
16 (*) t1 t2 = \st.let st`=t1 st in t2 st`
17
18 EqualTo :: a -> (a -> TestResult) | Testable a
19 EqualTo q = \a.(q == a, ["(EqualTo ",toString q,")"])
20
21 LessThen :: a -> (a -> TestResult) | Testable a
22 LessThen q = \a.(q < a, ["(LessThen ",toString q,")"])
23
24 Not :: (a -> TestResult) -> (a -> TestResult) | Testable a
25 Not x = \r.let (v,p)=x r in (not v, ["(Not ":p++[")"]])
26
27 Is :: (a -> TestResult) -> (a -> TestResult)
28 Is x = \r.let (v,p)=x r in (v, ["(Is ":p++[")"]])
29
30 Either :: (a -> TestResult) (a -> TestResult) -> (a -> TestResult)
31 Either x1 x2 = \r.let (v1,p1)=x1 r in let(v2,p2)=x2 r in
32 (v1 || v2, ["(Either ":p1++[" ":p2++[")"]]])
33
34 Contains :: a -> ([a] -> TestResult) | Testable a
35 Contains x = \r.(isMember x r, ["(Contains ",toString x,")"])
36
37 ContainsString :: String -> (String -> TestResult)
38 ContainsString s = \r.('Text'.indexOf s r <> -1,
39 ["(ContainsString ",toString s,")"])
40
41 AssertThat :: String a (a -> TestResult) -> Test
42 AssertThat msg q t = \st=:{s,f,p}.case t q of
43 (True, _) = {st & s=s+1}
44 (_, p`) = {st & f=f+1,
45 p=p++[toString (f+1),". AssertThat ",msg," ":p`++["\n"]]}
46
47 test :: Test -> String
48 test t = 'Text'.concat ["passes=", toString s, ", fails=", toString f, "\n":p]
49 where {f,s,p}=t {s=0, f=0, p=[]}
50
51 Start = test (a1 * a2 * a3 * a4 * a5 * a6)
52 where
53 a1 = AssertThat "(2*2)" (2*2) (Is (EqualTo (2+2)))
54 a2 = AssertThat "(3*3)" (3*3) (Is (EqualTo (3+3)))
55 a3 = AssertThat "(length [0..3])" (length [0..3]) (Not (EqualTo 4))
56 a4 = AssertThat "[0..3]" [0..3] (Contains 2)
57 a5 = AssertThat "[0..3]" [0..3] (Contains 7)
58 a6 = AssertThat "[0..3]" [0..3] (Either (EqualTo [1]) (Contains 7))