colorcode_convert_rgb 0.1.0

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 (158) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/Gemfile.lock +23 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +40 -0
  6. data/Rakefile +10 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/colorcode_convert_rgb.gemspec +30 -0
  10. data/exe/colorcode_convert_rgb +4 -0
  11. data/lib/colorcode_convert_rgb.rb +7 -0
  12. data/lib/colorcode_convert_rgb/cli.rb +13 -0
  13. data/lib/colorcode_convert_rgb/version.rb +3 -0
  14. data/vendor/bundle/ruby/2.5.0/bin/colorcode_convert_rgb +27 -0
  15. data/vendor/bundle/ruby/2.5.0/bin/rake +27 -0
  16. data/vendor/bundle/ruby/2.5.0/bin/thor +27 -0
  17. data/vendor/bundle/ruby/2.5.0/cache/minitest-5.14.2.gem +0 -0
  18. data/vendor/bundle/ruby/2.5.0/cache/rake-12.3.3.gem +0 -0
  19. data/vendor/bundle/ruby/2.5.0/cache/thor-1.0.1.gem +0 -0
  20. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/.autotest +34 -0
  21. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/History.rdoc +1397 -0
  22. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/Manifest.txt +27 -0
  23. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/README.rdoc +764 -0
  24. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/Rakefile +74 -0
  25. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/design_rationale.rb +52 -0
  26. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/hoe/minitest.rb +32 -0
  27. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest.rb +1056 -0
  28. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/assertions.rb +807 -0
  29. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/autorun.rb +13 -0
  30. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/benchmark.rb +455 -0
  31. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/expectations.rb +303 -0
  32. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/hell.rb +11 -0
  33. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/mock.rb +240 -0
  34. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/parallel.rb +70 -0
  35. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/pride.rb +4 -0
  36. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/pride_plugin.rb +142 -0
  37. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/spec.rb +342 -0
  38. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/test.rb +220 -0
  39. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/lib/minitest/unit.rb +45 -0
  40. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/metametameta.rb +136 -0
  41. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_assertions.rb +1575 -0
  42. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_benchmark.rb +137 -0
  43. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_mock.rb +872 -0
  44. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_reporter.rb +299 -0
  45. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_spec.rb +1061 -0
  46. data/vendor/bundle/ruby/2.5.0/gems/minitest-5.14.2/test/minitest/test_minitest_test.rb +1084 -0
  47. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/CONTRIBUTING.rdoc +43 -0
  48. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/Gemfile +3 -0
  49. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/History.rdoc +2344 -0
  50. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/MIT-LICENSE +21 -0
  51. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/README.rdoc +156 -0
  52. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/Rakefile +41 -0
  53. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/azure-pipelines.yml +11 -0
  54. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/bundle +105 -0
  55. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/console +7 -0
  56. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/rake +29 -0
  57. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/rdoc +29 -0
  58. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/rubocop +29 -0
  59. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/bin/setup +6 -0
  60. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/command_line_usage.rdoc +158 -0
  61. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/Rakefile1 +38 -0
  62. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/Rakefile2 +35 -0
  63. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/a.c +6 -0
  64. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/b.c +6 -0
  65. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/example/main.c +11 -0
  66. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/glossary.rdoc +42 -0
  67. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/jamis.rb +592 -0
  68. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/proto_rake.rdoc +127 -0
  69. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/rake.1 +156 -0
  70. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/rakefile.rdoc +622 -0
  71. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/doc/rational.rdoc +151 -0
  72. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/exe/rake +27 -0
  73. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake.rb +71 -0
  74. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/application.rb +824 -0
  75. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/backtrace.rb +24 -0
  76. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/clean.rb +78 -0
  77. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/cloneable.rb +17 -0
  78. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/cpu_counter.rb +107 -0
  79. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/default_loader.rb +15 -0
  80. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/dsl_definition.rb +195 -0
  81. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/early_time.rb +22 -0
  82. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/ext/core.rb +26 -0
  83. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/ext/string.rb +176 -0
  84. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_creation_task.rb +25 -0
  85. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_list.rb +435 -0
  86. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_task.rb +54 -0
  87. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_utils.rb +137 -0
  88. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/file_utils_ext.rb +145 -0
  89. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/invocation_chain.rb +57 -0
  90. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/invocation_exception_mixin.rb +17 -0
  91. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/late_time.rb +18 -0
  92. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/linked_list.rb +112 -0
  93. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/loaders/makefile.rb +54 -0
  94. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/multi_task.rb +14 -0
  95. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/name_space.rb +38 -0
  96. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/packagetask.rb +207 -0
  97. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/phony.rb +16 -0
  98. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/private_reader.rb +21 -0
  99. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/promise.rb +100 -0
  100. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/pseudo_status.rb +30 -0
  101. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/rake_module.rb +67 -0
  102. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/rake_test_loader.rb +27 -0
  103. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/rule_recursion_overflow_error.rb +20 -0
  104. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/scope.rb +43 -0
  105. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task.rb +413 -0
  106. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task_argument_error.rb +8 -0
  107. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task_arguments.rb +109 -0
  108. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/task_manager.rb +324 -0
  109. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/tasklib.rb +12 -0
  110. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/testtask.rb +224 -0
  111. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/thread_history_display.rb +49 -0
  112. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/thread_pool.rb +163 -0
  113. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/trace_output.rb +23 -0
  114. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/version.rb +10 -0
  115. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/lib/rake/win32.rb +51 -0
  116. data/vendor/bundle/ruby/2.5.0/gems/rake-12.3.3/rake.gemspec +42 -0
  117. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/.document +5 -0
  118. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/CHANGELOG.md +220 -0
  119. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/CONTRIBUTING.md +15 -0
  120. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/LICENSE.md +20 -0
  121. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/README.md +51 -0
  122. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/bin/thor +6 -0
  123. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor.rb +517 -0
  124. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions.rb +336 -0
  125. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/create_file.rb +104 -0
  126. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/create_link.rb +61 -0
  127. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/directory.rb +108 -0
  128. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/empty_directory.rb +143 -0
  129. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/file_manipulation.rb +373 -0
  130. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/actions/inject_into_file.rb +120 -0
  131. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/base.rb +699 -0
  132. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/command.rb +142 -0
  133. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
  134. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/error.rb +110 -0
  135. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/group.rb +281 -0
  136. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/invocation.rb +178 -0
  137. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/line_editor.rb +17 -0
  138. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/line_editor/basic.rb +37 -0
  139. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/line_editor/readline.rb +88 -0
  140. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/nested_context.rb +29 -0
  141. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser.rb +4 -0
  142. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/argument.rb +70 -0
  143. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/arguments.rb +175 -0
  144. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/option.rb +159 -0
  145. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/parser/options.rb +236 -0
  146. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/rake_compat.rb +72 -0
  147. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/runner.rb +325 -0
  148. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell.rb +81 -0
  149. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell/basic.rb +491 -0
  150. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell/color.rb +153 -0
  151. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/shell/html.rb +126 -0
  152. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/util.rb +284 -0
  153. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/lib/thor/version.rb +3 -0
  154. data/vendor/bundle/ruby/2.5.0/gems/thor-1.0.1/thor.gemspec +28 -0
  155. data/vendor/bundle/ruby/2.5.0/specifications/minitest-5.14.2.gemspec +38 -0
  156. data/vendor/bundle/ruby/2.5.0/specifications/rake-12.3.3.gemspec +43 -0
  157. data/vendor/bundle/ruby/2.5.0/specifications/thor-1.0.1.gemspec +34 -0
  158. metadata +214 -0
@@ -0,0 +1,74 @@
1
+ # -*- ruby -*-
2
+
3
+ require "rubygems"
4
+ require "hoe"
5
+
6
+ Hoe.plugin :seattlerb
7
+ Hoe.plugin :rdoc
8
+
9
+ Hoe.spec "minitest" do
10
+ developer "Ryan Davis", "ryand-ruby@zenspider.com"
11
+
12
+ license "MIT"
13
+
14
+ require_ruby_version [">= 2.2", "< 3.1"]
15
+ end
16
+
17
+ desc "Find missing expectations"
18
+ task :specs do
19
+ $:.unshift "lib"
20
+ require "minitest/test"
21
+ require "minitest/spec"
22
+
23
+ pos_prefix, neg_prefix = "must", "wont"
24
+ skip_re = /^(must|wont)$|wont_(throw)|must_(block|not?_|nothing|send|raise$)/x
25
+ dont_flip_re = /(must|wont)_(include|respond_to)/
26
+
27
+ map = {
28
+ /(must_throw)s/ => '\1',
29
+ /(?!not)_same/ => "_be_same_as",
30
+ /_in_/ => "_be_within_",
31
+ /_operator/ => "_be",
32
+ /_includes/ => "_include",
33
+ /(must|wont)_(.*_of|nil|silent|empty)/ => '\1_be_\2',
34
+ /must_raises/ => "must_raise",
35
+ /(must|wont)_predicate/ => '\1_be',
36
+ /(must|wont)_path_exists/ => 'path_\1_exist',
37
+ }
38
+
39
+ expectations = Minitest::Expectations.public_instance_methods.map(&:to_s)
40
+ assertions = Minitest::Assertions.public_instance_methods.map(&:to_s)
41
+
42
+ assertions.sort.each do |assertion|
43
+ expectation = case assertion
44
+ when /^assert/ then
45
+ assertion.sub(/^assert/, pos_prefix.to_s)
46
+ when /^refute/ then
47
+ assertion.sub(/^refute/, neg_prefix.to_s)
48
+ end
49
+
50
+ next unless expectation
51
+ next if expectation =~ skip_re
52
+
53
+ regexp, replacement = map.find { |re, _| expectation =~ re }
54
+ expectation.sub! regexp, replacement if replacement
55
+
56
+ next if expectations.include? expectation
57
+
58
+ args = [assertion, expectation].map(&:to_sym).map(&:inspect)
59
+ args << :reverse if expectation =~ dont_flip_re
60
+
61
+ puts
62
+ puts "##"
63
+ puts "# :method: #{expectation}"
64
+ puts "# See Minitest::Assertions##{assertion}"
65
+ puts
66
+ puts "infect_an_assertion #{args.join ", "}"
67
+ end
68
+ end
69
+
70
+ task :bugs do
71
+ sh "for f in bug*.rb ; do echo $f; echo; #{Gem.ruby} -Ilib $f && rm $f ; done"
72
+ end
73
+
74
+ # vim: syntax=Ruby
@@ -0,0 +1,52 @@
1
+ # Specs: # Equivalent Unit Tests:
2
+ ###############################################################################
3
+ describe Thingy do # class TestThingy < Minitest::Test
4
+ before do # def setup
5
+ do_some_setup # super
6
+ end # do_some_setup
7
+ # end
8
+ it "should do the first thing" do #
9
+ 1.must_equal 1 # def test_first_thing
10
+ end # assert_equal 1, 1
11
+ # end
12
+ describe SubThingy do # end
13
+ before do #
14
+ do_more_setup # class TestSubThingy < TestThingy
15
+ end # def setup
16
+ # super
17
+ it "should do the second thing" do # do_more_setup
18
+ 2.must_equal 2 # end
19
+ end #
20
+ end # def test_second_thing
21
+ end # assert_equal 2, 2
22
+ # end
23
+ # end
24
+ ###############################################################################
25
+ # runs 2 specs # runs 3 tests
26
+ ###############################################################################
27
+ # The specs generate:
28
+
29
+ class ThingySpec < Minitest::Spec
30
+ def setup
31
+ super
32
+ do_some_setup
33
+ end
34
+
35
+ def test_should_do_the_first_thing
36
+ assert_equal 1, 1
37
+ end
38
+ end
39
+
40
+ class SubThingySpec < ThingySpec
41
+ def setup
42
+ super
43
+ do_more_setup
44
+ end
45
+
46
+ # because only setup/teardown is inherited, not specs
47
+ remove_method :test_should_do_the_first_thing
48
+
49
+ def test_should_do_the_second_thing
50
+ assert_equal 2, 2
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ # :stopdoc:
2
+
3
+ class Hoe
4
+ end
5
+
6
+ module Hoe::Minitest
7
+ def minitest?
8
+ self.name == "minitest"
9
+ end
10
+
11
+ def initialize_minitest
12
+ unless minitest? then
13
+ dir = "../../minitest/dev/lib"
14
+ Hoe.add_include_dirs dir if File.directory? dir
15
+ end
16
+
17
+ gem "minitest"
18
+ require "minitest"
19
+ version = Minitest::VERSION.split(/\./).first(2).join(".")
20
+
21
+ dependency "minitest", "~> #{version}", :development unless
22
+ minitest? or ENV["MT_NO_ISOLATE"]
23
+ end
24
+
25
+ def define_minitest_tasks
26
+ self.testlib = :minitest
27
+
28
+ # make sure we use the gemmed minitest on 1.9
29
+ self.test_prelude = 'gem "minitest"' unless
30
+ minitest? or ENV["MT_NO_ISOLATE"]
31
+ end
32
+ end
@@ -0,0 +1,1056 @@
1
+ require "optparse"
2
+ require "thread"
3
+ require "mutex_m"
4
+ require "minitest/parallel"
5
+ require "stringio"
6
+
7
+ ##
8
+ # :include: README.rdoc
9
+
10
+ module Minitest
11
+ VERSION = "5.14.2" # :nodoc:
12
+ ENCS = "".respond_to? :encoding # :nodoc:
13
+
14
+ @@installed_at_exit ||= false
15
+ @@after_run = []
16
+ @extensions = []
17
+
18
+ mc = (class << self; self; end)
19
+
20
+ ##
21
+ # Parallel test executor
22
+
23
+ mc.send :attr_accessor, :parallel_executor
24
+
25
+ warn "DEPRECATED: use MT_CPU instead of N for parallel test runs" if ENV["N"]
26
+ n_threads = (ENV["MT_CPU"] || ENV["N"] || 2).to_i
27
+ self.parallel_executor = Parallel::Executor.new n_threads
28
+
29
+ ##
30
+ # Filter object for backtraces.
31
+
32
+ mc.send :attr_accessor, :backtrace_filter
33
+
34
+ ##
35
+ # Reporter object to be used for all runs.
36
+ #
37
+ # NOTE: This accessor is only available during setup, not during runs.
38
+
39
+ mc.send :attr_accessor, :reporter
40
+
41
+ ##
42
+ # Names of known extension plugins.
43
+
44
+ mc.send :attr_accessor, :extensions
45
+
46
+ ##
47
+ # The signal to use for dumping information to STDERR. Defaults to "INFO".
48
+
49
+ mc.send :attr_accessor, :info_signal
50
+ self.info_signal = "INFO"
51
+
52
+ ##
53
+ # Registers Minitest to run at process exit
54
+
55
+ def self.autorun
56
+ at_exit {
57
+ next if $! and not ($!.kind_of? SystemExit and $!.success?)
58
+
59
+ exit_code = nil
60
+
61
+ pid = Process.pid
62
+ at_exit {
63
+ next if Process.pid != pid
64
+ @@after_run.reverse_each(&:call)
65
+ exit exit_code || false
66
+ }
67
+
68
+ exit_code = Minitest.run ARGV
69
+ } unless @@installed_at_exit
70
+ @@installed_at_exit = true
71
+ end
72
+
73
+ ##
74
+ # A simple hook allowing you to run a block of code after everything
75
+ # is done running. Eg:
76
+ #
77
+ # Minitest.after_run { p $debugging_info }
78
+
79
+ def self.after_run &block
80
+ @@after_run << block
81
+ end
82
+
83
+ def self.init_plugins options # :nodoc:
84
+ self.extensions.each do |name|
85
+ msg = "plugin_#{name}_init"
86
+ send msg, options if self.respond_to? msg
87
+ end
88
+ end
89
+
90
+ def self.load_plugins # :nodoc:
91
+ return unless self.extensions.empty?
92
+
93
+ seen = {}
94
+
95
+ require "rubygems" unless defined? Gem
96
+
97
+ Gem.find_files("minitest/*_plugin.rb").each do |plugin_path|
98
+ name = File.basename plugin_path, "_plugin.rb"
99
+
100
+ next if seen[name]
101
+ seen[name] = true
102
+
103
+ require plugin_path
104
+ self.extensions << name
105
+ end
106
+ end
107
+
108
+ ##
109
+ # This is the top-level run method. Everything starts from here. It
110
+ # tells each Runnable sub-class to run, and each of those are
111
+ # responsible for doing whatever they do.
112
+ #
113
+ # The overall structure of a run looks like this:
114
+ #
115
+ # Minitest.autorun
116
+ # Minitest.run(args)
117
+ # Minitest.__run(reporter, options)
118
+ # Runnable.runnables.each
119
+ # runnable.run(reporter, options)
120
+ # self.runnable_methods.each
121
+ # self.run_one_method(self, runnable_method, reporter)
122
+ # Minitest.run_one_method(klass, runnable_method)
123
+ # klass.new(runnable_method).run
124
+
125
+ def self.run args = []
126
+ self.load_plugins unless args.delete("--no-plugins") || ENV["MT_NO_PLUGINS"]
127
+
128
+ options = process_args args
129
+
130
+ reporter = CompositeReporter.new
131
+ reporter << SummaryReporter.new(options[:io], options)
132
+ reporter << ProgressReporter.new(options[:io], options)
133
+
134
+ self.reporter = reporter # this makes it available to plugins
135
+ self.init_plugins options
136
+ self.reporter = nil # runnables shouldn't depend on the reporter, ever
137
+
138
+ self.parallel_executor.start if parallel_executor.respond_to?(:start)
139
+ reporter.start
140
+ begin
141
+ __run reporter, options
142
+ rescue Interrupt
143
+ warn "Interrupted. Exiting..."
144
+ end
145
+ self.parallel_executor.shutdown
146
+ reporter.report
147
+
148
+ reporter.passed?
149
+ end
150
+
151
+ ##
152
+ # Internal run method. Responsible for telling all Runnable
153
+ # sub-classes to run.
154
+
155
+ def self.__run reporter, options
156
+ suites = Runnable.runnables.reject { |s| s.runnable_methods.empty? }.shuffle
157
+ parallel, serial = suites.partition { |s| s.test_order == :parallel }
158
+
159
+ # If we run the parallel tests before the serial tests, the parallel tests
160
+ # could run in parallel with the serial tests. This would be bad because
161
+ # the serial tests won't lock around Reporter#record. Run the serial tests
162
+ # first, so that after they complete, the parallel tests will lock when
163
+ # recording results.
164
+ serial.map { |suite| suite.run reporter, options } +
165
+ parallel.map { |suite| suite.run reporter, options }
166
+ end
167
+
168
+ def self.process_args args = [] # :nodoc:
169
+ options = {
170
+ :io => $stdout,
171
+ }
172
+ orig_args = args.dup
173
+
174
+ OptionParser.new do |opts|
175
+ opts.banner = "minitest options:"
176
+ opts.version = Minitest::VERSION
177
+
178
+ opts.on "-h", "--help", "Display this help." do
179
+ puts opts
180
+ exit
181
+ end
182
+
183
+ opts.on "--no-plugins", "Bypass minitest plugin auto-loading (or set $MT_NO_PLUGINS)."
184
+
185
+ desc = "Sets random seed. Also via env. Eg: SEED=n rake"
186
+ opts.on "-s", "--seed SEED", Integer, desc do |m|
187
+ options[:seed] = m.to_i
188
+ end
189
+
190
+ opts.on "-v", "--verbose", "Verbose. Show progress processing files." do
191
+ options[:verbose] = true
192
+ end
193
+
194
+ opts.on "-n", "--name PATTERN", "Filter run on /regexp/ or string." do |a|
195
+ options[:filter] = a
196
+ end
197
+
198
+ opts.on "-e", "--exclude PATTERN", "Exclude /regexp/ or string from run." do |a|
199
+ options[:exclude] = a
200
+ end
201
+
202
+ unless extensions.empty?
203
+ opts.separator ""
204
+ opts.separator "Known extensions: #{extensions.join(", ")}"
205
+
206
+ extensions.each do |meth|
207
+ msg = "plugin_#{meth}_options"
208
+ send msg, opts, options if self.respond_to?(msg)
209
+ end
210
+ end
211
+
212
+ begin
213
+ opts.parse! args
214
+ rescue OptionParser::InvalidOption => e
215
+ puts
216
+ puts e
217
+ puts
218
+ puts opts
219
+ exit 1
220
+ end
221
+
222
+ orig_args -= args
223
+ end
224
+
225
+ unless options[:seed] then
226
+ srand
227
+ options[:seed] = (ENV["SEED"] || srand).to_i % 0xFFFF
228
+ orig_args << "--seed" << options[:seed].to_s
229
+ end
230
+
231
+ srand options[:seed]
232
+
233
+ options[:args] = orig_args.map { |s|
234
+ s =~ /[\s|&<>$()]/ ? s.inspect : s
235
+ }.join " "
236
+
237
+ options
238
+ end
239
+
240
+ def self.filter_backtrace bt # :nodoc:
241
+ result = backtrace_filter.filter bt
242
+ result = bt.dup if result.empty?
243
+ result
244
+ end
245
+
246
+ ##
247
+ # Represents anything "runnable", like Test, Spec, Benchmark, or
248
+ # whatever you can dream up.
249
+ #
250
+ # Subclasses of this are automatically registered and available in
251
+ # Runnable.runnables.
252
+
253
+ class Runnable
254
+ ##
255
+ # Number of assertions executed in this run.
256
+
257
+ attr_accessor :assertions
258
+
259
+ ##
260
+ # An assertion raised during the run, if any.
261
+
262
+ attr_accessor :failures
263
+
264
+ ##
265
+ # The time it took to run.
266
+
267
+ attr_accessor :time
268
+
269
+ def time_it # :nodoc:
270
+ t0 = Minitest.clock_time
271
+
272
+ yield
273
+ ensure
274
+ self.time = Minitest.clock_time - t0
275
+ end
276
+
277
+ ##
278
+ # Name of the run.
279
+
280
+ def name
281
+ @NAME
282
+ end
283
+
284
+ ##
285
+ # Set the name of the run.
286
+
287
+ def name= o
288
+ @NAME = o
289
+ end
290
+
291
+ ##
292
+ # Returns all instance methods matching the pattern +re+.
293
+
294
+ def self.methods_matching re
295
+ public_instance_methods(true).grep(re).map(&:to_s)
296
+ end
297
+
298
+ def self.reset # :nodoc:
299
+ @@runnables = []
300
+ end
301
+
302
+ reset
303
+
304
+ ##
305
+ # Responsible for running all runnable methods in a given class,
306
+ # each in its own instance. Each instance is passed to the
307
+ # reporter to record.
308
+
309
+ def self.run reporter, options = {}
310
+ filter = options[:filter] || "/./"
311
+ filter = Regexp.new $1 if filter.is_a?(String) && filter =~ %r%/(.*)/%
312
+
313
+ filtered_methods = self.runnable_methods.find_all { |m|
314
+ filter === m || filter === "#{self}##{m}"
315
+ }
316
+
317
+ exclude = options[:exclude]
318
+ exclude = Regexp.new $1 if exclude =~ %r%/(.*)/%
319
+
320
+ filtered_methods.delete_if { |m|
321
+ exclude === m || exclude === "#{self}##{m}"
322
+ }
323
+
324
+ return if filtered_methods.empty?
325
+
326
+ with_info_handler reporter do
327
+ filtered_methods.each do |method_name|
328
+ run_one_method self, method_name, reporter
329
+ end
330
+ end
331
+ end
332
+
333
+ ##
334
+ # Runs a single method and has the reporter record the result.
335
+ # This was considered internal API but is factored out of run so
336
+ # that subclasses can specialize the running of an individual
337
+ # test. See Minitest::ParallelTest::ClassMethods for an example.
338
+
339
+ def self.run_one_method klass, method_name, reporter
340
+ reporter.prerecord klass, method_name
341
+ reporter.record Minitest.run_one_method(klass, method_name)
342
+ end
343
+
344
+ def self.with_info_handler reporter, &block # :nodoc:
345
+ handler = lambda do
346
+ unless reporter.passed? then
347
+ warn "Current results:"
348
+ warn ""
349
+ warn reporter.reporters.first
350
+ warn ""
351
+ end
352
+ end
353
+
354
+ on_signal ::Minitest.info_signal, handler, &block
355
+ end
356
+
357
+ SIGNALS = Signal.list # :nodoc:
358
+
359
+ def self.on_signal name, action # :nodoc:
360
+ supported = SIGNALS[name]
361
+
362
+ old_trap = trap name do
363
+ old_trap.call if old_trap.respond_to? :call
364
+ action.call
365
+ end if supported
366
+
367
+ yield
368
+ ensure
369
+ trap name, old_trap if supported
370
+ end
371
+
372
+ ##
373
+ # Each subclass of Runnable is responsible for overriding this
374
+ # method to return all runnable methods. See #methods_matching.
375
+
376
+ def self.runnable_methods
377
+ raise NotImplementedError, "subclass responsibility"
378
+ end
379
+
380
+ ##
381
+ # Returns all subclasses of Runnable.
382
+
383
+ def self.runnables
384
+ @@runnables
385
+ end
386
+
387
+ @@marshal_dump_warned = false
388
+
389
+ def marshal_dump # :nodoc:
390
+ unless @@marshal_dump_warned then
391
+ warn ["Minitest::Runnable#marshal_dump is deprecated.",
392
+ "You might be violating internals. From", caller.first].join " "
393
+ @@marshal_dump_warned = true
394
+ end
395
+
396
+ [self.name, self.failures, self.assertions, self.time]
397
+ end
398
+
399
+ def marshal_load ary # :nodoc:
400
+ self.name, self.failures, self.assertions, self.time = ary
401
+ end
402
+
403
+ def failure # :nodoc:
404
+ self.failures.first
405
+ end
406
+
407
+ def initialize name # :nodoc:
408
+ self.name = name
409
+ self.failures = []
410
+ self.assertions = 0
411
+ end
412
+
413
+ ##
414
+ # Runs a single method. Needs to return self.
415
+
416
+ def run
417
+ raise NotImplementedError, "subclass responsibility"
418
+ end
419
+
420
+ ##
421
+ # Did this run pass?
422
+ #
423
+ # Note: skipped runs are not considered passing, but they don't
424
+ # cause the process to exit non-zero.
425
+
426
+ def passed?
427
+ raise NotImplementedError, "subclass responsibility"
428
+ end
429
+
430
+ ##
431
+ # Returns a single character string to print based on the result
432
+ # of the run. One of <tt>"."</tt>, <tt>"F"</tt>,
433
+ # <tt>"E"</tt> or <tt>"S"</tt>.
434
+
435
+ def result_code
436
+ raise NotImplementedError, "subclass responsibility"
437
+ end
438
+
439
+ ##
440
+ # Was this run skipped? See #passed? for more information.
441
+
442
+ def skipped?
443
+ raise NotImplementedError, "subclass responsibility"
444
+ end
445
+ end
446
+
447
+ ##
448
+ # Shared code for anything that can get passed to a Reporter. See
449
+ # Minitest::Test & Minitest::Result.
450
+
451
+ module Reportable
452
+ ##
453
+ # Did this run pass?
454
+ #
455
+ # Note: skipped runs are not considered passing, but they don't
456
+ # cause the process to exit non-zero.
457
+
458
+ def passed?
459
+ not self.failure
460
+ end
461
+
462
+ ##
463
+ # The location identifier of this test. Depends on a method
464
+ # existing called class_name.
465
+
466
+ def location
467
+ loc = " [#{self.failure.location}]" unless passed? or error?
468
+ "#{self.class_name}##{self.name}#{loc}"
469
+ end
470
+
471
+ def class_name # :nodoc:
472
+ raise NotImplementedError, "subclass responsibility"
473
+ end
474
+
475
+ ##
476
+ # Returns ".", "F", or "E" based on the result of the run.
477
+
478
+ def result_code
479
+ self.failure and self.failure.result_code or "."
480
+ end
481
+
482
+ ##
483
+ # Was this run skipped?
484
+
485
+ def skipped?
486
+ self.failure and Skip === self.failure
487
+ end
488
+
489
+ ##
490
+ # Did this run error?
491
+
492
+ def error?
493
+ self.failures.any? { |f| UnexpectedError === f }
494
+ end
495
+ end
496
+
497
+ ##
498
+ # This represents a test result in a clean way that can be
499
+ # marshalled over a wire. Tests can do anything they want to the
500
+ # test instance and can create conditions that cause Marshal.dump to
501
+ # blow up. By using Result.from(a_test) you can be reasonably sure
502
+ # that the test result can be marshalled.
503
+
504
+ class Result < Runnable
505
+ include Minitest::Reportable
506
+
507
+ undef_method :marshal_dump
508
+ undef_method :marshal_load
509
+
510
+ ##
511
+ # The class name of the test result.
512
+
513
+ attr_accessor :klass
514
+
515
+ ##
516
+ # The location of the test method.
517
+
518
+ attr_accessor :source_location
519
+
520
+ ##
521
+ # Create a new test result from a Runnable instance.
522
+
523
+ def self.from runnable
524
+ o = runnable
525
+
526
+ r = self.new o.name
527
+ r.klass = o.class.name
528
+ r.assertions = o.assertions
529
+ r.failures = o.failures.dup
530
+ r.time = o.time
531
+
532
+ r.source_location = o.method(o.name).source_location rescue ["unknown", -1]
533
+
534
+ r
535
+ end
536
+
537
+ def class_name # :nodoc:
538
+ self.klass # for Minitest::Reportable
539
+ end
540
+
541
+ def to_s # :nodoc:
542
+ return location if passed? and not skipped?
543
+
544
+ failures.map { |failure|
545
+ "#{failure.result_label}:\n#{self.location}:\n#{failure.message}\n"
546
+ }.join "\n"
547
+ end
548
+ end
549
+
550
+ ##
551
+ # Defines the API for Reporters. Subclass this and override whatever
552
+ # you want. Go nuts.
553
+
554
+ class AbstractReporter
555
+ include Mutex_m
556
+
557
+ ##
558
+ # Starts reporting on the run.
559
+
560
+ def start
561
+ end
562
+
563
+ ##
564
+ # About to start running a test. This allows a reporter to show
565
+ # that it is starting or that we are in the middle of a test run.
566
+
567
+ def prerecord klass, name
568
+ end
569
+
570
+ ##
571
+ # Output and record the result of the test. Call
572
+ # {result#result_code}[rdoc-ref:Runnable#result_code] to get the
573
+ # result character string. Stores the result of the run if the run
574
+ # did not pass.
575
+
576
+ def record result
577
+ end
578
+
579
+ ##
580
+ # Outputs the summary of the run.
581
+
582
+ def report
583
+ end
584
+
585
+ ##
586
+ # Did this run pass?
587
+
588
+ def passed?
589
+ true
590
+ end
591
+ end
592
+
593
+ class Reporter < AbstractReporter # :nodoc:
594
+ ##
595
+ # The IO used to report.
596
+
597
+ attr_accessor :io
598
+
599
+ ##
600
+ # Command-line options for this run.
601
+
602
+ attr_accessor :options
603
+
604
+ def initialize io = $stdout, options = {} # :nodoc:
605
+ super()
606
+ self.io = io
607
+ self.options = options
608
+ end
609
+ end
610
+
611
+ ##
612
+ # A very simple reporter that prints the "dots" during the run.
613
+ #
614
+ # This is added to the top-level CompositeReporter at the start of
615
+ # the run. If you want to change the output of minitest via a
616
+ # plugin, pull this out of the composite and replace it with your
617
+ # own.
618
+
619
+ class ProgressReporter < Reporter
620
+ def prerecord klass, name #:nodoc:
621
+ if options[:verbose] then
622
+ io.print "%s#%s = " % [klass.name, name]
623
+ io.flush
624
+ end
625
+ end
626
+
627
+ def record result # :nodoc:
628
+ io.print "%.2f s = " % [result.time] if options[:verbose]
629
+ io.print result.result_code
630
+ io.puts if options[:verbose]
631
+ end
632
+ end
633
+
634
+ ##
635
+ # A reporter that gathers statistics about a test run. Does not do
636
+ # any IO because meant to be used as a parent class for a reporter
637
+ # that does.
638
+ #
639
+ # If you want to create an entirely different type of output (eg,
640
+ # CI, HTML, etc), this is the place to start.
641
+ #
642
+ # Example:
643
+ #
644
+ # class JenkinsCIReporter < StatisticsReporter
645
+ # def report
646
+ # super # Needed to calculate some statistics
647
+ #
648
+ # print "<testsuite "
649
+ # print "tests='#{count}' "
650
+ # print "failures='#{failures}' "
651
+ # # Remaining XML...
652
+ # end
653
+ # end
654
+
655
+ class StatisticsReporter < Reporter
656
+ ##
657
+ # Total number of assertions.
658
+
659
+ attr_accessor :assertions
660
+
661
+ ##
662
+ # Total number of test cases.
663
+
664
+ attr_accessor :count
665
+
666
+ ##
667
+ # An +Array+ of test cases that failed or were skipped.
668
+
669
+ attr_accessor :results
670
+
671
+ ##
672
+ # Time the test run started. If available, the monotonic clock is
673
+ # used and this is a +Float+, otherwise it's an instance of
674
+ # +Time+.
675
+
676
+ attr_accessor :start_time
677
+
678
+ ##
679
+ # Test run time. If available, the monotonic clock is used and
680
+ # this is a +Float+, otherwise it's an instance of +Time+.
681
+
682
+ attr_accessor :total_time
683
+
684
+ ##
685
+ # Total number of tests that failed.
686
+
687
+ attr_accessor :failures
688
+
689
+ ##
690
+ # Total number of tests that erred.
691
+
692
+ attr_accessor :errors
693
+
694
+ ##
695
+ # Total number of tests that where skipped.
696
+
697
+ attr_accessor :skips
698
+
699
+ def initialize io = $stdout, options = {} # :nodoc:
700
+ super
701
+
702
+ self.assertions = 0
703
+ self.count = 0
704
+ self.results = []
705
+ self.start_time = nil
706
+ self.total_time = nil
707
+ self.failures = nil
708
+ self.errors = nil
709
+ self.skips = nil
710
+ end
711
+
712
+ def passed? # :nodoc:
713
+ results.all?(&:skipped?)
714
+ end
715
+
716
+ def start # :nodoc:
717
+ self.start_time = Minitest.clock_time
718
+ end
719
+
720
+ def record result # :nodoc:
721
+ self.count += 1
722
+ self.assertions += result.assertions
723
+
724
+ results << result if not result.passed? or result.skipped?
725
+ end
726
+
727
+ ##
728
+ # Report on the tracked statistics.
729
+
730
+ def report
731
+ aggregate = results.group_by { |r| r.failure.class }
732
+ aggregate.default = [] # dumb. group_by should provide this
733
+
734
+ self.total_time = Minitest.clock_time - start_time
735
+ self.failures = aggregate[Assertion].size
736
+ self.errors = aggregate[UnexpectedError].size
737
+ self.skips = aggregate[Skip].size
738
+ end
739
+ end
740
+
741
+ ##
742
+ # A reporter that prints the header, summary, and failure details at
743
+ # the end of the run.
744
+ #
745
+ # This is added to the top-level CompositeReporter at the start of
746
+ # the run. If you want to change the output of minitest via a
747
+ # plugin, pull this out of the composite and replace it with your
748
+ # own.
749
+
750
+ class SummaryReporter < StatisticsReporter
751
+ # :stopdoc:
752
+ attr_accessor :sync
753
+ attr_accessor :old_sync
754
+ # :startdoc:
755
+
756
+ def start # :nodoc:
757
+ super
758
+
759
+ io.puts "Run options: #{options[:args]}"
760
+ io.puts
761
+ io.puts "# Running:"
762
+ io.puts
763
+
764
+ self.sync = io.respond_to? :"sync=" # stupid emacs
765
+ self.old_sync, io.sync = io.sync, true if self.sync
766
+ end
767
+
768
+ def report # :nodoc:
769
+ super
770
+
771
+ io.sync = self.old_sync
772
+
773
+ io.puts unless options[:verbose] # finish the dots
774
+ io.puts
775
+ io.puts statistics
776
+ aggregated_results io
777
+ io.puts summary
778
+ end
779
+
780
+ def statistics # :nodoc:
781
+ "Finished in %.6fs, %.4f runs/s, %.4f assertions/s." %
782
+ [total_time, count / total_time, assertions / total_time]
783
+ end
784
+
785
+ def aggregated_results io # :nodoc:
786
+ filtered_results = results.dup
787
+ filtered_results.reject!(&:skipped?) unless options[:verbose]
788
+
789
+ filtered_results.each_with_index { |result, i|
790
+ io.puts "\n%3d) %s" % [i+1, result]
791
+ }
792
+ io.puts
793
+ io
794
+ end
795
+
796
+ def to_s # :nodoc:
797
+ aggregated_results(StringIO.new(binary_string)).string
798
+ end
799
+
800
+ def summary # :nodoc:
801
+ extra = ""
802
+
803
+ extra = "\n\nYou have skipped tests. Run with --verbose for details." if
804
+ results.any?(&:skipped?) unless options[:verbose] or ENV["MT_NO_SKIP_MSG"]
805
+
806
+ "%d runs, %d assertions, %d failures, %d errors, %d skips%s" %
807
+ [count, assertions, failures, errors, skips, extra]
808
+ end
809
+
810
+ private
811
+
812
+ if '<3'.respond_to? :b
813
+ def binary_string; ''.b; end
814
+ else
815
+ def binary_string; ''.force_encoding(Encoding::ASCII_8BIT); end
816
+ end
817
+ end
818
+
819
+ ##
820
+ # Dispatch to multiple reporters as one.
821
+
822
+ class CompositeReporter < AbstractReporter
823
+ ##
824
+ # The list of reporters to dispatch to.
825
+
826
+ attr_accessor :reporters
827
+
828
+ def initialize *reporters # :nodoc:
829
+ super()
830
+ self.reporters = reporters
831
+ end
832
+
833
+ def io # :nodoc:
834
+ reporters.first.io
835
+ end
836
+
837
+ ##
838
+ # Add another reporter to the mix.
839
+
840
+ def << reporter
841
+ self.reporters << reporter
842
+ end
843
+
844
+ def passed? # :nodoc:
845
+ self.reporters.all?(&:passed?)
846
+ end
847
+
848
+ def start # :nodoc:
849
+ self.reporters.each(&:start)
850
+ end
851
+
852
+ def prerecord klass, name # :nodoc:
853
+ self.reporters.each do |reporter|
854
+ # TODO: remove conditional for minitest 6
855
+ reporter.prerecord klass, name if reporter.respond_to? :prerecord
856
+ end
857
+ end
858
+
859
+ def record result # :nodoc:
860
+ self.reporters.each do |reporter|
861
+ reporter.record result
862
+ end
863
+ end
864
+
865
+ def report # :nodoc:
866
+ self.reporters.each(&:report)
867
+ end
868
+ end
869
+
870
+ ##
871
+ # Represents run failures.
872
+
873
+ class Assertion < Exception
874
+ def error # :nodoc:
875
+ self
876
+ end
877
+
878
+ ##
879
+ # Where was this run before an assertion was raised?
880
+
881
+ def location
882
+ last_before_assertion = ""
883
+ self.backtrace.reverse_each do |s|
884
+ break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
885
+ last_before_assertion = s
886
+ end
887
+ last_before_assertion.sub(/:in .*$/, "")
888
+ end
889
+
890
+ def result_code # :nodoc:
891
+ result_label[0, 1]
892
+ end
893
+
894
+ def result_label # :nodoc:
895
+ "Failure"
896
+ end
897
+ end
898
+
899
+ ##
900
+ # Assertion raised when skipping a run.
901
+
902
+ class Skip < Assertion
903
+ def result_label # :nodoc:
904
+ "Skipped"
905
+ end
906
+ end
907
+
908
+ ##
909
+ # Assertion wrapping an unexpected error that was raised during a run.
910
+
911
+ class UnexpectedError < Assertion
912
+ # TODO: figure out how to use `cause` instead
913
+ attr_accessor :error # :nodoc:
914
+
915
+ def initialize error # :nodoc:
916
+ super "Unexpected exception"
917
+ self.error = error
918
+ end
919
+
920
+ def backtrace # :nodoc:
921
+ self.error.backtrace
922
+ end
923
+
924
+ def message # :nodoc:
925
+ bt = Minitest.filter_backtrace(self.backtrace).join "\n "
926
+ "#{self.error.class}: #{self.error.message}\n #{bt}"
927
+ end
928
+
929
+ def result_label # :nodoc:
930
+ "Error"
931
+ end
932
+ end
933
+
934
+ ##
935
+ # Provides a simple set of guards that you can use in your tests
936
+ # to skip execution if it is not applicable. These methods are
937
+ # mixed into Test as both instance and class methods so you
938
+ # can use them inside or outside of the test methods.
939
+ #
940
+ # def test_something_for_mri
941
+ # skip "bug 1234" if jruby?
942
+ # # ...
943
+ # end
944
+ #
945
+ # if windows? then
946
+ # # ... lots of test methods ...
947
+ # end
948
+
949
+ module Guard
950
+
951
+ ##
952
+ # Is this running on jruby?
953
+
954
+ def jruby? platform = RUBY_PLATFORM
955
+ "java" == platform
956
+ end
957
+
958
+ ##
959
+ # Is this running on maglev?
960
+
961
+ def maglev? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
962
+ where = Minitest.filter_backtrace(caller).first
963
+ where = where.split(/:in /, 2).first # clean up noise
964
+ warn "DEPRECATED: `maglev?` called from #{where}. This will fail in Minitest 6."
965
+ "maglev" == platform
966
+ end
967
+
968
+ ##
969
+ # Is this running on mri?
970
+
971
+ def mri? platform = RUBY_DESCRIPTION
972
+ /^ruby/ =~ platform
973
+ end
974
+
975
+ ##
976
+ # Is this running on macOS?
977
+
978
+ def osx? platform = RUBY_PLATFORM
979
+ /darwin/ =~ platform
980
+ end
981
+
982
+ ##
983
+ # Is this running on rubinius?
984
+
985
+ def rubinius? platform = defined?(RUBY_ENGINE) && RUBY_ENGINE
986
+ where = Minitest.filter_backtrace(caller).first
987
+ where = where.split(/:in /, 2).first # clean up noise
988
+ warn "DEPRECATED: `rubinius?` called from #{where}. This will fail in Minitest 6."
989
+ "rbx" == platform
990
+ end
991
+
992
+ ##
993
+ # Is this running on windows?
994
+
995
+ def windows? platform = RUBY_PLATFORM
996
+ /mswin|mingw/ =~ platform
997
+ end
998
+ end
999
+
1000
+ ##
1001
+ # The standard backtrace filter for minitest.
1002
+ #
1003
+ # See Minitest.backtrace_filter=.
1004
+
1005
+ class BacktraceFilter
1006
+
1007
+ MT_RE = %r%lib/minitest% #:nodoc:
1008
+
1009
+ ##
1010
+ # Filter +bt+ to something useful. Returns the whole thing if
1011
+ # $DEBUG (ruby) or $MT_DEBUG (env).
1012
+
1013
+ def filter bt
1014
+ return ["No backtrace"] unless bt
1015
+
1016
+ return bt.dup if $DEBUG || ENV["MT_DEBUG"]
1017
+
1018
+ new_bt = bt.take_while { |line| line !~ MT_RE }
1019
+ new_bt = bt.select { |line| line !~ MT_RE } if new_bt.empty?
1020
+ new_bt = bt.dup if new_bt.empty?
1021
+
1022
+ new_bt
1023
+ end
1024
+ end
1025
+
1026
+ self.backtrace_filter = BacktraceFilter.new
1027
+
1028
+ def self.run_one_method klass, method_name # :nodoc:
1029
+ result = klass.new(method_name).run
1030
+ raise "#{klass}#run _must_ return a Result" unless Result === result
1031
+ result
1032
+ end
1033
+
1034
+ # :stopdoc:
1035
+
1036
+ if defined? Process::CLOCK_MONOTONIC # :nodoc:
1037
+ def self.clock_time
1038
+ Process.clock_gettime Process::CLOCK_MONOTONIC
1039
+ end
1040
+ else
1041
+ def self.clock_time
1042
+ Time.now
1043
+ end
1044
+ end
1045
+
1046
+ class Runnable # re-open
1047
+ def self.inherited klass # :nodoc:
1048
+ self.runnables << klass
1049
+ super
1050
+ end
1051
+ end
1052
+
1053
+ # :startdoc:
1054
+ end
1055
+
1056
+ require "minitest/test"