{-# LANGUAGE NoFieldSelectors #-} import Data.Aeson qualified as JSON import Data.Aeson (FromJSON, ToJSON) import GHC.Generics (Generic) import Data.Aeson.RecordAsTuple import Data.ByteString.Builder qualified as Builder import Generic.Random.DerivingVia (GenericArbitraryU (..)) import Test.Hspec import Test.Hspec.QuickCheck import Test.QuickCheck (Arbitrary (..)) main :: IO () main = hspec spec spec :: Spec spec = describe "roundtrips" do prop "example via toJSON" prop_concocted prop "example via toEncoding" prop_concocted_toEncoding prop_concocted :: A -> Bool prop_concocted a = JSON.fromJSON (JSON.toJSON a) == JSON.Success a prop_concocted_toEncoding :: A -> Bool prop_concocted_toEncoding a = JSON.decode enc == Just a where enc = Builder.toLazyByteString (JSON.fromEncoding (JSON.toEncoding a)) data A = A {a, b, c, d :: Maybe B} deriving stock (Eq, Ord, Show, Generic) deriving (Arbitrary) via (GenericArbitraryU A) deriving (ToJSON, FromJSON) via (RecordAsTuple A) data B = B {a, b, c, d :: Maybe C} deriving stock (Eq, Ord, Show, Generic) deriving (Arbitrary) via (GenericArbitraryU B) deriving (ToJSON, FromJSON) via (RecordAsTuple B) data C = C {x, y, z, w, a, b, c, d :: Maybe Int} deriving stock (Eq, Ord, Show, Generic) deriving (Arbitrary) via (GenericArbitraryU C) deriving (ToJSON, FromJSON) via (RecordAsTuple C)