0
我正在为函数eval :: Wff -> Assignment -> Maybe Bool
写一个HUnit测试。 Wff
是自定义数据类型是用于布尔表达式的简化子集的抽象语法分析树:传播错误导致HUnit测试失败
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
。这会导致测试运行中止,我宁愿为少数不良测试取得失败,其余测试结果也是如此。我该如何修改当前的结构,以便错误传播导致测试失败,而不是一起中止?
这看起来像一个令人愉快的解决方案。感谢您的建议。 –
p.s.我的问题可能更多的是关于混合monads而不是关于HUnit。也许我需要找到一种方法来重述我的问题,以突出显示我正在使用“Either String”monad以及“Maybe”monad列表。我确信有一些很好的处理方法,但我还没有找到。 –