2013-09-30 3 views
0

Я пишу тест 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. Это приводит к прерыванию тестового прогона, и я предпочел бы получить отказ для нескольких плохих тестов и реальных результатов для остальных. Как я могу изменить свою текущую структуру, чтобы ошибка распространялась, чтобы вызвать сбой теста, а не прерывать все вместе?

ответ

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

Смежные вопросы