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.



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/evilution/integration/minitest.rb', line 78

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



70
71
72
73
74
75
76
# File 'lib/evilution/integration/minitest.rb', line 70

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



24
25
26
# File 'lib/evilution/integration/minitest.rb', line 24

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.



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

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.



47
48
49
50
51
52
53
54
# File 'lib/evilution/integration/minitest.rb', line 47

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



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/evilution/integration/minitest.rb', line 28

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
# File 'lib/evilution/integration/minitest.rb', line 16

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