packages feed

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