packages feed

keiro-dsl-0.21.0.0: test/conformance-history-dependent-holes/Main.hs

module Main (main) where

import Data.Text.IO qualified as TIO
import Generated.HistoryDependentHoles.Assignment.BehaviorContract
import Generated.HistoryDependentHoles.Assignment.Domain
import Generated.HistoryDependentHoles.Assignment.Harness (harnessAssertions)
import Generated.HistoryDependentHoles.Assignment.Transducer (assignmentTransducer)
import HistoryDependentHoles.Assignment.BehaviorHoles (behaviorWitnesses)
import Keiki.Core qualified as K
import System.Exit (exitFailure)
import Control.Monad (unless)

main :: IO ()
main = do
  mapM_ printRow harnessAssertions
  TIO.putStr (renderBehaviorConformanceText report)
  mapM_ printRow directAssertions
  unless (all snd (harnessAssertions <> directAssertions)) exitFailure
  where
    printRow (label, passed) = putStrLn ((if passed then "PASS  " else "FAIL  ") <> label)

report :: BehaviorConformanceReport
report = behaviorCoverageReport behaviorWitnesses

directAssertions :: [(String, Bool)]
directAssertions =
  [ ("live clear from empty registers refuses", case K.step assignmentTransducer seed clear of Nothing -> True; Just _ -> False)
  , ("forward stepping never selects the replay-only clear", case K.stepDetailedEither assignmentTransducer seed clear of Left K.NoMatchingEdge {} -> True; _ -> False)
  , ("historical empty clear replays through the replay-only edge", case K.applyEventsDetailedEither assignmentTransducer seed [PropertyCleared (PropertyClearedData "colour")] of
       Right result -> case result.replaySuccessTrace of
         [attribution] -> attribution.replayAttributionMode == K.ReplayOnly && attribution.replayAttributionEdge == K.EdgeRef AssignmentActive 3
         _ -> False
       Left _ -> False)
  , ("behavior conformance passes", behaviorConformancePassed report)
  ]
  where
    seed = (AssignmentActive, initialAssignmentRegs)
    clear = ClearProperty (ClearPropertyData "colour")