packages feed

bookkeeper-0.1.2.0: test/BookkeeperSpec.hs

module BookkeeperSpec (spec) where

import Data.Char (toUpper)
import Test.Hspec

import Bookkeeper

spec :: Spec
spec = describe "books" $ do
    let p :: Person
           = emptyBook
           & #name =: "Julian K. Arni"
           & #age =: 28

    it "allows creation" $ do
      typeLevelTest

    it "allows creation out of order" $ do
      let _p :: Person
             = emptyBook
             & #age  =:  28
             & #name =: "Julian K. Arni"
      typeLevelTest

    it "allows access" $ do
      get #name p  `shouldBe` "Julian K. Arni"

    it "allows update" $ do
      let p' :: Person
             = p & #name %: fmap toUpper
      get #name p' `shouldBe` "JULIAN K. ARNI"

    it "allows extension" $ do
      let p' = #email =: "jkarni<at>turingjump<dot>com" $ p
      get #email p' `shouldBe` ("jkarni<at>turingjump<dot>com" :: String)

    it "allows deleting" $ do
      let _p = delete #name p
      typeLevelTest

    it "allows nested updates" $ do
      let timeTravelingJulian = p & #child =: p
          p' = timeTravelingJulian & #child %: #name %: fmap toUpper
      p' ?: #name `shouldBe` "Julian K. Arni"
      p' ?: #child ?: #name `shouldBe` "JULIAN K. ARNI"

    it "has a decent show instance" $ do
      show p `shouldBe` "Book {age = 28, name = \"Julian K. Arni\"}"

type Person = Book '[ "name" :=> String , "age" :=> Int]


typeLevelTest :: Expectation
typeLevelTest = True `shouldBe` True