large-anon-0.3.4: test/Test/Sanity/HasField.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fplugin=Data.Record.Anon.Plugin #-}
module Test.Sanity.HasField (tests) where
import Data.Record.Anon
import Data.Record.Anon.Advanced (Record)
import qualified Data.Record.Anon.Advanced as Anon
import Test.Tasty
import Test.Tasty.HUnit
tests :: TestTree
tests = testGroup "Test.Sanity.HasField" [
testCase "HasField" test_HasField
]
{-------------------------------------------------------------------------------
Example values
-------------------------------------------------------------------------------}
record1 :: Record I [ "x" := Bool, "y" := Char, "z" := () ]
record1 =
Anon.insert #x (I True)
$ Anon.insert #y (I 'a')
$ Anon.insert #z (I ())
$ Anon.empty
record1' :: Record I [ "x" := Bool, "y" := Char, "z" := () ]
record1' =
Anon.insert #x (I False)
$ Anon.insert #y (I 'a')
$ Anon.insert #z (I ())
$ Anon.empty
{-------------------------------------------------------------------------------
Tests proper
-------------------------------------------------------------------------------}
test_HasField :: Assertion
test_HasField = do
-- get
assertEqual "get field 1" (I True) $ Anon.get #x record1
assertEqual "get field 2" (I 'a') $ Anon.get #y record1
assertEqual "get field 3" (I ()) $ Anon.get #z record1
-- set then get
assertEqual "set field 1, then get field 1" (I False) $
Anon.get #x (Anon.set #x (I False) record1)
assertEqual "set field 1, then get field 2" (I 'a') $
Anon.get #y (Anon.set #x (I False) record1)
-- set
assertEqual "set field 1" record1' $ Anon.set #x (I False) record1