mutant 0.9.10 → 0.10.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 (254) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mutant +16 -11
  3. data/lib/mutant.rb +8 -4
  4. data/lib/mutant/bootstrap.rb +14 -1
  5. data/lib/mutant/cli.rb +9 -162
  6. data/lib/mutant/cli/command.rb +196 -0
  7. data/lib/mutant/cli/command/root.rb +13 -0
  8. data/lib/mutant/cli/command/run.rb +151 -0
  9. data/lib/mutant/cli/command/subscription.rb +54 -0
  10. data/lib/mutant/expression.rb +0 -1
  11. data/lib/mutant/isolation.rb +1 -1
  12. data/lib/mutant/isolation/fork.rb +2 -2
  13. data/lib/mutant/isolation/none.rb +1 -1
  14. data/lib/mutant/license.rb +9 -35
  15. data/lib/mutant/license/subscription.rb +31 -9
  16. data/lib/mutant/license/subscription/commercial.rb +2 -4
  17. data/lib/mutant/license/subscription/opensource.rb +7 -7
  18. data/lib/mutant/matcher/config.rb +2 -0
  19. data/lib/mutant/meta/example.rb +16 -4
  20. data/lib/mutant/meta/example/dsl.rb +33 -16
  21. data/lib/mutant/meta/example/verification.rb +70 -28
  22. data/lib/mutant/minitest/coverage.rb +53 -0
  23. data/lib/mutant/mutator/node.rb +2 -2
  24. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  25. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  26. data/lib/mutant/mutator/node/index.rb +4 -4
  27. data/lib/mutant/mutator/node/literal/range.rb +5 -2
  28. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +1 -1
  29. data/lib/mutant/mutator/node/noop.rb +1 -1
  30. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  31. data/lib/mutant/mutator/node/send.rb +25 -1
  32. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  33. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  34. data/lib/mutant/subject/method/instance.rb +1 -1
  35. data/lib/mutant/version.rb +1 -1
  36. metadata +18 -336
  37. data/.github/workflows/ci.yml +0 -121
  38. data/.gitignore +0 -38
  39. data/.rspec +0 -5
  40. data/.rubocop.yml +0 -210
  41. data/Changelog.md +0 -87
  42. data/Gemfile +0 -7
  43. data/Gemfile.lock +0 -107
  44. data/Gemfile.shared +0 -10
  45. data/README.md +0 -199
  46. data/Rakefile +0 -5
  47. data/config/devtools.yml +0 -2
  48. data/config/reek.yml +0 -139
  49. data/config/yardstick.yml +0 -2
  50. data/docs/commercial-support.md +0 -14
  51. data/docs/concurrency.md +0 -39
  52. data/docs/incremental.md +0 -76
  53. data/docs/known-problems.md +0 -30
  54. data/docs/limitations.md +0 -50
  55. data/docs/mutant-minitest.md +0 -149
  56. data/docs/mutant-rspec.md +0 -130
  57. data/docs/nomenclature.md +0 -82
  58. data/docs/reading-reports.md +0 -74
  59. data/lib/mutant/mutator/node/dsym.rb +0 -22
  60. data/meta/and.rb +0 -13
  61. data/meta/and_asgn.rb +0 -14
  62. data/meta/array.rb +0 -27
  63. data/meta/begin.rb +0 -20
  64. data/meta/block.rb +0 -199
  65. data/meta/block_pass.rb +0 -8
  66. data/meta/blockarg.rb +0 -10
  67. data/meta/break.rb +0 -9
  68. data/meta/case.rb +0 -217
  69. data/meta/casgn.rb +0 -25
  70. data/meta/cbase.rb +0 -8
  71. data/meta/class.rb +0 -12
  72. data/meta/const.rb +0 -17
  73. data/meta/csend.rb +0 -10
  74. data/meta/cvar.rb +0 -7
  75. data/meta/cvasgn.rb +0 -9
  76. data/meta/date.rb +0 -59
  77. data/meta/def.rb +0 -196
  78. data/meta/defined.rb +0 -9
  79. data/meta/dstr.rb +0 -13
  80. data/meta/dsym.rb +0 -14
  81. data/meta/ensure.rb +0 -8
  82. data/meta/false.rb +0 -7
  83. data/meta/file.rb +0 -5
  84. data/meta/float.rb +0 -37
  85. data/meta/gvar.rb +0 -7
  86. data/meta/gvasgn.rb +0 -9
  87. data/meta/hash.rb +0 -20
  88. data/meta/if.rb +0 -72
  89. data/meta/index.rb +0 -133
  90. data/meta/indexasgn.rb +0 -31
  91. data/meta/int.rb +0 -18
  92. data/meta/ivar.rb +0 -8
  93. data/meta/ivasgn.rb +0 -22
  94. data/meta/kwarg.rb +0 -10
  95. data/meta/kwbegin.rb +0 -8
  96. data/meta/kwoptarg.rb +0 -13
  97. data/meta/lambda.rb +0 -23
  98. data/meta/line.rb +0 -5
  99. data/meta/lvar.rb +0 -16
  100. data/meta/lvasgn.rb +0 -24
  101. data/meta/masgn.rb +0 -7
  102. data/meta/match_current_line.rb +0 -14
  103. data/meta/next.rb +0 -10
  104. data/meta/nil.rb +0 -5
  105. data/meta/nthref.rb +0 -14
  106. data/meta/op_assgn.rb +0 -17
  107. data/meta/or.rb +0 -13
  108. data/meta/or_asgn.rb +0 -50
  109. data/meta/range.rb +0 -65
  110. data/meta/redo.rb +0 -5
  111. data/meta/regexp.rb +0 -80
  112. data/meta/regopt.rb +0 -10
  113. data/meta/rescue.rb +0 -84
  114. data/meta/return.rb +0 -16
  115. data/meta/sclass.rb +0 -12
  116. data/meta/self.rb +0 -7
  117. data/meta/send.rb +0 -600
  118. data/meta/str.rb +0 -7
  119. data/meta/super.rb +0 -27
  120. data/meta/sym.rb +0 -8
  121. data/meta/true.rb +0 -7
  122. data/meta/until.rb +0 -16
  123. data/meta/while.rb +0 -24
  124. data/meta/yield.rb +0 -9
  125. data/mutant-minitest.gemspec +0 -22
  126. data/mutant-rspec.gemspec +0 -22
  127. data/mutant.gemspec +0 -44
  128. data/mutant.sh +0 -12
  129. data/mutant.yml +0 -6
  130. data/spec/integration/mutant/corpus_spec.rb +0 -15
  131. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  132. data/spec/integration/mutant/minitest_spec.rb +0 -11
  133. data/spec/integration/mutant/null_spec.rb +0 -16
  134. data/spec/integration/mutant/rspec_spec.rb +0 -15
  135. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  136. data/spec/integrations.yml +0 -63
  137. data/spec/shared/framework_integration_behavior.rb +0 -70
  138. data/spec/shared/method_matcher_behavior.rb +0 -47
  139. data/spec/spec_helper.rb +0 -90
  140. data/spec/support/corpus.rb +0 -318
  141. data/spec/support/file_system.rb +0 -62
  142. data/spec/support/ice_nine_config.rb +0 -10
  143. data/spec/support/ruby_vm.rb +0 -84
  144. data/spec/support/shared_context.rb +0 -169
  145. data/spec/support/xspec.rb +0 -183
  146. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  147. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  148. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  149. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  150. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  151. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  152. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  153. data/spec/unit/mutant/ast_spec.rb +0 -57
  154. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  155. data/spec/unit/mutant/cli_spec.rb +0 -305
  156. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  157. data/spec/unit/mutant/config_spec.rb +0 -126
  158. data/spec/unit/mutant/context_spec.rb +0 -111
  159. data/spec/unit/mutant/env_spec.rb +0 -229
  160. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  161. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  163. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  164. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  165. data/spec/unit/mutant/expression_spec.rb +0 -45
  166. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  167. data/spec/unit/mutant/integration_spec.rb +0 -150
  168. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  169. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  170. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  171. data/spec/unit/mutant/license_spec.rb +0 -305
  172. data/spec/unit/mutant/loader_spec.rb +0 -79
  173. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  174. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  175. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  176. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  177. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  178. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  179. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  180. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  181. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  182. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  183. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  184. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  185. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  186. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  187. data/spec/unit/mutant/matcher_spec.rb +0 -102
  188. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  189. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  190. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  191. data/spec/unit/mutant/mutation_spec.rb +0 -140
  192. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  193. data/spec/unit/mutant/mutator_spec.rb +0 -21
  194. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  195. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  196. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  197. data/spec/unit/mutant/parallel_spec.rb +0 -115
  198. data/spec/unit/mutant/parser_spec.rb +0 -26
  199. data/spec/unit/mutant/range_spec.rb +0 -141
  200. data/spec/unit/mutant/registry_spec.rb +0 -74
  201. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  202. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  203. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  204. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  205. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  206. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  207. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  208. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  209. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  210. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  211. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  212. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  213. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  214. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  215. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  216. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  217. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  218. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  219. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  220. data/spec/unit/mutant/result/env_spec.rb +0 -161
  221. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  222. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  223. data/spec/unit/mutant/result/test_spec.rb +0 -14
  224. data/spec/unit/mutant/result_spec.rb +0 -33
  225. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  226. data/spec/unit/mutant/runner_spec.rb +0 -121
  227. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  228. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  229. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -276
  230. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  231. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  232. data/spec/unit/mutant/subject_spec.rb +0 -93
  233. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  234. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  235. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  236. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  237. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  238. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  239. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  240. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  241. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  242. data/spec/unit/mutant/util/one_spec.rb +0 -22
  243. data/spec/unit/mutant/warnings_spec.rb +0 -89
  244. data/spec/unit/mutant/world_spec.rb +0 -63
  245. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  246. data/test_app/.rspec +0 -1
  247. data/test_app/Gemfile.minitest +0 -6
  248. data/test_app/Gemfile.rspec3.8 +0 -7
  249. data/test_app/lib/test_app.rb +0 -114
  250. data/test_app/lib/test_app/literal.rb +0 -35
  251. data/test_app/lib/test_app/metaclasses.rb +0 -108
  252. data/test_app/spec/spec_helper.rb +0 -9
  253. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  254. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Repository::SubjectFilter do
4
- context '#call' do
5
- subject { object.call(mutant_subject) }
6
-
7
- let(:object) { described_class.new(diff) }
8
- let(:diff) { instance_double(Mutant::Repository::Diff) }
9
- let(:value) { instance_double(Object, 'value') }
10
-
11
- let(:mutant_subject) do
12
- double(
13
- 'Subject',
14
- source_path: double('source path'),
15
- source_lines: double('source lines')
16
- )
17
- end
18
-
19
- before do
20
- expect(diff).to receive(:touches?).with(
21
- mutant_subject.source_path,
22
- mutant_subject.source_lines
23
- ).and_return(value)
24
- end
25
-
26
- it 'connects return value to repository diff API' do
27
- expect(subject).to be(value)
28
- end
29
- end
30
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::RequireHighjack do
4
- let(:highjacked_calls) { [] }
5
- let(:require_calls) { [] }
6
-
7
- let(:target_module) do
8
- acc = require_calls
9
- Module.new do
10
- define_method(:require, &acc.method(:<<))
11
- define_singleton_method(:require, &acc.method(:<<))
12
- end
13
- end
14
-
15
- def singleton_require(logical_name)
16
- target_module.require(logical_name)
17
- end
18
-
19
- def instance_require(logical_name)
20
- Object.new.extend(target_module).require(logical_name)
21
- end
22
-
23
- describe '.call' do
24
- let(:logical_name) { instance_double(String) }
25
-
26
- def apply
27
- described_class.call(target_module, highjacked_calls.method(:<<))
28
- end
29
-
30
- it 'prevents warnings' do
31
- expect(Mutant::WORLD.warnings.call(&method(:apply))).to eql([])
32
- end
33
-
34
- it 'returns the original implementation from singleton' do
35
- expect { apply.call(logical_name) }
36
- .to change { require_calls }
37
- .from([])
38
- .to([logical_name])
39
- end
40
-
41
- context '#require' do
42
- it 'does highjack calls' do
43
- apply
44
- expect { instance_require(logical_name) }
45
- .to change { highjacked_calls }
46
- .from([])
47
- .to([logical_name])
48
- end
49
-
50
- it 'does not call original require' do
51
- apply
52
- expect { instance_require(logical_name) }
53
- .not_to change { require_calls }.from([])
54
- end
55
- end
56
-
57
- context '.require' do
58
- it 'does highjack calls' do
59
- apply
60
- expect { singleton_require(logical_name) }
61
- .to change { highjacked_calls }
62
- .from([])
63
- .to([logical_name])
64
- end
65
-
66
- it 'does not call original require' do
67
- apply
68
- expect { singleton_require(logical_name) }
69
- .not_to change { require_calls }.from([])
70
- end
71
- end
72
- end
73
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The effect of this private module is done at boot time.
4
- # Hence there is no way to kill the mutations at runtime
5
- # so we have to directly hook into the private moduel via
6
- # reflection to redo a runtime observable interaction with
7
- # it.
8
- #
9
- # Until mutant gets boot time mutation support there is no
10
- # way to to avoid this.
11
- RSpec.describe 'Mutant::Result::ClassMethods' do
12
- let(:infected_class) do
13
- Class.new do
14
- include Adamantium::Flat, Concord::Public.new(:collection)
15
- extend Mutant::Result.const_get(:ClassMethods)
16
-
17
- sum :length, :collection
18
- end
19
- end
20
-
21
- describe '#sum' do
22
- let(:object) { infected_class.new(collection) }
23
-
24
- def apply
25
- object.length
26
- end
27
-
28
- subject { apply }
29
-
30
- before do
31
- # memoization behavior
32
- expect(collection).to receive(:map)
33
- .once
34
- .and_call_original
35
-
36
- apply
37
- end
38
-
39
- context 'empty collection' do
40
- let(:collection) { [] }
41
-
42
- it { should be(0) }
43
- end
44
-
45
- context 'non-emtpy collection' do
46
- let(:collection) { [[1], [2, 3]] }
47
-
48
- it { should be(3) }
49
- end
50
- end
51
- end
@@ -1,161 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Result::Env do
4
- let(:object) do
5
- described_class.new(
6
- runtime: instance_double(Float),
7
- env: env,
8
- subject_results: subject_results
9
- )
10
- end
11
-
12
- let(:subject_results) { [subject_result] }
13
-
14
- let(:env) do
15
- instance_double(
16
- Mutant::Env,
17
- config: instance_double(Mutant::Config, fail_fast: fail_fast),
18
- integration: integration,
19
- mutations: [instance_double(Mutant::Mutation)],
20
- selections: selections,
21
- subjects: [subject_a, subject_b]
22
- )
23
- end
24
-
25
- let(:integration) do
26
- instance_double(
27
- Mutant::Integration,
28
- all_tests: [test_a, test_b]
29
- )
30
- end
31
-
32
- let(:subject_result) do
33
- instance_double(
34
- Mutant::Result::Subject,
35
- amount_mutation_results: results,
36
- amount_mutations_killed: killed,
37
- success?: subject_success?
38
- )
39
- end
40
-
41
- let(:selections) do
42
- {
43
- subject_a: [test_a],
44
- subject_b: [test_a, test_b, test_c]
45
- }
46
- end
47
-
48
- let(:subject_a) do
49
- instance_double(Mutant::Subject, :a)
50
- end
51
-
52
- let(:subject_b) do
53
- instance_double(Mutant::Subject, :b)
54
- end
55
-
56
- let(:test_a) do
57
- instance_double(Mutant::Test, :a)
58
- end
59
-
60
- let(:test_b) do
61
- instance_double(Mutant::Test, :b)
62
- end
63
-
64
- let(:test_c) do
65
- instance_double(Mutant::Test, :c)
66
- end
67
-
68
- let(:fail_fast) { false }
69
- let(:killed) { 0 }
70
- let(:results) { 1 }
71
- let(:subject_success?) { true }
72
-
73
- describe '#success?' do
74
- subject { object.success? }
75
-
76
- context 'when coverage matches expectation' do
77
- let(:killed) { 1 }
78
-
79
- it { should be(true) }
80
- end
81
-
82
- context 'when coverage does not match expectation' do
83
- it { should be(false) }
84
- end
85
- end
86
-
87
- describe '#failed_subject_results' do
88
- subject { object.failed_subject_results }
89
-
90
- it { should eql([]) }
91
- end
92
-
93
- describe '#coverage' do
94
- subject { object.coverage }
95
-
96
- context 'when there are no results' do
97
- let(:results) { 0 }
98
-
99
- it { should eql(Rational(1)) }
100
- end
101
-
102
- context 'when there are no kills' do
103
- it { should eql(Rational(0)) }
104
- end
105
-
106
- context 'when there are kills' do
107
- let(:killed) { 1 }
108
- let(:results) { 2 }
109
-
110
- it { should eql(Rational(1, 2)) }
111
- end
112
- end
113
-
114
- describe '#amount_mutations' do
115
- subject { object.amount_mutations }
116
-
117
- it { should eql(1) }
118
- end
119
-
120
- describe '#stop?' do
121
- subject { object.stop? }
122
-
123
- context 'without fail fast' do
124
- context 'on empty subjects' do
125
- let(:subject_results) { [] }
126
-
127
- it { should be(false) }
128
- end
129
-
130
- context 'on failed subject' do
131
- let(:subject_success?) { false }
132
-
133
- it { should be(false) }
134
- end
135
-
136
- context 'on successful subject' do
137
- it { should be(false) }
138
- end
139
- end
140
-
141
- context 'with fail fast' do
142
- let(:fail_fast) { true }
143
-
144
- context 'on empty subjects' do
145
- let(:subject_results) { [] }
146
-
147
- it { should be(false) }
148
- end
149
-
150
- context 'on failed subject' do
151
- let(:subject_success?) { false }
152
-
153
- it { should be(true) }
154
- end
155
-
156
- context 'on successful subject' do
157
- it { should be(false) }
158
- end
159
- end
160
- end
161
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Result::Mutation do
4
- let(:object) do
5
- described_class.new(
6
- isolation_result: isolation_result,
7
- mutation: mutation,
8
- runtime: 2.0
9
- )
10
- end
11
-
12
- let(:mutation) { instance_double(Mutant::Mutation) }
13
-
14
- let(:test_result) do
15
- instance_double(
16
- Mutant::Result::Test,
17
- runtime: 1.0
18
- )
19
- end
20
-
21
- let(:isolation_result) do
22
- Mutant::Isolation::Result::Success.new(test_result)
23
- end
24
-
25
- shared_examples_for 'unsuccessful isolation' do
26
- let(:isolation_result) do
27
- Mutant::Isolation::Result::Exception.new(RuntimeError.new('foo'))
28
- end
29
- end
30
-
31
- describe '#killtime' do
32
- subject { object.killtime }
33
-
34
- context 'if isolation is successful' do
35
- it { should eql(1.0) }
36
- end
37
-
38
- context 'if isolation is not successful' do
39
- include_context 'unsuccessful isolation'
40
-
41
- it { should eql(0.0) }
42
- end
43
- end
44
-
45
- describe '#runtime' do
46
- subject { object.runtime }
47
-
48
- it { should eql(2.0) }
49
- end
50
-
51
- describe '#success?' do
52
- subject { object.success? }
53
-
54
- context 'if isolation is successful' do
55
- before do
56
- expect(mutation.class).to receive(:success?)
57
- .with(test_result)
58
- .and_return(true)
59
- end
60
-
61
- it { should be(true) }
62
- end
63
-
64
- context 'if isolation is not successful' do
65
- include_context 'unsuccessful isolation'
66
-
67
- it { should be(false) }
68
- end
69
- end
70
- end
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Result::Subject do
4
- let(:object) do
5
- described_class.new(
6
- subject: mutation_subject,
7
- mutation_results: mutation_results,
8
- tests: []
9
- )
10
- end
11
-
12
- let(:mutation_subject) do
13
- instance_double(
14
- Mutant::Subject,
15
- mutations: mutation_results.map { instance_double(Mutant::Mutation) }
16
- )
17
- end
18
-
19
- shared_context 'full coverage' do
20
- let(:mutation_results) do
21
- [
22
- instance_double(Mutant::Result::Mutation, success?: true)
23
- ]
24
- end
25
- end
26
-
27
- shared_context 'partial coverage' do
28
- let(:mutation_results) do
29
- [
30
- instance_double(Mutant::Result::Mutation, success?: false),
31
- instance_double(Mutant::Result::Mutation, success?: true)
32
- ]
33
- end
34
- end
35
-
36
- shared_context 'no coverage' do
37
- let(:mutation_results) do
38
- [
39
- instance_double(Mutant::Result::Mutation, success?: false)
40
- ]
41
- end
42
- end
43
-
44
- shared_context 'no results' do
45
- let(:mutation_results) { [] }
46
- end
47
-
48
- describe '#coverage' do
49
- subject { object.coverage }
50
-
51
- {
52
- 'full coverage' => 1r,
53
- 'partial coverage' => 0.5r,
54
- 'no coverage' => 0r,
55
- 'no results' => 1r
56
- }.each do |name, expected|
57
- context(name) do
58
- include_context(name)
59
- it { should eql(expected) }
60
- end
61
- end
62
- end
63
-
64
- describe '#amount_mutations' do
65
- subject { object.amount_mutations }
66
-
67
- {
68
- 'full coverage' => 1,
69
- 'partial coverage' => 2,
70
- 'no coverage' => 1,
71
- 'no results' => 0
72
- }.each do |name, expected|
73
- context(name) do
74
- include_context(name)
75
- it { should be(expected) }
76
- end
77
- end
78
- end
79
-
80
- describe '#amount_mutations_alive' do
81
- subject { object.amount_mutations_alive }
82
-
83
- {
84
- 'full coverage' => 0,
85
- 'partial coverage' => 1,
86
- 'no coverage' => 1,
87
- 'no results' => 0
88
- }.each do |name, expected|
89
- context(name) do
90
- include_context(name)
91
- it { should be(expected) }
92
- end
93
- end
94
- end
95
-
96
- describe '#success?' do
97
- subject { object.success? }
98
-
99
- {
100
- 'full coverage' => true,
101
- 'partial coverage' => false,
102
- 'no coverage' => false,
103
- 'no results' => true
104
- }.each do |name, expected|
105
- context(name) do
106
- include_context(name)
107
- it { should be(expected) }
108
- end
109
- end
110
- end
111
- end