mutest 0.0.6 → 0.0.7
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 +4 -4
- data/.buildkite/hooks/pre-command +1 -1
- data/.buildkite/pipeline.yml +9 -22
- data/.gitmodules +3 -0
- data/CHANGELOG.md +14 -1
- data/Gemfile +11 -6
- data/Gemfile.lock +27 -101
- data/README.md +42 -2
- data/Rakefile +2 -8
- data/circle.yml +4 -1
- data/lib/mutest.rb +1 -1
- data/lib/mutest/ast/meta/send.rb +6 -0
- data/lib/mutest/ast/named_children.rb +1 -1
- data/lib/mutest/ast/nodes.rb +0 -2
- data/lib/mutest/ast/regexp.rb +4 -4
- data/lib/mutest/ast/regexp/transformer.rb +4 -4
- data/lib/mutest/ast/regexp/transformer/character_set.rb +1 -1
- data/lib/mutest/ast/regexp/transformer/direct.rb +1 -1
- data/lib/mutest/ast/regexp/transformer/quantifier.rb +3 -3
- data/lib/mutest/ast/regexp/transformer/recursive.rb +1 -1
- data/lib/mutest/ast/regexp/transformer/text.rb +1 -1
- data/lib/mutest/ast/types.rb +0 -1
- data/lib/mutest/cli.rb +1 -1
- data/lib/mutest/context.rb +1 -1
- data/lib/mutest/matcher/config.rb +0 -2
- data/lib/mutest/matcher/method.rb +1 -3
- data/lib/mutest/matcher/method/instance.rb +1 -1
- data/lib/mutest/matcher/methods.rb +1 -1
- data/lib/mutest/mutator.rb +0 -2
- data/lib/mutest/mutator/node/block_pass.rb +29 -0
- data/lib/mutest/mutator/node/generic.rb +1 -0
- data/lib/mutest/mutator/node/literal/boolean.rb +0 -1
- data/lib/mutest/mutator/node/literal/range.rb +1 -1
- data/lib/mutest/mutator/node/literal/regex.rb +1 -1
- data/lib/mutest/mutator/node/literal/string.rb +3 -0
- data/lib/mutest/mutator/node/literal/symbol.rb +0 -2
- data/lib/mutest/mutator/node/send.rb +35 -6
- data/lib/mutest/mutator/node/splat.rb +3 -1
- data/lib/mutest/parallel/worker.rb +1 -1
- data/lib/mutest/reporter/cli.rb +0 -2
- data/lib/mutest/reporter/cli/format.rb +1 -1
- data/lib/mutest/reporter/cli/printer.rb +2 -2
- data/lib/mutest/reporter/cli/printer/mutation_result.rb +0 -2
- data/lib/mutest/version.rb +1 -1
- data/meta/and.rb +0 -2
- data/meta/array.rb +0 -3
- data/meta/begin.rb +0 -3
- data/meta/block.rb +0 -1
- data/meta/block_pass.rb +30 -1
- data/meta/break.rb +0 -1
- data/meta/case.rb +0 -6
- data/meta/casgn.rb +0 -3
- data/meta/cvasgn.rb +0 -1
- data/meta/def.rb +0 -7
- data/meta/dstr.rb +2 -0
- data/meta/dsym.rb +2 -0
- data/meta/ensure.rb +0 -1
- data/meta/false.rb +0 -1
- data/meta/gvasgn.rb +0 -1
- data/meta/hash.rb +0 -4
- data/meta/if.rb +0 -5
- data/meta/ivasgn.rb +0 -1
- data/meta/kwbegin.rb +0 -1
- data/meta/lvasgn.rb +0 -1
- data/meta/match_current_line.rb +0 -1
- data/meta/next.rb +0 -1
- data/meta/or.rb +0 -2
- data/meta/regexp.rb +0 -1
- data/meta/rescue.rb +0 -6
- data/meta/send.rb +60 -16
- data/meta/splat.rb +25 -0
- data/meta/str.rb +1 -0
- data/meta/true.rb +0 -1
- data/meta/until.rb +0 -1
- data/meta/while.rb +0 -2
- data/meta/yield.rb +0 -1
- data/mutest-rspec.gemspec +1 -1
- data/mutest.gemspec +0 -4
- data/spec/integration/mutest/rspec_spec.rb +1 -1
- data/spec/integrations.yml +1 -1
- data/spec/shared/command_method_behavior.rb +5 -0
- data/spec/shared/idempotent_method_behavior.rb +10 -0
- data/spec/spec_helper.rb +21 -1
- data/spec/support/xspec.rb +1 -1
- data/spec/unit/mutest/actor/sender_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send_spec.rb +23 -11
- data/spec/unit/mutest/cli_spec.rb +13 -13
- data/spec/unit/mutest/context_spec.rb +2 -2
- data/spec/unit/mutest/diff_spec.rb +9 -9
- data/spec/unit/mutest/integration/null_spec.rb +1 -1
- data/spec/unit/mutest/integration_spec.rb +1 -1
- data/spec/unit/mutest/matcher/method/instance_spec.rb +5 -5
- data/spec/unit/mutest/matcher/method/singleton_spec.rb +5 -5
- data/spec/unit/mutest/meta/example_spec.rb +3 -3
- data/spec/unit/mutest/mutation_spec.rb +5 -5
- data/spec/unit/mutest/mutator/node_spec.rb +6 -9
- data/spec/unit/mutest/parallel/driver_spec.rb +1 -1
- data/spec/unit/mutest/reporter/null_spec.rb +1 -1
- data/spec/unit/mutest/reporter/sequence_spec.rb +1 -1
- data/spec/unit/mutest/result_spec.rb +1 -1
- data/spec/unit/mutest/runner/sink_spec.rb +1 -1
- data/spec/unit/mutest/subject/method/instance/memoized_spec.rb +1 -1
- data/spec/unit/mutest/subject/method/instance_spec.rb +3 -3
- data/spec/unit/mutest/subject/method/singleton_spec.rb +3 -3
- data/spec/unit/mutest/subject_spec.rb +2 -2
- data/test_app/Gemfile.rspec3.6 +7 -0
- metadata +9 -57
- data/build/Dockerfile +0 -71
- data/build/docker-bootstrap.sh +0 -85
- data/build/docker-exec +0 -29
- data/build/make-docker +0 -3
- data/build/ruby_matrix +0 -1
- data/build/run +0 -5
- data/build/strict-mode.sh +0 -16
- data/config/devtools.yml +0 -2
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/reek.yml +0 -137
- data/lib/mutest/mutator/node/noop.rb +0 -19
data/meta/splat.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Mutest::Meta::Example.add :splat do
|
2
|
+
source 'foo(*bar)'
|
3
|
+
|
4
|
+
singleton_mutations
|
5
|
+
mutation 'foo'
|
6
|
+
mutation 'foo(nil)'
|
7
|
+
mutation 'foo(bar)'
|
8
|
+
mutation 'foo(self)'
|
9
|
+
mutation 'foo(*self)'
|
10
|
+
end
|
11
|
+
|
12
|
+
Mutest::Meta::Example.add :splat do
|
13
|
+
source 'a = *bar'
|
14
|
+
|
15
|
+
singleton_mutations
|
16
|
+
mutation 'a__mutest__ = *bar'
|
17
|
+
mutation 'a = nil'
|
18
|
+
mutation 'a = self'
|
19
|
+
mutation 'a = []'
|
20
|
+
mutation 'a = [nil]'
|
21
|
+
mutation 'a = [self]'
|
22
|
+
mutation 'a = [*self]'
|
23
|
+
mutation 'a = [bar]'
|
24
|
+
mutation s(:lvasgn, :a, s(:splat, s(:send, nil, :bar)))
|
25
|
+
end
|
data/meta/str.rb
CHANGED
data/meta/true.rb
CHANGED
data/meta/until.rb
CHANGED
@@ -6,7 +6,6 @@ Mutest::Meta::Example.add :until do
|
|
6
6
|
mutation 'until true; foo; end'
|
7
7
|
mutation 'until true; end'
|
8
8
|
mutation 'until false; foo; bar; end'
|
9
|
-
mutation 'until nil; foo; bar; end'
|
10
9
|
mutation 'until true; foo; nil; end'
|
11
10
|
mutation 'until true; foo; self; end'
|
12
11
|
mutation 'until true; nil; bar; end'
|
data/meta/while.rb
CHANGED
@@ -8,7 +8,6 @@ Mutest::Meta::Example.add :while do
|
|
8
8
|
mutation 'while true; foo; end'
|
9
9
|
mutation 'while true; end'
|
10
10
|
mutation 'while false; foo; bar; end'
|
11
|
-
mutation 'while nil; foo; bar; end'
|
12
11
|
mutation 'while true; foo; nil; end'
|
13
12
|
mutation 'while true; nil; bar; end'
|
14
13
|
mutation 'while true; raise; end'
|
@@ -20,5 +19,4 @@ Mutest::Meta::Example.add :while do
|
|
20
19
|
singleton_mutations
|
21
20
|
mutation 'while true; raise; end'
|
22
21
|
mutation 'while false; end'
|
23
|
-
mutation 'while nil; end'
|
24
22
|
end
|
data/meta/yield.rb
CHANGED
data/mutest-rspec.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.extra_rdoc_files = %w[LICENSE]
|
17
17
|
|
18
18
|
gem.add_runtime_dependency('mutest', "~> #{gem.version}")
|
19
|
-
gem.add_runtime_dependency('rspec-core', '>= 3.4.0', '< 3.
|
19
|
+
gem.add_runtime_dependency('rspec-core', '>= 3.4.0', '< 3.7.0')
|
20
20
|
|
21
21
|
gem.add_development_dependency('bundler', '~> 1.3', '>= 1.3.5')
|
22
22
|
end
|
data/mutest.gemspec
CHANGED
@@ -39,8 +39,4 @@ Gem::Specification.new do |gem|
|
|
39
39
|
gem.add_runtime_dependency('anima', '~> 0.3.0')
|
40
40
|
gem.add_runtime_dependency('concord', '~> 0.1.5')
|
41
41
|
gem.add_runtime_dependency('regexp_parser', '~> 0.4.1')
|
42
|
-
|
43
|
-
gem.add_development_dependency('rubocop-rspec', '~> 1.10.0')
|
44
|
-
gem.add_development_dependency('devtools', '~> 0.1.16')
|
45
|
-
gem.add_development_dependency('bundler', '~> 1.10')
|
46
42
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
RSpec.describe 'rspec integration', mutest: false do
|
2
2
|
let(:base_cmd) { 'bundle exec mutest -I lib --require test_app --use rspec' }
|
3
3
|
|
4
|
-
%w[3.4 3.5].each do |version|
|
4
|
+
%w[3.4 3.5 3.6].each do |version|
|
5
5
|
context "RSpec #{version}" do
|
6
6
|
let(:gemfile) { "Gemfile.rspec#{version}" }
|
7
7
|
|
data/spec/integrations.yml
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
RSpec.shared_examples_for 'an idempotent method' do
|
2
|
+
it 'is idempotent' do
|
3
|
+
first = subject
|
4
|
+
fail 'RSpec not configured for threadsafety' unless RSpec.configuration.threadsafe?
|
5
|
+
mutex = __memoized.instance_variable_get(:@mutex)
|
6
|
+
memoized = __memoized.instance_variable_get(:@memoized)
|
7
|
+
mutex.synchronize { memoized.delete(:subject) }
|
8
|
+
expect(subject).to equal(first)
|
9
|
+
end
|
10
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -22,10 +22,19 @@ require 'tempfile'
|
|
22
22
|
require 'concord'
|
23
23
|
require 'anima'
|
24
24
|
require 'adamantium'
|
25
|
-
require 'devtools/spec_helper'
|
26
25
|
require 'unparser/cli'
|
27
26
|
require 'mutest'
|
28
27
|
require 'mutest/meta'
|
28
|
+
require 'rspec/its'
|
29
|
+
require 'timeout'
|
30
|
+
|
31
|
+
module MutestSpec
|
32
|
+
SPECS_PATH = Pathname.new(__dir__).expand_path.freeze
|
33
|
+
PROJECT_ROOT = SPECS_PATH.parent.freeze
|
34
|
+
UNIT_TEST_TIMOUT = 10.0
|
35
|
+
end # MutestSpec
|
36
|
+
|
37
|
+
Dir.glob(MutestSpec::SPECS_PATH.join('{shared,support}/**/*.rb')).each(&method(:require))
|
29
38
|
|
30
39
|
$LOAD_PATH << File.join(TestApp.root, 'lib')
|
31
40
|
|
@@ -63,6 +72,17 @@ RSpec.configure do |config|
|
|
63
72
|
config.include(ParserHelper)
|
64
73
|
config.include(Mutest::AST::Sexp)
|
65
74
|
|
75
|
+
# Define metadata for all tests which live under spec/unit
|
76
|
+
config.define_derived_metadata(file_path: %r{\bspec/unit/}) do |metadata|
|
77
|
+
# Set the type of these tests as 'unit'
|
78
|
+
metadata[:type] = :unit
|
79
|
+
end
|
80
|
+
|
81
|
+
# Set a modest timeout to kill slow tests when running `mutest`.
|
82
|
+
config.around(:each, type: :unit) do |example|
|
83
|
+
Timeout.timeout(MutestSpec::UNIT_TEST_TIMOUT, &example)
|
84
|
+
end
|
85
|
+
|
66
86
|
config.after(:suite) do
|
67
87
|
$stderr = STDERR
|
68
88
|
MutestSpec::Warning.assert_no_warnings
|
data/spec/support/xspec.rb
CHANGED
@@ -5,21 +5,33 @@ RSpec.describe Mutest::AST::Meta::Send do
|
|
5
5
|
Parser::CurrentRuby.parse(source)
|
6
6
|
end
|
7
7
|
|
8
|
-
let(:method_call) { parse('foo.bar(baz)')
|
9
|
-
let(:attribute_read) { parse('foo.bar')
|
10
|
-
let(:index_assignment) { parse('foo[0] = bar')
|
11
|
-
let(:attribute_assignment) { parse('foo.bar = baz')
|
12
|
-
let(:binary_method_operator) { parse('foo == bar')
|
8
|
+
let(:method_call) { parse('foo.bar(baz)') }
|
9
|
+
let(:attribute_read) { parse('foo.bar') }
|
10
|
+
let(:index_assignment) { parse('foo[0] = bar') }
|
11
|
+
let(:attribute_assignment) { parse('foo.bar = baz') }
|
12
|
+
let(:binary_method_operator) { parse('foo == bar') }
|
13
|
+
let(:method_method_call) { parse('foo.method(:bar)') }
|
14
|
+
let(:public_method_call) { parse("foo.public_method('bar')") }
|
13
15
|
|
14
16
|
class Expectation
|
15
|
-
include Adamantium,
|
17
|
+
include Adamantium,
|
18
|
+
Anima.new(
|
19
|
+
:name,
|
20
|
+
:assignment,
|
21
|
+
:attribute_assignment,
|
22
|
+
:index_assignment,
|
23
|
+
:binary_method_operator,
|
24
|
+
:method_object_selector
|
25
|
+
)
|
16
26
|
|
17
27
|
ALL = [
|
18
|
-
[:method_call, false, false, false, false],
|
19
|
-
[:attribute_read, false, false, false, false],
|
20
|
-
[:index_assignment, true, false, true, false],
|
21
|
-
[:attribute_assignment, true, true, false, false],
|
22
|
-
[:binary_method_operator, false, false, false, true]
|
28
|
+
[:method_call, false, false, false, false, false],
|
29
|
+
[:attribute_read, false, false, false, false, false],
|
30
|
+
[:index_assignment, true, false, true, false, false],
|
31
|
+
[:attribute_assignment, true, true, false, false, false],
|
32
|
+
[:binary_method_operator, false, false, false, true, false],
|
33
|
+
[:method_method_call, false, false, false, false, true],
|
34
|
+
[:public_method_call, false, false, false, false, true]
|
23
35
|
].map do |values|
|
24
36
|
new(Hash[anima.attribute_names.zip(values)])
|
25
37
|
end.freeze
|
@@ -85,7 +85,7 @@ RSpec.describe Mutest::CLI do
|
|
85
85
|
|
86
86
|
let(:expected_message) { 'invalid option: --invalid' }
|
87
87
|
|
88
|
-
|
88
|
+
it_behaves_like 'an invalid cli run'
|
89
89
|
end
|
90
90
|
|
91
91
|
context 'with unknown option' do
|
@@ -93,7 +93,7 @@ RSpec.describe Mutest::CLI do
|
|
93
93
|
|
94
94
|
let(:expected_message) { 'invalid option: --invalid' }
|
95
95
|
|
96
|
-
|
96
|
+
it_behaves_like 'an invalid cli run'
|
97
97
|
end
|
98
98
|
|
99
99
|
context 'with include help flag' do
|
@@ -104,7 +104,7 @@ RSpec.describe Mutest::CLI do
|
|
104
104
|
expect(Kernel).to receive(:exit)
|
105
105
|
end
|
106
106
|
|
107
|
-
|
107
|
+
it_behaves_like 'a cli parser'
|
108
108
|
|
109
109
|
let(:expected_message) do
|
110
110
|
strip_indent(<<-MESSAGE)
|
@@ -129,7 +129,7 @@ Options:
|
|
129
129
|
context 'with include flag' do
|
130
130
|
let(:flags) { %w[--include foo] }
|
131
131
|
|
132
|
-
|
132
|
+
it_behaves_like 'a cli parser'
|
133
133
|
|
134
134
|
it 'configures includes' do
|
135
135
|
expect(subject.config.includes).to eql(%w[foo])
|
@@ -147,7 +147,7 @@ Options:
|
|
147
147
|
.and_call_original
|
148
148
|
end
|
149
149
|
|
150
|
-
|
150
|
+
it_behaves_like 'a cli parser'
|
151
151
|
end
|
152
152
|
|
153
153
|
context 'when specifying the default null integration explicitely' do
|
@@ -160,7 +160,7 @@ Options:
|
|
160
160
|
.and_call_original
|
161
161
|
end
|
162
162
|
|
163
|
-
|
163
|
+
it_behaves_like 'a cli parser'
|
164
164
|
end
|
165
165
|
|
166
166
|
context 'when integration does NOT exist' do
|
@@ -183,13 +183,13 @@ Options:
|
|
183
183
|
expect($stdout).to receive(:puts).with("mutest-#{Mutest::VERSION}")
|
184
184
|
end
|
185
185
|
|
186
|
-
|
186
|
+
it_behaves_like 'a cli parser'
|
187
187
|
end
|
188
188
|
|
189
189
|
context 'with jobs flag' do
|
190
190
|
let(:flags) { %w[--jobs 0] }
|
191
191
|
|
192
|
-
|
192
|
+
it_behaves_like 'a cli parser'
|
193
193
|
|
194
194
|
it 'configures expected coverage' do
|
195
195
|
expect(subject.config.jobs).to be(0)
|
@@ -199,7 +199,7 @@ Options:
|
|
199
199
|
context 'with require flags' do
|
200
200
|
let(:flags) { %w[--require foo --require bar] }
|
201
201
|
|
202
|
-
|
202
|
+
it_behaves_like 'a cli parser'
|
203
203
|
|
204
204
|
it 'configures requires' do
|
205
205
|
expect(subject.config.requires).to eql(%w[foo bar])
|
@@ -223,7 +223,7 @@ Options:
|
|
223
223
|
)
|
224
224
|
end
|
225
225
|
|
226
|
-
|
226
|
+
it_behaves_like 'a cli parser'
|
227
227
|
end
|
228
228
|
|
229
229
|
context 'with subject-ignore flag' do
|
@@ -233,13 +233,13 @@ Options:
|
|
233
233
|
default_matcher_config.with(ignore_expressions: [parse_expression('Foo::Bar')])
|
234
234
|
end
|
235
235
|
|
236
|
-
|
236
|
+
it_behaves_like 'a cli parser'
|
237
237
|
end
|
238
238
|
|
239
239
|
context 'with fail-fast flag' do
|
240
240
|
let(:flags) { %w[--fail-fast] }
|
241
241
|
|
242
|
-
|
242
|
+
it_behaves_like 'a cli parser'
|
243
243
|
|
244
244
|
it 'sets the fail fast option' do
|
245
245
|
expect(subject.config.fail_fast).to be(true)
|
@@ -249,7 +249,7 @@ Options:
|
|
249
249
|
context 'with zombie flag' do
|
250
250
|
let(:flags) { %w[--zombie] }
|
251
251
|
|
252
|
-
|
252
|
+
it_behaves_like 'a cli parser'
|
253
253
|
|
254
254
|
it 'sets the zombie option' do
|
255
255
|
expect(subject.config.zombie).to be(true)
|
@@ -77,7 +77,7 @@ RSpec.describe Mutest::Context do
|
|
77
77
|
is_expected.to eql('TestApp')
|
78
78
|
end
|
79
79
|
|
80
|
-
|
80
|
+
it_behaves_like 'an idempotent method'
|
81
81
|
end
|
82
82
|
|
83
83
|
context 'with scoped constant name' do
|
@@ -85,7 +85,7 @@ RSpec.describe Mutest::Context do
|
|
85
85
|
is_expected.to eql('Literal')
|
86
86
|
end
|
87
87
|
|
88
|
-
|
88
|
+
it_behaves_like 'an idempotent method'
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
@@ -30,7 +30,7 @@ RSpec.describe Mutest::Diff do
|
|
30
30
|
|
31
31
|
it { is_expected.to eql(expectation) }
|
32
32
|
|
33
|
-
|
33
|
+
it_behaves_like 'an idempotent method'
|
34
34
|
end
|
35
35
|
|
36
36
|
context 'when there is no diff' do
|
@@ -39,7 +39,7 @@ RSpec.describe Mutest::Diff do
|
|
39
39
|
|
40
40
|
it { is_expected.to be(nil) }
|
41
41
|
|
42
|
-
|
42
|
+
it_behaves_like 'an idempotent method'
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -65,7 +65,7 @@ RSpec.describe Mutest::Diff do
|
|
65
65
|
|
66
66
|
it { is_expected.to eql(expectation) }
|
67
67
|
|
68
|
-
|
68
|
+
it_behaves_like 'an idempotent method'
|
69
69
|
end
|
70
70
|
|
71
71
|
context 'when there is a diff at begin of hunk' do
|
@@ -83,7 +83,7 @@ RSpec.describe Mutest::Diff do
|
|
83
83
|
|
84
84
|
it { is_expected.to eql(expectation) }
|
85
85
|
|
86
|
-
|
86
|
+
it_behaves_like 'an idempotent method'
|
87
87
|
end
|
88
88
|
|
89
89
|
context 'when there is a diff NOT at begin of hunk' do
|
@@ -101,7 +101,7 @@ RSpec.describe Mutest::Diff do
|
|
101
101
|
|
102
102
|
it { is_expected.to eql(expectation) }
|
103
103
|
|
104
|
-
|
104
|
+
it_behaves_like 'an idempotent method'
|
105
105
|
end
|
106
106
|
|
107
107
|
context 'when the diff has a long context at begin' do
|
@@ -124,7 +124,7 @@ RSpec.describe Mutest::Diff do
|
|
124
124
|
|
125
125
|
it { is_expected.to eql(expectation) }
|
126
126
|
|
127
|
-
|
127
|
+
it_behaves_like 'an idempotent method'
|
128
128
|
end
|
129
129
|
|
130
130
|
context 'when the diff has a long context at end, deleting' do
|
@@ -147,7 +147,7 @@ RSpec.describe Mutest::Diff do
|
|
147
147
|
|
148
148
|
it { is_expected.to eql(expectation) }
|
149
149
|
|
150
|
-
|
150
|
+
it_behaves_like 'an idempotent method'
|
151
151
|
end
|
152
152
|
|
153
153
|
context 'when the diff has a long context at end, inserting' do
|
@@ -170,7 +170,7 @@ RSpec.describe Mutest::Diff do
|
|
170
170
|
|
171
171
|
it { is_expected.to eql(expectation) }
|
172
172
|
|
173
|
-
|
173
|
+
it_behaves_like 'an idempotent method'
|
174
174
|
end
|
175
175
|
|
176
176
|
context 'when there is no diff' do
|
@@ -179,7 +179,7 @@ RSpec.describe Mutest::Diff do
|
|
179
179
|
|
180
180
|
it { is_expected.to be(nil) }
|
181
181
|
|
182
|
-
|
182
|
+
it_behaves_like 'an idempotent method'
|
183
183
|
end
|
184
184
|
end
|
185
185
|
end
|