@@ -1,42 +1,80 @@
11module Test.Main where
22
33import Prelude
4−import Control.Monad.Eff (Eff)
5−import Control.Monad.Eff.Console (CONSOLE, log)
6−import Control.Monad.Eff.Ref (REF)
74
8−import Data.Vault as V
95import Data.Maybe (Maybe(..))
6+import Data.Vault as Vault
7+import Effect (Effect)
8+import Effect.Aff (launchAff_)
9+import Effect.Class (liftEffect)
10+import Test.Spec (describe, it)
11+import Test.Spec.Assertions (shouldEqual)
12+import Test.Spec.Reporter (consoleReporter)
13+import Test.Spec.Runner (runSpec)
1014
11−itemKeyInt :: forall eff. Eff (ref :: REF | eff) (V.Key Int)
12−itemKeyInt = V.newKey
13−
14−itemKeyString :: forall eff. Eff (ref :: REF | eff) (V.Key String)
15−itemKeyString = V.newKey
16−
17−testCreateAndGet :: forall eff. Eff (console :: CONSOLE, ref :: REF | eff) Unit
18−testCreateAndGet = do
19− k1 <- itemKeyString
20− k2 <- itemKeyInt
21− let m1 = V.insert k1 "vault" V.empty
22− v1 = V.lookup k1 m1
23− v2 = V.lookup k2 m1
24− when (v1 /= Just "vault") (log "Failed getting value from Vault")
25− when (v2 /= Nothing) (log "Non existing value should return Nothing")
26−
27−testCreateAndDelete :: forall eff. Eff (console :: CONSOLE, ref :: REF | eff) Unit
28−testCreateAndDelete = do
29− k <- itemKeyInt
30− let m1 = V.insert k 1 V.empty
31− v1 = V.lookup k m1
32− m2 = V.delete k m1
33− v2 = V.lookup k m2
34− when (v1 == v2) $ log "Deleted item should return Nothing"
35−
36−main :: forall eff. Eff (console :: CONSOLE, ref :: REF | eff) Unit
37−main = do
38− log "Create new Vault Item"
39− testCreateAndGet
40−
41− log "Crate new Vault Item and Delete"
42− testCreateAndDelete
15+main :: Effect Unit
16+main =
17+ launchAff_ $
18+ runSpec [ consoleReporter ] do
19+ it "inserts an item" do
20+ let s0 = Vault.empty
21+ k <- liftEffect Vault.newKey
22+ let
23+ v = { foo: 1 }
24+ s1 = Vault.insert k v s0
25+ Vault.lookup k s1 `shouldEqual` pure v
26+ it "adjusts an item" do
27+ let s0 = Vault.empty
28+ k <- liftEffect Vault.newKey
29+ let
30+ v0 = { foo: 1 }
31+ s1 = Vault.insert k v0 s0
32+ s2 = Vault.adjust (\r -> r { foo = r.foo + 1 }) k s1
33+ Vault.lookup k s2 `shouldEqual` pure { foo: 2 }
34+ it "deletes an item" do
35+ let s0 = Vault.empty
36+ k <- liftEffect Vault.newKey
37+ let
38+ s1 = Vault.insert k 1 s0
39+ s2 = Vault.delete k s1
40+ Vault.lookup k s2 `shouldEqual` Nothing
41+ it "merges two vaults" do
42+ k <- liftEffect Vault.newKey
43+ l <- liftEffect Vault.newKey
44+ let
45+ a = Vault.insert k 1 Vault.empty
46+ b = Vault.empty # Vault.insert k 2 # Vault.insert l 3
47+ c = Vault.union a b
48+ Vault.lookup k c `shouldEqual` pure 1
49+ Vault.lookup l c `shouldEqual` pure 3
50+ describe "on insert" do
51+ it "does not affect other items" do
52+ k <- liftEffect Vault.newKey
53+ let
54+ s0 = Vault.empty
55+ s1 = Vault.insert k "foo" s0
56+ k' <- liftEffect Vault.newKey
57+ let s2 = Vault.insert k' 3 s1
58+ Vault.lookup k s2 `shouldEqual` pure "foo"
59+ describe "on adjust" do
60+ it "does not affect other items" do
61+ k <- liftEffect Vault.newKey
62+ let
63+ s0 = Vault.empty
64+ s1 = Vault.insert k "foo" s0
65+ k' <- liftEffect Vault.newKey
66+ let
67+ s2 = Vault.insert k' "hi" s1
68+ s3 = Vault.adjust (_ <> "!") k' s2
69+ Vault.lookup k s3 `shouldEqual` pure "foo"
70+ describe "on delete" do
71+ it "does not affect other items" do
72+ k <- liftEffect Vault.newKey
73+ let
74+ s0 = Vault.empty
75+ s1 = Vault.insert k "foo" s0
76+ k' <- liftEffect Vault.newKey
77+ let
78+ s2 = Vault.insert k' "hi" s1
79+ s3 = Vault.delete k' s2
80+ Vault.lookup k s3 `shouldEqual` pure "foo"