packages feed

prairie-0.0.1.0: test/Spec.hs

{-# language TypeApplications, StandaloneDeriving, ConstraintKinds, TemplateHaskell, DataKinds, OverloadedStrings, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances, TypeFamilies, GADTs #-}
module Main where

import Prairie

import Data.Aeson
import Control.Monad

data User = User { name :: String, age :: Int }
  deriving Eq

mkRecord ''User

deriving instance Eq (Field User a)

example = User "Alice" 30

assert :: String -> Bool -> IO ()
assert message success = unless success (error message)

main :: IO ()
main = do
  assert "getField" $ getRecordField UserName example == "Alice"
  assert "setField" $ setRecordField UserAge 32 example == User "Alice" 32
  assert "label" $ recordFieldLabel UserAge == "age"
  assert "label" $ recordFieldLabel UserName == "name"

  assert "update json" $
    encode (diffRecord example (setRecordField UserName "Bob" example))
    ==
    "[{\"field\":\"name\",\"value\":\"Bob\"}]"

  assert "decode update" $
    decode "[{\"field\":\"name\",\"value\":\"Bob\"}]"
    ==
    Just [SetField UserName "Bob"]