Я пишу тест HUnit для функции eval :: Wff -> Assignment -> Maybe Bool
. 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. Мой вопрос, вероятно, больше связан с смешиванием монадов, а не с HUnit. Возможно, мне нужно найти способ перефразировать мой вопрос, чтобы подчеркнуть, что я использую монаду «Либо String» вместе со списком монахов «Maybe». Я уверен, что есть хороший способ справиться с этим, но я еще не нашел его. –