Class: Evilution::Integration::Minitest

Inherits:
Base
  • Object
show all
Defined in:
lib/evilution/integration/minitest.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#call

Constructor Details

#initialize(test_files: nil, hooks: nil, fallback_to_full_suite: false, spec_selector: nil) ⇒ Minitest

Returns a new instance of Minitest.



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/evilution/integration/minitest.rb', line 91

def initialize(test_files: nil, hooks: nil, fallback_to_full_suite: false, spec_selector: nil)
  @test_files = test_files
  @minitest_loaded = false
  @spec_selector = spec_selector || Evilution::SpecSelector.new(
    spec_resolver: Evilution::SpecResolver.new(test_dir: "test", test_suffix: "_test.rb", request_dir: "integration")
  )
  @fallback_to_full_suite = fallback_to_full_suite
  @crash_detector = nil
  @warned_files = Set.new
  super(hooks: hooks)
end

Class Method Details

.baseline_optionsObject



83
84
85
86
87
88
89
# File 'lib/evilution/integration/minitest.rb', line 83

def self.baseline_options
  {
    runner: baseline_runner,
    spec_resolver: Evilution::SpecResolver.new(test_dir: "test", test_suffix: "_test.rb", request_dir: "integration"),
    fallback_dir: "test"
  }
end

.baseline_runnerObject



12
13
14
# File 'lib/evilution/integration/minitest.rb', line 12

def self.baseline_runner
  ->(test_file) { run_baseline_test_file(test_file) }
end

.baseline_test_files(test_file) ⇒ Object



37
38
39
# File 'lib/evilution/integration/minitest.rb', line 37

def self.baseline_test_files(test_file)
  File.directory?(test_file) ? Dir.glob(File.join(test_file, "**/*_test.rb")) : [test_file]
end

.dispatch_minitest_suites(reporter, options) ⇒ Object

Dispatch to the version-appropriate suite runner. Minitest 6 removed ::Minitest.__run; the equivalent public entry point is run_all_suites. Minitest 5.x still exposes __run.



72
73
74
75
76
77
78
79
80
81
# File 'lib/evilution/integration/minitest.rb', line 72

def self.dispatch_minitest_suites(reporter, options)
  if ::Minitest.respond_to?(:run_all_suites)
    ::Minitest.run_all_suites(reporter, options)
  elsif ::Minitest.respond_to?(:__run)
    ::Minitest.__run(reporter, options)
  else
    raise Evilution::Error,
          "Minitest #{::Minitest::VERSION} has neither run_all_suites nor __run"
  end
end

.initialize_minitest_state(reporter, options) ⇒ Object

Mirror Minitest.run’s preamble: seed setup + plugin init. Without seeding Minitest.seed before dispatching suites, Minitest 5.x raises ‘TypeError: no implicit conversion of nil into Integer` from Minitest::Test.runnable_methods calling `srand(Minitest.seed)` on nil. init_plugins also needs Minitest.reporter set first because some plugins (pride) read it during init.



60
61
62
63
64
65
66
67
# File 'lib/evilution/integration/minitest.rb', line 60

def self.initialize_minitest_state(reporter, options)
  ::Minitest.seed = options[:seed]
  srand(::Minitest.seed) if ::Minitest.seed

  ::Minitest.reporter = reporter
  ::Minitest.init_plugins(options) if ::Minitest.respond_to?(:init_plugins)
  ::Minitest.reporter = nil
end

.run_baseline_minitestObject



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/evilution/integration/minitest.rb', line 41

def self.run_baseline_minitest
  out = StringIO.new
  options = ::Minitest.process_args(["--seed", "0"])
  options[:io] = out
  reporter = ::Minitest::CompositeReporter.new
  reporter << ::Minitest::SummaryReporter.new(out, options)
  initialize_minitest_state(reporter, options)
  reporter.start
  dispatch_minitest_suites(reporter, options)
  reporter.report
  reporter.passed?
end

.run_baseline_test_file(test_file) ⇒ Object



16
17
18
19
20
21
22
23
# File 'lib/evilution/integration/minitest.rb', line 16

def self.run_baseline_test_file(test_file)
  require "minitest"
  require "stringio"
  stub_autorun!
  ::Minitest::Runnable.runnables.clear
  baseline_test_files(test_file).each { |f| load(File.expand_path(f)) }
  run_baseline_minitest
end

.stub_autorun!Object

User helpers that ‘require “minitest/autorun”` install an at_exit handler calling `Minitest.run(ARGV)`. At evilution process exit ARGV still holds evilution flags (–integration, –spec, …) and Minitest’s option parser prints a misleading “invalid option” banner. Stubbing autorun before user code loads prevents the handler from ever being installed.



30
31
32
33
34
35
# File 'lib/evilution/integration/minitest.rb', line 30

def self.stub_autorun!
  location = ::Minitest.singleton_class.instance_method(:autorun).source_location
  return if location && location.first == __FILE__

  ::Minitest.define_singleton_method(:autorun) { nil }
end