packages feed

json-tracer-0.0.1.0: test/PolyDictSpec.hs

{-# LANGUAGE OverloadedLabels, DataKinds,TypeFamilies #-}
module PolyDictSpec(spec) where

import Data.PolyDict(Assoc,Dict)
import qualified Data.PolyDict as D

import Test.Hspec.Core.Spec
import Test.Hspec.Expectations
import Lens.Micro

data Test
type instance Assoc Test "foo" = String
type instance Assoc Test "bar" = Bool
type instance Assoc Test "baz" = Dict Test

dict0 :: Dict Test
dict0 = D.empty

dict1 = dict0 & (D.access #foo ?~ "Foo")
              . (D.access #bar ?~ True )
              . (D.access #baz ?~ dict0)

specDict0 :: Spec
specDict0 = do
  describe "empty" $ do
    it "lookup always be Nothing" $ do
        D.lookup #foo dict0 `shouldBe` Nothing
        D.lookup #bar dict0 `shouldBe` Nothing
        D.lookup #baz dict0 `shouldBe` Nothing

specDict1 :: Spec
specDict1 = do
  describe "insert" $ do
    it "has" $ do
      D.lookup #foo dict1 `shouldBe` (Just "Foo")
      D.lookup #bar dict1 `shouldBe` (Just True)
      D.lookup #baz dict1 `shouldBe` (Just dict0)

spec :: Spec
spec = do
    specDict0
    specDict1