-
Notifications
You must be signed in to change notification settings - Fork 13
/
TableSpec.hs
95 lines (72 loc) · 2.73 KB
/
TableSpec.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Data.TableSpec where
import Control.Applicative
import Control.Lens
import Data.Table
import Test.Hspec
data Foo = Foo { _k :: String, _v :: String }
deriving (Eq, Ord, Show, Read)
makeLenses ''Foo
instance Tabular Foo where
type PKT Foo = String
data Key k Foo a where
FooK :: Key Primary Foo String
FooV :: Key Supplemental Foo String
data Tab Foo i = FooTab (i Primary String)
(i Supplemental String)
fetch FooK = _k
fetch FooV = _v
primary = FooK
primarily FooK r = r
mkTab f = FooTab <$> f FooK <*> f FooV
forTab (FooTab a b) f = FooTab <$> f FooK a <*> f FooV b
ixTab (FooTab a _) FooK = a
ixTab (FooTab _ b) FooV = b
tableA, tableB, tableC, tableD, tableE, tableF, tableG, tableH, tableI, tableJ,
tableA', tableB', tableC', tableD', tableE', tableF', tableG', tableH', tableI', tableJ',
tableB_at, tableD_at, tableJ_at :: Table Foo
tableA = fromList [Foo "a" "A", Foo "b" "hello"]
tableA' = fromList [Foo {_k = "a", _v = "A"}, Foo {_k = "b", _v = "hello"}]
tableB = insert (Foo "a" "Y") tableA
tableB_at = tableA & at "a" .~ Just (Foo "a" "Y")
tableB' = fromList [Foo {_k = "a", _v = "Y"}, Foo {_k = "b", _v = "hello"}]
tableC = tableB ^. with FooV (/=) ""
tableC' = fromList [Foo {_k = "a", _v = "Y"}, Foo {_k = "b", _v = "hello"}]
tableD = (tableA & ix "a" . v .~ "OH! NO!") ^. with FooV (/=) ""
tableD_at = (tableA & at "a" . _Just . v .~ "OH! NO!") ^. with FooV (/=) ""
tableD' = fromList [Foo {_k = "a", _v = "OH! NO!"}, Foo {_k = "b", _v = "hello"}]
tableE = tableC ^. with FooV (/=) ""
tableE' = fromList [Foo {_k = "a", _v = "Y"}, Foo {_k = "b", _v = "hello"}]
tableF = tableC ^. with _v (==) "A"
tableF' = fromList []
tableG = tableC ^. with _v (==) "Y"
tableG' = fromList [Foo {_k = "a", _v = "Y"}]
tableH = tableC ^. with FooV (==) "Y"
tableH' = fromList [Foo {_k = "a", _v = "Y"}]
tableI = tableC ^. with _v (==) "Y"
tableI' = fromList [Foo {_k = "a", _v = "Y"}]
tableJ = delete (Foo "a" "A") tableA
tableJ_at = tableA & at "a" .~ Nothing
tableJ' = fromList [Foo {_k = "b", _v = "hello"}]
tests :: IO ()
tests = hspec spec
spec :: Spec
spec = describe "Data.Table" . it "unit tests" $ do
mapM_ (\ (i :: String, t, t') -> (i, t) `shouldBe` (i, t'))
[ ("A", tableA, tableA')
, ("B", tableB, tableB')
, ("B at", tableB_at, tableB')
, ("C", tableC, tableC')
, ("E", tableE, tableE')
, ("F", tableF, tableF')
, ("G", tableG, tableG')
, ("H", tableH, tableH')
, ("I", tableI, tableI')
, ("D", tableD, tableD')
, ("D at", tableD_at, tableD')
, ("J", tableJ, tableJ')
, ("J at", tableJ_at, tableJ')
]