minitest 5.26.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/History.rdoc +111 -0
  4. data/Manifest.txt +13 -4
  5. data/README.rdoc +18 -98
  6. data/Rakefile +7 -1
  7. data/bin/minitest +5 -0
  8. data/design_rationale.rb +21 -19
  9. data/lib/hoe/minitest.rb +2 -1
  10. data/lib/minitest/assertions.rb +34 -66
  11. data/lib/minitest/autorun.rb +3 -4
  12. data/lib/minitest/benchmark.rb +3 -3
  13. data/lib/minitest/bisect.rb +306 -0
  14. data/lib/minitest/complete.rb +56 -0
  15. data/lib/minitest/find_minimal_combination.rb +127 -0
  16. data/lib/minitest/hell.rb +1 -1
  17. data/lib/minitest/manual_plugins.rb +4 -16
  18. data/lib/minitest/parallel.rb +5 -3
  19. data/lib/minitest/path_expander.rb +425 -0
  20. data/lib/minitest/pride.rb +2 -2
  21. data/lib/minitest/pride_plugin.rb +1 -1
  22. data/lib/minitest/server.rb +45 -0
  23. data/lib/minitest/server_plugin.rb +84 -0
  24. data/lib/minitest/spec.rb +5 -33
  25. data/lib/minitest/sprint.rb +104 -0
  26. data/lib/minitest/sprint_plugin.rb +39 -0
  27. data/lib/minitest/test.rb +7 -13
  28. data/lib/minitest/test_task.rb +18 -16
  29. data/lib/minitest.rb +91 -101
  30. data/test/minitest/metametameta.rb +1 -1
  31. data/test/minitest/test_bisect.rb +235 -0
  32. data/test/minitest/test_find_minimal_combination.rb +138 -0
  33. data/test/minitest/test_minitest_assertions.rb +48 -105
  34. data/test/minitest/test_minitest_benchmark.rb +14 -0
  35. data/test/minitest/test_minitest_reporter.rb +6 -5
  36. data/test/minitest/test_minitest_spec.rb +52 -118
  37. data/test/minitest/test_minitest_test.rb +21 -100
  38. data/test/minitest/test_path_expander.rb +229 -0
  39. data/test/minitest/test_server.rb +149 -0
  40. data.tar.gz.sig +2 -2
  41. metadata +56 -23
  42. metadata.gz.sig +0 -0
  43. data/.autotest +0 -34
  44. data/lib/minitest/mock.rb +0 -347
  45. data/lib/minitest/unit.rb +0 -42
  46. data/test/minitest/test_minitest_mock.rb +0 -1218
@@ -0,0 +1,104 @@
1
+ $LOAD_PATH.unshift "test", "lib"
2
+
3
+ require "simplecov" if ENV["MT_COV"] || ARGV.delete("--simplecov")
4
+ require_relative "autorun"
5
+ require_relative "path_expander"
6
+
7
+ ##
8
+ # Runs (Get it? It's fast!) your tests and makes it easier to rerun individual
9
+ # failures.
10
+
11
+ module Minitest
12
+ class Sprint
13
+ # extracted version = "1.5.0"
14
+
15
+ ##
16
+ # Process and run minitest cmdline.
17
+
18
+ def self.run args = ARGV
19
+ if ARGV.delete("--bisect") or ARGV.delete("-b") then
20
+ require_relative "bisect"
21
+
22
+ return Minitest::Bisect.run ARGV
23
+ end
24
+
25
+ Minitest::PathExpander.new(args).process { |f|
26
+ require "./#{f}" if File.file? f
27
+ }
28
+ end
29
+
30
+ ##
31
+ # An extra minitest reporter to output how to rerun failures in
32
+ # various styles.
33
+
34
+ class SprintReporter < AbstractReporter
35
+ ##
36
+ # The style to report, either lines or regexp. Defaults to lines.
37
+ attr_accessor :style
38
+ attr_accessor :results # :nodoc:
39
+
40
+ def initialize style = :regexp # :nodoc:
41
+ self.results = []
42
+ self.style = style
43
+ end
44
+
45
+ def record result # :nodoc:
46
+ results << result unless result.passed? or result.skipped?
47
+ end
48
+
49
+ def report # :nodoc:
50
+ return if results.empty?
51
+
52
+ puts
53
+ puts "Happy Happy Sprint List:"
54
+ puts
55
+ print_list
56
+ puts
57
+ end
58
+
59
+ def print_list # :nodoc:
60
+ case style
61
+ when :regexp
62
+ results.each do |result|
63
+ puts " minitest -n #{result.class_name}##{result.name}"
64
+ end
65
+ when :lines
66
+ files = Hash.new { |h,k| h[k] = [] }
67
+ results.each do |result|
68
+ path, line = result.source_location
69
+ path = path.delete_prefix "#{Dir.pwd}/"
70
+ files[path] << line
71
+ end
72
+
73
+ files.sort.each do |path, lines|
74
+ puts " minitest %s:%s" % [path, lines.sort.join(",")]
75
+ end
76
+ else
77
+ raise "unsupported style: %p" % [style]
78
+ end
79
+ end
80
+ end
81
+
82
+ ##
83
+ # An extra minitest reporter to output how to rerun failures using
84
+ # rake.
85
+
86
+ class RakeReporter < SprintReporter
87
+ ##
88
+ # The name of the rake task to rerun. Defaults to nil.
89
+
90
+ attr_accessor :name
91
+
92
+ def initialize name = nil # :nodoc:
93
+ super()
94
+ self.name = name
95
+ end
96
+
97
+ def print_list # :nodoc:
98
+ results.each do |result|
99
+ puts [" rake", name, "N=#{result.class_name}##{result.name}"].compact.join(" ")
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,39 @@
1
+ require_relative "../minitest"
2
+
3
+ # :stopdoc:
4
+ class OptionParser # unofficial embedded gem "makeoptparseworkwell"
5
+ def hidden(...) = define(...).tap { |sw| def sw.summarize(*) = nil }
6
+ def deprecate(from, to) = hidden(from) { abort "#{from} is deprecated. Use #{to}." }
7
+ def topdict(name) = name.length > 1 ? top.long : top.short
8
+ def alias(from, to) = (dict = topdict(from) and dict[to] = dict[from])
9
+ end unless OptionParser.method_defined? :hidden
10
+ # :startdoc:
11
+
12
+ module Minitest # :nodoc:
13
+ def self.plugin_sprint_options opts, options # :nodoc:
14
+ opts.on "--rake [TASK]", "Report how to re-run failures with rake." do |task|
15
+ options[:sprint] = :rake
16
+ options[:rake_task] = task
17
+ end
18
+
19
+ opts.deprecate "--binstub", "--rerun"
20
+
21
+ sprint_styles = %w[rake lines names binstub]
22
+
23
+ opts.on "-r", "--rerun [STYLE]", sprint_styles, "Report how to re-run failures using STYLE (names, lines)." do |style|
24
+ options[:sprint] = (style || :lines).to_sym
25
+ end
26
+ end
27
+
28
+ def self.plugin_sprint_init options
29
+ require_relative "sprint"
30
+ case options[:sprint]
31
+ when :rake then
32
+ self.reporter << Minitest::Sprint::RakeReporter.new(options[:rake_task])
33
+ when :binstub, :names then
34
+ self.reporter << Minitest::Sprint::SprintReporter.new
35
+ when :lines then
36
+ self.reporter << Minitest::Sprint::SprintReporter.new(:lines)
37
+ end
38
+ end
39
+ end
data/lib/minitest/test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "minitest" unless defined? Minitest::Runnable
1
+ require_relative "../minitest" unless defined? Minitest::Runnable
2
2
 
3
3
  module Minitest
4
4
  ##
@@ -8,14 +8,10 @@ module Minitest
8
8
  # See Minitest::Assertions
9
9
 
10
10
  class Test < Runnable
11
- require "minitest/assertions"
11
+ require_relative "assertions"
12
12
  include Minitest::Reportable
13
13
  include Minitest::Assertions
14
14
 
15
- def class_name # :nodoc:
16
- self.class.name # for Minitest::Reportable
17
- end
18
-
19
15
  PASSTHROUGH_EXCEPTIONS = [NoMemoryError, SignalException, SystemExit] # :nodoc:
20
16
 
21
17
  SETUP_METHODS = %w[ before_setup setup after_setup ] # :nodoc:
@@ -34,8 +30,8 @@ module Minitest
34
30
 
35
31
  def self.i_suck_and_my_tests_are_order_dependent!
36
32
  class << self
37
- undef_method :test_order if method_defined? :test_order
38
- define_method :test_order do :alpha end
33
+ undef_method :run_order if method_defined? :run_order
34
+ define_method :run_order do :alpha end
39
35
  end
40
36
  end
41
37
 
@@ -65,20 +61,20 @@ module Minitest
65
61
 
66
62
  ##
67
63
  # Returns all instance methods starting with "test_". Based on
68
- # #test_order, the methods are either sorted, randomized
64
+ # #run_order, the methods are either sorted, randomized
69
65
  # (default), or run in parallel.
70
66
 
71
67
  def self.runnable_methods
72
68
  methods = methods_matching(/^test_/)
73
69
 
74
- case self.test_order
70
+ case self.run_order
75
71
  when :random, :parallel then
76
72
  srand Minitest.seed
77
73
  methods.sort.shuffle
78
74
  when :alpha, :sorted then
79
75
  methods.sort
80
76
  else
81
- raise "Unknown test_order: #{self.test_order.inspect}"
77
+ raise "Unknown_order: %p" % [self.run_order]
82
78
  end
83
79
  end
84
80
 
@@ -234,5 +230,3 @@ module Minitest
234
230
  extend Guard
235
231
  end # Test
236
232
  end
237
-
238
- require "minitest/unit" if ENV["MT_COMPAT"] # compatibility layer only
@@ -168,20 +168,18 @@ module Minitest # :nodoc:
168
168
  ENV["TESTOPTS"]
169
169
  warn "FILTER is deprecated in Minitest::TestTask. Use A instead" if
170
170
  ENV["FILTER"]
171
- warn "N is deprecated in Minitest::TestTask. Use MT_CPU instead" if
172
- ENV["N"] && ENV["N"].to_i > 0
173
171
 
174
172
  lib_extras = (ENV["MT_LIB_EXTRAS"] || "").split File::PATH_SEPARATOR
175
173
  self.libs[0, 0] = lib_extras
176
174
 
177
- extra_args << "-n" << ENV["N"] if ENV["N"]
178
- extra_args << "-e" << ENV["X"] if ENV["X"]
175
+ extra_args << "-i" << ENV["N"] if ENV["N"]
176
+ extra_args << "-i" << ENV["I"] if ENV["I"]
177
+ extra_args << "-x" << ENV["X"] if ENV["X"]
178
+ extra_args << "-x" << ENV["E"] if ENV["E"]
179
179
  extra_args.concat Shellwords.split(ENV["TESTOPTS"]) if ENV["TESTOPTS"]
180
180
  extra_args.concat Shellwords.split(ENV["FILTER"]) if ENV["FILTER"]
181
181
  extra_args.concat Shellwords.split(ENV["A"]) if ENV["A"]
182
182
 
183
- ENV.delete "N" if ENV["N"]
184
-
185
183
  # TODO? RUBY_DEBUG = ENV["RUBY_DEBUG"]
186
184
  # TODO? ENV["RUBY_FLAGS"]
187
185
 
@@ -189,11 +187,16 @@ module Minitest # :nodoc:
189
187
  end
190
188
 
191
189
  def define # :nodoc:
192
- desc "Run the test suite. Use N, X, A, and TESTOPTS to add flags/args."
190
+ desc "Run the test suite. Use I, X, and A to add flags/args."
193
191
  task name do
194
192
  ruby make_test_cmd, verbose: verbose
195
193
  end
196
194
 
195
+ desc "Run the test suite, filtering for 'FU' in name (focused units?)."
196
+ task "#{name}:fu" do
197
+ ruby make_test_cmd(include:"/FU/"), verbose: verbose
198
+ end
199
+
197
200
  desc "Print out the test command. Good for profiling and other tools."
198
201
  task "#{name}:cmd" do
199
202
  puts "ruby #{make_test_cmd}"
@@ -212,7 +215,7 @@ module Minitest # :nodoc:
212
215
 
213
216
  n.threads_do tests.sort do |path|
214
217
  t0 = Time.now
215
- output = `#{Gem.ruby} #{make_test_cmd path} 2>&1`
218
+ output = `#{Gem.ruby} #{make_test_cmd path:path} 2>&1`
216
219
  t1 = Time.now - t0
217
220
 
218
221
  times[path] = t1
@@ -278,7 +281,9 @@ module Minitest # :nodoc:
278
281
  ##
279
282
  # Generate the test command-line.
280
283
 
281
- def make_test_cmd globs = test_globs
284
+ def make_test_cmd **option
285
+ globs = option[:path] || test_globs
286
+
282
287
  tests = []
283
288
  tests.concat Dir[*globs].sort.shuffle # TODO: SEED -> srand first?
284
289
  tests.map! { |f| %(require "#{f}") }
@@ -289,6 +294,8 @@ module Minitest # :nodoc:
289
294
  runner.concat tests
290
295
  runner = runner.join "; "
291
296
 
297
+ extra_args << "-i" << option[:include] if option[:include]
298
+
292
299
  args = []
293
300
  args << "-I#{libs.join File::PATH_SEPARATOR}" unless libs.empty?
294
301
  args << "-w" if warning
@@ -303,13 +310,8 @@ module Minitest # :nodoc:
303
310
  end
304
311
 
305
312
  class Work < Queue # :nodoc:
306
- def initialize jobs = [] # :nodoc:
307
- super()
308
-
309
- jobs.each do |job|
310
- self << job
311
- end
312
-
313
+ def initialize jobs # :nodoc:
314
+ super
313
315
  close
314
316
  end
315
317
  end