packages feed

keiro-dsl-0.6.0.0: test/conformance-replay/Generated/ReplayDivergence/Note/Harness.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedLabels #-}

-- @generated by keiro-dsl; do not edit. Regenerated from the .keiro spec.
module Generated.ReplayDivergence.Note.Harness (harnessAssertions) where

import Generated.ReplayDivergence.Note.Codec (encodeNoteEvent, noteCodec, parseNoteEvent)
import Generated.ReplayDivergence.Note.Domain
import Keiki.Core (applyEventsEither, defaultValidationOptions, step, validateTransducer, (!))
import Keiro.Codec (eventType)
import ReplayDivergence.Note.Holes (noteTransducer)

{- | (label, passed). A driver runs these and exits non-zero on any False,
naming the failing assertion. Filling a hole wrongly turns a specific
entry False; the scaffold cannot.
-}
harnessAssertions :: [(String, Bool)]
harnessAssertions =
    [ ("validateTransducer is empty", null (validateTransducer defaultValidationOptions noteTransducer))
    , ("clock-free: spec samples no wall clock", True)
    , ("golden round-trip: NoteWritten", roundTrips sampleEventNoteWritten)
    , ("accepts WriteNote from NoteEmpty", acceptWriteNote)
    ]
        ++ forwardReplayWriteNote

roundTrips :: NoteEvent -> Bool
roundTrips e = parseNoteEvent (eventType noteCodec e) (encodeNoteEvent e) == Right e

sampleEventNoteWritten :: NoteEvent
sampleEventNoteWritten = (NoteWritten (NoteWrittenData "sample-noteText" "sample-echo"))

acceptWriteNote :: Bool
acceptWriteNote =
    case step noteTransducer (NoteEmpty, initialNoteRegs) ((WriteNote (WriteNoteData "sample-noteText" "sample-echo"))) of
        Just (v, _, _) -> v == NoteRecorded
        Nothing -> False

-- forward/replay equality (plan 147): cross the persisted codec boundary,
-- replay the emitted chain, and compare the final vertex and every register.
forwardReplayWriteNote :: [(String, Bool)]
forwardReplayWriteNote =
    case step noteTransducer (NoteEmpty, initialNoteRegs) ((WriteNote (WriteNoteData "sample-noteText" "sample-echo"))) of
        Nothing -> [(prefix <> "forward step accepted", False)]
        Just (forwardVertex, forwardRegs, emitted) ->
            case mapM (\event -> parseNoteEvent (eventType noteCodec event) (encodeNoteEvent event)) emitted of
                Left _ -> [(prefix <> "emitted chain decodes", False)]
                Right decodedEvents ->
                    case applyEventsEither noteTransducer (NoteEmpty, initialNoteRegs) decodedEvents of
                        Left _ -> [(prefix <> "replay succeeds", False)]
                        Right (replayVertex, replayRegs) ->
                            [ (prefix <> "final vertex", replayVertex == forwardVertex)
                            , (prefix <> "register note", (replayRegs ! #note) == (forwardRegs ! #note))
                            ]
  where
    prefix = "forward/replay equality: WriteNote from NoteEmpty -- "