packages feed

pure-sum-aeson-0.1.0.0: test/Data/Sum/Pure/AesonSpec.hs

{-# LANGUAGE StandaloneDeriving #-}

module Data.Sum.Pure.AesonSpec
  ( main,
    spec,
  )
where

import Data.Aeson
import qualified Data.Map as Map
import Data.Sum.Pure.Aeson
import GHC.Generics
import Test.Hspec

main :: IO ()
main = hspec spec

spec :: Spec
spec = do
  it "encoding regular derivation is broken" $
    encode (Map.singleton RSunday ("Happy day" :: String)) `shouldBe` "[[\"RSunday\",\"Happy day\"]]"
  it "encoding pure sum derivation is working" $
    encode (Map.singleton BSunday ("Happy day" :: String)) `shouldBe` "{\"BSunday\":\"Happy day\"}"
  it "decoding pure sum derivation is working" $
    eitherDecode "{\"BSunday\":\"Happy day\"}" `shouldBe` Right (Map.singleton BSunday ("Happy day" :: String))
  it "decoding unknown pure sum derivation is working" $
    eitherDecode @(Map.Map BetterWeekend String) "{\"Sunday\":\"Happy day\"}" `shouldBe` Left "Error in $.Sunday: unknown value: \"Sunday\""

data RegularWeekend = RSaturday | RSunday
  deriving stock (Eq, Ord, Show, Generic)
  deriving anyclass (FromJSON, FromJSONKey, ToJSON, ToJSONKey)

data BetterWeekend = BSaturday | BSunday
  deriving stock (Eq, Ord, Show, Generic)
  deriving (ToSumText, FromSumText, FromJSON, FromJSONKey, ToJSON, ToJSONKey) via (PureSum BetterWeekend)