mutant 0.9.8 → 0.9.13

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 (335) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +5 -2
  3. data/lib/mutant/ast.rb +0 -9
  4. data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
  5. data/lib/mutant/ast/meta/send.rb +0 -6
  6. data/lib/mutant/bootstrap.rb +14 -37
  7. data/lib/mutant/cli.rb +11 -49
  8. data/lib/mutant/config.rb +0 -8
  9. data/lib/mutant/context.rb +0 -3
  10. data/lib/mutant/env.rb +0 -6
  11. data/lib/mutant/expression/method.rb +6 -6
  12. data/lib/mutant/expression/methods.rb +6 -6
  13. data/lib/mutant/expression/parser.rb +0 -6
  14. data/lib/mutant/integration.rb +0 -18
  15. data/lib/mutant/isolation.rb +1 -1
  16. data/lib/mutant/isolation/fork.rb +2 -24
  17. data/lib/mutant/isolation/none.rb +1 -1
  18. data/lib/mutant/license.rb +11 -0
  19. data/lib/mutant/matcher.rb +0 -14
  20. data/lib/mutant/matcher/config.rb +2 -11
  21. data/lib/mutant/matcher/method.rb +0 -31
  22. data/lib/mutant/matcher/method/instance.rb +0 -8
  23. data/lib/mutant/matcher/method/metaclass.rb +86 -0
  24. data/lib/mutant/matcher/method/singleton.rb +0 -25
  25. data/lib/mutant/matcher/methods.rb +17 -28
  26. data/lib/mutant/matcher/namespace.rb +0 -10
  27. data/lib/mutant/matcher/scope.rb +2 -4
  28. data/lib/mutant/meta/example/dsl.rb +0 -21
  29. data/lib/mutant/meta/example/verification.rb +0 -20
  30. data/lib/mutant/minitest/coverage.rb +53 -0
  31. data/lib/mutant/mutation.rb +0 -3
  32. data/lib/mutant/mutator.rb +1 -29
  33. data/lib/mutant/mutator/node.rb +1 -66
  34. data/lib/mutant/mutator/node/and_asgn.rb +0 -3
  35. data/lib/mutant/mutator/node/argument.rb +0 -15
  36. data/lib/mutant/mutator/node/arguments.rb +0 -20
  37. data/lib/mutant/mutator/node/begin.rb +0 -3
  38. data/lib/mutant/mutator/node/binary.rb +0 -23
  39. data/lib/mutant/mutator/node/block.rb +0 -15
  40. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  41. data/lib/mutant/mutator/node/break.rb +0 -3
  42. data/lib/mutant/mutator/node/case.rb +0 -9
  43. data/lib/mutant/mutator/node/class.rb +0 -3
  44. data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
  45. data/lib/mutant/mutator/node/const.rb +0 -3
  46. data/lib/mutant/mutator/node/define.rb +0 -11
  47. data/lib/mutant/mutator/node/defined.rb +0 -3
  48. data/lib/mutant/mutator/node/dstr.rb +0 -3
  49. data/lib/mutant/mutator/node/dsym.rb +0 -3
  50. data/lib/mutant/mutator/node/generic.rb +0 -3
  51. data/lib/mutant/mutator/node/if.rb +0 -12
  52. data/lib/mutant/mutator/node/index.rb +0 -27
  53. data/lib/mutant/mutator/node/kwbegin.rb +0 -3
  54. data/lib/mutant/mutator/node/literal.rb +0 -3
  55. data/lib/mutant/mutator/node/literal/array.rb +0 -6
  56. data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
  57. data/lib/mutant/mutator/node/literal/float.rb +0 -9
  58. data/lib/mutant/mutator/node/literal/hash.rb +0 -9
  59. data/lib/mutant/mutator/node/literal/integer.rb +0 -9
  60. data/lib/mutant/mutator/node/literal/nil.rb +0 -3
  61. data/lib/mutant/mutator/node/literal/range.rb +4 -7
  62. data/lib/mutant/mutator/node/literal/regex.rb +0 -6
  63. data/lib/mutant/mutator/node/literal/string.rb +0 -3
  64. data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
  65. data/lib/mutant/mutator/node/masgn.rb +0 -3
  66. data/lib/mutant/mutator/node/match_current_line.rb +0 -3
  67. data/lib/mutant/mutator/node/mlhs.rb +0 -3
  68. data/lib/mutant/mutator/node/named_value/access.rb +2 -14
  69. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
  70. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
  71. data/lib/mutant/mutator/node/next.rb +0 -3
  72. data/lib/mutant/mutator/node/noop.rb +1 -4
  73. data/lib/mutant/mutator/node/nthref.rb +0 -3
  74. data/lib/mutant/mutator/node/op_asgn.rb +0 -3
  75. data/lib/mutant/mutator/node/or_asgn.rb +0 -3
  76. data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
  77. data/lib/mutant/mutator/node/regopt.rb +0 -6
  78. data/lib/mutant/mutator/node/resbody.rb +0 -6
  79. data/lib/mutant/mutator/node/rescue.rb +2 -19
  80. data/lib/mutant/mutator/node/return.rb +0 -3
  81. data/lib/mutant/mutator/node/sclass.rb +20 -0
  82. data/lib/mutant/mutator/node/send.rb +26 -61
  83. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
  84. data/lib/mutant/mutator/node/send/binary.rb +0 -11
  85. data/lib/mutant/mutator/node/send/conditional.rb +0 -3
  86. data/lib/mutant/mutator/node/splat.rb +0 -3
  87. data/lib/mutant/mutator/node/super.rb +0 -3
  88. data/lib/mutant/mutator/node/when.rb +0 -19
  89. data/lib/mutant/mutator/node/yield.rb +0 -3
  90. data/lib/mutant/mutator/node/zsuper.rb +0 -3
  91. data/lib/mutant/mutator/util/array.rb +0 -6
  92. data/lib/mutant/mutator/util/symbol.rb +0 -3
  93. data/lib/mutant/parallel.rb +0 -13
  94. data/lib/mutant/parallel/driver.rb +0 -10
  95. data/lib/mutant/parallel/worker.rb +0 -22
  96. data/lib/mutant/reporter/cli.rb +0 -5
  97. data/lib/mutant/reporter/cli/format.rb +0 -9
  98. data/lib/mutant/reporter/cli/printer.rb +2 -42
  99. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  100. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
  101. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  102. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  103. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  104. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  105. data/lib/mutant/repository/diff.rb +1 -13
  106. data/lib/mutant/repository/diff/ranges.rb +0 -11
  107. data/lib/mutant/result.rb +0 -3
  108. data/lib/mutant/runner.rb +0 -18
  109. data/lib/mutant/runner/sink.rb +0 -5
  110. data/lib/mutant/subject.rb +0 -8
  111. data/lib/mutant/subject/method.rb +0 -3
  112. data/lib/mutant/subject/method/instance.rb +40 -6
  113. data/lib/mutant/subject/method/metaclass.rb +30 -0
  114. data/lib/mutant/transform.rb +0 -92
  115. data/lib/mutant/version.rb +1 -1
  116. data/lib/mutant/warnings.rb +0 -6
  117. data/lib/mutant/zombifier.rb +2 -34
  118. metadata +61 -333
  119. data/.github/workflows/ci.yml +0 -121
  120. data/.gitignore +0 -38
  121. data/.rspec +0 -5
  122. data/.rubocop.yml +0 -7
  123. data/Changelog.md +0 -75
  124. data/Gemfile +0 -7
  125. data/Gemfile.lock +0 -167
  126. data/Gemfile.shared +0 -10
  127. data/README.md +0 -138
  128. data/Rakefile +0 -5
  129. data/config/devtools.yml +0 -2
  130. data/config/reek.yml +0 -138
  131. data/config/rubocop.yml +0 -205
  132. data/config/yardstick.yml +0 -2
  133. data/docs/commercial-support.md +0 -14
  134. data/docs/concurrency.md +0 -39
  135. data/docs/incremental.md +0 -76
  136. data/docs/known-problems.md +0 -30
  137. data/docs/limitations.md +0 -50
  138. data/docs/mutant-minitest.md +0 -149
  139. data/docs/mutant-rspec.md +0 -130
  140. data/docs/nomenclature.md +0 -82
  141. data/docs/reading-reports.md +0 -74
  142. data/lib/mutant/color.rb +0 -43
  143. data/lib/mutant/diff.rb +0 -114
  144. data/meta/and.rb +0 -15
  145. data/meta/and_asgn.rb +0 -14
  146. data/meta/array.rb +0 -30
  147. data/meta/begin.rb +0 -23
  148. data/meta/block.rb +0 -202
  149. data/meta/block_pass.rb +0 -8
  150. data/meta/blockarg.rb +0 -10
  151. data/meta/break.rb +0 -10
  152. data/meta/case.rb +0 -223
  153. data/meta/casgn.rb +0 -28
  154. data/meta/cbase.rb +0 -8
  155. data/meta/class.rb +0 -12
  156. data/meta/const.rb +0 -17
  157. data/meta/csend.rb +0 -10
  158. data/meta/cvar.rb +0 -7
  159. data/meta/cvasgn.rb +0 -10
  160. data/meta/date.rb +0 -59
  161. data/meta/def.rb +0 -203
  162. data/meta/defined.rb +0 -9
  163. data/meta/dstr.rb +0 -13
  164. data/meta/dsym.rb +0 -14
  165. data/meta/ensure.rb +0 -9
  166. data/meta/false.rb +0 -8
  167. data/meta/file.rb +0 -5
  168. data/meta/float.rb +0 -37
  169. data/meta/gvar.rb +0 -7
  170. data/meta/gvasgn.rb +0 -10
  171. data/meta/hash.rb +0 -24
  172. data/meta/if.rb +0 -77
  173. data/meta/index.rb +0 -133
  174. data/meta/indexasgn.rb +0 -31
  175. data/meta/int.rb +0 -18
  176. data/meta/ivar.rb +0 -8
  177. data/meta/ivasgn.rb +0 -23
  178. data/meta/kwarg.rb +0 -10
  179. data/meta/kwbegin.rb +0 -9
  180. data/meta/kwoptarg.rb +0 -13
  181. data/meta/lambda.rb +0 -23
  182. data/meta/line.rb +0 -5
  183. data/meta/lvar.rb +0 -16
  184. data/meta/lvasgn.rb +0 -25
  185. data/meta/masgn.rb +0 -7
  186. data/meta/match_current_line.rb +0 -15
  187. data/meta/next.rb +0 -11
  188. data/meta/nil.rb +0 -5
  189. data/meta/nthref.rb +0 -14
  190. data/meta/op_assgn.rb +0 -17
  191. data/meta/or.rb +0 -15
  192. data/meta/or_asgn.rb +0 -50
  193. data/meta/range.rb +0 -39
  194. data/meta/redo.rb +0 -5
  195. data/meta/regexp.rb +0 -81
  196. data/meta/regopt.rb +0 -10
  197. data/meta/rescue.rb +0 -90
  198. data/meta/return.rb +0 -16
  199. data/meta/self.rb +0 -7
  200. data/meta/send.rb +0 -604
  201. data/meta/str.rb +0 -7
  202. data/meta/super.rb +0 -27
  203. data/meta/sym.rb +0 -8
  204. data/meta/true.rb +0 -8
  205. data/meta/until.rb +0 -17
  206. data/meta/while.rb +0 -26
  207. data/meta/yield.rb +0 -10
  208. data/mutant-minitest.gemspec +0 -22
  209. data/mutant-rspec.gemspec +0 -22
  210. data/mutant.gemspec +0 -41
  211. data/mutant.yml +0 -6
  212. data/spec/integration/mutant/corpus_spec.rb +0 -15
  213. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  214. data/spec/integration/mutant/minitest_spec.rb +0 -11
  215. data/spec/integration/mutant/null_spec.rb +0 -16
  216. data/spec/integration/mutant/rspec_spec.rb +0 -15
  217. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  218. data/spec/integrations.yml +0 -63
  219. data/spec/shared/base_behavior.rb +0 -45
  220. data/spec/shared/framework_integration_behavior.rb +0 -70
  221. data/spec/shared/method_matcher_behavior.rb +0 -47
  222. data/spec/spec_helper.rb +0 -75
  223. data/spec/support/corpus.rb +0 -318
  224. data/spec/support/file_system.rb +0 -62
  225. data/spec/support/ice_nine_config.rb +0 -10
  226. data/spec/support/ruby_vm.rb +0 -84
  227. data/spec/support/shared_context.rb +0 -169
  228. data/spec/support/test_app.rb +0 -7
  229. data/spec/support/warnings.yml +0 -6
  230. data/spec/support/xspec.rb +0 -183
  231. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  232. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  233. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  234. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  235. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  236. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  237. data/spec/unit/mutant/ast_spec.rb +0 -57
  238. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  239. data/spec/unit/mutant/cli_spec.rb +0 -305
  240. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  241. data/spec/unit/mutant/config_spec.rb +0 -126
  242. data/spec/unit/mutant/context_spec.rb +0 -111
  243. data/spec/unit/mutant/diff_spec.rb +0 -189
  244. data/spec/unit/mutant/env_spec.rb +0 -229
  245. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  246. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  247. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  248. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  249. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  250. data/spec/unit/mutant/expression_spec.rb +0 -45
  251. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  252. data/spec/unit/mutant/integration_spec.rb +0 -150
  253. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  254. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  255. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  256. data/spec/unit/mutant/license_spec.rb +0 -293
  257. data/spec/unit/mutant/loader_spec.rb +0 -79
  258. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  259. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  260. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  261. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  262. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  263. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  264. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  265. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  266. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  267. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  268. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  269. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  270. data/spec/unit/mutant/matcher_spec.rb +0 -102
  271. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  272. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  273. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  274. data/spec/unit/mutant/mutation_spec.rb +0 -140
  275. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  276. data/spec/unit/mutant/mutator_spec.rb +0 -21
  277. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  278. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  279. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  280. data/spec/unit/mutant/parallel_spec.rb +0 -115
  281. data/spec/unit/mutant/parser_spec.rb +0 -26
  282. data/spec/unit/mutant/range_spec.rb +0 -141
  283. data/spec/unit/mutant/registry_spec.rb +0 -74
  284. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  285. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  286. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  287. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  288. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  290. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  291. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  292. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  293. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  294. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  295. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  296. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  297. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  298. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  299. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  300. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  301. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  302. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  303. data/spec/unit/mutant/result/env_spec.rb +0 -161
  304. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  305. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  306. data/spec/unit/mutant/result/test_spec.rb +0 -14
  307. data/spec/unit/mutant/result_spec.rb +0 -33
  308. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  309. data/spec/unit/mutant/runner_spec.rb +0 -121
  310. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  311. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  312. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  313. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  314. data/spec/unit/mutant/subject_spec.rb +0 -93
  315. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  316. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  317. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  318. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  319. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  320. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  321. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  322. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  323. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  324. data/spec/unit/mutant/util/one_spec.rb +0 -22
  325. data/spec/unit/mutant/warnings_spec.rb +0 -89
  326. data/spec/unit/mutant/world_spec.rb +0 -63
  327. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  328. data/test_app/.rspec +0 -1
  329. data/test_app/Gemfile.minitest +0 -4
  330. data/test_app/Gemfile.rspec3.8 +0 -7
  331. data/test_app/lib/test_app.rb +0 -109
  332. data/test_app/lib/test_app/literal.rb +0 -35
  333. data/test_app/spec/spec_helper.rb +0 -9
  334. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  335. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -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(:nil), 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,52 +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(
45
- [
46
- s(:and, s(:nil), s(:true)),
47
- s(:and, s(:true), s(:nil))
48
- ].to_set
49
- )
50
- end
51
- end
52
- 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
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Parallel::Source::Array do
4
- subject { described_class.new(payloads) }
5
-
6
- let(:payloads) { %i[a b c] }
7
-
8
- describe '#next' do
9
- def job(**attributes)
10
- Mutant::Parallel::Source::Job.new(attributes)
11
- end
12
-
13
- def apply
14
- subject.next
15
- end
16
-
17
- context 'when there is a next job' do
18
- it 'returns that job' do
19
- expect(apply).to eql(job(index: 0, payload: :a))
20
- end
21
-
22
- it 'does not return the same job twice' do
23
- expect(apply).to eql(job(index: 0, payload: :a))
24
- expect(apply).to eql(job(index: 1, payload: :b))
25
- expect(apply).to eql(job(index: 2, payload: :c))
26
- end
27
- end
28
-
29
- context 'when there is no next job' do
30
- let(:payloads) { [] }
31
-
32
- it 'raises error' do
33
- expect { apply }.to raise_error(Mutant::Parallel::Source::NoJobError)
34
- end
35
- end
36
- end
37
-
38
- describe '#next?' do
39
- def apply
40
- subject.next?
41
- end
42
-
43
- context 'when there is a next job' do
44
- it 'returns true' do
45
- expect(apply).to be(true)
46
- end
47
- end
48
-
49
- context 'when there is no next job' do
50
- let(:payloads) { [] }
51
-
52
- it 'returns false' do
53
- expect(apply).to be(false)
54
- end
55
- end
56
- end
57
- end
@@ -1,206 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Parallel::Worker do
4
- describe '#call' do
5
- let(:active_jobs) { instance_double(Set) }
6
- let(:payload_a) { instance_double(Object) }
7
- let(:payload_b) { instance_double(Object) }
8
- let(:processor) { instance_double(Proc) }
9
- let(:result_a) { instance_double(Object) }
10
- let(:result_b) { instance_double(Object) }
11
- let(:running) { 1 }
12
- let(:sink) { instance_double(Mutant::Parallel::Sink) }
13
- let(:source) { instance_double(Mutant::Parallel::Source) }
14
- let(:thread_a) { instance_double(Thread, alive?: true) }
15
- let(:thread_b) { instance_double(Thread, alive?: true) }
16
- let(:threads) { [thread_a, thread_b] }
17
- let(:timeout) { instance_double(Float) }
18
-
19
- let(:job_a) do
20
- instance_double(
21
- Mutant::Parallel::Source::Job,
22
- payload: payload_a
23
- )
24
- end
25
-
26
- let(:job_b) do
27
- instance_double(
28
- Mutant::Parallel::Source::Job,
29
- payload: payload_b
30
- )
31
- end
32
-
33
- let(:var_active_jobs) do
34
- instance_double(Variable::IVar, 'active jobs')
35
- end
36
-
37
- let(:var_final) do
38
- instance_double(Variable::IVar, 'final')
39
- end
40
-
41
- let(:var_running) do
42
- instance_double(Variable::MVar, 'running')
43
- end
44
-
45
- let(:var_sink) do
46
- instance_double(Variable::IVar, 'sink')
47
- end
48
-
49
- let(:var_source) do
50
- instance_double(Variable::IVar, 'source')
51
- end
52
-
53
- subject do
54
- described_class.new(
55
- processor: processor,
56
- var_active_jobs: var_active_jobs,
57
- var_final: var_final,
58
- var_running: var_running,
59
- var_sink: var_sink,
60
- var_source: var_source
61
- )
62
- end
63
-
64
- def apply
65
- subject.call
66
- end
67
-
68
- def sink_result(result)
69
- {
70
- receiver: sink,
71
- selector: :result,
72
- arguments: [result]
73
- }
74
- end
75
-
76
- def sink_stop?(value)
77
- {
78
- receiver: sink,
79
- selector: :stop?,
80
- reaction: { return: value }
81
- }
82
- end
83
-
84
- def source_next?(value)
85
- {
86
- receiver: source,
87
- selector: :next?,
88
- reaction: { return: value }
89
- }
90
- end
91
-
92
- def source_next(value)
93
- {
94
- receiver: source,
95
- selector: :next,
96
- reaction: { return: value }
97
- }
98
- end
99
-
100
- def with(var, value)
101
- {
102
- receiver: var,
103
- selector: :with,
104
- reaction: { yields: [value] }
105
- }
106
- end
107
-
108
- def process(payload, result)
109
- {
110
- receiver: processor,
111
- selector: :call,
112
- arguments: [payload],
113
- reaction: { return: result }
114
- }
115
- end
116
-
117
- def add_job(job)
118
- {
119
- receiver: active_jobs,
120
- selector: :<<,
121
- arguments: [job]
122
- }
123
- end
124
-
125
- def remove_job(job)
126
- {
127
- receiver: active_jobs,
128
- selector: :delete,
129
- arguments: [job]
130
- }
131
- end
132
-
133
- shared_examples 'worker execution' do
134
- it 'terminates after processing all jobs' do
135
- verify_events { expect(apply).to be(subject) }
136
- end
137
- end
138
-
139
- def modify_running
140
- {
141
- receiver: var_running,
142
- selector: :modify,
143
- reaction: { yields: [running] }
144
- }
145
- end
146
-
147
- def finalize
148
- [
149
- modify_running,
150
- {
151
- receiver: var_final,
152
- selector: :put,
153
- arguments: [nil]
154
- }
155
- ]
156
- end
157
-
158
- context 'when processing jobs till sink stops accepting' do
159
- let(:raw_expectations) do
160
- [
161
- with(var_source, source),
162
- source_next?(true),
163
- source_next(job_a),
164
- with(var_active_jobs, active_jobs),
165
- add_job(job_a),
166
- process(payload_a, result_a),
167
- with(var_active_jobs, active_jobs),
168
- remove_job(job_a),
169
- with(var_sink, sink),
170
- sink_result(result_a),
171
- sink_stop?(true),
172
- *finalize
173
- ]
174
- end
175
-
176
- include_examples 'worker execution'
177
- end
178
-
179
- context 'when processing jobs till source is empty' do
180
- let(:raw_expectations) do
181
- [
182
- with(var_source, source),
183
- source_next?(false),
184
- *finalize
185
- ]
186
- end
187
-
188
- include_examples 'worker execution'
189
- end
190
-
191
- context 'when worker exits as others are still going' do
192
- let(:running) { 2 }
193
-
194
- let(:raw_expectations) do
195
- [
196
- with(var_source, source),
197
- source_next?(false),
198
- modify_running
199
- # no finalize
200
- ]
201
- end
202
-
203
- include_examples 'worker execution'
204
- end
205
- end
206
- end