summaryrefslogtreecommitdiff
path: root/test/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'test/coverage')
-rw-r--r--test/coverage/test_coverage.rb170
1 files changed, 133 insertions, 37 deletions
diff --git a/test/coverage/test_coverage.rb b/test/coverage/test_coverage.rb
index 16be47b458..adcd4a946c 100644
--- a/test/coverage/test_coverage.rb
+++ b/test/coverage/test_coverage.rb
@@ -5,22 +5,33 @@ require "tmpdir"
require "envutil"
class TestCoverage < Test::Unit::TestCase
+ # The command-line arguments that we will pass to the ruby subprocess invoked
+ # by assert_in_out_err. In general this is just requiring the coverage
+ # library, but if prism is enabled we want to additionally pass that option
+ # through.
+ ARGV = ["-rcoverage"]
+
+ if RUBY_ENGINE == "ruby" && RubyVM::InstructionSequence.compile('').to_a[4][:parser] == :prism
+ ARGV << "-W:no-experimental"
+ ARGV << "--parser=prism"
+ end
+
def test_result_without_start
- assert_in_out_err(%w[-rcoverage], <<-"end;", [], /coverage measurement is not enabled/)
+ assert_in_out_err(ARGV, <<-"end;", [], /coverage measurement is not enabled/)
Coverage.result
p :NG
end;
end
def test_peek_result_without_start
- assert_in_out_err(%w[-rcoverage], <<-"end;", [], /coverage measurement is not enabled/)
+ assert_in_out_err(ARGV, <<-"end;", [], /coverage measurement is not enabled/)
Coverage.peek_result
p :NG
end;
end
def test_result_with_nothing
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["{}"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["{}"], [])
Coverage.start
p Coverage.result
end;
@@ -34,7 +45,7 @@ class TestCoverage < Test::Unit::TestCase
end
def test_coverage_running?
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["false", "true", "true", "false"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["false", "true", "true", "false"], [])
p Coverage.running?
Coverage.start
p Coverage.running?
@@ -56,7 +67,71 @@ class TestCoverage < Test::Unit::TestCase
EOS
end
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["[1, 0, nil]", "[1, 1, nil]", "[1, 1, nil]"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["[1, 0, nil]", "[1, 1, nil]", "[1, 1, nil]"], [])
+ Coverage.start
+ tmp = Dir.pwd
+ require tmp + "/test.rb"
+ cov = Coverage.peek_result[tmp + "/test.rb"]
+ coverage_test_snapshot
+ cov2 = Coverage.peek_result[tmp + "/test.rb"]
+ p cov
+ p cov2
+ p Coverage.result[tmp + "/test.rb"]
+ end;
+ }
+ }
+ end
+
+ def test_coverage_snapshot_iseq_compile
+ Dir.mktmpdir {|tmp|
+ Dir.chdir(tmp) {
+ File.open("test.rb", "w") do |f|
+ f.puts <<-EOS
+ def coverage_test_snapshot
+ :ok
+ end
+ EOS
+ end
+
+ assert_in_out_err(ARGV, <<-"end;", ["[1, 0, nil]", "[1, 1, nil]", "[1, 1, nil]"], [])
+ class RubyVM::InstructionSequence
+ def self.load_iseq(path)
+ compile(File.read(path), path, path)
+ end
+ end
+
+ Coverage.start
+ tmp = Dir.pwd
+ require tmp + "/test.rb"
+ cov = Coverage.peek_result[tmp + "/test.rb"]
+ coverage_test_snapshot
+ cov2 = Coverage.peek_result[tmp + "/test.rb"]
+ p cov
+ p cov2
+ p Coverage.result[tmp + "/test.rb"]
+ end;
+ }
+ }
+ end
+
+ def test_coverage_snapshot_iseq_compile_file
+ Dir.mktmpdir {|tmp|
+ Dir.chdir(tmp) {
+ File.open("test.rb", "w") do |f|
+ f.puts <<-EOS
+ def coverage_test_snapshot
+ :ok
+ end
+ EOS
+ end
+
+ assert_in_out_err(ARGV, <<-"end;", ["[1, 0, nil]", "[1, 1, nil]", "[1, 1, nil]"], [])
+ class RubyVM::InstructionSequence
+ def self.load_iseq(path)
+ compile_file(path)
+ end
+ end
+
Coverage.start
tmp = Dir.pwd
require tmp + "/test.rb"
@@ -92,7 +167,7 @@ class TestCoverage < Test::Unit::TestCase
exp1 = { "#{tmp}/test.rb" => [1, 0, nil] }.inspect
exp2 = {}.inspect
exp3 = { "#{tmp}/test2.rb" => [1] }.inspect
- assert_in_out_err(%w[-rcoverage], <<-"end;", [exp1, exp2, exp3], [])
+ assert_in_out_err(ARGV, <<-"end;", [exp1, exp2, exp3], [])
Coverage.start
tmp = Dir.pwd
require tmp + "/test.rb"
@@ -124,7 +199,7 @@ class TestCoverage < Test::Unit::TestCase
f.puts "])"
end
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["10003"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["10003"], [])
Coverage.start
tmp = Dir.pwd
require tmp + '/test.rb'
@@ -153,7 +228,7 @@ class TestCoverage < Test::Unit::TestCase
f.puts 'end'
end
- assert_in_out_err(%w[-W0 -rcoverage], <<-"end;", ["[1, 1, 1, 400, nil, nil, nil, nil, nil, nil, nil]"], [], bug13305)
+ assert_in_out_err(["-W0", *ARGV], <<-"end;", ["[1, 1, 1, 400, nil, nil, nil, nil, nil, nil, nil]"], [], bug13305)
Coverage.start(:all)
tmp = Dir.pwd
require tmp + '/test.rb'
@@ -165,7 +240,7 @@ class TestCoverage < Test::Unit::TestCase
end
def test_eval_coverage
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["[1, 1, 1, nil, 0, nil]"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["[1, 1, 1, nil, 0, nil]"], [])
Coverage.start(eval: true, lines: true)
eval(<<-RUBY, TOPLEVEL_BINDING, "test.rb")
@@ -181,6 +256,23 @@ class TestCoverage < Test::Unit::TestCase
end;
end
+ def test_eval_negative_lineno
+ assert_in_out_err(ARGV, <<-"end;", ["[1, 1, 1]"], [])
+ Coverage.start(eval: true, lines: true)
+
+ eval(<<-RUBY, TOPLEVEL_BINDING, "test.rb", -2)
+ p # -2 # Not subject to measurement
+ p # -1 # Not subject to measurement
+ p # 0 # Not subject to measurement
+ p # 1 # Subject to measurement
+ p # 2 # Subject to measurement
+ p # 3 # Subject to measurement
+ RUBY
+
+ p Coverage.result["test.rb"][:lines]
+ end;
+ end
+
def test_coverage_supported
assert Coverage.supported?(:lines)
assert Coverage.supported?(:oneshot_lines)
@@ -242,7 +334,7 @@ class TestCoverage < Test::Unit::TestCase
Dir.chdir(tmp) {
File.write("test.rb", code)
- assert_in_out_err(%w[-W0 -rcoverage], <<-"end;", stdout, [])
+ assert_in_out_err(["-W0", *ARGV], <<-"end;", stdout, [])
Coverage.start(#{ opt })
tmp = Dir.pwd
require tmp + '/test.rb'
@@ -452,6 +544,8 @@ class TestCoverage < Test::Unit::TestCase
[:"&.", 3, 7, 0, 7, 6] => {[:then, 4, 7, 0, 7, 6]=>0, [:else, 5, 7, 0, 7, 6]=>1},
[:"&.", 6, 8, 0, 8, 10] => {[:then, 7, 8, 0, 8, 10]=>1, [:else, 8, 8, 0, 8, 10]=>0},
[:"&.", 9, 9, 0, 9, 10] => {[:then, 10, 9, 0, 9, 10]=>0, [:else, 11, 9, 0, 9, 10]=>1},
+ [:"&.", 12, 10, 0, 10, 6] => {[:then, 13, 10, 0, 10, 6] => 0, [:else, 14, 10, 0, 10, 6] => 1},
+ [:"&.", 15, 11, 0, 11, 5] => {[:then, 16, 11, 0, 11, 5] => 0, [:else, 17, 11, 0, 11, 5] => 1},
}
}
assert_coverage(<<~"end;", { branches: true }, result)
@@ -464,6 +558,8 @@ class TestCoverage < Test::Unit::TestCase
b&.foo
c&.foo = 1
d&.foo = 1
+ d&.(b)
+ d&.()
end;
end
@@ -638,11 +734,11 @@ class TestCoverage < Test::Unit::TestCase
end
exp = [
- "{:lines=>[1, 0, 0, nil, 0, nil, nil]}",
- "{:lines=>[0, 1, 1, nil, 0, nil, nil]}",
- "{:lines=>[0, 1, 0, nil, 1, nil, nil]}",
+ { lines: [1, 0, 0, nil, 0, nil, nil] }.inspect,
+ { lines: [0, 1, 1, nil, 0, nil, nil] }.inspect,
+ { lines: [0, 1, 0, nil, 1, nil, nil] }.inspect,
]
- assert_in_out_err(%w[-rcoverage], <<-"end;", exp, [])
+ assert_in_out_err(ARGV, <<-"end;", exp, [])
Coverage.start(lines: true)
tmp = Dir.pwd
f = tmp + "/test.rb"
@@ -671,12 +767,12 @@ class TestCoverage < Test::Unit::TestCase
end
exp = [
- "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>0, [:else, 2, 5, 4, 5, 12]=>0}}}",
- "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>1, [:else, 2, 5, 4, 5, 12]=>0}}}",
- "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>0, [:else, 2, 5, 4, 5, 12]=>1}}}",
- "{:branches=>{[:if, 0, 2, 2, 6, 5]=>{[:then, 1, 3, 4, 3, 8]=>0, [:else, 2, 5, 4, 5, 12]=>1}}}",
+ { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 0, [:else, 2, 5, 4, 5, 12] => 0 } } }.inspect,
+ { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 1, [:else, 2, 5, 4, 5, 12] => 0 } } }.inspect,
+ { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 0, [:else, 2, 5, 4, 5, 12] => 1 } } }.inspect,
+ { branches: { [:if, 0, 2, 2, 6, 5] => { [:then, 1, 3, 4, 3, 8] => 0, [:else, 2, 5, 4, 5, 12] => 1 } } }.inspect,
]
- assert_in_out_err(%w[-rcoverage], <<-"end;", exp, [])
+ assert_in_out_err(ARGV, <<-"end;", exp, [])
Coverage.start(branches: true)
tmp = Dir.pwd
f = tmp + "/test.rb"
@@ -707,12 +803,12 @@ class TestCoverage < Test::Unit::TestCase
end
exp = [
- "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>0}}",
- "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>1}}",
- "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>1}}",
- "{:methods=>{[Object, :foo, 1, 0, 7, 3]=>1}}"
+ { methods: { [Object, :foo, 1, 0, 7, 3] => 0 } }.inspect,
+ { methods: { [Object, :foo, 1, 0, 7, 3] => 1 } }.inspect,
+ { methods: { [Object, :foo, 1, 0, 7, 3] => 1 } }.inspect,
+ { methods: { [Object, :foo, 1, 0, 7, 3] => 1 } }.inspect
]
- assert_in_out_err(%w[-rcoverage], <<-"end;", exp, [])
+ assert_in_out_err(ARGV, <<-"end;", exp, [])
Coverage.start(methods: true)
tmp = Dir.pwd
f = tmp + "/test.rb"
@@ -743,12 +839,12 @@ class TestCoverage < Test::Unit::TestCase
end
exp = [
- "{:oneshot_lines=>[1]}",
- "{:oneshot_lines=>[2, 3]}",
- "{:oneshot_lines=>[5]}",
- "{:oneshot_lines=>[]}",
+ { oneshot_lines: [1] }.inspect,
+ { oneshot_lines: [2, 3] }.inspect,
+ { oneshot_lines: [5] }.inspect,
+ { oneshot_lines: [] }.inspect,
]
- assert_in_out_err(%w[-rcoverage], <<-"end;", exp, [])
+ assert_in_out_err(ARGV, <<-"end;", exp, [])
Coverage.start(oneshot_lines: true)
tmp = Dir.pwd
f = tmp + "/test.rb"
@@ -924,7 +1020,7 @@ class TestCoverage < Test::Unit::TestCase
end
def test_coverage_state
- assert_in_out_err(%w[-rcoverage], <<-"end;", [":idle", ":running", ":running", ":idle"], [])
+ assert_in_out_err(ARGV, <<-"end;", [":idle", ":running", ":running", ":idle"], [])
p Coverage.state
Coverage.start
p Coverage.state
@@ -934,7 +1030,7 @@ class TestCoverage < Test::Unit::TestCase
p Coverage.state
end;
- assert_in_out_err(%w[-rcoverage], <<-"end;", [":idle", ":suspended", ":running", ":suspended", ":running", ":suspended", ":idle"], [])
+ assert_in_out_err(ARGV, <<-"end;", [":idle", ":suspended", ":running", ":suspended", ":running", ":suspended", ":idle"], [])
p Coverage.state
Coverage.setup
p Coverage.state
@@ -952,14 +1048,14 @@ class TestCoverage < Test::Unit::TestCase
end
def test_result_without_resume
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["{}"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["{}"], [])
Coverage.setup
p Coverage.result
end;
end
def test_result_after_suspend
- assert_in_out_err(%w[-rcoverage], <<-"end;", ["{}"], [])
+ assert_in_out_err(ARGV, <<-"end;", ["{}"], [])
Coverage.start
Coverage.suspend
p Coverage.result
@@ -967,21 +1063,21 @@ class TestCoverage < Test::Unit::TestCase
end
def test_resume_without_setup
- assert_in_out_err(%w[-rcoverage], <<-"end;", [], /coverage measurement is not set up yet/)
+ assert_in_out_err(ARGV, <<-"end;", [], /coverage measurement is not set up yet/)
Coverage.resume
p :NG
end;
end
def test_suspend_without_setup
- assert_in_out_err(%w[-rcoverage], <<-"end;", [], /coverage measurement is not running/)
+ assert_in_out_err(ARGV, <<-"end;", [], /coverage measurement is not running/)
Coverage.suspend
p :NG
end;
end
def test_double_resume
- assert_in_out_err(%w[-rcoverage], <<-"end;", [], /coverage measurement is already running/)
+ assert_in_out_err(ARGV, <<-"end;", [], /coverage measurement is already running/)
Coverage.start
Coverage.resume
p :NG
@@ -989,7 +1085,7 @@ class TestCoverage < Test::Unit::TestCase
end
def test_double_suspend
- assert_in_out_err(%w[-rcoverage], <<-"end;", [], /coverage measurement is not running/)
+ assert_in_out_err(ARGV, <<-"end;", [], /coverage measurement is not running/)
Coverage.setup
Coverage.suspend
p :NG