diff --git a/.github/workflows/ruby-ci.yml b/.github/workflows/ruby-ci.yml index b345e3c..8bd3b70 100644 --- a/.github/workflows/ruby-ci.yml +++ b/.github/workflows/ruby-ci.yml @@ -15,9 +15,6 @@ jobs: matrix: os: - ubuntu-latest - gemfile: - - minitest5 - - test_unit_gem ruby: - ruby-2.7 - ruby-3.0 @@ -29,13 +26,9 @@ jobs: - jruby - truffleruby include: - - { os: ubuntu-latest, gemfile: minitest4, ruby: ruby-2.7 } - - { os: ubuntu-latest, gemfile: minitest4, ruby: ruby-4.0 } - - { os: macos-latest, gemfile: minitest5, ruby: ruby-2.7 } - - { os: macos-latest, gemfile: minitest5, ruby: ruby-4.0 } + - { os: macos-latest, ruby: ruby-2.7 } + - { os: macos-latest, ruby: ruby-4.0 } runs-on: ${{ matrix.os }} - env: - BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile steps: - name: Checkout uses: actions/checkout@v6 diff --git a/Gemfile b/Gemfile index b568bdf..629ca21 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,8 @@ source "https://rubygems.org" gem "benchmark-ips" gem "coveralls", require: false +gem "minitest", ">= 5" +gem "test-unit" gem "allocation_stats" unless defined?(JRUBY_VERSION) diff --git a/README.md b/README.md index 141b27a..a18728f 100644 --- a/README.md +++ b/README.md @@ -124,16 +124,7 @@ CONTRIBUTING You can run all the tests with: - bundle exec rake tests - -You can also run tests selectively. For minitest 4 run: - - bundle exec rake test:minitest4 - -and the ones for minitest 5 with: - - bundle exec rake test:minitest5 - + bundle exec rake test LICENSE ======= diff --git a/Rakefile b/Rakefile index d58a1bf..172a66c 100755 --- a/Rakefile +++ b/Rakefile @@ -6,43 +6,17 @@ require "bundler/gem_tasks" require "rake/clean" require "rake/testtask" require "standard/rake" +require "rbconfig" task default: [:test, "standard:fix"] Rake::TestTask.new do |t| - t.libs << "test" - t.libs << "lib" t.pattern = "test/*_test.rb" end -desc "Run all tests and get merged test coverage" -namespace :test do - Dir.glob("gemfiles/*.gemfile").each do |gemfile_path| - name = /gemfiles\/(.*).gemfile/.match(gemfile_path)[1] - desc "Run #{name} tests" - task name do |rake_task| - gemfile_name = rake_task.name.split(":").last - gemfile_path = "gemfiles/#{gemfile_name}.gemfile" - Bundler.with_original_env do - sh "BUNDLE_GEMFILE=#{gemfile_path} bundle exec rake" - end - end - end -end - -desc "Run all tests and get merged test coverage" -task :tests do - Dir.glob("gemfiles/*.gemfile").each do |gemfile_path| - Bundler.with_original_env do - sh "BUNDLE_GEMFILE=#{gemfile_path} bundle exec rake" - end - end - Coveralls.push! -end - desc "Run simple benchmarks" task :bench do current_commit = `git rev-parse HEAD` file_name = "benchmarks/#{Time.now.strftime "%Y%m%d"}-benchmark.log" - exec "echo -e 'Data for commit: #{current_commit}' > #{file_name} && ruby test/bench.rb >> #{file_name}" + exec "echo -e 'Data for commit: #{current_commit}' > #{file_name} && #{RbConfig.ruby} test/bench.rb >> #{file_name}" end diff --git a/gemfiles/minitest4.gemfile b/gemfiles/minitest4.gemfile deleted file mode 100644 index 5766db4..0000000 --- a/gemfiles/minitest4.gemfile +++ /dev/null @@ -1,10 +0,0 @@ -source "https://rubygems.org" - -gem "allocation_stats" -gem "benchmark-ips" -gem "coveralls", require: false -gem "minitest", "~> 4" -gem "mutex_m" if RUBY_VERSION >= "3.3" -gem "logger" if RUBY_VERSION >= "3.4" - -gemspec path: "../" diff --git a/gemfiles/minitest5.gemfile b/gemfiles/minitest5.gemfile deleted file mode 100644 index e49f3a2..0000000 --- a/gemfiles/minitest5.gemfile +++ /dev/null @@ -1,10 +0,0 @@ -source "https://rubygems.org" - -gem "allocation_stats" -gem "benchmark-ips" -gem "coveralls", require: false -gem "minitest", "~> 5" -gem "mutex_m" if RUBY_VERSION >= "3.3" -gem "logger" if RUBY_VERSION >= "3.4" - -gemspec path: "../" diff --git a/gemfiles/test_unit_gem.gemfile b/gemfiles/test_unit_gem.gemfile deleted file mode 100644 index 4400d06..0000000 --- a/gemfiles/test_unit_gem.gemfile +++ /dev/null @@ -1,10 +0,0 @@ -source "https://rubygems.org" - -gem "allocation_stats" -gem "benchmark-ips" -gem "coveralls", require: false -gem "test-unit" -gem "mutex_m" if RUBY_VERSION >= "3.3" -gem "logger" if RUBY_VERSION >= "3.4" - -gemspec path: "../" diff --git a/lib/m/executor.rb b/lib/m/executor.rb index 66a2621..bcf21fd 100644 --- a/lib/m/executor.rb +++ b/lib/m/executor.rb @@ -1,4 +1,5 @@ require_relative "runners/base" +require_relative "runners/minitest_6" require_relative "runners/minitest_5" require_relative "runners/minitest_4" require_relative "runners/test_unit" diff --git a/lib/m/frameworks.rb b/lib/m/frameworks.rb index 72e46ad..077a593 100644 --- a/lib/m/frameworks.rb +++ b/lib/m/frameworks.rb @@ -8,12 +8,12 @@ def self.minitest_version_major end end - def self.minitest5? - minitest_version_major == "5" + def self.minitest6? + minitest_version_major == "6" end - def self.minitest4? - minitest_version_major == "4" + def self.minitest5? + minitest_version_major == "5" end def self.test_unit? @@ -25,10 +25,10 @@ def self.framework_runner end def framework_runner - if minitest5? + if minitest6? + Runners::Minitest6.new + elsif minitest5? Runners::Minitest5.new - elsif minitest4? - Runners::Minitest4.new elsif test_unit? Runners::TestUnit.new else @@ -38,12 +38,12 @@ def framework_runner private - def minitest5? - self.class.minitest5? + def minitest6? + self.class.minitest6? end - def minitest4? - self.class.minitest4? + def minitest5? + self.class.minitest5? end def test_unit? diff --git a/lib/m/parser.rb b/lib/m/parser.rb index 5adb8d7..b533c11 100644 --- a/lib/m/parser.rb +++ b/lib/m/parser.rb @@ -1,4 +1,5 @@ require_relative "testable" +require "rbconfig" module M class Parser @@ -11,12 +12,12 @@ def parse # With no arguments, if argv.empty? # Just shell out to `rake test`. - exec "rake test" + exec "#{RbConfig.ruby} -S rake test" else parse_options! argv if argv.first.start_with? "--" - exec "rake test #{argv.join}" + exec "#{RbConfig.ruby} -S rake test #{argv.join}" exit 0 else # Parse out ARGV, it should be coming in in a format like `test/test_file.rb:9:19` diff --git a/lib/m/runners/minitest_6.rb b/lib/m/runners/minitest_6.rb new file mode 100644 index 0000000..13781bd --- /dev/null +++ b/lib/m/runners/minitest_6.rb @@ -0,0 +1,3 @@ +require_relative "minitest_5" + +M::Runners::Minitest6 = M::Runners::Minitest5 diff --git a/lib/m/test_method.rb b/lib/m/test_method.rb index 8ceab2c..75b03e4 100644 --- a/lib/m/test_method.rb +++ b/lib/m/test_method.rb @@ -1,4 +1,4 @@ -require_relative "finish_line" if RUBY_VERSION < "4" +require_relative "finish_line" # if RUBY_VERSION < "4.1" module M ### Simple data structure for what a test method contains. @@ -13,12 +13,14 @@ def self.create suite_class, test_method method = suite_class.instance_method test_method # Ruby can find the starting line for us, so pull that out of the array. - # Ruby 4.0+ can also provide the ending line. - start_line, end_line = method.source_location.values_at(1, 3) + # Ruby 4.1+ can also provide the ending line. + #start_line, end_line = method.source_location.values_at(1, 3) + start_line = method.source_location[1] - # Ruby < 4.0 can't find the end line. Use a Ripper-derived parser to + # Ruby < 4.1 can't find the end line. Use a Ripper-derived parser to # determine the ending line. - end_line ||= FinishLine.ending_line_for method + #end_line ||= FinishLine.ending_line_for method + end_line = FinishLine.ending_line_for method # Shove the given attributes into a new databag new test_method, start_line, end_line diff --git a/test/active_support_test.rb b/test/active_support_test.rb index f3ad041..ff8af97 100644 --- a/test/active_support_test.rb +++ b/test/active_support_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" class ActiveSupportTest < MTest def test_run_simple_test_by_line_number_with_absolute_path diff --git a/test/allocations.rb b/test/allocations.rb index e686db9..7a04118 100644 --- a/test/allocations.rb +++ b/test/allocations.rb @@ -1,5 +1,4 @@ -$LOAD_PATH.unshift "lib" -require "m" +require_relative "../lib/m" require "allocation_stats" def benchmark_allocations burn: 1, &block @@ -16,6 +15,6 @@ def benchmark_allocations burn: 1, &block benchmark_allocations do 10.times do - M::Runner.new(["test/examples/minitest_5_example_test.rb:19"]).run + M::Runner.new(["test/examples/minitest_5_or_6_example_test.rb:19"]).run end end diff --git a/test/bench.rb b/test/bench.rb index e140bb8..aadd2e3 100644 --- a/test/bench.rb +++ b/test/bench.rb @@ -1,35 +1,28 @@ require "benchmark/ips" +require "rbconfig" Benchmark.ips do |bench| bench.report("running m on a file that doesn't exist") do - `bundle exec ruby -Ilib ./bin/m failwhale 2>/dev/null` + `bundle exec #{RbConfig.ruby} -Ilib ./bin/m failwhale 2>/dev/null` end bench.report("running m on an empty file") do - `bundle exec ruby -Ilib ./bin/m test/examples/empty_example_test.rb 2>/dev/null` + `bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/empty_example_test.rb 2>/dev/null` end - bench.report("running m on an entire file with minitest4") do - `BUNDLE_GEMFILE=gemfiles/minitest4.gemfile bundle exec ruby -Ilib ./bin/m test/examples/minitest_4_example_test.rb 2>/dev/null` - end - - bench.report("running m on an entire file with minitest5") do - `BUNDLE_GEMFILE=gemfiles/minitest5.gemfile bundle exec ruby -Ilib ./bin/m test/examples/minitest_5_example_test.rb 2>/dev/null` + bench.report("running m on an entire file with minitest") do + `bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_5_or_6_example_test.rb 2>/dev/null` end bench.report("running m on an entire file with test-unit gem") do - `BUNDLE_GEMFILE=gemfiles/test_unit_gem.gemfile bundle exec ruby -Ilib ./bin/m test/examples/test_unit_example_test.rb 2>/dev/null` - end - - bench.report("running m on a specific test with minitest4") do - `BUNDLE_GEMFILE=gemfiles/minitest4.gemfile bundle exec ruby -Ilib ./bin/m test/examples/minitest_4_example_test.rb:19 2>/dev/null` + `bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/test_unit_example_test.rb 2>/dev/null` end - bench.report("running m on a specific test with minitest5") do - `BUNDLE_GEMFILE=gemfiles/minitest5.gemfile bundle exec ruby -Ilib ./bin/m test/examples/minitest_5_example_test.rb:19 2>/dev/null` + bench.report("running m on a specific test with minitest") do + `bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_5_or_6_example_test.rb:19 2>/dev/null` end bench.report("running m on a specific test with test-unit gem") do - `BUNDLE_GEMFILE=gemfiles/test_unit_gem.gemfile bundle exec ruby -Ilib ./bin/m test/examples/test_unit_example_test.rb:15 2>/dev/null` + `bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/test_unit_example_test.rb:15 2>/dev/null` end end diff --git a/test/empty_test.rb b/test/empty_test.rb index 3535875..19cbc1c 100644 --- a/test/empty_test.rb +++ b/test/empty_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" class EmptyTest < MTest def test_run_simple_test_by_line_number diff --git a/test/everything_test.rb b/test/everything_test.rb index 276dff2..dad8ca1 100644 --- a/test/everything_test.rb +++ b/test/everything_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" class EverythingTest < MTest def test_runs_entire_test_suite_with_no_arguments diff --git a/test/examples/minitest_4_example_test.rb b/test/examples/minitest_4_example_test.rb deleted file mode 100644 index ad26a43..0000000 --- a/test/examples/minitest_4_example_test.rb +++ /dev/null @@ -1,34 +0,0 @@ -require "minitest/unit" - -if M::Frameworks.minitest4? - class Meme - def i_can_has_cheezburger? - "OHAI!" - end - - def will_it_blend? - "YES!" - end - end - - class TestMeme < MiniTest::Unit::TestCase - def setup - @meme = Meme.new - end - - def test_that_kitty_can_eat - assert_equal "OHAI!", @meme.i_can_has_cheezburger? - end - - def test_that_it_will_not_blend - refute_match(/^maybe/i, @meme.will_it_blend?) - refute_match(/^no/i, @meme.will_it_blend?) - refute_match(/^lolz/i, @meme.will_it_blend?) - end - - def test_that_kitty_can_eat_two_time - assert_equal "OHAI!", @meme.i_can_has_cheezburger? - assert_equal "OHAI!", @meme.i_can_has_cheezburger? - end - end -end diff --git a/test/examples/minitest_5_example_test.rb b/test/examples/minitest_5_or_6_example_test.rb similarity index 93% rename from test/examples/minitest_5_example_test.rb rename to test/examples/minitest_5_or_6_example_test.rb index 75b8b5e..fa3f458 100644 --- a/test/examples/minitest_5_example_test.rb +++ b/test/examples/minitest_5_or_6_example_test.rb @@ -1,6 +1,6 @@ require "minitest/autorun" -if M::Frameworks.minitest5? +if M::Frameworks.minitest5? || M::Frameworks.minitest6? class Meme def i_can_has_cheezburger? "OHAI!" diff --git a/test/examples/minitest_example_test.rb b/test/examples/minitest_example_test.rb index 7049923..2e54030 100644 --- a/test/examples/minitest_example_test.rb +++ b/test/examples/minitest_example_test.rb @@ -1,4 +1,4 @@ -require "minitest/unit" +require "minitest" class Meme def i_can_has_cheezburger? @@ -10,9 +10,7 @@ def will_it_blend? end end -Test = M::Frameworks.minitest4? ? MiniTest::Unit::TestCase : Minitest::Test - -class TestMeme < Test +class TestMeme < Minitest::Test def setup @meme = Meme.new end diff --git a/test/exit_codes_test.rb b/test/exit_codes_test.rb index 73db1e9..76fe7c8 100644 --- a/test/exit_codes_test.rb +++ b/test/exit_codes_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" class ExitCodesTest < MTest def test_failing_test_returns_1 diff --git a/test/minitest_4_test.rb b/test/minitest_4_test.rb deleted file mode 100644 index d4c215c..0000000 --- a/test/minitest_4_test.rb +++ /dev/null @@ -1,44 +0,0 @@ -require "test_helper" - -if M::Frameworks.minitest4? - class Minitest4Test < MTest - def test_run_simple_test_by_line_number_with_absolute_path - output = m File.join(__dir__, "examples/minitest_4_example_test.rb:19") - assert_output(/1 tests, 1 assertions/, output) - end - - def test_run_simple_test_by_line_number - output = m "examples/minitest_4_example_test.rb:19" - assert_output(/1 tests, 1 assertions/, output) - end - - def test_runs_entire_test_without_line_number - output = m "examples/minitest_4_example_test.rb" - assert_output(/3 tests/, output) - end - - def test_run_inside_of_test - output = m "examples/minitest_4_example_test.rb:20" - assert_output(/1 tests, 1 assertions/, output) - end - - def test_run_on_end_of_test - output = m "examples/minitest_4_example_test.rb:21" - assert_output(/1 tests, 1 assertions/, output) - end - - def test_run_inside_big_test - output = m "examples/minitest_4_example_test.rb:26" - assert_output(/1 tests, 6 assertions/, output) - end - - def test_run_on_blank_line - output = m "examples/minitest_4_example_test.rb:2" - - assert !$?.success? - assert_match(/No tests found on line 2. Valid tests to run:/, output) - assert_match %r{ test_that_kitty_can_eat: m examples/minitest_4_example_test\.rb:19}, output - assert_match %r{test_that_it_will_not_blend: m examples/minitest_4_example_test\.rb:23}, output - end - end -end diff --git a/test/minitest_5_test.rb b/test/minitest_test.rb similarity index 57% rename from test/minitest_5_test.rb rename to test/minitest_test.rb index fa6b82c..a85ae61 100644 --- a/test/minitest_5_test.rb +++ b/test/minitest_test.rb @@ -1,47 +1,48 @@ -require "test_helper" -if M::Frameworks.minitest5? - class Minitest5Test < MTest +require_relative "test_helper" + +if M::Frameworks.minitest5? || M::Frameworks.minitest6? + class MinitestTest < MTest def test_run_simple_test_by_line_number_with_absolute_path - output = m File.join(__dir__, "examples/minitest_5_example_test.rb:19") + output = m File.join(__dir__, "examples/minitest_5_or_6_example_test.rb:19") assert_output(/1 runs, 1 assertions/, output) end def test_run_simple_test_by_line_number - output = m "examples/minitest_5_example_test.rb:19" + output = m "examples/minitest_5_or_6_example_test.rb:19" assert_output(/1 runs, 1 assertions/, output) end def test_runs_entire_test_without_line_number - output = m "examples/minitest_5_example_test.rb" + output = m "examples/minitest_5_or_6_example_test.rb" assert_output(/3 runs/, output) end def test_run_inside_of_test - output = m "examples/minitest_5_example_test.rb:20" + output = m "examples/minitest_5_or_6_example_test.rb:20" assert_output(/1 runs, 1 assertions/, output) end def test_run_on_end_of_test - output = m "examples/minitest_5_example_test.rb:21" + output = m "examples/minitest_5_or_6_example_test.rb:21" assert_output(/1 runs, 1 assertions/, output) end def test_run_inside_big_test - output = m "examples/minitest_5_example_test.rb:26" + output = m "examples/minitest_5_or_6_example_test.rb:26" assert_output(/1 runs, 6 assertions/, output) end def test_run_on_blank_line - output = m "examples/minitest_5_example_test.rb:3" + output = m "examples/minitest_5_or_6_example_test.rb:3" assert !$?.success? assert_match(/No tests found on line 3. Valid tests to run:/, output) - assert_match %r{ test_that_kitty_can_eat: m examples/minitest_5_example_test\.rb:19}, output - assert_match %r{test_that_it_will_not_blend: m examples/minitest_5_example_test\.rb:23}, output + assert_match %r{ test_that_kitty_can_eat: m examples/minitest_5_or_6_example_test\.rb:19}, output + assert_match %r{test_that_it_will_not_blend: m examples/minitest_5_or_6_example_test\.rb:23}, output end def test_run_with_after_run_block - output = m "examples/minitest_5_example_test.rb" + output = m "examples/minitest_5_or_6_example_test.rb" assert_output(/ran after run block/, output) end diff --git a/test/multiple_test.rb b/test/multiple_test.rb index 46bc32b..fba7c54 100644 --- a/test/multiple_test.rb +++ b/test/multiple_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" class MultipleTest < MTest def test_run_simple_test_by_line_number diff --git a/test/options_test.rb b/test/options_test.rb index b29f441..d2f5741 100644 --- a/test/options_test.rb +++ b/test/options_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" class OptionsTest < MTest def test_short_help_option diff --git a/test/test_helper.rb b/test/test_helper.rb index 857318c..da69347 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,13 +2,14 @@ require "coveralls" Coveralls.wear_merged! rescue LoadError - warn "gem 'coveralls' not available, proceeding without it" end +require "rbconfig" + module Testable def m arguments Dir.chdir "test" do - `ruby -I../lib -I. ../bin/m #{arguments} 2>&1`.strip + `#{RbConfig.ruby} -I../lib -I. ../bin/m #{arguments} 2>&1`.strip end end @@ -23,7 +24,7 @@ def assert_output_for_failed_execution regexp, output end end -require "m" +require_relative "../lib/m" def try_loading gem require gem @@ -31,8 +32,7 @@ def try_loading gem false end -try_loading("test-unit") || - try_loading("minitest/autorun") || +try_loading("minitest/autorun") || try_loading("test/unit") if M::Frameworks.test_unit? @@ -45,12 +45,8 @@ def try_loading gem class MTest < Test::Unit::TestCase include ::Testable end -elsif M::Frameworks.minitest5? - class MTest < Minitest::Test - include ::Testable - end else - class MTest < MiniTest::Unit::TestCase + class MTest < Minitest::Test include ::Testable end end diff --git a/test/test_unit_test.rb b/test/test_unit_test.rb index 564df5e..62f87c0 100644 --- a/test/test_unit_test.rb +++ b/test/test_unit_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" if M::Frameworks.test_unit? class TestUnitTest < MTest