
Issue #19715 has been reported by ngan (Ngan Pham). ---------------------------------------- Bug #19715: Coverage oneshot_lines mode is not working after result clear https://bugs.ruby-lang.org/issues/19715 * Author: ngan (Ngan Pham) * Status: Open * Priority: Normal * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Given a simple Ruby file (`foo.rb`): ```ruby def hello puts "hello" end ``` If I do the following in `irb`, I get unexpected results: ``` irb(main):001:0> require 'coverage' irb(main):002:0> Coverage.setup(oneshot_lines: true) => nil irb(main):003:0> require_relative 'foo' => true irb(main):004:0> Coverage.resume => nil irb(main):005:0> hello hello => nil irb(main):006:0> Coverage.suspend => nil irb(main):007:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:oneshot_lines=>[2]}} irb(main):008:0> Coverage.resume => nil irb(main):009:0> Coverage.suspend => nil irb(main):010:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:oneshot_lines=>[]}} irb(main):011:0> Coverage.resume => nil irb(main):012:0> hello hello => nil irb(main):013:0> Coverage.suspend => nil irb(main):014:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:oneshot_lines=>[]}} ``` You can see that in the third `Coverage.result` call, oneshot_lines did not populate despite me executing `hello`. If I use `lines`, then it works the way I'd expect it to: ``` irb(main):001:0> require 'coverage' irb(main):002:0> Coverage.setup(lines: true) => nil irb(main):003:0> require_relative 'foo' => true irb(main):004:0> Coverage.resume => nil irb(main):005:0> hello hello => nil irb(main):006:0> Coverage.suspend irb(main):007:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:lines=>[0, 1, nil]}} irb(main):008:0> Coverage.resume => nil irb(main):009:0> Coverage.suspend irb(main):010:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:lines=>[0, 0, nil]}} irb(main):011:0> Coverage.resume => nil irb(main):012:0> hello hello => nil irb(main):013:0> Coverage.suspend irb(main):014:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:lines=>[0, 1, nil]}} ``` I get that `oneshot_lines` is only suppose to count the line once, but I'd expect that upon a reset/clear, it should remark the line as executed. I wasn't sure if this is expected behavior or a bug. -- https://bugs.ruby-lang.org/