packages feed

hercules-ci-api-agent-0.3.0.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)))
              )