packages feed

hercules-ci-api-agent-0.2.1.0: test/AesonSupport.hs

{-# LANGUAGE ScopedTypeVariables #-}

module AesonSupport where

import Data.Aeson
import qualified Data.ByteString.Builder as BB
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Test.Hspec
import Test.QuickCheck
import Prelude

checkLaws :: forall a. (ToJSON a, FromJSON a, Eq a) => Gen a -> Spec
checkLaws gen =
  describe "ToJSON/FromJSON laws" $ do
    it "obey partial isomorphism"
      $ property
      $ do
        a <- gen
        pure $ counterexample (T.unpack . T.decodeUtf8 . BL.toStrict . encode $ a) (fromJSON (toJSON a) == Data.Aeson.Success a)
    it "obey toJSON/toEncoding equivalence"
      $ property
      $ do
        a <- gen
        pure $
          counterexample
            (T.unpack . T.decodeUtf8 . BL.toStrict . encode $ a)
            ( Right (toJSON a)
                == eitherDecode (BB.toLazyByteString (fromEncoding (toEncoding a)))
            )