{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# 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.Conway (CanonicalGovActionState)
import qualified Cardano.Ledger.CanonicalState.Namespace.Blocks.V0 as Blocks.V0
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 Cardano.SCLS.Testlib
import Data.Typeable
import Data.Word (Word64)
import GHC.TypeLits
import Test.Cardano.Ledger.CanonicalState.Arbitrary ()
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Conway.CanonicalState.Arbitrary ()

spec :: Spec
spec :: Spec
spec = do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"types" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"blocks/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"utxo/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"entities/committee/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"entities/stake_pools/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"entities/dreps/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"entities/stake_pools/vrf_key_hashes/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"entities/accounts/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"gov/committee/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"gov/constitution/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"gov/pparams/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"gov/proposals/roots/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, ToCanonicalCBOR ns a, Typeable a, Arbitrary a,
 Show a) =>
Spec
isCanonical @"gov/proposals/roots/v0" @TxId
      forall (ns :: Symbol) a.
(KnownSymbol ns, ToCanonicalCBOR ns a, Typeable a, Arbitrary a,
 Show a) =>
Spec
isCanonical @"gov/proposals/roots/v0" @GovProposals.V0.CanonicalGovActionIx
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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.
(KnownSymbol ns, 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"
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"gov/proposals/v0" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall (ns :: Symbol) a.
(KnownSymbol ns, 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"
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"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"

isCanonical ::
  forall ns a. (KnownSymbol ns, ToCanonicalCBOR ns a, Typeable a, Arbitrary a, Show a) => Spec
isCanonical :: forall (ns :: Symbol) a.
(KnownSymbol ns, ToCanonicalCBOR ns a, Typeable a, Arbitrary a,
 Show a) =>
Spec
isCanonical = String -> (a -> IO ()) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
propName ((a -> IO ()) -> Spec) -> (a -> IO ()) -> Spec
forall a b. (a -> b) -> a -> b
$ forall (ns :: Symbol) a.
(KnownSymbol ns, ToCanonicalCBOR ns a) =>
a -> IO ()
propTypeIsCanonical @ns @a
  where
    propName :: String
propName = TypeRep -> ShowS
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)) String
" is canonical"