2013-09-30 6 views
0

나는 eval :: Wff -> Assignment -> Maybe Bool 함수에 대한 HUnit 테스트를 작성하고 있습니다.오류 전파로 인해 HUnit 테스트가 실패합니다.

data Wff = Var Name 
     | Not Wff 
     | Or Wff Wff 
     deriving (Eq) 

AssignmentWff 각 변수에 대한 부울 값을 제공 연관 목록 유형의 별칭입니다 : 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에 대해 더 복잡한 값으로 수정했지만 오타를 만들면 parseRigth Wff 대신 Left String을 반환하므로 Right 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보다는 모나드를 혼합하는 것에 관한 것입니다. 어쩌면 나는 "어쩌면"모나드의 목록과 함께 "두 개의 문자열"모나드를 사용하고 있다는 것을 강조하기 위해 내 질문을 다시 표현할 방법을 찾아야 할 것입니다. 이 문제를 해결할 좋은 방법이있을 것이라고 확신하지만 아직 발견하지 못했습니다. –