packages feed

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)]