packages feed

large-anon-0.3.4: test/Test/Sanity/Simple.hs

{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TypeOperators    #-}

{-# OPTIONS_GHC -fplugin=Data.Record.Anon.Plugin #-}

-- | Tests for the @Simple@ interface
--
-- The @Simple@ is a thin wrapper around the @Advanced@ interface, so a few
-- select sanity tests suffice.
module Test.Sanity.Simple (tests) where

import Test.Tasty
import Test.Tasty.HUnit

import Data.Record.Anon
import Data.Record.Anon.Simple (Record)

import qualified Data.Record.Anon.Simple as Anon

tests :: TestTree
tests = testGroup "Test.Sanity.Simple" [
      testCase "hasField" test_hasField
    , testCase "merge"    test_merge
    ]

{-------------------------------------------------------------------------------
  Example values
-------------------------------------------------------------------------------}

recordA :: Record [ "a" := Bool, "b" := Char ]
recordA =
      Anon.insert #a True
    $ Anon.insert #b 'a'
    $ Anon.empty

recordA' :: Record [ "a" := Bool, "b" := Char ]
recordA' =
      Anon.insert #a False
    $ Anon.insert #b 'a'
    $ Anon.empty

{-------------------------------------------------------------------------------
  Tests proper
-------------------------------------------------------------------------------}

test_hasField :: Assertion
test_hasField = do
    assertEqual "get" True     $ Anon.get #a recordA
    assertEqual "set" recordA' $ Anon.set #a False recordA

test_merge :: Assertion
test_merge = do
    assertEqual "left"  recordA $ Anon.project $ Anon.merge Anon.empty recordA
    assertEqual "right" recordA $ Anon.project $ Anon.merge recordA Anon.empty