{-# 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, UnitInterval)
import Cardano.Ledger.CanonicalState.BasicTypes (CanonicalExUnits (..))
import Cardano.Ledger.CanonicalState.Conway ()
import qualified Cardano.Ledger.CanonicalState.Namespace.Blocks.V0 as Blocks.V0
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesCommittee.V0 as Committee.V0
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.V0 as EntitiesStakePools.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.State (PoolMetadata, StakePoolRelay)
import Cardano.Ledger.TxIn (TxId)
import Cardano.SCLS.CBOR.Canonical.Encoder (ToCanonicalCBOR (..))
import Cardano.SCLS.Testlib
import Data.Typeable
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
"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
"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 @"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"