{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}

module Byron.Spec.Ledger.Update.Test
  ( coverUpiregFailures
  , coverUpivoteFailures
  )
where

import qualified Control.State.Transition.Generator as Generator
import           Data.Data (Data)
import           GHC.Stack (HasCallStack)
import           Hedgehog (MonadTest)
import           Hedgehog.Internal.Property (CoverPercentage)

import           Byron.Spec.Ledger.Update

-- | Check that all the relevant predicate failures are covered.
coverUpiregFailures
  :: forall m a
   .  ( MonadTest m
      , HasCallStack
      , Data a
      )
  => CoverPercentage
  -- ^ Minimum percentage that each failure must occur.
  -> a
  -- ^ Structure containing the failures
  -> m ()
coverUpiregFailures :: CoverPercentage -> a -> m ()
coverUpiregFailures CoverPercentage
coverPercentage a
someData = do
  CoverPercentage -> [PredicateFailure UPPVV] -> a -> m ()
forall (m :: * -> *) s a.
(MonadTest m, HasCallStack, Data (PredicateFailure s), Data a) =>
CoverPercentage -> [PredicateFailure s] -> a -> m ()
Generator.coverFailures
    CoverPercentage
coverPercentage
    [ PredicateFailure UPPVV
UppvvPredicateFailure
CannotFollowPv
    , [UpdateConstraintViolation] -> UppvvPredicateFailure
CannotUpdatePv []
    , PredicateFailure UPPVV
UppvvPredicateFailure
AlreadyProposedPv
    ]
    a
someData

  CoverPercentage -> [PredicateFailure UPSVV] -> a -> m ()
forall (m :: * -> *) s a.
(MonadTest m, HasCallStack, Data (PredicateFailure s), Data a) =>
CoverPercentage -> [PredicateFailure s] -> a -> m ()
Generator.coverFailures
    CoverPercentage
coverPercentage
    [ PredicateFailure UPSVV
UpsvvPredicateFailure
AlreadyProposedSv
    , PredicateFailure UPSVV
UpsvvPredicateFailure
CannotFollowSv
    , PredicateFailure UPSVV
UpsvvPredicateFailure
InvalidApplicationName
    , PredicateFailure UPSVV
UpsvvPredicateFailure
InvalidSystemTags
    ]
    a
someData

  CoverPercentage -> [PredicateFailure UPREG] -> a -> m ()
forall (m :: * -> *) s a.
(MonadTest m, HasCallStack, Data (PredicateFailure s), Data a) =>
CoverPercentage -> [PredicateFailure s] -> a -> m ()
Generator.coverFailures
    CoverPercentage
coverPercentage
    [ PredicateFailure UPREG
UpregPredicateFailure
NotGenesisDelegate
    , PredicateFailure UPREG
UpregPredicateFailure
DoesNotVerify
    ]
    a
someData


-- | See 'coverUpiregFailures'.
coverUpivoteFailures
  :: forall m a
   .  ( MonadTest m
      , HasCallStack
      , Data a
      )
  => CoverPercentage
  -> a
  -> m ()
coverUpivoteFailures :: CoverPercentage -> a -> m ()
coverUpivoteFailures CoverPercentage
coverPercentage =
  CoverPercentage -> [PredicateFailure ADDVOTE] -> a -> m ()
forall (m :: * -> *) s a.
(MonadTest m, HasCallStack, Data (PredicateFailure s), Data a) =>
CoverPercentage -> [PredicateFailure s] -> a -> m ()
Generator.coverFailures
    CoverPercentage
coverPercentage
    [ PredicateFailure ADDVOTE
AddvotePredicateFailure
AVSigDoesNotVerify
    , UpId -> AddvotePredicateFailure
NoUpdateProposal (Int -> UpId
UpId Int
0) -- We need to pass a dummy update id here.
    ]