linnet-aeson-0.1.0.1: test/DecodeJsonLaws.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module DecodeJsonLaws
( decodeJsonLaws
) where
import qualified Data.Aeson as Aeson
import Data.ByteString.Lazy
import Linnet (ApplicationJson)
import Linnet.Decode
import Linnet.Errors (LinnetError (..))
import Test.QuickCheck (Arbitrary, property)
import Test.QuickCheck.Classes (Laws (..))
decodeJsonLaws ::
forall a. (Decode ApplicationJson a, Arbitrary a, Show a, Eq a, Aeson.ToJSON a)
=> Laws
decodeJsonLaws = Laws "DecodeJSON" laws
where
roundTrip = property $ \(a :: a) -> decode @ApplicationJson (Aeson.encode a) == Right a
errorHandle =
property $ \(a :: a) ->
case decode @ApplicationJson @a ("@" `append` Aeson.encode a) of
Left (DecodeError err) -> True
laws = [("roundTrip", roundTrip), ("errorHandle", errorHandle)]