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