Skip to content

Commit

Permalink
TxTrace: Simplify model by moving latestSnapshot out
Browse files Browse the repository at this point in the history
This makes precondition and validFailingAction less conditional
  • Loading branch information
ch1bo authored and v0d1ch committed May 7, 2024
1 parent 89420c2 commit 523305e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 30 deletions.
1 change: 1 addition & 0 deletions fourmolu.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ fixities:
- infixr 0 $
- infixr 1 &
- infixl 3 <|>
- infixr 2 ||
- infixr 3 &&
- infixl 1 <&>
- infixl 4 <$>
Expand Down
70 changes: 40 additions & 30 deletions hydra-node/test/Hydra/Chain/Direct/TxTraceSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,14 @@ prop_runActions actions =

data Model = Model
{ headState :: State
, latestSnapshot :: SnapshotNumber
, alreadyContested :: [Actor]
}
deriving (Show)

data State
= Open {latestSnapshot :: SnapshotNumber}
| Closed {latestSnapshot :: SnapshotNumber}
= Open
| Closed
| Final
deriving (Show, Eq)

Expand All @@ -132,12 +133,13 @@ instance StateModel Model where

initialState =
Model
{ headState = Open 0 -- TODO: move latestSnapshot out?
{ headState = Open
, latestSnapshot = 0
, alreadyContested = []
}

arbitraryAction :: VarContext -> Model -> Gen (Any (Action Model))
arbitraryAction _lookup Model{headState} =
arbitraryAction _lookup Model{headState, latestSnapshot} =
case headState of
Open{} ->
oneof
Expand All @@ -150,7 +152,7 @@ instance StateModel Model where
snapshotNumber <- arbitrary
pure $ Some Decrement{actor, snapshotNumber}
]
Closed{latestSnapshot} ->
Closed{} ->
oneof
[ do
snapshotNumber <-
Expand All @@ -167,47 +169,55 @@ instance StateModel Model where
Final -> pure $ Some Stop

precondition :: Model -> Action Model a -> Bool
precondition Model{headState, alreadyContested} action =
case (headState, action) of
(Final, Stop) -> False
(Open{latestSnapshot}, Decrement{snapshotNumber}) ->
snapshotNumber > latestSnapshot
precondition Model{headState, latestSnapshot, alreadyContested} = \case
Stop -> headState /= Final
Decrement{snapshotNumber} ->
-- TODO: assert what to decrement still there
(Open{latestSnapshot}, Close{snapshotNumber}) ->
snapshotNumber >= latestSnapshot
(Open{}, Contest{}) -> False
(Closed{latestSnapshot}, Contest{actor, snapshotNumber}) ->
actor `notElem` alreadyContested && snapshotNumber > latestSnapshot
(Open{}, Fanout{}) -> False
(Closed{latestSnapshot}, Fanout{snapshotNumber}) ->
snapshotNumber == latestSnapshot
_ -> True
headState == Open
&& snapshotNumber > latestSnapshot
Close{snapshotNumber} ->
headState == Open
&& snapshotNumber >= latestSnapshot
Contest{actor, snapshotNumber} ->
headState == Closed
&& actor `notElem` alreadyContested
&& snapshotNumber > latestSnapshot
Fanout{snapshotNumber} ->
headState == Closed
&& snapshotNumber == latestSnapshot

validFailingAction :: Model -> Action Model a -> Bool
validFailingAction Model{headState, alreadyContested} action =
case (headState, action) of
(Open{latestSnapshot}, Decrement{snapshotNumber}) -> snapshotNumber <= latestSnapshot
(Open{latestSnapshot}, Close{snapshotNumber}) -> snapshotNumber < latestSnapshot
(Closed{latestSnapshot}, Contest{actor, snapshotNumber}) -> snapshotNumber <= latestSnapshot || actor `elem` alreadyContested
(Closed{latestSnapshot}, Fanout{snapshotNumber}) -> snapshotNumber /= latestSnapshot
_ -> False
validFailingAction Model{latestSnapshot, alreadyContested} = \case
Decrement{snapshotNumber} ->
snapshotNumber <= latestSnapshot
Close{snapshotNumber} ->
snapshotNumber < latestSnapshot
Contest{actor, snapshotNumber} ->
snapshotNumber <= latestSnapshot
|| actor `elem` alreadyContested
Fanout{snapshotNumber} ->
snapshotNumber /= latestSnapshot
_ -> False

nextState :: Model -> Action Model a -> Var a -> Model
nextState m Stop _ = m
nextState m t _result =
case t of
Stop -> m
Decrement{snapshotNumber} ->
m
{ headState = Open snapshotNumber
{ headState = Open
, latestSnapshot = snapshotNumber
}
Close{snapshotNumber} ->
m
{ headState = Closed snapshotNumber
{ headState = Closed
, latestSnapshot = snapshotNumber
, alreadyContested = []
}
Contest{actor, snapshotNumber} ->
m
{ headState = Closed snapshotNumber
{ headState = Closed
, latestSnapshot = snapshotNumber
, alreadyContested = actor : alreadyContested m
}
Fanout{} -> m{headState = Final}
Expand Down

0 comments on commit 523305e

Please sign in to comment.