phino-0.0.144: test/EngineSpec.hs
{-# LANGUAGE OverloadedStrings #-}
-- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
-- SPDX-License-Identifier: MIT
module EngineSpec where
import AST
import Data.Map.Strict qualified as Map
import Deps (Term (TeExpression))
import Engine (Engine (..), building, fresh, stepOf, yaml)
import Matcher (substEmpty)
import Rule (Step (..))
import Test.Hspec (Spec, describe, it, shouldBe)
import Yaml qualified as Y
spec :: Spec
spec = do
describe "stepOf" $ do
it "interprets a rule the engine was not compiled from" $
_name (stepOf yaml (Y.Rule "wnkq" Nothing Nothing ExXi ExRoot Nothing Nothing Nothing)) `shouldBe` "wnkq"
it "takes the step the engine compiled out of the very same rule" $
let rule = Y.Rule "prv" Nothing Nothing ExTermination ExXi Nothing Nothing Nothing
in _name (stepOf yaml{_rules = Map.fromList [(show rule, Step "zyx8" (\_ _ -> pure Nothing))]} rule) `shouldBe` "zyx8"
describe "fresh" $ do
it "accepts the engine interpreting the rules phino carries" $
fresh yaml `shouldBe` True
it "refuses an engine compiled from other rules" $
fresh yaml{_sources = ["Rule {name = \"gone\"}"]} `shouldBe` False
describe "building" $
it "hands contextualization to the engine" $ do
TeExpression term <- building yaml{_contextualize = \_ _ -> pure (ExDispatch ExRoot (AtLabel "qo"))} "contextualize" [Y.ArgExpression ExXi, Y.ArgExpression (ExFormation [])] substEmpty
term `shouldBe` ExDispatch ExRoot (AtLabel "qo")