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