2011-01-11 3 views
4

HPC를 사용하여 하스켈에서 작성한 코드의 100 % 테스트 커버리지를 얻으려고합니다. 그러나 이런 식으로 쓸 경우 :하스켈에서 경비원과 함께 100 % 코드 커버리지를 보유하고 있음을 HPC에 알리는 방법은 무엇입니까?

fac n | n > 0 = n * (fac (n - 1)) 
     | otherwise = 1 

그런 다음 guard 문의 두 번째 표현식에는 항상 True가 지정됩니다. 일반적인 경우에 이것을 극복하는 가장 쉬운 방법은 무엇입니까?

편집 : 그냥 정리해주세요. 이 코드 :

fac n = if n > 0 then n * (fac (n - 1)) 
     else 1 

HPC와 잘 작동합니다 (100 % 코드 적용 범위 제공).

나는 기본적으로이 문제로 고통 해요 : http://hackage.haskell.org/trac/ghc/ticket/3175

+1

극복한다는 것은 무엇을 의미합니까? 함수는 총 함수입니다 (모든 입력에 대해 정의됩니다).이 함수는 양수와 음수로 시도 할 때 100 % 코드 적용 범위에 도달합니다. – stonemetal

+0

만약 HPC가 단위 테스트 세트를 작성한다면 HPC는 100 % 코드 커버리지를 가지고 있다고 말하지 않을 것입니다. –

+0

'otherwise'를 동등 함과보다 작은 경우로 바꿀 수 없습니까? (숫자) 입력 유형 T는 전체 순서를 가지므로 T의 모든 n, m에 대해 n m 중 하나를 선택합니다. 각각에 대한 사례를 정의하면됩니다. – danportin

답변

7

문제 없습니다. 표현식이 항상 참으로 표시 되어도 100 % 미만의 보상 범위를 갖는 것은 아닙니다. 예를 들어, fac을 기반으로 작은 실행 파일을 작성한 다음 hpc를 실행하고 hpc 결과 tix 파일을보고합니다.

여기 소스입니다 :

fac n | n > 0 = n * (fac (n - 1)) 
     | n == 0 = 1 
     | otherwise = 125 -- An arbitrary value. This of couse is demo code, and not actually a factorial. 

main = print (fac 12) >> print (fac (negate 100)) 

여기 결과입니다 :

100% expressions used (23/23) 
66% boolean coverage (2/3) 
     66% guards (2/3), 1 always True 
    100% 'if' conditions (0/0) 
    100% qualifiers (0/0) 
100% alternatives used (3/3) 
100% local declarations used (0/0) 
100% top-level declarations used (2/2) 

중요한 것은 사용을 100 개 % 표현이며, 100 % 대신 100 % 최고 수준의 선언을 사용, 사용. 66 % 부울 범위를 가지고 있다는 사실은 부적합합니다. 따라서 hpc 마크 업을 실행하고 결과 hpc_index 파일을 보면 최상위 레벨, 대체 및 표현식이보고되지만 은 아니며 부울 범위입니다.

+0

'125'를'undefined'로 바꾸라고 제안 할 수 있습니까? (125가 임의라고 가정) –

+0

그러면 주 기능이 오류를 발생시킵니다. – luqui

0

당신은 "만약 그때 다른 '표현의 많은 가드 구문을 대체 할 수 있습니다. 나는 그것을하는 더 좋은 방법을 모른다.

관련 문제