hydra-0.5.0: src/test/haskell/Hydra/FlowsSpec.hs
module Hydra.FlowsSpec where
import Hydra.Kernel
import qualified Hydra.Dsl.Terms as Terms
import Hydra.TestUtils
import qualified Test.Hspec as H
import qualified Test.QuickCheck as QC
import qualified Data.List as L
import qualified Data.Map as M
import qualified Test.Hspec as H
checkErrorTrace :: H.SpecWith ()
checkErrorTrace = do
H.describe "Check error traces resulting from an explicit failure" $ do
H.it "Error traces are in the right order" $
H.shouldBe
(unFlow (withTrace "one" $ withTrace "two" $ if False then pure 42 else fail "oops") () emptyTrace)
(FlowState Nothing () emptyTrace {traceMessages = ["Error: oops (one > two)"]})
checkMaxTraceDepth :: H.SpecWith ()
checkMaxTraceDepth = do
H.describe "Check breaking out of flows with an infinite loop" $ do
H.it "Flows with no trace are OK" $
H.shouldBe
(unFlow (testFlow 42 0) () emptyTrace)
(FlowState (Just 42) () emptyTrace)
H.it "Flows with a trace just below the maximum depth are OK" $
H.shouldBe
(unFlow (testFlow 42 maxTraceDepth) () emptyTrace)
(FlowState (Just 42) () emptyTrace)
H.it "Flows fail when their trace reaches the maximum depth" $ do
H.shouldBe (flowStateValue overflow) Nothing
H.shouldBe (L.length $ traceMessages $ flowStateTrace overflow) 1
where
overflow = unFlow (testFlow 42 (maxTraceDepth+1)) () emptyTrace
testFlow :: x -> Int -> Flow () x
testFlow seed depth = helper depth
where
helper d = if d == 0
then pure seed
else withTrace ("level " ++ show (depth-d)) $ helper (d-1)
spec :: H.Spec
spec = do
checkErrorTrace
checkMaxTraceDepth