我正在为函数eval :: Wff -> Assignment -> Maybe Bool
编写一个 HUnit 测试。 Wff
是一种自定义数据类型,它是布尔表达式简化子集的抽象解析树:
data Wff = Var Name
| Not Wff
| Or Wff Wff
deriving (Eq)
Assignment
是关联列表的类型别名,它为Wff
中的每个变量提供一个布尔值:
type Assignment = [(Name, Bool)]
我当前的测试如下所示:
testEval :: Test
testEval = "Test eval"
~: TestList $ zipWith (e (Just a) -> e ~=? a) expected (eval wff <$> assignments)
where expected = [True, False]
assignments = [[('p', True)], [('p', False)]]
Right wff = parse wffStr
wffStr = "p"
两个测试都通过。但是,该测试不是很强大。如果我用更复杂的值修改它wffStr
但打错了字,模式Right wff
将失败,因为parse
将返回Left String
而不是Rigth Wff
。这会导致测试运行中止,我宁愿为少数不良测试失败,其余测试的实际结果失败。如何修改当前结构,使错误传播导致测试失败,而不是一起中止?
我对 HUnit 一无所知,但是:你能告诉它解析失败时该怎么做吗?
testEval = case parse wffStr of
Left _ -> {- use HUnit's functions to make a failing test case -}
Right wff -> "Test eval" ~: TestList $ {- ... -}
where expected = [True, False]
{- ... -}