keiro-dsl-0.12.0.0: test/conformance-import-planning/Generated/ImportPlanningCollisions/CollisionLedger/Harness.hs
-- @generated by keiro-dsl 0.12.0.0 (language keiro-dsl 4) from aggregate CollisionLedger; do not edit.
module Generated.ImportPlanningCollisions.CollisionLedger.Harness (harnessAssertions) where
import Generated.ImportPlanningCollisions.CollisionLedger.Domain
import Generated.ImportPlanningCollisions.CollisionLedger.Codec (encodeCollisionLedgerEvent, parseCollisionLedgerEvent, collisionLedgerCodec, encodeDetailsMapped, decodeDetailsMapped)
import Generated.ImportPlanningCollisions.CollisionLedger.Transducer (collisionLedgerTransducer)
import Keiki.Core (applyEventsEither, defaultValidationOptions, step, validateTransducer, fieldWitnessAgrees)
import Keiro.Codec (eventType)
import Data.Aeson qualified as Aeson
import Data.Aeson.Key qualified as AesonKey
import Data.Aeson.KeyMap qualified as AesonKeyMap
import Data.Either (isLeft)
import Data.Text qualified as T
import Keiro.Codec.Structural (FixtureCases (..))
import Data.List.NonEmpty qualified as NonEmpty
import Keiro.Codec.Nominal (nominalDomainRoundTrip, nominalFixtureCases, nominalFixtureDomain, nominalRepresentationRoundTrip, nominalToRepresentation)
import Generated.ImportPlanningCollisions.NominalProjections qualified as NominalProjections
import ImportPlanning.Bindings qualified as Bindings
-- | (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 collisionLedgerTransducer))
-- clock-free: spec samples no wall clock (verified at scaffold time)
, ("golden round-trip: RecordedValues", roundTrips sampleEventRecordedValues)
, ("accepts Record from CollisionLedgerEmpty", acceptRecord)
]
++ mappedConformanceAssertions
++ nominalConformanceAssertions
++ forwardReplayRecord
roundTrips :: CollisionLedgerEvent -> Bool
roundTrips e = parseCollisionLedgerEvent (eventType collisionLedgerCodec e) (encodeCollisionLedgerEvent e) == Right e
sampleEventRecordedValues :: CollisionLedgerEvent
sampleEventRecordedValues = RecordedValues (RecordedValuesData (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.orderStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.invoiceStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.localCollisionFixtures))) (snd (NonEmpty.head (fixtureCases Bindings.detailsFixtures))))
acceptRecord :: Bool
acceptRecord =
case step collisionLedgerTransducer (CollisionLedgerEmpty, initialCollisionLedgerRegs) (Record (RecordData (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.orderStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.invoiceStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.localCollisionFixtures))) (snd (NonEmpty.head (fixtureCases Bindings.detailsFixtures))))) of
Just (v, _, _) -> v == CollisionLedgerRecorded
Nothing -> False
-- forward/replay equality (plan 147): cross the persisted codec boundary,
-- replay the emitted chain, and compare the final vertex and every register.
forwardReplayRecord :: [(String, Bool)]
forwardReplayRecord =
case step collisionLedgerTransducer (CollisionLedgerEmpty, initialCollisionLedgerRegs) (Record (RecordData (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.orderStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.invoiceStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.localCollisionFixtures))) (snd (NonEmpty.head (fixtureCases Bindings.detailsFixtures))))) of
Nothing -> [(prefix <> "forward step accepted", False)]
Just (forwardVertex, _forwardRegs, emitted) ->
case mapM (\event -> parseCollisionLedgerEvent (eventType collisionLedgerCodec event) (encodeCollisionLedgerEvent event)) emitted of
Left _ -> [(prefix <> "emitted chain decodes", False)]
Right decodedEvents ->
case applyEventsEither collisionLedgerTransducer (CollisionLedgerEmpty, initialCollisionLedgerRegs) decodedEvents of
Left _ -> [(prefix <> "replay succeeds", False)]
Right (replayVertex, _replayRegs) ->
[ (prefix <> "final vertex", replayVertex == forwardVertex)
]
where
prefix = "forward/replay equality: Record from CollisionLedgerEmpty -- "
mappedConformanceAssertions :: [(String, Bool)]
mappedConformanceAssertions =
concat
[ recordedValuesDetailsAssertions
, structuralWirePolicyAssertions
]
recordedValuesDetailsAssertions :: [(String, Bool)]
recordedValuesDetailsAssertions =
[ ("mapped codec round-trip: RecordedValues/details/" <> T.unpack label, roundTrips (RecordedValues (RecordedValuesData (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.orderStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.invoiceStatusFixtures))) (nominalFixtureDomain (NonEmpty.head (nominalFixtureCases Bindings.localCollisionFixtures))) mappedValue)))
| (label, mappedValue) <- NonEmpty.toList (fixtureCases Bindings.detailsFixtures)
]
structuralWirePolicyAssertions :: [(String, Bool)]
structuralWirePolicyAssertions =
[ ("wire policy unknown fields: import-planning.Details.v1", all (\(_, value) -> isLeft (decodeDetailsMapped (insertObjectField "__keiro_unknown" (Aeson.Bool True) (encodeDetailsMapped value)))) (NonEmpty.toList (fixtureCases Bindings.detailsFixtures)))
]
insertObjectField :: T.Text -> Aeson.Value -> Aeson.Value -> Aeson.Value
insertObjectField key inserted (Aeson.Object objectValue) = Aeson.Object (AesonKeyMap.insert (AesonKey.fromText key) inserted objectValue)
insertObjectField _ _ value = value
nominalConformanceAssertions :: [(String, Bool)]
nominalConformanceAssertions =
[ ("nominal domain law: InvoiceStatus", all (\fixture -> nominalDomainRoundTrip Bindings.invoiceStatusBinding (nominalFixtureDomain fixture)) (NonEmpty.toList (nominalFixtureCases Bindings.invoiceStatusFixtures)))
, ("nominal representation law: InvoiceStatus", all (\fixture -> let domainValue = nominalFixtureDomain fixture in nominalRepresentationRoundTrip Bindings.invoiceStatusBinding (nominalToRepresentation Bindings.invoiceStatusBinding domainValue)) (NonEmpty.toList (nominalFixtureCases Bindings.invoiceStatusFixtures)))
, ("nominal projection agreement: InvoiceStatus", all (\fixture -> fieldWitnessAgrees NominalProjections.invoiceStatusWitness (nominalToRepresentation Bindings.invoiceStatusBinding) (nominalFixtureDomain fixture)) (NonEmpty.toList (nominalFixtureCases Bindings.invoiceStatusFixtures)))
, ("nominal domain law: LocalCollision", all (\fixture -> nominalDomainRoundTrip Bindings.localCollisionBinding (nominalFixtureDomain fixture)) (NonEmpty.toList (nominalFixtureCases Bindings.localCollisionFixtures)))
, ("nominal representation law: LocalCollision", all (\fixture -> let domainValue = nominalFixtureDomain fixture in nominalRepresentationRoundTrip Bindings.localCollisionBinding (nominalToRepresentation Bindings.localCollisionBinding domainValue)) (NonEmpty.toList (nominalFixtureCases Bindings.localCollisionFixtures)))
, ("nominal projection agreement: LocalCollision", all (\fixture -> fieldWitnessAgrees NominalProjections.localCollisionWitness (nominalToRepresentation Bindings.localCollisionBinding) (nominalFixtureDomain fixture)) (NonEmpty.toList (nominalFixtureCases Bindings.localCollisionFixtures)))
, ("nominal domain law: OrderStatus", all (\fixture -> nominalDomainRoundTrip Bindings.orderStatusBinding (nominalFixtureDomain fixture)) (NonEmpty.toList (nominalFixtureCases Bindings.orderStatusFixtures)))
, ("nominal representation law: OrderStatus", all (\fixture -> let domainValue = nominalFixtureDomain fixture in nominalRepresentationRoundTrip Bindings.orderStatusBinding (nominalToRepresentation Bindings.orderStatusBinding domainValue)) (NonEmpty.toList (nominalFixtureCases Bindings.orderStatusFixtures)))
, ("nominal projection agreement: OrderStatus", all (\fixture -> fieldWitnessAgrees NominalProjections.orderStatusWitness (nominalToRepresentation Bindings.orderStatusBinding) (nominalFixtureDomain fixture)) (NonEmpty.toList (nominalFixtureCases Bindings.orderStatusFixtures)))
]