descript-lang-0.2.0.0: test/Core/Test/Descript/Spec.hs
module Core.Test.Descript.Spec
( shouldFailTo_
, shouldFailToSummaryIn
, shouldFailToSummaries
, shouldBeReducePrintOf
) where
import Test.Hspec
import Test.HUnit
import Descript.Misc
import Data.List
import Control.Monad
-- | Asserts the result should be a failure, and the error should be the
-- given value.
shouldFailTo_ :: (HasCallStack, Eq e, Show e, Summary a) => Result e a -> e -> Expectation
shouldFailTo_ = shouldFailToGen id
-- | Asserts the result should be a failure, and the error's summary
-- should be the given value.
shouldFailToSummaryIn :: (HasCallStack, FileSummary e, Summary a) => SFile -> Result e a -> String -> Expectation
shouldFailToSummaryIn = shouldFailToGen . summaryF
-- | Asserts the result should be a failure, and the errors' summaries
-- should be the given values.
shouldFailToSummaries :: (HasCallStack, Summary e, Summary a) => Result [e] a -> [String] -> Expectation
shouldFailToSummaries = shouldFailToGen $ map summary
shouldFailToGen :: (HasCallStack, Eq ee, Show ee, Summary a) => (ae -> ee) -> Result ae a -> ee -> Expectation
shouldFailToGen f (Failure aerr) eerr = f aerr `shouldBe` eerr
shouldFailToGen _ (Success val) _ = assertFailure $ "Unexpected success: " ++ summary val
-- | Specifies that the left string should be a subsequence of the right.
shouldBeReducePrintOf :: (HasCallStack) => String -> String -> Expectation
rp `shouldBeReducePrintOf` full
= unless (rp `isSubsequenceOf` full) $ assertFailure failMsg
where failMsg
= "not a reduce print:\n"
++ rp
++ "\n----- isn't a reduce print of -----\n"
++ full