{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Ledger.Conformance.ExecSpecRule.Conway.Gov () where

import Cardano.Ledger.Conway (ConwayEra)
import Cardano.Ledger.Conway.Core (EraPParams (..))
import Cardano.Ledger.Conway.Governance
import Cardano.Ledger.Conway.Rules
import Lens.Micro ((&), (.~), (^.))
import qualified Lib as Agda
import Test.Cardano.Ledger.Conformance
import Test.Cardano.Ledger.Conformance.ExecSpecRule.Conway.Base ()
import Test.Cardano.Ledger.Constrained.Conway
import Test.Cardano.Ledger.Conway.Arbitrary ()
import Test.Cardano.Ledger.Imp.Common

instance
  ( NFData (SpecRep (ConwayGovPredFailure ConwayEra))
  , IsConwayUniv fn
  ) =>
  ExecSpecRule fn "GOV" ConwayEra
  where
  type ExecContext fn "GOV" ConwayEra = EnactState ConwayEra

  environmentSpec :: HasCallStack =>
ExecContext fn "GOV" ConwayEra
-> Specification fn (ExecEnvironment fn "GOV" ConwayEra)
environmentSpec ExecContext fn "GOV" ConwayEra
_ = forall (fn :: [*] -> * -> *).
IsConwayUniv fn =>
Specification fn (GovEnv ConwayEra)
govEnvSpec

  stateSpec :: HasCallStack =>
ExecContext fn "GOV" ConwayEra
-> ExecEnvironment fn "GOV" ConwayEra
-> Specification fn (ExecState fn "GOV" ConwayEra)
stateSpec ExecContext fn "GOV" ConwayEra
_ = forall (fn :: [*] -> * -> *).
IsConwayUniv fn =>
GovEnv ConwayEra -> Specification fn (Proposals ConwayEra)
govProposalsSpec

  signalSpec :: HasCallStack =>
ExecContext fn "GOV" ConwayEra
-> ExecEnvironment fn "GOV" ConwayEra
-> ExecState fn "GOV" ConwayEra
-> Specification fn (ExecSignal fn "GOV" ConwayEra)
signalSpec ExecContext fn "GOV" ConwayEra
_ = forall (fn :: [*] -> * -> *).
IsConwayUniv fn =>
GovEnv ConwayEra
-> Proposals ConwayEra -> Specification fn (GovSignal ConwayEra)
govProceduresSpec

  runAgdaRule :: HasCallStack =>
SpecRep (ExecEnvironment fn "GOV" ConwayEra)
-> SpecRep (ExecState fn "GOV" ConwayEra)
-> SpecRep (ExecSignal fn "GOV" ConwayEra)
-> Either
     OpaqueErrorString (SpecRep (ExecState fn "GOV" ConwayEra))
runAgdaRule SpecRep (ExecEnvironment fn "GOV" ConwayEra)
env SpecRep (ExecState fn "GOV" ConwayEra)
st SpecRep (ExecSignal fn "GOV" ConwayEra)
sig = forall a. ComputationResult Text a -> Either OpaqueErrorString a
unComputationResult forall a b. (a -> b) -> a -> b
$ GovEnv
-> GovState
-> [Either GovVote GovProposal]
-> T_ComputationResult_46 Text GovState
Agda.govStep SpecRep (ExecEnvironment fn "GOV" ConwayEra)
env SpecRep (ExecState fn "GOV" ConwayEra)
st SpecRep (ExecSignal fn "GOV" ConwayEra)
sig

  translateInputs :: HasCallStack =>
ExecEnvironment fn "GOV" ConwayEra
-> ExecState fn "GOV" ConwayEra
-> ExecSignal fn "GOV" ConwayEra
-> ExecContext fn "GOV" ConwayEra
-> ImpTestM
     ConwayEra
     (SpecRep (ExecEnvironment fn "GOV" ConwayEra),
      SpecRep (ExecState fn "GOV" ConwayEra),
      SpecRep (ExecSignal fn "GOV" ConwayEra))
translateInputs env :: ExecEnvironment fn "GOV" ConwayEra
env@GovEnv {PParams ConwayEra
gePParams :: forall era. GovEnv era -> PParams era
gePParams :: PParams ConwayEra
gePParams} ExecState fn "GOV" ConwayEra
st ExecSignal fn "GOV" ConwayEra
sig ExecContext fn "GOV" ConwayEra
enactState = do
    GovEnv
agdaEnv <- forall a (m :: * -> *) b.
(HasCallStack, Show a, MonadIO m) =>
Either a b -> m b
expectRight forall a b. (a -> b) -> a -> b
$ forall ctx a. ctx -> SpecTransM ctx a -> Either Text a
runSpecTransM EnactState ConwayEra
ctx forall a b. (a -> b) -> a -> b
$ forall ctx a.
SpecTranslate ctx a =>
a -> SpecTransM ctx (SpecRep a)
toSpecRep ExecEnvironment fn "GOV" ConwayEra
env
    GovState
agdaSt <- forall a (m :: * -> *) b.
(HasCallStack, Show a, MonadIO m) =>
Either a b -> m b
expectRight forall a b. (a -> b) -> a -> b
$ forall ctx a. ctx -> SpecTransM ctx a -> Either Text a
runSpecTransM EnactState ConwayEra
ctx forall a b. (a -> b) -> a -> b
$ forall ctx a.
SpecTranslate ctx a =>
a -> SpecTransM ctx (SpecRep a)
toSpecRep ExecState fn "GOV" ConwayEra
st
    [Either GovVote GovProposal]
agdaSig <- forall a (m :: * -> *) b.
(HasCallStack, Show a, MonadIO m) =>
Either a b -> m b
expectRight forall a b. (a -> b) -> a -> b
$ forall ctx a. ctx -> SpecTransM ctx a -> Either Text a
runSpecTransM EnactState ConwayEra
ctx forall a b. (a -> b) -> a -> b
$ forall ctx a.
SpecTranslate ctx a =>
a -> SpecTransM ctx (SpecRep a)
toSpecRep ExecSignal fn "GOV" ConwayEra
sig
    forall (f :: * -> *) a. Applicative f => a -> f a
pure (GovEnv
agdaEnv, GovState
agdaSt, [Either GovVote GovProposal]
agdaSig)
    where
      ctx :: EnactState ConwayEra
ctx =
        ExecContext fn "GOV" ConwayEra
enactState
          forall a b. a -> (a -> b) -> b
& forall era. Lens' (EnactState era) (GovRelation StrictMaybe era)
ensPrevGovActionIdsL
            forall s t a b. ASetter s t a b -> b -> s -> t
.~ forall era. GovRelation PRoot era -> GovRelation StrictMaybe era
toPrevGovActionIds (ExecState fn "GOV" ConwayEra
st forall s a. s -> Getting a s a -> a
^. forall era. Lens' (Proposals era) (GovRelation PRoot era)
pRootsL)
          forall a b. a -> (a -> b) -> b
& forall era. EraPParams era => Lens' (EnactState era) ProtVer
ensProtVerL
            forall s t a b. ASetter s t a b -> b -> s -> t
.~ (PParams ConwayEra
gePParams forall s a. s -> Getting a s a -> a
^. forall era. EraPParams era => Lens' (PParams era) ProtVer
ppProtocolVersionL)