From 7e520203bd4c420ea028256518ea19216371a32a Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 15 Dec 2025 23:32:23 -0800 Subject: [PATCH 01/12] Revert getting the end_line location from the source location This was reverted in Ruby 4.0, with only about a week until the release. While only the require_relative line actually needed a change, since the code itself would be correct even with the revert, I think it's best to use simpler code. It's likely Ruby 4.1 will include support for this, so comment out the code to make it easy to change back. --- lib/m/test_method.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 From 0d27d84de872ac79bce5385624237032d1b97946 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 16:33:49 -0800 Subject: [PATCH 02/12] Don't warn when running specs if coveralls is not available --- test/test_helper.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 857318c..501a5a2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,7 +2,6 @@ require "coveralls" Coveralls.wear_merged! rescue LoadError - warn "gem 'coveralls' not available, proceeding without it" end module Testable From ad22eb7ace5c50c858c12bc6fe4bd9a98b894d6a Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 16:36:20 -0800 Subject: [PATCH 03/12] Use RbConfig.ruby to get current Ruby program Do not assume it is installed as `ruby`. Use `-S rake` to execute rake with the current Ruby version. --- Rakefile | 7 ++++--- lib/m/parser.rb | 5 +++-- test/bench.rb | 17 +++++++++-------- test/test_helper.rb | 4 +++- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Rakefile b/Rakefile index d58a1bf..aaaa722 100755 --- a/Rakefile +++ b/Rakefile @@ -6,6 +6,7 @@ require "bundler/gem_tasks" require "rake/clean" require "rake/testtask" require "standard/rake" +require "rbconfig" task default: [:test, "standard:fix"] @@ -24,7 +25,7 @@ namespace :test do 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" + sh "BUNDLE_GEMFILE=#{gemfile_path} bundle exec #{RbConfig.ruby} -S rake" end end end @@ -34,7 +35,7 @@ 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" + sh "BUNDLE_GEMFILE=#{gemfile_path} bundle exec #{RbConfig.ruby} -S rake" end end Coveralls.push! @@ -44,5 +45,5 @@ 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/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/test/bench.rb b/test/bench.rb index e140bb8..a6d7b34 100644 --- a/test/bench.rb +++ b/test/bench.rb @@ -1,35 +1,36 @@ 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` + `BUNDLE_GEMFILE=gemfiles/minitest4.gemfile bundle exec #{RbConfig.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` + `BUNDLE_GEMFILE=gemfiles/minitest5.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_5_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` + `BUNDLE_GEMFILE=gemfiles/test_unit_gem.gemfile 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 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_GEMFILE=gemfiles/minitest4.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_4_example_test.rb:19 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` + `BUNDLE_GEMFILE=gemfiles/minitest5.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_5_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_GEMFILE=gemfiles/test_unit_gem.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/test_unit_example_test.rb:15 2>/dev/null` end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 501a5a2..d133838 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,10 +4,12 @@ rescue LoadError 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 From 58165cc93c2ca26ddafdc15ea4fa0b74509be133 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 16:40:38 -0800 Subject: [PATCH 04/12] Have minitest example test work with minitest 6 --- test/examples/minitest_example_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/examples/minitest_example_test.rb b/test/examples/minitest_example_test.rb index 7049923..f234dae 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? From f34c67245cecfe1114beac3bd1d0a6596076fbcf Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 16:42:26 -0800 Subject: [PATCH 05/12] Only require minitest/unit in tests if minitest 4 is being used This file was removed in minitest 6, and there is no point in requiring it if it isn't used. --- test/examples/minitest_4_example_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/examples/minitest_4_example_test.rb b/test/examples/minitest_4_example_test.rb index ad26a43..0561dfd 100644 --- a/test/examples/minitest_4_example_test.rb +++ b/test/examples/minitest_4_example_test.rb @@ -1,6 +1,6 @@ -require "minitest/unit" - if M::Frameworks.minitest4? + require "minitest/unit" + class Meme def i_can_has_cheezburger? "OHAI!" From 158cfa4999f8b92920b3529d7a648eebf697c7aa Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 17:23:15 -0800 Subject: [PATCH 06/12] Add support for running on minitest 6 No lib changes are needed. --- lib/m/executor.rb | 1 + lib/m/frameworks.rb | 12 +++++++++++- lib/m/runners/minitest_6.rb | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 lib/m/runners/minitest_6.rb 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..4b1bc29 100644 --- a/lib/m/frameworks.rb +++ b/lib/m/frameworks.rb @@ -8,6 +8,10 @@ def self.minitest_version_major end end + def self.minitest6? + minitest_version_major == "6" + end + def self.minitest5? minitest_version_major == "5" end @@ -25,7 +29,9 @@ 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 @@ -38,6 +44,10 @@ def framework_runner private + def minitest6? + self.class.minitest6? + end + def minitest5? self.class.minitest5? end 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 From 01d7686eb3fbed94613e233fe127ec45e99c171b Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 17:24:08 -0800 Subject: [PATCH 07/12] Rename minitest5 test to minitest The same tests work for both minitest 5 and minitest 6. I'd like to rename test/examples/minitest_5_example_test.rb to test/examples/minitest_example_test.rb, but since that file already exists, I chose the ugly test/examples/minitest_5_or_6_example_test.rb --- .github/workflows/ruby-ci.yml | 6 ++--- README.md | 4 ++-- .../{minitest5.gemfile => minitest.gemfile} | 0 test/allocations.rb | 2 +- test/bench.rb | 8 +++---- ...est.rb => minitest_5_or_6_example_test.rb} | 2 +- test/{minitest_5_test.rb => minitest_test.rb} | 24 +++++++++---------- test/test_helper.rb | 2 +- 8 files changed, 24 insertions(+), 24 deletions(-) rename gemfiles/{minitest5.gemfile => minitest.gemfile} (100%) rename test/examples/{minitest_5_example_test.rb => minitest_5_or_6_example_test.rb} (93%) rename test/{minitest_5_test.rb => minitest_test.rb} (59%) diff --git a/.github/workflows/ruby-ci.yml b/.github/workflows/ruby-ci.yml index b345e3c..6476ced 100644 --- a/.github/workflows/ruby-ci.yml +++ b/.github/workflows/ruby-ci.yml @@ -16,7 +16,7 @@ jobs: os: - ubuntu-latest gemfile: - - minitest5 + - minitest - test_unit_gem ruby: - ruby-2.7 @@ -31,8 +31,8 @@ jobs: 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, gemfile: minitest, ruby: ruby-2.7 } + - { os: macos-latest, gemfile: minitest, ruby: ruby-4.0 } runs-on: ${{ matrix.os }} env: BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile diff --git a/README.md b/README.md index 141b27a..37da617 100644 --- a/README.md +++ b/README.md @@ -130,9 +130,9 @@ You can also run tests selectively. For minitest 4 run: bundle exec rake test:minitest4 -and the ones for minitest 5 with: +and the ones for minitest 5 or 6 with: - bundle exec rake test:minitest5 + bundle exec rake test:minitest LICENSE diff --git a/gemfiles/minitest5.gemfile b/gemfiles/minitest.gemfile similarity index 100% rename from gemfiles/minitest5.gemfile rename to gemfiles/minitest.gemfile diff --git a/test/allocations.rb b/test/allocations.rb index e686db9..0740a01 100644 --- a/test/allocations.rb +++ b/test/allocations.rb @@ -16,6 +16,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 a6d7b34..1e855fb 100644 --- a/test/bench.rb +++ b/test/bench.rb @@ -14,8 +14,8 @@ `BUNDLE_GEMFILE=gemfiles/minitest4.gemfile bundle exec #{RbConfig.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 #{RbConfig.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_GEMFILE=gemfiles/minitest.gemfile 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 @@ -26,8 +26,8 @@ `BUNDLE_GEMFILE=gemfiles/minitest4.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_4_example_test.rb:19 2>/dev/null` end - bench.report("running m on a specific test with minitest5") do - `BUNDLE_GEMFILE=gemfiles/minitest5.gemfile bundle exec #{RbConfig.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_GEMFILE=gemfiles/minitest.gemfile 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 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/minitest_5_test.rb b/test/minitest_test.rb similarity index 59% rename from test/minitest_5_test.rb rename to test/minitest_test.rb index fa6b82c..71e59f3 100644 --- a/test/minitest_5_test.rb +++ b/test/minitest_test.rb @@ -1,47 +1,47 @@ require "test_helper" -if M::Frameworks.minitest5? - class Minitest5Test < MTest +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/test_helper.rb b/test/test_helper.rb index d133838..0ace499 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -46,7 +46,7 @@ def try_loading gem class MTest < Test::Unit::TestCase include ::Testable end -elsif M::Frameworks.minitest5? +elsif M::Frameworks.minitest5? || M::Frameworks.minitest6? class MTest < Minitest::Test include ::Testable end From 57b70db1974a500273af6bcca2d4d5b1b6581260 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 17:20:54 -0800 Subject: [PATCH 08/12] Allow running individual test files with ruby test/some_test.rb This uses require_relative to load test_helper, instead of requiring the test directory to be in the Ruby load path. This has test_helper use require_relative to load m, instead of requiring the lib directory to be in the Ruby load path. --- Rakefile | 2 -- test/active_support_test.rb | 2 +- test/empty_test.rb | 2 +- test/everything_test.rb | 2 +- test/exit_codes_test.rb | 2 +- test/minitest_4_test.rb | 2 +- test/minitest_test.rb | 3 ++- test/multiple_test.rb | 2 +- test/options_test.rb | 2 +- test/test_helper.rb | 2 +- test/test_unit_test.rb | 2 +- 11 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Rakefile b/Rakefile index aaaa722..a928a06 100755 --- a/Rakefile +++ b/Rakefile @@ -11,8 +11,6 @@ require "rbconfig" task default: [:test, "standard:fix"] Rake::TestTask.new do |t| - t.libs << "test" - t.libs << "lib" t.pattern = "test/*_test.rb" end 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/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/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 index d4c215c..ccec036 100644 --- a/test/minitest_4_test.rb +++ b/test/minitest_4_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require_relative "test_helper" if M::Frameworks.minitest4? class Minitest4Test < MTest diff --git a/test/minitest_test.rb b/test/minitest_test.rb index 71e59f3..a85ae61 100644 --- a/test/minitest_test.rb +++ b/test/minitest_test.rb @@ -1,4 +1,5 @@ -require "test_helper" +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 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 0ace499..8b42806 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -24,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 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 From 1c3b689c3385f294472196abac20d738b8e2e10f Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 17:49:27 -0800 Subject: [PATCH 09/12] Run the tests with minitest instead of test/unit Minitest gives better progress output by default, with `.` for each test, instead of using a spinner that does not provide information on progress. --- test/examples/minitest_example_test.rb | 4 ++-- test/test_helper.rb | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/test/examples/minitest_example_test.rb b/test/examples/minitest_example_test.rb index f234dae..e7f5ade 100644 --- a/test/examples/minitest_example_test.rb +++ b/test/examples/minitest_example_test.rb @@ -10,9 +10,9 @@ def will_it_blend? end end -Test = M::Frameworks.minitest4? ? MiniTest::Unit::TestCase : Minitest::Test +TestClass = M::Frameworks.minitest4? ? MiniTest::Unit::TestCase : Minitest::Test -class TestMeme < Test +class TestMeme < TestClass def setup @meme = Meme.new end diff --git a/test/test_helper.rb b/test/test_helper.rb index 8b42806..9edc501 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -32,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? From 1e7ec44e481abcfb6b4ccd7b9022768f1cf3ed30 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 17:50:32 -0800 Subject: [PATCH 10/12] Use require_relative to load m in allocation test This avoids the need for load path modification. --- test/allocations.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/allocations.rb b/test/allocations.rb index 0740a01..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 From 7afe576d2ee869fa8b95bf1701167ec35c9fbbb2 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 18:15:33 -0800 Subject: [PATCH 11/12] Remove separate gemfiles When testing, it's best to have all testing libraries installed. This doesn't work for minitest 4, but that is over 12 years old at this point, and we can safely drop support for it. This also removes the tests tasks from the Rakefile. --- .github/workflows/ruby-ci.yml | 11 ++--------- Gemfile | 2 ++ Rakefile | 25 ------------------------- gemfiles/minitest.gemfile | 10 ---------- gemfiles/minitest4.gemfile | 10 ---------- gemfiles/test_unit_gem.gemfile | 10 ---------- 6 files changed, 4 insertions(+), 64 deletions(-) delete mode 100644 gemfiles/minitest.gemfile delete mode 100644 gemfiles/minitest4.gemfile delete mode 100644 gemfiles/test_unit_gem.gemfile diff --git a/.github/workflows/ruby-ci.yml b/.github/workflows/ruby-ci.yml index 6476ced..8bd3b70 100644 --- a/.github/workflows/ruby-ci.yml +++ b/.github/workflows/ruby-ci.yml @@ -15,9 +15,6 @@ jobs: matrix: os: - ubuntu-latest - gemfile: - - minitest - - 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: minitest, ruby: ruby-2.7 } - - { os: macos-latest, gemfile: minitest, 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/Rakefile b/Rakefile index a928a06..172a66c 100755 --- a/Rakefile +++ b/Rakefile @@ -14,31 +14,6 @@ Rake::TestTask.new do |t| 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 #{RbConfig.ruby} -S 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 #{RbConfig.ruby} -S rake" - end - end - Coveralls.push! -end - desc "Run simple benchmarks" task :bench do current_commit = `git rev-parse HEAD` diff --git a/gemfiles/minitest.gemfile b/gemfiles/minitest.gemfile deleted file mode 100644 index e49f3a2..0000000 --- a/gemfiles/minitest.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/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/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: "../" From 2973b2cffe1aa6862dab8f91994bc855ec57c655 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Thu, 18 Dec 2025 18:21:44 -0800 Subject: [PATCH 12/12] Drop minitest 4 support minitest 6 was just released, and minitest 5 was released over 12 years ago. It's unlikely there are any minitest 4 users that need updated versions of m. Remove BUNDLE_GEMFILE usage in test_bench.rb while here. --- README.md | 11 +----- lib/m/frameworks.rb | 10 ------ test/bench.rb | 16 +++------ test/examples/minitest_4_example_test.rb | 34 ------------------ test/examples/minitest_example_test.rb | 4 +-- test/minitest_4_test.rb | 44 ------------------------ test/test_helper.rb | 6 +--- 7 files changed, 7 insertions(+), 118 deletions(-) delete mode 100644 test/examples/minitest_4_example_test.rb delete mode 100644 test/minitest_4_test.rb diff --git a/README.md b/README.md index 37da617..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 or 6 with: - - bundle exec rake test:minitest - + bundle exec rake test LICENSE ======= diff --git a/lib/m/frameworks.rb b/lib/m/frameworks.rb index 4b1bc29..077a593 100644 --- a/lib/m/frameworks.rb +++ b/lib/m/frameworks.rb @@ -16,10 +16,6 @@ def self.minitest5? minitest_version_major == "5" end - def self.minitest4? - minitest_version_major == "4" - end - def self.test_unit? defined?(Test::Unit) end @@ -33,8 +29,6 @@ def framework_runner Runners::Minitest6.new elsif minitest5? Runners::Minitest5.new - elsif minitest4? - Runners::Minitest4.new elsif test_unit? Runners::TestUnit.new else @@ -52,10 +46,6 @@ def minitest5? self.class.minitest5? end - def minitest4? - self.class.minitest4? - end - def test_unit? self.class.test_unit? end diff --git a/test/bench.rb b/test/bench.rb index 1e855fb..aadd2e3 100644 --- a/test/bench.rb +++ b/test/bench.rb @@ -10,27 +10,19 @@ `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 #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_4_example_test.rb 2>/dev/null` - end - bench.report("running m on an entire file with minitest") do - `BUNDLE_GEMFILE=gemfiles/minitest.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_5_or_6_example_test.rb 2>/dev/null` + `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 #{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 minitest4") do - `BUNDLE_GEMFILE=gemfiles/minitest4.gemfile bundle exec #{RbConfig.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 minitest") do - `BUNDLE_GEMFILE=gemfiles/minitest.gemfile bundle exec #{RbConfig.ruby} -Ilib ./bin/m test/examples/minitest_5_or_6_example_test.rb:19 2>/dev/null` + `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 #{RbConfig.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/examples/minitest_4_example_test.rb b/test/examples/minitest_4_example_test.rb deleted file mode 100644 index 0561dfd..0000000 --- a/test/examples/minitest_4_example_test.rb +++ /dev/null @@ -1,34 +0,0 @@ -if M::Frameworks.minitest4? - require "minitest/unit" - - 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_example_test.rb b/test/examples/minitest_example_test.rb index e7f5ade..2e54030 100644 --- a/test/examples/minitest_example_test.rb +++ b/test/examples/minitest_example_test.rb @@ -10,9 +10,7 @@ def will_it_blend? end end -TestClass = M::Frameworks.minitest4? ? MiniTest::Unit::TestCase : Minitest::Test - -class TestMeme < TestClass +class TestMeme < Minitest::Test def setup @meme = Meme.new end diff --git a/test/minitest_4_test.rb b/test/minitest_4_test.rb deleted file mode 100644 index ccec036..0000000 --- a/test/minitest_4_test.rb +++ /dev/null @@ -1,44 +0,0 @@ -require_relative "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/test_helper.rb b/test/test_helper.rb index 9edc501..da69347 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -45,12 +45,8 @@ def try_loading gem class MTest < Test::Unit::TestCase include ::Testable end -elsif M::Frameworks.minitest5? || M::Frameworks.minitest6? - class MTest < Minitest::Test - include ::Testable - end else - class MTest < MiniTest::Unit::TestCase + class MTest < Minitest::Test include ::Testable end end