你如何让HPC承认你在Haskell中拥有100%的守卫代码?

dan*_*rth 4 haskell code-coverage

我试图获得(并证明)我使用HPC在Haskell中编写的一些代码的100%测试覆盖率.但是,如果我写这样的东西:

fac n | n > 0 = n * (fac (n - 1))
      | otherwise = 1
Run Code Online (Sandbox Code Playgroud)

然后,guard语句的第二个表达式始终标记为True.在一般情况下,最简单的解决方法是什么?

编辑:只是为了澄清.这段代码:

fac n = if n > 0 then n * (fac (n - 1))
        else 1
Run Code Online (Sandbox Code Playgroud)

适用于HPC,(运行它可以提供100%的代码覆盖率).

我基本上遇到了这个问题:http://hackage.haskell.org/trac/ghc/ticket/3175

scl*_*clv 7

没有问题.如果表达式标记为始终为true,则这并不意味着您的覆盖率低于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))
Run Code Online (Sandbox Code Playgroud)

这是结果:

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)
Run Code Online (Sandbox Code Playgroud)

关键是使用100%表达式,使用100%替代,使用100%顶级声明.您拥有66%布尔覆盖率这一事实无关紧要.这就是为什么如果你运行hpc标记并查看生成的hpc_index文件,它会报告顶级,替代和表达式,但不报告布尔覆盖.