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,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST::Meta::Optarg do
4
- subject(:object) { described_class.new(node) }
5
-
6
- let(:node) { s(:optarg, name, value) }
7
- let(:name) { :foo }
8
- let(:value) { s(:sym, :bar) }
9
-
10
- its(:name) { should be(:foo) }
11
- its(:default_value) { should eql(s(:sym, :bar)) }
12
-
13
- describe '#used?' do
14
- subject { object.used? }
15
-
16
- it { should be true }
17
-
18
- context 'when name is prefixed with an underscore' do
19
- let(:name) { :_foo }
20
- it { should be false }
21
- end
22
- end
23
-
24
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST::Meta::Send, '#proc?' do
4
- subject { described_class.new(node).proc? }
5
-
6
- shared_context 'proc send' do |source|
7
- let(:node) { Unparser.parse(source).children.first }
8
- end
9
-
10
- shared_examples 'proc definition' do |*args|
11
- include_context 'proc send', *args
12
-
13
- it { should be(true) }
14
- end
15
-
16
- shared_examples 'not a proc definition' do |*args|
17
- include_context 'proc send', *args
18
-
19
- it { should be_falsey }
20
- end
21
-
22
- it_behaves_like 'proc definition', 'proc { }'
23
- it_behaves_like 'proc definition', 'Proc.new { }'
24
- it_behaves_like 'not a proc definition', 'new { }'
25
- it_behaves_like 'not a proc definition', 'foo.proc { }'
26
- it_behaves_like 'not a proc definition', 'Proc.blah { }'
27
- it_behaves_like 'not a proc definition', 'Proc().new { }'
28
- it_behaves_like 'not a proc definition', 'Foo.new { }'
29
- it_behaves_like 'not a proc definition', 'blah { }'
30
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST::Meta::Send, '#receiver_possible_top_level_const?' do
4
- subject { described_class.new(node).receiver_possible_top_level_const? }
5
-
6
- def parse(source)
7
- Unparser.parse(source)
8
- end
9
-
10
- context 'when implicit top level const' do
11
- let(:node) { parse('Foo.bar') }
12
-
13
- it { should be true }
14
- end
15
-
16
- context 'when cbase' do
17
- let(:node) { parse('::Foo.bar') }
18
-
19
- it { should be true }
20
- end
21
-
22
- context 'when nested const' do
23
- let(:node) { parse('Baz::Foo.bar') }
24
-
25
- it { should be false }
26
- end
27
-
28
- context 'when no receiver' do
29
- let(:node) { parse('bar') }
30
-
31
- it { should be false }
32
- end
33
-
34
- context 'when send receiver' do
35
- let(:node) { parse('foo.bar') }
36
-
37
- it { should be false }
38
- end
39
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST::Meta::Send do
4
- let(:object) { described_class.new(node) }
5
-
6
- def parse(source)
7
- Unparser.parse(source)
8
- end
9
-
10
- let(:method_call) { parse('foo.bar(baz)') }
11
- let(:attribute_read) { parse('foo.bar') }
12
- let(:attribute_assignment) { parse('foo.bar = baz') }
13
- let(:binary_method_operator) { parse('foo == bar') }
14
-
15
- class Expectation
16
- include Adamantium, Anima.new(:name, :attribute_assignment, :binary_method_operator)
17
-
18
- ALL = [
19
- [:method_call, false, false],
20
- [:attribute_read, false, false],
21
- [:attribute_assignment, true, false],
22
- [:binary_method_operator, false, true]
23
- ].map do |values|
24
- new(Hash[anima.attribute_names.zip(values)])
25
- end.freeze
26
- end # Expectation
27
-
28
- # Rspec should have a build in for this kind of "n-dimensional assertion with context"
29
- (Expectation.anima.attribute_names - %i[name]).each do |name|
30
- describe "##{name}?" do
31
- subject { object.public_send(:"#{name}?") }
32
-
33
- Expectation::ALL.each do |expectation|
34
- context "on #{expectation.name}" do
35
- let(:node) { public_send(expectation.name) }
36
-
37
- it { should be(expectation.public_send(name)) }
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST::NamedChildren do
4
- describe '.included' do
5
- let(:klass) do
6
- Class.new do
7
- include Mutant::AST::NamedChildren, Concord.new(:node)
8
-
9
- children :foo, :bar
10
- end
11
- end
12
-
13
- def publish
14
- klass.class_eval do
15
- public :foo, :bar
16
-
17
- public :remaining_children, :remaining_children_indices, :remaining_children_with_index
18
- end
19
- end
20
-
21
- let(:instance) { klass.new(node) }
22
-
23
- let(:node_foo) { s(:foo) }
24
- let(:node_bar) { s(:bar) }
25
- let(:node_baz) { s(:baz) }
26
-
27
- let(:node) { s(:node, node_foo, node_bar, node_baz) }
28
-
29
- describe 'generated methods' do
30
- specify 'are private by default' do
31
- %i[
32
- foo
33
- bar
34
- remaining_children
35
- remaining_children_indices
36
- remaining_children_with_index
37
- ].each do |name|
38
- expect(klass.private_instance_methods.include?(name)).to be(true)
39
- end
40
- end
41
-
42
- describe '#remaining_children' do
43
- it 'returns remaining unnamed children' do
44
- publish
45
- expect(instance.remaining_children).to eql([node_baz])
46
- end
47
- end
48
-
49
- describe '#remaining_children_indices' do
50
- it 'returns remaining unnamed children indices' do
51
- publish
52
- expect(instance.remaining_children_indices).to eql([2])
53
- end
54
- end
55
-
56
- describe '#remaining_children_with_index' do
57
- it 'returns remaining unnamed children indices' do
58
- publish
59
- expect(instance.remaining_children_with_index).to eql([[node_baz, 2]])
60
- end
61
- end
62
-
63
- describe '#foo' do
64
- it 'returns named child foo' do
65
- publish
66
- expect(instance.foo).to be(node_foo)
67
- end
68
- end
69
-
70
- describe '#bar' do
71
- context 'when node is present' do
72
- it 'returns named child bar' do
73
- publish
74
- expect(instance.bar).to be(node_bar)
75
- end
76
- end
77
-
78
- context 'when node is NOT present' do
79
- let(:node) { s(:node, node_foo) }
80
-
81
- it 'returns nil' do
82
- publish
83
- expect(instance.bar).to be(nil)
84
- end
85
- end
86
- end
87
- end
88
- end
89
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST::Sexp do
4
- let(:object) do
5
- Class.new do
6
- include Mutant::AST::Sexp
7
-
8
- public :n_not
9
- public :s
10
- end.new
11
- end
12
-
13
- describe '#n_not' do
14
- subject { object.n_not(node) }
15
-
16
- let(:node) { s(:true) }
17
-
18
- it 'returns negated ast' do
19
- expect(subject).to eql(s(:send, s(:true), :!))
20
- end
21
- end
22
-
23
- describe '#s' do
24
- subject { object.s(*arguments) }
25
-
26
- context 'with single argument' do
27
- let(:arguments) { %i[foo] }
28
-
29
- it { should eql(Parser::AST::Node.new(:foo)) }
30
- end
31
-
32
- context 'with single multiple arguments' do
33
- let(:arguments) { %i[foo bar baz] }
34
-
35
- it { should eql(Parser::AST::Node.new(:foo, %i[bar baz])) }
36
- end
37
- end
38
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::AST do
4
- let(:object) { described_class }
5
-
6
- describe '.find_last_path' do
7
- subject { object.find_last_path(root, &block) }
8
-
9
- let(:root) { s(:root, parent) }
10
- let(:child_a) { s(:child_a) }
11
- let(:child_b) { s(:child_b) }
12
- let(:parent) { s(:parent, child_a, child_b) }
13
-
14
- def path
15
- subject.map(&:type)
16
- end
17
-
18
- context 'when no node matches' do
19
- let(:block) { ->(_) { false } }
20
-
21
- it { should eql([]) }
22
- end
23
-
24
- context 'when called without block' do
25
- let(:block) { nil }
26
-
27
- it 'raises error' do
28
- expect { subject }.to raise_error(ArgumentError, 'block expected')
29
- end
30
- end
31
-
32
- context 'on non Parser::AST::Node child' do
33
- let(:block) { ->(node) { fail if node.equal?(child_a) } }
34
- let(:child_a) { AST::Node.new(:foo) }
35
-
36
- it 'does not yield that node' do
37
- expect(path).to eql([])
38
- end
39
- end
40
-
41
- context 'when one node matches' do
42
- let(:block) { ->(node) { node.equal?(child_a) } }
43
-
44
- it 'returns the full path' do
45
- expect(path).to eql(%i[root parent child_a])
46
- end
47
- end
48
-
49
- context 'when two nodes match' do
50
- let(:block) { ->(node) { node.equal?(child_a) || node.equal?(child_b) } }
51
-
52
- it 'returns the last full path' do
53
- expect(path).to eql(%i[root parent child_b])
54
- end
55
- end
56
- end
57
- end
@@ -1,216 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Bootstrap do
4
- let(:integration) { instance_double(Mutant::Integration) }
5
- let(:integration_name) { instance_double(String) }
6
- let(:integration_result) { Mutant::Either::Right.new(integration) }
7
- let(:kernel) { instance_double(Object, 'kernel') }
8
- let(:load_path) { %w[original] }
9
- let(:matcher_config) { Mutant::Matcher::Config::DEFAULT }
10
- let(:object_space) { class_double(ObjectSpace) }
11
- let(:object_space_modules) { [] }
12
- let(:warnings) { instance_double(Mutant::Warnings) }
13
-
14
- let(:world) do
15
- instance_double(
16
- Mutant::World,
17
- kernel: kernel,
18
- load_path: load_path,
19
- object_space: object_space,
20
- pathname: Pathname,
21
- warnings: warnings
22
- )
23
- end
24
-
25
- let(:config) do
26
- Mutant::Config::DEFAULT.with(
27
- includes: [],
28
- integration: integration,
29
- jobs: 1,
30
- matcher: matcher_config,
31
- reporter: instance_double(Mutant::Reporter),
32
- requires: []
33
- )
34
- end
35
-
36
- let(:expected_env) do
37
- env_with_scopes.with(
38
- integration: integration,
39
- selector: Mutant::Selector::Expression.new(integration)
40
- )
41
- end
42
-
43
- let(:env_empty) do
44
- Mutant::Env.empty(world, config)
45
- end
46
-
47
- let(:env_with_scopes) { env_empty }
48
-
49
- shared_examples 'expected warning' do
50
- let(:warns) { [] }
51
-
52
- before do
53
- allow(config.reporter).to receive(:warn, &warns.method(:<<))
54
- end
55
-
56
- it 'warns with expected warning' do
57
- expect { apply }.to change(warns, :to_a).from([]).to([expected_warning])
58
- end
59
- end
60
-
61
- shared_examples_for 'bootstrap call' do
62
- it 'returns expected env' do
63
- expect(apply).to eql(Mutant::Either::Right.new(expected_env))
64
- end
65
-
66
- it 'performs IO in expected sequence' do
67
- apply
68
-
69
- expect(object_space)
70
- .to have_received(:each_object)
71
- .ordered
72
-
73
- expect(Mutant::Integration)
74
- .to have_received(:setup)
75
- .with(env_with_scopes)
76
- .ordered
77
- end
78
- end
79
-
80
- before do
81
- allow(Mutant::Integration).to receive_messages(setup: integration_result)
82
-
83
- allow(object_space).to receive(:each_object) do |argument|
84
- expect(argument).to be(Module)
85
- object_space_modules.each
86
- end
87
- end
88
-
89
- describe '.apply' do
90
- def apply
91
- described_class.apply(world, config)
92
- end
93
-
94
- context 'when Module#name calls result in exceptions' do
95
- let(:object_space_modules) { [invalid_class] }
96
-
97
- let(:expected_warning) do
98
- "Object#name from: #{invalid_class} raised an error: " \
99
- "RuntimeError. #{Mutant::Env::SEMANTICS_MESSAGE}"
100
- end
101
-
102
- # Not really a class, but does not leak a "wrong" class
103
- # into later specs.
104
- let(:invalid_class) do
105
- Object.new.tap do |object|
106
- def object.name
107
- fail
108
- end
109
- end
110
- end
111
-
112
- include_examples 'expected warning'
113
- include_examples 'bootstrap call'
114
- end
115
-
116
- context 'when Module#name calls return nil' do
117
- let(:anonymous_class) { Class.new }
118
- let(:object_space_modules) { [anonymous_class] }
119
-
120
- include_examples 'bootstrap call'
121
- end
122
-
123
- context 'when requires are configured' do
124
- let(:config) { super().with(requires: %w[foo bar]) }
125
- let(:requires) { [] }
126
-
127
- before do
128
- allow(kernel).to receive(:require, &requires.method(:<<))
129
- end
130
-
131
- it 'executes requires' do
132
- expect { apply }.to change(requires, :to_a).from([]).to(%w[foo bar])
133
- end
134
-
135
- include_examples 'bootstrap call'
136
- end
137
-
138
- context 'when includes are configured' do
139
- let(:config) { super().with(includes: %w[foo bar]) }
140
-
141
- it 'appends to load path' do
142
- expect { apply }
143
- .to change(load_path, :to_a)
144
- .from(load_path.dup)
145
- .to(%w[original foo bar])
146
- end
147
-
148
- include_examples 'bootstrap call'
149
- end
150
-
151
- context 'when Module#name does not return a String or nil' do
152
- let(:object_space_modules) { [invalid_class] }
153
-
154
- let(:invalid_class) do
155
- # intentionally an object to not actually pollute object space
156
- Object.new.tap do |object|
157
- def object.name
158
- Object
159
- end
160
- end
161
- end
162
-
163
- let(:expected_warning) do
164
- "Object#name from: #{invalid_class} " \
165
- "returned Object. #{Mutant::Env::SEMANTICS_MESSAGE}"
166
- end
167
-
168
- include_examples 'expected warning'
169
- include_examples 'bootstrap call'
170
- end
171
-
172
- context 'when object name cannot be parsed as expression' do
173
- let(:object_space_modules) { [invalid_class] }
174
-
175
- let(:invalid_class) do
176
- # intentionally an object to not actually pollute object space
177
- Object.new.tap do |object|
178
- def object.name
179
- 'invalid expression'
180
- end
181
- end
182
- end
183
-
184
- include_examples 'bootstrap call'
185
- end
186
-
187
- context 'when scope matches expression' do
188
- let(:object_space_modules) { [TestApp::Literal, TestApp::Empty] }
189
- let(:match_expressions) { object_space_modules.map(&:name).map(&method(:parse_expression)) }
190
-
191
- let(:matcher_config) do
192
- super().with(match_expressions: match_expressions)
193
- end
194
-
195
- let(:env_with_scopes) do
196
- env_empty.with(
197
- matchable_scopes: [
198
- Mutant::Scope.new(TestApp::Empty, match_expressions.last),
199
- Mutant::Scope.new(TestApp::Literal, match_expressions.first)
200
- ]
201
- )
202
- end
203
-
204
- let(:expected_env) do
205
- subjects = Mutant::Matcher::Scope.new(TestApp::Literal).call(env_empty)
206
-
207
- super().with(
208
- mutations: subjects.flat_map(&:mutations),
209
- subjects: subjects
210
- )
211
- end
212
-
213
- include_examples 'bootstrap call'
214
- end
215
- end
216
- end