2013-09-30 17 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列表。我確信有一些很好的處理方法,但我還沒有找到。 –

相關問題