packages feed

keiro-dsl-0.21.0.0: test/conformance-mapped-register-construction/Generated/MappedRegisterConstruction/StructuralConformance.hs

-- @generated by keiro-dsl 0.21.0.0 (language keiro-dsl 6) from context mapped-register-construction structural conformance; do not edit.
module Generated.MappedRegisterConstruction.StructuralConformance
  ( structuralConformanceAssertions
  ) where

import Data.Aeson qualified as Aeson
import Data.List (nub)
import Data.List.NonEmpty qualified as NonEmpty
import Data.Text qualified as T
import Keiro.Codec.Structural (FixtureCases (..))
import Conformance.MappedRegisterConstruction.Bindings qualified as Bindings
import Conformance.MappedRegisterConstruction.Domain (MaybeTime)
import Conformance.MappedRegisterConstruction.Lift qualified as Lift
import Data.Time (UTCTime)

structuralConformanceAssertions :: [(String, Bool)]
structuralConformanceAssertions =
  concat
    [ maybeTimeOpaqueAssertions
    , maybeTimeWriteLiftAssertions
    ]

validFixtureLabels :: NonEmpty.NonEmpty (T.Text, value) -> Bool
validFixtureLabels cases =
  all (not . T.null) labels && length labels == length (nub labels)
  where
    labels = map fst (NonEmpty.toList cases)

maybeTimeOpaqueAssertions :: [(String, Bool)]
maybeTimeOpaqueAssertions =
  ("opaque boundary fixtures: conformance.MaybeTime.json@1", validFixtureLabels cases) :
  [ ("opaque codec round-trip: conformance.MaybeTime.json@1/" <> T.unpack caseLabel, case Aeson.fromJSON (Aeson.toJSON value) of Aeson.Success decoded -> decoded == value; Aeson.Error _ -> False)
  | (caseLabel, value) <- NonEmpty.toList cases
  ]
  where
    cases = fixtureCases Bindings.maybeTimeCases

maybeTimeWriteLiftAssertions :: [(String, Bool)]
maybeTimeWriteLiftAssertions =
  ("write-lift fixture labels: MaybeTime", all (not . T.null . T.strip) labels && length labels == length (nub labels)) :
  [ ("write-lift case: MaybeTime/" <> T.unpack label, apply input == expected)
  | (label, input, expected) <- NonEmpty.toList cases
  ]
  where
    apply :: UTCTime -> MaybeTime
    apply = Lift.atTime
    cases :: NonEmpty.NonEmpty (T.Text, UTCTime, MaybeTime)
    cases = Lift.atTimeCases
    labels = [label | (label, _, _) <- NonEmpty.toList cases]