{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-} module Test.Cardano.Ledger.CanonicalState.Spec (spec) where import Cardano.Ledger.BaseTypes (EpochInterval, NonNegativeInterval, NonZero, UnitInterval) import Cardano.Ledger.CanonicalState.BasicTypes (CanonicalExUnits (..)) import Cardano.Ledger.CanonicalState.CDDL.Validate (invalidSpecs, validSpecs) import Cardano.Ledger.CanonicalState.Conway (CanonicalGovActionState) import qualified Cardano.Ledger.CanonicalState.Namespace.Blocks.V0 as Blocks.V0 import Cardano.Ledger.CanonicalState.Namespace.CDDL (namespaceSymbolFromText) import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesAccounts.V0 as EntitiesAccounts.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesCommittee.V0 as Committee.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesDReps.V0 as EntitiesDReps.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.V0 as EntitiesStakePools.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.VRFKeyHashes.V0 as EntitiesStakePoolsVRFKeyHashes.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.GovCommittee.V0 as GovCommittee.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.GovConstitution.V0 as GovConstitution.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.GovPParams.V0 as GovPParams.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.GovProposals.Roots.V0 as GovProposals.Roots.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.GovProposals.V0 as GovProposals.V0 import qualified Cardano.Ledger.CanonicalState.Namespace.UTxO.V0 as UTxO.V0 import Cardano.Ledger.Conway (ConwayEra) import Cardano.Ledger.Core ( AccountAddress, AccountId, KeyHash, PParams, StakePool, StakePoolVRF, Staking, VRFVerKeyHash, ) import Cardano.Ledger.Credential (Credential) import Cardano.Ledger.DRep (DRep) import Cardano.Ledger.State (PoolMetadata, StakePoolRelay) import Cardano.Ledger.TxIn (TxId) import Cardano.SCLS.CBOR.Canonical.Encoder (ToCanonicalCBOR (..)) import Codec.CBOR.Cuddle.CDDL.CTree (CTreeRoot) import Codec.CBOR.Cuddle.CDDL.Resolve (MonoReferenced) import qualified Data.Map.Strict as Map import qualified Data.Text as T import Data.Typeable import Data.Word (Word64) import Test.Cardano.Ledger.CanonicalState.Arbitrary () import Test.Cardano.Ledger.CanonicalState.Conformance (Direction (..), propReferenceAcceptsCBOR) import Test.Cardano.Ledger.CanonicalState.Reference (LoadError) import Test.Cardano.Ledger.CanonicalState.Testlib import Test.Cardano.Ledger.Common import Test.Cardano.Ledger.Conway.CanonicalState.Arbitrary () spec :: Maybe [(T.Text, Either LoadError (CTreeRoot MonoReferenced))] -> Integer -> Spec spec :: Maybe [(Text, Either LoadError (CTreeRoot MonoReferenced))] -> Integer -> Spec spec Maybe [(Text, Either LoadError (CTreeRoot MonoReferenced))] mReferenceCDDLs Integer sampleCount = do [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "Basic checks" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do [Char] -> Expectation -> SpecM (Arg Expectation) () forall a. (HasCallStack, Example a) => [Char] -> a -> SpecWith (Arg a) it [Char] "has no invalid namespaces" (Expectation -> SpecM (Arg Expectation) ()) -> Expectation -> SpecM (Arg Expectation) () forall a b. (a -> b) -> a -> b $ Map SomeNamespaceSymbol NameResolutionFailure invalidSpecs Map SomeNamespaceSymbol NameResolutionFailure -> (Map SomeNamespaceSymbol NameResolutionFailure -> Bool) -> Expectation forall a. (HasCallStack, Show a) => a -> (a -> Bool) -> Expectation `shouldSatisfy` Map SomeNamespaceSymbol NameResolutionFailure -> Bool forall k a. Map k a -> Bool Map.null [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "Conformance test" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do case Maybe [(Text, Either LoadError (CTreeRoot MonoReferenced))] mReferenceCDDLs of Maybe [(Text, Either LoadError (CTreeRoot MonoReferenced))] Nothing -> [Char] -> Expectation -> SpecM (Arg Expectation) () forall a. (HasCallStack, Example a) => [Char] -> a -> SpecWith (Arg a) it [Char] "loads reference CDDL specs" (Expectation -> SpecM (Arg Expectation) ()) -> Expectation -> SpecM (Arg Expectation) () forall a b. (a -> b) -> a -> b $ HasCallStack => [Char] -> Expectation [Char] -> Expectation pendingWith [Char] "REFERENCE_CDDL_DIR environment variable is not set" Just [(Text, Either LoadError (CTreeRoot MonoReferenced))] referenceCDDLs -> [(Text, Either LoadError (CTreeRoot MonoReferenced))] -> ((Text, Either LoadError (CTreeRoot MonoReferenced)) -> Spec) -> Spec forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ [(Text, Either LoadError (CTreeRoot MonoReferenced))] referenceCDDLs (Text, Either LoadError (CTreeRoot MonoReferenced)) -> Spec runConformanceTest [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "types" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "blocks/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"blocks/v0" @Blocks.V0.BlockOut forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"blocks/v0" @Blocks.V0.BlockOut Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "utxo/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"utxo/v0" @(UTxO.V0.UtxoOut ConwayEra) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"utxo/v0" @(UTxO.V0.UtxoOut ConwayEra) Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "entities/committee/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/committee/v0" @Committee.V0.CanonicalCommitteeState forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/committee/v0" @Committee.V0.CanonicalCommitteeState Text "committee_state" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/committee/v0" @Committee.V0.CanonicalCommitteeAuthorization forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/committee/v0" @Committee.V0.CanonicalCommitteeAuthorization Text "committee_authorization" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "entities/stake_pools/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @(VRFVerKeyHash StakePoolVRF) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @(VRFVerKeyHash StakePoolVRF) Text "vrf_keyhash" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @UnitInterval forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @UnitInterval Text "unit_interval" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @(KeyHash Staking) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @(KeyHash Staking) Text "staking_keyhash" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @StakePoolRelay forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @StakePoolRelay Text "relay" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @PoolMetadata forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @PoolMetadata Text "pool_metadata" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @AccountId forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @AccountId Text "account_id" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @(Credential Staking) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @(Credential Staking) Text "credential" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @(KeyHash StakePool) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @(KeyHash StakePool) Text "pool_keyhash" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @(VRFVerKeyHash StakePoolVRF) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @(VRFVerKeyHash StakePoolVRF) Text "vrf_keyhash" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @UnitInterval forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @UnitInterval Text "unit_interval" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @(KeyHash Staking) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @(KeyHash Staking) Text "staking_keyhash" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @StakePoolRelay forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @StakePoolRelay Text "relay" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @PoolMetadata forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @PoolMetadata Text "pool_metadata" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @AccountAddress forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @AccountAddress Text "address" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @EntitiesStakePools.V0.CanonicalStakePoolParams forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @EntitiesStakePools.V0.CanonicalStakePoolParams Text "stake_pool_params" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @EntitiesStakePools.V0.CanonicalStakePoolState forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @EntitiesStakePools.V0.CanonicalStakePoolState Text "stake_pool_state" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/v0" @EntitiesStakePools.V0.CanonicalStakePool forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/v0" @EntitiesStakePools.V0.CanonicalStakePool Text "stake_pool" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "entities/dreps/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/dreps/v0" @EntitiesDReps.V0.CanonicalDRepState forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/dreps/v0" @EntitiesDReps.V0.CanonicalDRepState Text "drep_state" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "entities/stake_pools/vrf_key_hashes/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/vrf_key_hashes/v0" @(NonZero Word64) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/vrf_key_hashes/v0" @(NonZero Word64) Text "positive_int" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/stake_pools/vrf_key_hashes/v0" @EntitiesStakePoolsVRFKeyHashes.V0.EntitiesStakePoolsVRFKeyHashesOut forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/stake_pools/vrf_key_hashes/v0" @EntitiesStakePoolsVRFKeyHashes.V0.EntitiesStakePoolsVRFKeyHashesOut Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "entities/accounts/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/accounts/v0" @DRep forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/accounts/v0" @DRep Text "drep" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/accounts/v0" @EntitiesAccounts.V0.CanonicalAccountState forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/accounts/v0" @EntitiesAccounts.V0.CanonicalAccountState Text "account_state" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"entities/accounts/v0" @EntitiesAccounts.V0.EntitiesAccountsOut forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"entities/accounts/v0" @EntitiesAccounts.V0.EntitiesAccountsOut Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "gov/committee/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/committee/v0" @GovCommittee.V0.CanonicalCommittee forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/committee/v0" @GovCommittee.V0.CanonicalCommittee Text "committee" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/committee/v0" @GovCommittee.V0.GovCommitteeOut forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/committee/v0" @GovCommittee.V0.GovCommitteeOut Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "gov/constitution/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/constitution/v0" @GovConstitution.V0.CanonicalConstitution forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/constitution/v0" @GovConstitution.V0.CanonicalConstitution Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "gov/pparams/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/pparams/v0" @EpochInterval forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/pparams/v0" @EpochInterval Text "epoch_interval" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/pparams/v0" @NonNegativeInterval forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/pparams/v0" @NonNegativeInterval Text "nonnegative_interval" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/pparams/v0" @UnitInterval forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/pparams/v0" @UnitInterval Text "unit_interval" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/pparams/v0" @CanonicalExUnits forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/pparams/v0" @CanonicalExUnits Text "ex_units" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/pparams/v0" @(PParams ConwayEra) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/pparams/v0" @(GovPParams.V0.GovPParamsOut ConwayEra) Text "gov_pparams_out" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "gov/proposals/roots/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/proposals/roots/v0" @TxId forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/proposals/roots/v0" @GovProposals.V0.CanonicalGovActionIx forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/proposals/roots/v0" @GovProposals.V0.CanonicalGovActionId forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/proposals/roots/v0" @GovProposals.V0.CanonicalGovActionId Text "gov_action_id" forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/proposals/roots/v0" @GovProposals.Roots.V0.GovProposalsRootsOut forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/proposals/roots/v0" @GovProposals.Roots.V0.GovProposalsRootsOut Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "gov/proposals/v0" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical @"gov/proposals/v0" @(GovProposals.V0.GovProposalOut CanonicalGovActionState) forall (ns :: Symbol) a. (KnownSymbol ns, ToCanonicalCBOR ns a, Arbitrary a, Show a, Typeable a) => Text -> Spec validateType @"gov/proposals/v0" @(GovProposals.V0.GovProposalOut CanonicalGovActionState) Text "record_entry" [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a describe [Char] "namespaces" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"blocks/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"utxo/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"entities/committee/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"entities/stake_pools/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"entities/dreps/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"entities/stake_pools/vrf_key_hashes/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"entities/accounts/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"gov/constitution/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"gov/committee/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"gov/pparams/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"gov/proposals/v0" forall (ns :: Symbol). (KnownSymbol ns, KnownNamespace ns, Arbitrary (NamespaceEntry ns), Eq (NamespaceEntry ns), Show (NamespaceEntry ns)) => Spec testNS @"gov/proposals/roots/v0" where runConformanceTest :: (Text, Either LoadError (CTreeRoot MonoReferenced)) -> Spec runConformanceTest (Text nsText, Either LoadError (CTreeRoot MonoReferenced) mRef) = [Char] -> Spec -> Spec forall a. HasCallStack => [Char] -> SpecWith a -> SpecWith a context (Text -> [Char] T.unpack Text nsText) (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ [Char] -> Expectation -> SpecM (Arg Expectation) () forall a. (HasCallStack, Example a) => [Char] -> a -> SpecWith (Arg a) it [Char] "passes bidirectional conformance tests" (Expectation -> SpecM (Arg Expectation) ()) -> Expectation -> SpecM (Arg Expectation) () forall a b. (a -> b) -> a -> b $ do case Either LoadError (CTreeRoot MonoReferenced) mRef of Left LoadError err -> HasCallStack => [Char] -> Expectation [Char] -> Expectation expectationFailure ([Char] -> Expectation) -> [Char] -> Expectation forall a b. (a -> b) -> a -> b $ [Char] "Failed to load reference CDDL: " [Char] -> [Char] -> [Char] forall a. [a] -> [a] -> [a] ++ LoadError -> [Char] forall a. Show a => a -> [Char] show LoadError err Right CTreeRoot MonoReferenced refCDDL -> do case Text -> Maybe SomeNamespaceSymbol namespaceSymbolFromText Text nsText Maybe SomeNamespaceSymbol -> (SomeNamespaceSymbol -> Maybe (CTreeRoot MonoReferenced)) -> Maybe (CTreeRoot MonoReferenced) forall a b. Maybe a -> (a -> Maybe b) -> Maybe b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= (SomeNamespaceSymbol -> Map SomeNamespaceSymbol (CTreeRoot MonoReferenced) -> Maybe (CTreeRoot MonoReferenced)) -> Map SomeNamespaceSymbol (CTreeRoot MonoReferenced) -> SomeNamespaceSymbol -> Maybe (CTreeRoot MonoReferenced) forall a b c. (a -> b -> c) -> b -> a -> c flip SomeNamespaceSymbol -> Map SomeNamespaceSymbol (CTreeRoot MonoReferenced) -> Maybe (CTreeRoot MonoReferenced) forall k a. Ord k => k -> Map k a -> Maybe a Map.lookup Map SomeNamespaceSymbol (CTreeRoot MonoReferenced) validSpecs of Maybe (CTreeRoot MonoReferenced) Nothing -> HasCallStack => [Char] -> Expectation [Char] -> Expectation expectationFailure ([Char] -> Expectation) -> [Char] -> Expectation forall a b. (a -> b) -> a -> b $ [Char] "No valid Huddle CDDL spec found for namespace: " [Char] -> [Char] -> [Char] forall a. [a] -> [a] -> [a] ++ Text -> [Char] T.unpack Text nsText Just CTreeRoot MonoReferenced huddleSpec -> do (Integer -> Expectation) -> [Integer] -> Expectation forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => (a -> m b) -> t a -> m () mapM_ (\Integer _ -> CTreeRoot MonoReferenced -> CTreeRoot MonoReferenced -> Direction -> IO (Either FailureInfo ()) propReferenceAcceptsCBOR CTreeRoot MonoReferenced refCDDL CTreeRoot MonoReferenced huddleSpec Direction HuddleValidating IO (Either FailureInfo ()) -> Either FailureInfo () -> Expectation forall a. (HasCallStack, Show a, Eq a) => IO a -> a -> Expectation `shouldReturn` () -> Either FailureInfo () forall a b. b -> Either a b Right ()) [Integer 1 .. Integer sampleCount] (Integer -> Expectation) -> [Integer] -> Expectation forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => (a -> m b) -> t a -> m () mapM_ (\Integer _ -> CTreeRoot MonoReferenced -> CTreeRoot MonoReferenced -> Direction -> IO (Either FailureInfo ()) propReferenceAcceptsCBOR CTreeRoot MonoReferenced huddleSpec CTreeRoot MonoReferenced refCDDL Direction ReferenceValidating IO (Either FailureInfo ()) -> Either FailureInfo () -> Expectation forall a. (HasCallStack, Show a, Eq a) => IO a -> a -> Expectation `shouldReturn` () -> Either FailureInfo () forall a b. b -> Either a b Right ()) [Integer 1 .. Integer sampleCount] isCanonical :: forall ns a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical :: forall (ns :: Symbol) a. (ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec isCanonical = [Char] -> (a -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => [Char] -> prop -> Spec prop [Char] propName ((a -> Expectation) -> Spec) -> (a -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ forall (ns :: Symbol) a. ToCanonicalCBOR ns a => a -> Expectation propTypeIsCanonical @ns @a where propName :: [Char] propName = TypeRep -> [Char] -> [Char] showsTypeRep (Proxy a -> TypeRep forall {k} (proxy :: k -> *) (a :: k). Typeable a => proxy a -> TypeRep typeRep (forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @a)) [Char] " is canonical"