mutant-minitest 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 279aa0ddb0529bfe71450630a9cf2e1c59140d4f30c5d83f212ae446e9c0109e
4
+ data.tar.gz: df2a0ad024f3987adccbb2ffd3633df6b402a684e195f16ed80c489979e5e856
5
+ SHA512:
6
+ metadata.gz: e97baa23175be495490968be97f1522e55da94cd328a10a5dfff015bec04f133df8bbd5e011bce43f13fdf6612100a4e7c4648d0c94dd504284342a743786f84
7
+ data.tar.gz: 05e8c6f6935350bb686ccbb5418b8ed5b2bf5277685ac7ee28ea30d38230c7ad2de9aec1a2299bb5d2167ad0bd631cebd17a70a912cc854be39ff9bf2a69ad0a
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012-2014 Markus Schirp
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest'
4
+ require 'mutant/minitest/coverage'
5
+
6
+ module Minitest
7
+ # Prevent autorun from running tests when the VM closes
8
+ #
9
+ # Mutant needs control about the exit status of the VM and
10
+ # the moment of test execution
11
+ #
12
+ # @api private
13
+ #
14
+ # @return [nil]
15
+ def self.autorun; end
16
+ end # Minitest
17
+
18
+ module Mutant
19
+ class Integration
20
+ # Minitest integration
21
+ class Minitest < self
22
+ TEST_FILE_PATTERN = './test/**/{test_*,*_test}.rb'
23
+ IDENTIFICATION_FORMAT = 'minitest:%s#%s'
24
+
25
+ private_constant(*constants(false))
26
+
27
+ # Compose a runnable with test method
28
+ #
29
+ # This looks actually like a missing object on minitest implementation.
30
+ class TestCase
31
+ include Adamantium, Concord.new(:klass, :test_method)
32
+
33
+ # Identification string
34
+ #
35
+ # @return [String]
36
+ def identification
37
+ IDENTIFICATION_FORMAT % [klass, test_method]
38
+ end
39
+ memoize :identification
40
+
41
+ # Run test case
42
+ #
43
+ # @param [Object] reporter
44
+ #
45
+ # @return [Boolean]
46
+ def call(reporter)
47
+ ::Minitest::Runnable.run_one_method(klass, test_method, reporter)
48
+ reporter.passed?
49
+ end
50
+
51
+ # Cover expression syntaxes
52
+ #
53
+ # @return [String, nil]
54
+ def expression_syntax
55
+ klass.resolve_cover_expression
56
+ end
57
+
58
+ end # TestCase
59
+
60
+ private_constant(*constants(false))
61
+
62
+ # Setup integration
63
+ #
64
+ # @return [self]
65
+ def setup
66
+ Pathname.glob(TEST_FILE_PATTERN)
67
+ .map(&:to_s)
68
+ .each(&method(:require))
69
+
70
+ self
71
+ end
72
+
73
+ # Call test integration
74
+ #
75
+ # @param [Array<Tests>] tests
76
+ #
77
+ # @return [Result::Test]
78
+ #
79
+ # rubocop:disable MethodLength
80
+ #
81
+ # ignore :reek:TooManyStatements
82
+ def call(tests)
83
+ test_cases = tests.map(&all_tests_index.method(:fetch))
84
+ output = StringIO.new
85
+ start = Time.now
86
+
87
+ reporter = ::Minitest::SummaryReporter.new(output)
88
+
89
+ reporter.start
90
+
91
+ test_cases.each do |test|
92
+ break unless test.call(reporter)
93
+ end
94
+
95
+ output.rewind
96
+
97
+ Result::Test.new(
98
+ passed: reporter.passed?,
99
+ tests: tests,
100
+ output: output.read,
101
+ runtime: Time.now - start
102
+ )
103
+ end
104
+
105
+ # All tests exposed by this integration
106
+ #
107
+ # @return [Array<Test>]
108
+ def all_tests
109
+ all_tests_index.keys
110
+ end
111
+ memoize :all_tests
112
+
113
+ private
114
+
115
+ # The index of all tests to runnable test cases
116
+ #
117
+ # @return [Hash<Test,TestCase>]
118
+ def all_tests_index
119
+ all_test_cases.each_with_object({}) do |test_case, index|
120
+ index[construct_test(test_case)] = test_case
121
+ end
122
+ end
123
+ memoize :all_tests_index
124
+
125
+ # Construct test from test case
126
+ #
127
+ # @param [TestCase]
128
+ #
129
+ # @return [Test]
130
+ def construct_test(test_case)
131
+ Test.new(
132
+ id: test_case.identification,
133
+ expression: config.expression_parser.call(test_case.expression_syntax)
134
+ )
135
+ end
136
+
137
+ # All minitest test cases
138
+ #
139
+ # Intentional utility method.
140
+ #
141
+ # @return [Array<TestCase>]
142
+ def all_test_cases
143
+ ::Minitest::Runnable
144
+ .runnables
145
+ .select(&method(:allow_runnable?))
146
+ .flat_map(&method(:test_case))
147
+ end
148
+
149
+ # Test if runnable qualifies for mutation testing
150
+ #
151
+ # @param [Class]
152
+ #
153
+ # @return [Bool]
154
+ #
155
+ # ignore :reek:UtilityFunction
156
+ def allow_runnable?(klass)
157
+ !klass.equal?(::Minitest::Runnable) && klass.resolve_cover_expression
158
+ end
159
+
160
+ # Turn a minitest runnable into its test cases
161
+ #
162
+ # Intentional utility method.
163
+ #
164
+ # @param [Object] runnable
165
+ #
166
+ # @return [Array<TestCase>]
167
+ #
168
+ # ignore :reek:UtilityFunction
169
+ def test_case(runnable)
170
+ runnable.runnable_methods.map { |method| TestCase.new(runnable, method) }
171
+ end
172
+ end # Minitest
173
+ end # Integration
174
+ end # Mutant
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest'
4
+
5
+ module Mutant
6
+ module Minitest
7
+ module Coverage
8
+ # Setup coverage declaration for current class
9
+ #
10
+ # @param [String]
11
+ #
12
+ # @example
13
+ #
14
+ # class MyTest < MiniTest::Test
15
+ # cover 'MyCode*'
16
+ #
17
+ # def test_some_stuff
18
+ # end
19
+ # end
20
+ #
21
+ # @api public
22
+ def cover(expression)
23
+ fail "#{self} already declares to cover: #{@covers}" if @covers
24
+
25
+ @cover_expression = expression
26
+ end
27
+
28
+ # Effective coverage expression
29
+ #
30
+ # @return [String, nil]
31
+ #
32
+ # @api private
33
+ def resolve_cover_expression
34
+ return @cover_expression if defined?(@cover_expression)
35
+
36
+ try_superclass_cover_expression
37
+ end
38
+
39
+ private
40
+
41
+ # Attempt to resolve superclass cover expressio
42
+ #
43
+ # @return [String, nil]
44
+ #
45
+ # @api private
46
+ def try_superclass_cover_expression
47
+ return if superclass.equal?(::Minitest::Runnable)
48
+
49
+ superclass.resolve_cover_expression
50
+ end
51
+
52
+ end # Coverage
53
+ end # Minitest
54
+ end # Mutant
55
+
56
+ Minitest::Test.extend(Mutant::Minitest::Coverage)
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mutant-minitest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Markus Schirp
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.11'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mutant
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.1
41
+ description: Minitest integration for mutant
42
+ email:
43
+ - mbj@schirp-dso.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files:
47
+ - LICENSE
48
+ files:
49
+ - LICENSE
50
+ - lib/mutant/integration/minitest.rb
51
+ - lib/mutant/minitest/coverage.rb
52
+ homepage: https://github.com/mbj/mutant
53
+ licenses:
54
+ - MIT
55
+ metadata: {}
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 2.7.6
73
+ signing_key:
74
+ specification_version: 4
75
+ summary: Minitest integration for mutant
76
+ test_files: []