packages feed

monoidmap-0.1.0.0: components/monoidmap-test/Data/MonoidMap/CoercionSpec.hs

{-# OPTIONS_GHC -fdefer-type-errors #-}
{-# OPTIONS_GHC -Wno-deferred-type-errors #-}

-- |
-- Copyright: © 2022–2026 Jonathan Knowles
-- License: Apache-2.0
--
-- Tests for coercions of 'MonoidMap' values.
--
module Data.MonoidMap.CoercionSpec
    ( spec
    ) where

import Prelude

import Data.Coerce
    ( coerce )
import Data.Monoid
    ( Product (..), Sum (..) )
import Data.MonoidMap
    ( MonoidMap )
import Test.Hspec
    ( Spec, describe, it, shouldBe )
import Test.Hspec.TypeError
    ( shouldFailToTypecheckWith )

import qualified Data.MonoidMap as MonoidMap

spec :: Spec
spec = describe "Coercion" $ do

    let source :: MonoidMap Char (Sum Int)
        source = MonoidMap.singleton 'a' (Sum 1)

    it "permits coercion to the same value type" $
        (coerce source :: MonoidMap Char (Sum Int))
            `shouldBe` source

    it "forbids coercion to a different value type" $
        (coerce source :: MonoidMap Char (Product Int))
            `shouldFailToTypecheckWith`
            ["Couldn't match type", "Sum Int", "Product Int", "coerce"]