{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Ledger.Dijkstra.Imp where

import Cardano.Ledger.Conway.Rules
import Cardano.Ledger.Dijkstra (DijkstraEra)
import Cardano.Ledger.Dijkstra.Core
import Cardano.Ledger.Dijkstra.Rules (DijkstraUtxoPredFailure)
import Cardano.Ledger.Shelley.Rules
import Test.Cardano.Ledger.Common
import qualified Test.Cardano.Ledger.Conway.Imp as ConwayImp
import qualified Test.Cardano.Ledger.Dijkstra.Imp.UtxoSpec as Utxo
import qualified Test.Cardano.Ledger.Dijkstra.Imp.UtxowSpec as Utxow
import Test.Cardano.Ledger.Dijkstra.ImpTest

spec ::
  forall era.
  ( DijkstraEraImp era
  , EraSpecificSpec era
  , Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era
  , Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era
  , Event (EraRule "HARDFORK" era) ~ ConwayHardForkEvent era
  , InjectRuleFailure "LEDGER" DijkstraUtxoPredFailure era
  ) =>
  Spec
spec :: forall era.
(DijkstraEraImp era, EraSpecificSpec era,
 Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era,
 Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era,
 Event (EraRule "HARDFORK" era) ~ ConwayHardForkEvent era,
 InjectRuleFailure "LEDGER" DijkstraUtxoPredFailure era) =>
Spec
spec = do
  forall era.
(ConwayEraImp era, EraSpecificSpec era,
 Event (EraRule "HARDFORK" era) ~ ConwayHardForkEvent era,
 Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era,
 Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era) =>
Spec
ConwayImp.spec @era
  forall era.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era)) -> Spec
withEachEraVersion @era (SpecWith (ImpInit (LedgerSpec era)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec era)) -> Spec
forall a b. (a -> b) -> a -> b
$ forall era.
(DijkstraEraImp era,
 InjectRuleFailure "LEDGER" DijkstraUtxoPredFailure era) =>
SpecWith (ImpInit (LedgerSpec era))
dijkstraEraGenericSpec @era

dijkstraEraGenericSpec ::
  forall era.
  ( DijkstraEraImp era
  , InjectRuleFailure "LEDGER" DijkstraUtxoPredFailure era
  ) =>
  SpecWith (ImpInit (LedgerSpec era))
dijkstraEraGenericSpec :: forall era.
(DijkstraEraImp era,
 InjectRuleFailure "LEDGER" DijkstraUtxoPredFailure era) =>
SpecWith (ImpInit (LedgerSpec era))
dijkstraEraGenericSpec = do
  String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"UTXOW" SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
Utxow.spec
  String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"UTXO" SpecWith (ImpInit (LedgerSpec era))
forall era.
(DijkstraEraImp era,
 InjectRuleFailure "LEDGER" DijkstraUtxoPredFailure era) =>
SpecWith (ImpInit (LedgerSpec era))
Utxo.spec

instance EraSpecificSpec DijkstraEra