mutant 0.9.9 → 0.9.14

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 (252) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +2 -4
  3. data/lib/mutant/bootstrap.rb +14 -1
  4. data/lib/mutant/cli.rb +6 -0
  5. data/lib/mutant/isolation.rb +1 -1
  6. data/lib/mutant/isolation/fork.rb +2 -2
  7. data/lib/mutant/isolation/none.rb +1 -1
  8. data/lib/mutant/matcher/config.rb +2 -0
  9. data/lib/mutant/meta/example.rb +16 -4
  10. data/lib/mutant/meta/example/dsl.rb +33 -16
  11. data/lib/mutant/meta/example/verification.rb +70 -28
  12. data/lib/mutant/minitest/coverage.rb +53 -0
  13. data/lib/mutant/mutator/node.rb +2 -2
  14. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  15. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  16. data/lib/mutant/mutator/node/index.rb +4 -4
  17. data/lib/mutant/mutator/node/literal/range.rb +4 -1
  18. data/lib/mutant/mutator/node/noop.rb +1 -1
  19. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  20. data/lib/mutant/mutator/node/send.rb +25 -1
  21. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  22. data/lib/mutant/reporter/cli/printer.rb +2 -2
  23. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  24. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -1
  25. data/lib/mutant/subject/method/instance.rb +41 -2
  26. data/lib/mutant/version.rb +1 -1
  27. metadata +59 -347
  28. data/.github/workflows/ci.yml +0 -121
  29. data/.gitignore +0 -38
  30. data/.rspec +0 -5
  31. data/.rubocop.yml +0 -7
  32. data/Changelog.md +0 -81
  33. data/Gemfile +0 -7
  34. data/Gemfile.lock +0 -167
  35. data/Gemfile.shared +0 -10
  36. data/README.md +0 -178
  37. data/Rakefile +0 -5
  38. data/config/devtools.yml +0 -2
  39. data/config/reek.yml +0 -139
  40. data/config/rubocop.yml +0 -205
  41. data/config/yardstick.yml +0 -2
  42. data/docs/commercial-support.md +0 -14
  43. data/docs/concurrency.md +0 -39
  44. data/docs/incremental.md +0 -76
  45. data/docs/known-problems.md +0 -30
  46. data/docs/limitations.md +0 -50
  47. data/docs/mutant-minitest.md +0 -149
  48. data/docs/mutant-rspec.md +0 -130
  49. data/docs/nomenclature.md +0 -82
  50. data/docs/reading-reports.md +0 -74
  51. data/lib/mutant/color.rb +0 -40
  52. data/lib/mutant/diff.rb +0 -97
  53. data/lib/mutant/mutator/node/dsym.rb +0 -22
  54. data/meta/and.rb +0 -13
  55. data/meta/and_asgn.rb +0 -14
  56. data/meta/array.rb +0 -27
  57. data/meta/begin.rb +0 -20
  58. data/meta/block.rb +0 -199
  59. data/meta/block_pass.rb +0 -8
  60. data/meta/blockarg.rb +0 -10
  61. data/meta/break.rb +0 -9
  62. data/meta/case.rb +0 -217
  63. data/meta/casgn.rb +0 -25
  64. data/meta/cbase.rb +0 -8
  65. data/meta/class.rb +0 -12
  66. data/meta/const.rb +0 -17
  67. data/meta/csend.rb +0 -10
  68. data/meta/cvar.rb +0 -7
  69. data/meta/cvasgn.rb +0 -9
  70. data/meta/date.rb +0 -59
  71. data/meta/def.rb +0 -196
  72. data/meta/defined.rb +0 -9
  73. data/meta/dstr.rb +0 -13
  74. data/meta/dsym.rb +0 -14
  75. data/meta/ensure.rb +0 -8
  76. data/meta/false.rb +0 -7
  77. data/meta/file.rb +0 -5
  78. data/meta/float.rb +0 -37
  79. data/meta/gvar.rb +0 -7
  80. data/meta/gvasgn.rb +0 -9
  81. data/meta/hash.rb +0 -20
  82. data/meta/if.rb +0 -72
  83. data/meta/index.rb +0 -133
  84. data/meta/indexasgn.rb +0 -31
  85. data/meta/int.rb +0 -18
  86. data/meta/ivar.rb +0 -8
  87. data/meta/ivasgn.rb +0 -22
  88. data/meta/kwarg.rb +0 -10
  89. data/meta/kwbegin.rb +0 -8
  90. data/meta/kwoptarg.rb +0 -13
  91. data/meta/lambda.rb +0 -23
  92. data/meta/line.rb +0 -5
  93. data/meta/lvar.rb +0 -16
  94. data/meta/lvasgn.rb +0 -24
  95. data/meta/masgn.rb +0 -7
  96. data/meta/match_current_line.rb +0 -14
  97. data/meta/next.rb +0 -10
  98. data/meta/nil.rb +0 -5
  99. data/meta/nthref.rb +0 -14
  100. data/meta/op_assgn.rb +0 -17
  101. data/meta/or.rb +0 -13
  102. data/meta/or_asgn.rb +0 -50
  103. data/meta/range.rb +0 -39
  104. data/meta/redo.rb +0 -5
  105. data/meta/regexp.rb +0 -80
  106. data/meta/regopt.rb +0 -10
  107. data/meta/rescue.rb +0 -84
  108. data/meta/return.rb +0 -16
  109. data/meta/sclass.rb +0 -12
  110. data/meta/self.rb +0 -7
  111. data/meta/send.rb +0 -600
  112. data/meta/str.rb +0 -7
  113. data/meta/super.rb +0 -27
  114. data/meta/sym.rb +0 -8
  115. data/meta/true.rb +0 -7
  116. data/meta/until.rb +0 -16
  117. data/meta/while.rb +0 -24
  118. data/meta/yield.rb +0 -9
  119. data/mutant-minitest.gemspec +0 -22
  120. data/mutant-rspec.gemspec +0 -22
  121. data/mutant.gemspec +0 -41
  122. data/mutant.sh +0 -12
  123. data/mutant.yml +0 -6
  124. data/spec/integration/mutant/corpus_spec.rb +0 -15
  125. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  126. data/spec/integration/mutant/minitest_spec.rb +0 -11
  127. data/spec/integration/mutant/null_spec.rb +0 -16
  128. data/spec/integration/mutant/rspec_spec.rb +0 -15
  129. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  130. data/spec/integrations.yml +0 -63
  131. data/spec/shared/base_behavior.rb +0 -45
  132. data/spec/shared/framework_integration_behavior.rb +0 -70
  133. data/spec/shared/method_matcher_behavior.rb +0 -47
  134. data/spec/spec_helper.rb +0 -75
  135. data/spec/support/corpus.rb +0 -318
  136. data/spec/support/file_system.rb +0 -62
  137. data/spec/support/ice_nine_config.rb +0 -10
  138. data/spec/support/ruby_vm.rb +0 -84
  139. data/spec/support/shared_context.rb +0 -169
  140. data/spec/support/test_app.rb +0 -7
  141. data/spec/support/warnings.yml +0 -6
  142. data/spec/support/xspec.rb +0 -183
  143. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  144. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  145. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  146. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  147. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  148. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  149. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  150. data/spec/unit/mutant/ast_spec.rb +0 -57
  151. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  152. data/spec/unit/mutant/cli_spec.rb +0 -305
  153. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  154. data/spec/unit/mutant/config_spec.rb +0 -126
  155. data/spec/unit/mutant/context_spec.rb +0 -111
  156. data/spec/unit/mutant/diff_spec.rb +0 -189
  157. data/spec/unit/mutant/env_spec.rb +0 -229
  158. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  159. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  160. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  161. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  163. data/spec/unit/mutant/expression_spec.rb +0 -45
  164. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  165. data/spec/unit/mutant/integration_spec.rb +0 -150
  166. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  167. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  168. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  169. data/spec/unit/mutant/license_spec.rb +0 -305
  170. data/spec/unit/mutant/loader_spec.rb +0 -79
  171. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  172. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  173. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  174. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  175. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  176. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  177. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  178. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  179. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  180. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  181. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  182. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  183. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  184. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  185. data/spec/unit/mutant/matcher_spec.rb +0 -102
  186. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  187. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  188. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  189. data/spec/unit/mutant/mutation_spec.rb +0 -140
  190. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  191. data/spec/unit/mutant/mutator_spec.rb +0 -21
  192. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  193. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  194. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  195. data/spec/unit/mutant/parallel_spec.rb +0 -115
  196. data/spec/unit/mutant/parser_spec.rb +0 -26
  197. data/spec/unit/mutant/range_spec.rb +0 -141
  198. data/spec/unit/mutant/registry_spec.rb +0 -74
  199. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  200. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  201. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  202. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  203. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  204. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  205. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  206. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  207. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  208. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  209. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  210. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  211. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  212. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  213. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  214. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  215. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  216. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  217. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  218. data/spec/unit/mutant/result/env_spec.rb +0 -161
  219. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  220. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  221. data/spec/unit/mutant/result/test_spec.rb +0 -14
  222. data/spec/unit/mutant/result_spec.rb +0 -33
  223. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  224. data/spec/unit/mutant/runner_spec.rb +0 -121
  225. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  226. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  227. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  228. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  229. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  230. data/spec/unit/mutant/subject_spec.rb +0 -93
  231. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  232. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  233. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  234. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  235. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  236. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  237. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  238. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  239. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  240. data/spec/unit/mutant/util/one_spec.rb +0 -22
  241. data/spec/unit/mutant/warnings_spec.rb +0 -89
  242. data/spec/unit/mutant/world_spec.rb +0 -63
  243. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  244. data/test_app/.rspec +0 -1
  245. data/test_app/Gemfile.minitest +0 -4
  246. data/test_app/Gemfile.rspec3.8 +0 -7
  247. data/test_app/lib/test_app.rb +0 -110
  248. data/test_app/lib/test_app/literal.rb +0 -35
  249. data/test_app/lib/test_app/metaclasses.rb +0 -108
  250. data/test_app/spec/spec_helper.rb +0 -9
  251. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  252. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,154 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Meta::Example::Verification do
4
- let(:object) { described_class.new(example, mutations) }
5
-
6
- let(:example) do
7
- Mutant::Meta::Example.new(
8
- file: 'foo.rb',
9
- node: s(:true),
10
- types: [:true],
11
- expected: expected_nodes
12
- )
13
- end
14
-
15
- let(:mutations) do
16
- generated_nodes.map do |node|
17
- Mutant::Mutation::Evil.new(example, node)
18
- end
19
- end
20
-
21
- let(:generated_nodes) { [] }
22
- let(:expected_nodes) { [] }
23
-
24
- describe '#success?' do
25
- subject { object.success? }
26
-
27
- context 'when generated nodes equal expected nodes' do
28
- it { should be(true) }
29
- end
30
-
31
- context 'when expected node is missing' do
32
- let(:expected_nodes) { [s(:false)] }
33
-
34
- it { should be(false) }
35
- end
36
-
37
- context 'when there is extra generated node' do
38
- let(:generated_nodes) { [s(:false)] }
39
-
40
- it { should be(false) }
41
- end
42
-
43
- context 'when there is no diff to original source' do
44
- let(:expected_nodes) { [s(:true)] }
45
- let(:generated_nodes) { [s(:true)] }
46
-
47
- it { should be(false) }
48
- end
49
- end
50
-
51
- describe '#error_report' do
52
- subject { object.error_report }
53
-
54
- context 'on success' do
55
- specify do
56
- expect { subject }.to raise_error(
57
- RuntimeError,
58
- 'no error report on successful validation'
59
- )
60
- end
61
- end
62
-
63
- context 'when expected node is missing' do
64
- let(:expected_nodes) { [s(:false), s(:nil)] }
65
-
66
- specify do
67
- should eql(<<~'REPORT')
68
- ---
69
- file: foo.rb
70
- original_ast: s(:true)
71
- original_source: 'true'
72
- missing:
73
- - node: s(:false)
74
- source: 'false'
75
- - node: s(:nil)
76
- source: nil
77
- unexpected: []
78
- invalid_syntax: []
79
- no_diff: []
80
- REPORT
81
- end
82
- end
83
-
84
- context 'when there is extra generated node' do
85
- let(:generated_nodes) { [s(:false), s(:nil)] }
86
-
87
- specify do
88
- should eql(<<~'REPORT')
89
- ---
90
- file: foo.rb
91
- original_ast: s(:true)
92
- original_source: 'true'
93
- missing: []
94
- unexpected:
95
- - node: s(:false)
96
- source: 'false'
97
- - node: s(:nil)
98
- source: nil
99
- invalid_syntax: []
100
- no_diff: []
101
- REPORT
102
- end
103
- end
104
-
105
- context 'when there is no diff to original source' do
106
- let(:expected_nodes) { [s(:true)] }
107
- let(:generated_nodes) { [s(:true)] }
108
-
109
- specify do
110
- should eql(<<~'REPORT')
111
- ---
112
- file: foo.rb
113
- original_ast: s(:true)
114
- original_source: 'true'
115
- missing: []
116
- unexpected: []
117
- invalid_syntax: []
118
- no_diff:
119
- - node: s(:true)
120
- source: 'true'
121
- REPORT
122
- end
123
- end
124
-
125
- context 'when the generated node is invalid syntax after unparsed' do
126
- let(:invalid_node) do
127
- s(:op_asgn, s(:send, s(:self), :at, s(:int, 1)), :+, s(:int, 1))
128
- end
129
-
130
- let(:expected_nodes) { [invalid_node] }
131
- let(:generated_nodes) { [invalid_node] }
132
-
133
- specify do
134
- should eql(<<~'REPORT')
135
- ---
136
- file: foo.rb
137
- original_ast: s(:true)
138
- original_source: 'true'
139
- missing: []
140
- unexpected: []
141
- invalid_syntax:
142
- - node: |-
143
- s(:op_asgn,
144
- s(:send,
145
- s(:self), :at,
146
- s(:int, 1)), :+,
147
- s(:int, 1))
148
- source: self.at(1) += 1
149
- no_diff: []
150
- REPORT
151
- end
152
- end
153
- end
154
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Meta::Example do
4
- let(:object) do
5
- described_class.new(
6
- file: file,
7
- node: node,
8
- types: [node.type],
9
- expected: mutation_nodes
10
- )
11
- end
12
-
13
- let(:file) { 'foo/bar.rb' }
14
- let(:node) { s(:true) }
15
- let(:mutation_nodes) { [s(:false)] }
16
-
17
- let(:mutations) do
18
- mutation_nodes.map do |node|
19
- Mutant::Mutation::Evil.new(object, node)
20
- end
21
- end
22
-
23
- describe '#source' do
24
- subject { object.source }
25
-
26
- it { should eql('true') }
27
- end
28
-
29
- describe '#verification' do
30
- subject { object.verification }
31
-
32
- it { should eql(Mutant::Meta::Example::Verification.new(object, mutations)) }
33
- end
34
- end
@@ -1,140 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Mutation do
4
- let(:mutation_class) do
5
- Class.new(Mutant::Mutation) do
6
- const_set(:SYMBOL, 'test')
7
- const_set(:TEST_PASS_SUCCESS, true)
8
- end
9
- end
10
-
11
- let(:context) { instance_double(Mutant::Context) }
12
-
13
- let(:object) do
14
- mutation_class.new(mutation_subject, Mutant::AST::Nodes::N_NIL)
15
- end
16
-
17
- let(:mutation_subject) do
18
- instance_double(
19
- Mutant::Subject,
20
- identification: 'subject',
21
- context: context,
22
- source: 'original'
23
- )
24
- end
25
-
26
- describe '#insert' do
27
- subject { object }
28
-
29
- def apply
30
- subject.insert(kernel)
31
- end
32
-
33
- let(:expected_source) { '1' }
34
- let(:kernel) { instance_double(Kernel) }
35
- let(:loader_result) { instance_double(Mutant::Loader::Result) }
36
- let(:root_node) { s(:int, 1) }
37
-
38
- before do
39
- expect(context).to receive(:root)
40
- .with(object.node)
41
- .and_return(root_node)
42
-
43
- expect(mutation_subject).to receive(:prepare)
44
- .ordered
45
- .and_return(mutation_subject)
46
-
47
- expect(Mutant::Loader).to receive(:call)
48
- .ordered
49
- .with(
50
- binding: TOPLEVEL_BINDING,
51
- kernel: kernel,
52
- source: expected_source,
53
- subject: mutation_subject
54
- )
55
- .and_return(loader_result)
56
- end
57
-
58
- it 'returns loader result' do
59
- expect(apply).to be(loader_result)
60
- end
61
- end
62
-
63
- describe '#code' do
64
- subject { object.code }
65
-
66
- it { should eql('8771a') }
67
-
68
- it_should_behave_like 'an idempotent method'
69
- end
70
-
71
- describe '#original_source' do
72
- subject { object.original_source }
73
-
74
- it { should eql('original') }
75
-
76
- it_should_behave_like 'an idempotent method'
77
- end
78
-
79
- describe '#source' do
80
- subject { object.source }
81
-
82
- it { should eql('nil') }
83
-
84
- it_should_behave_like 'an idempotent method'
85
- end
86
-
87
- describe '.success?' do
88
- subject { mutation_class.success?(test_result) }
89
-
90
- let(:test_result) do
91
- instance_double(
92
- Mutant::Result::Test,
93
- passed: passed
94
- )
95
- end
96
-
97
- context 'on mutation with positive pass expectation' do
98
- context 'when Result::Test#passed equals expectation' do
99
- let(:passed) { true }
100
-
101
- it { should be(true) }
102
- end
103
-
104
- context 'when Result::Test#passed NOT equals expectation' do
105
- let(:passed) { false }
106
-
107
- it { should be(false) }
108
- end
109
- end
110
-
111
- context 'on mutation with negative pass expectation' do
112
- let(:mutation_class) do
113
- Class.new(super()) do
114
- const_set(:TEST_PASS_SUCCESS, false)
115
- end
116
- end
117
-
118
- context 'when Result::Test#passed equals expectation' do
119
- let(:passed) { true }
120
-
121
- it { should be(false) }
122
- end
123
-
124
- context 'when Result::Test#passed NOT equals expectation' do
125
- let(:passed) { false }
126
-
127
- it { should be(true) }
128
- end
129
- end
130
- end
131
-
132
- describe '#identification' do
133
-
134
- subject { object.identification }
135
-
136
- it { should eql('test:subject:8771a') }
137
-
138
- it_should_behave_like 'an idempotent method'
139
- end
140
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- aggregate = Hash.new { |hash, key| hash[key] = [] }
4
-
5
- Mutant::Meta::Example::ALL
6
- .each_with_object(aggregate) do |example, agg|
7
- example.types.each do |type|
8
- agg[Mutant::Mutator::REGISTRY.lookup(type)] << example
9
- end
10
- end
11
-
12
- aggregate.each do |mutator, examples|
13
- RSpec.describe mutator do
14
- it 'generates expected mutations' do
15
- examples.each do |example|
16
- verification = example.verification
17
- fail verification.error_report unless verification.success?
18
- end
19
- end
20
- end
21
- end
22
-
23
- RSpec.describe Mutant::Mutator::Node do
24
- describe 'internal DSL' do
25
- let(:klass) do
26
- Class.new(described_class) do
27
- children(:left, :right)
28
-
29
- def dispatch
30
- left
31
- emit_left(s(:nil))
32
- emit_right_mutations do |node|
33
- node.eql?(s(:nil))
34
- end
35
- end
36
- end
37
- end
38
-
39
- def apply
40
- klass.call(s(:and, s(:true), s(:true)))
41
- end
42
-
43
- specify do
44
- expect(apply).to eql([s(:and, s(:nil), s(:true))].to_set)
45
- end
46
- end
47
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Mutator do
4
- describe '.handle' do
5
- subject do
6
- Class.new(described_class) do
7
- const_set(:REGISTRY, Mutant::Registry.new)
8
-
9
- handle :send
10
-
11
- def dispatch
12
- emit(parent)
13
- end
14
- end
15
- end
16
-
17
- it 'should register mutator' do
18
- expect(subject.mutate(s(:send), s(:parent))).to eql([s(:parent)].to_set)
19
- end
20
- end
21
- end
@@ -1,126 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Parallel::Driver do
4
- let(:active_jobs) { [] }
5
- let(:thread_a) { instance_double(Thread, alive?: true) }
6
- let(:thread_b) { instance_double(Thread, alive?: true) }
7
- let(:threads) { [thread_a, thread_b] }
8
- let(:timeout) { instance_double(Float) }
9
- let(:sink_status) { instance_double(Object) }
10
-
11
- let(:sink) do
12
- instance_double(
13
- Mutant::Parallel::Sink,
14
- status: sink_status
15
- )
16
- end
17
-
18
- let(:var_active_jobs) do
19
- instance_double(Variable::IVar, 'active jobs')
20
- end
21
-
22
- let(:var_final) do
23
- instance_double(Variable::IVar, 'final')
24
- end
25
-
26
- let(:var_sink) do
27
- instance_double(Variable::IVar, 'sink')
28
- end
29
-
30
- subject do
31
- described_class.new(
32
- threads: threads,
33
- var_active_jobs: var_active_jobs,
34
- var_final: var_final,
35
- var_sink: var_sink
36
- )
37
- end
38
-
39
- describe '#wait_timeout' do
40
- def apply
41
- subject.wait_timeout(timeout)
42
- end
43
-
44
- shared_examples 'returns expected status' do
45
- it 'returns expected status' do
46
- verify_events do
47
- expect(apply).to eql(expected_status)
48
- end
49
- end
50
-
51
- it 'returns frozen copy of active jobs' do
52
- verify_events do
53
- returned_active_jobs = apply.active_jobs
54
-
55
- expect(returned_active_jobs).to_not be(active_jobs)
56
- expect(returned_active_jobs.frozen?).to be(true)
57
- end
58
- end
59
- end
60
-
61
- let(:raw_expectations) do
62
- [
63
- {
64
- receiver: var_final,
65
- selector: :take_timeout,
66
- arguments: [timeout],
67
- reaction: { return: Variable.const_get(:Result)::Timeout.new }
68
- },
69
- {
70
- receiver: var_active_jobs,
71
- selector: :with,
72
- reaction: { yields: [active_jobs] }
73
- },
74
- {
75
- receiver: var_sink,
76
- selector: :with,
77
- reaction: { yields: [sink] }
78
- }
79
- ]
80
- end
81
-
82
- context 'when not done' do
83
- let(:expected_status) do
84
- Mutant::Parallel::Status.new(
85
- active_jobs: active_jobs,
86
- done: false,
87
- payload: sink_status
88
- )
89
- end
90
-
91
- include_examples 'returns expected status'
92
- end
93
-
94
- context 'when done' do
95
- before do
96
- allow(thread_a).to receive_messages(alive?: false)
97
- allow(thread_b).to receive_messages(alive?: false)
98
- end
99
-
100
- let(:raw_expectations) do
101
- [
102
- *super(),
103
- {
104
- receiver: thread_a,
105
- selector: :join
106
- },
107
- {
108
- receiver: thread_b,
109
- selector: :join
110
- }
111
- ]
112
-
113
- end
114
-
115
- let(:expected_status) do
116
- Mutant::Parallel::Status.new(
117
- active_jobs: active_jobs,
118
- done: true,
119
- payload: sink_status
120
- )
121
- end
122
-
123
- include_examples 'returns expected status'
124
- end
125
- end
126
- end