Project

General

Profile

Actions

Bug #16967

closed

Branch coverage duplicates branches inside ensure

Added by jeremyevans0 (Jeremy Evans) almost 4 years ago. Updated almost 4 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.8.0dev (2020-06-05T21:26:28Z master ca15b7b8ee) [x86_64-openbsd6.7]
[ruby-core:98844]

Description

The following file, which should have perfect coverage, is reported as only have 50% of the branches covered:

def a
  yield
ensure
  p 1
  p 2 if $!
end
a{}
a{raise} rescue nil

The branches reported by branch coverage are:

{[:if, 0, 5, 2, 5, 11]=>
  {[:then, 1, 5, 2, 5, 5]=>1, [:else, 2, 5, 2, 5, 11]=>0},
 [:if, 3, 5, 2, 5, 11]=>
  {[:then, 4, 5, 2, 5, 5]=>0, [:else, 5, 5, 2, 5, 11]=>1}}

Instead of reporting 2 branches for the if, 4 branches are reported:

  1. exception raised, if condition true
  2. exception raised, if condition false
  3. exception not raised, if condition true
  4. exception not raised, if condition false

In this example, it is impossible to cover branches 2 and 3, because the if condition is only true if an exception is raised.

Note that ensure blocks by themselves are not considered branches. This code results in no branches reported by branch coverage:

def a
  yield
ensure
  p $!
end
a{}
a{raise} rescue nil

Nested ensure usage duplicates all branches. This code with 3 nested ensures generates 16 branches:

def a
  yield
ensure
  begin
  ensure
    begin
    ensure
      p 1
      p 2 if $!
    end
  end
end
a{}
a{raise} rescue nil

I think this is a bug in the coverage library, and that it should not duplicate branches inside ensure. This issue is not theoretical, it affects branch coverage testing in my libraries.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0