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