2013-09-30 14 views
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。这会导致测试运行中止,我宁愿为少数不良测试取得失败,其余测试结果也是如此。我该如何修改当前的结构,以便错误传播导致测试失败,而不是一起中止?

回答

1

我对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] 
      {- ... -} 
+0

这看起来像一个令人愉快的解决方案。感谢您的建议。 –

+0

p.s.我的问题可能更多的是关于混合monads而不是关于HUnit。也许我需要找到一种方法来重述我的问题,以突出显示我正在使用“Either String”monad以及“Maybe”monad列表。我确信有一些很好的处理方法,但我还没有找到。 –

相关问题