3 | import Control.Monad.Writer
9 | record Testing (a: Type) where
18 | ETest = Exists Testing
20 | record TestValues (a : Type) where
25 | record EqValues (a : Type) where
30 | record OrValues (0 a, b : Type) where
36 | Eq a => Eq b => Eq (OrValues a b) where
37 | (MkOr a1 a2) == (MkOr b1 b2) = a1 == b1 || a2 == b2
40 | by : (a -> a -> Bool) -> TestValues a -> EqValues a
43 | runTestList : List ETest -> Nat -> IO Nat
44 | runTestList [] acc = pure acc
45 | runTestList ((Evidence fst (MkT name eq first second)) :: xs) acc =
46 | if first `eq` second
47 | then putStrLn (show $
colored Green "success: \{name}") >> runTestList xs (S acc)
48 | else putStrLn (show $
colored Red "failure: \{name}") >> runTestList xs acc
51 | runTests : List ETest -> IO ()
52 | runTests xs = let l = length xs
53 | in runTestList xs 0 >>= printOut l
55 | printOut : Nat -> Nat -> IO ()
56 | printOut allTests successes =
57 | putStrLn "Done \{show successes}/\{show allTests}" >>
58 | if allTests == successes
64 | (>>) : List ETest -> List ETest -> List ETest
67 | pure : Testing a -> List ETest
68 | pure x = [Evidence a x]
72 | test : String -> Eq a => TestValues a -> List ETest
73 | test name values = [ Evidence a $
MkT name (==) values.f values.s ]
76 | testEq : String -> EqValues a -> List ETest
77 | testEq name (MkEV f (MkV x y)) = [ Evidence a $
MkT name f x y ]
80 | shouldBe : a -> a -> TestValues a
84 | and : TestValues a -> TestValues b -> TestValues (a, b)
85 | and (MkV a1 a2) (MkV b1 b2) = MkV (a1, b1) (a2, b2)
88 | or : TestValues a -> TestValues b -> TestValues (OrValues a b)
89 | or (MkV a1 a2) (MkV b1 b2) = MkV (MkOr a1 b1) (MkOr a2 b2)
92 | (.shouldBeTrue) : Bool -> TestValues Bool
93 | (.shouldBeTrue) = MkV True
96 | (.shouldBeFalse) : Bool -> TestValues Bool
97 | (.shouldBeFalse) = MkV False
99 | export infixl 9 `shouldBe`
100 | export infixl 8 `or`
101 | export infixl 7 `and`