{-# 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))) )