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,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Method do
4
- let(:object) { parse_expression(input) }
5
- let(:env) { Fixtures::TEST_ENV }
6
- let(:instance_method) { 'TestApp::Literal#string' }
7
- let(:singleton_method) { 'TestApp::Literal.string' }
8
-
9
- describe '#match_length' do
10
- let(:input) { instance_method }
11
-
12
- subject { object.match_length(other) }
13
-
14
- context 'when other is an equivalent expression' do
15
- let(:other) { parse_expression(object.syntax) }
16
-
17
- it { should be(object.syntax.length) }
18
- end
19
-
20
- context 'when other is an unequivalent expression' do
21
- let(:other) { parse_expression('Foo*') }
22
-
23
- it { should be(0) }
24
- end
25
- end
26
-
27
- describe '#matcher' do
28
- subject { object.matcher }
29
-
30
- context 'with an instance method' do
31
- let(:input) { instance_method }
32
-
33
- it 'returns correct matcher' do
34
- expect(subject.call(env).map(&:expression)).to eql([object])
35
- end
36
- end
37
-
38
- context 'with a singleton method' do
39
- let(:input) { singleton_method }
40
-
41
- it 'returns correct matcher' do
42
- expect(subject.call(env).map(&:expression)).to eql([object])
43
- end
44
- end
45
- end
46
-
47
- describe '#syntax' do
48
- subject { object.syntax }
49
-
50
- context 'on instance method' do
51
- let(:input) { instance_method }
52
-
53
- it { should eql(instance_method) }
54
- end
55
-
56
- context 'on singleton method' do
57
- let(:input) { singleton_method }
58
-
59
- it { should eql(singleton_method) }
60
- end
61
- end
62
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Methods do
4
- let(:object) { described_class.new(attributes) }
5
-
6
- describe '#match_length' do
7
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '#' } }
8
-
9
- subject { object.match_length(other) }
10
-
11
- context 'when other is an equivalent expression' do
12
- let(:other) { parse_expression(object.syntax) }
13
-
14
- it { should be(object.syntax.length) }
15
- end
16
-
17
- context 'when other is matched' do
18
- let(:other) { parse_expression('TestApp::Literal#foo') }
19
-
20
- it { should be(object.syntax.length) }
21
- end
22
-
23
- context 'when other is an not matched expression' do
24
- let(:other) { parse_expression('Foo*') }
25
-
26
- it { should be(0) }
27
- end
28
- end
29
-
30
- describe '#syntax' do
31
- subject { object.syntax }
32
-
33
- context 'with an instance method' do
34
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '#' } }
35
-
36
- it { should eql('TestApp::Literal#') }
37
- end
38
-
39
- context 'with a singleton method' do
40
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '.' } }
41
-
42
- it { should eql('TestApp::Literal.') }
43
- end
44
- end
45
-
46
- describe '#matcher' do
47
- subject { object.matcher }
48
-
49
- context 'with an instance method' do
50
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '#' } }
51
-
52
- it { should eql(Mutant::Matcher::Methods::Instance.new(TestApp::Literal)) }
53
- end
54
-
55
- context 'with a singleton method' do
56
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '.' } }
57
-
58
- it { should eql(Mutant::Matcher::Methods::Singleton.new(TestApp::Literal)) }
59
- end
60
- end
61
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Namespace::Exact do
4
- let(:object) { parse_expression(input) }
5
- let(:input) { 'TestApp::Literal' }
6
-
7
- describe '#matcher' do
8
- subject { object.matcher }
9
-
10
- it { should eql(Mutant::Matcher::Scope.new(TestApp::Literal)) }
11
- end
12
-
13
- describe '#match_length' do
14
- subject { object.match_length(other) }
15
-
16
- context 'when other is an equivalent expression' do
17
- let(:other) { parse_expression(object.syntax) }
18
-
19
- it { should be(object.syntax.length) }
20
- end
21
-
22
- context 'when other is an unequivalent expression' do
23
- let(:other) { parse_expression('Foo*') }
24
-
25
- it { should be(0) }
26
- end
27
- end
28
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Namespace::Recursive do
4
- let(:object) { parse_expression(input) }
5
- let(:input) { 'TestApp::Literal*' }
6
-
7
- describe '#matcher' do
8
- subject { object.matcher }
9
-
10
- it { should eql(Mutant::Matcher::Namespace.new(object)) }
11
- end
12
-
13
- describe '#syntax' do
14
- subject { object.syntax }
15
-
16
- it { should eql(input) }
17
- end
18
-
19
- describe '#match_length' do
20
- subject { object.match_length(other) }
21
-
22
- context 'when other is an equivalent expression' do
23
- let(:other) { parse_expression(object.syntax) }
24
-
25
- it { should be(object.syntax.length) }
26
- end
27
-
28
- context 'when other expression describes a shorter prefix' do
29
- let(:other) { parse_expression('TestApp') }
30
-
31
- it { should be(0) }
32
- end
33
-
34
- context 'when other expression describes adjacent namespace' do
35
- let(:other) { parse_expression('TestApp::LiteralFoo') }
36
-
37
- it { should be(0) }
38
- end
39
-
40
- context 'when other expression describes root namespace' do
41
- let(:other) { parse_expression('TestApp::Literal') }
42
-
43
- it { should be(16) }
44
- end
45
-
46
- context 'when other expression describes a longer prefix' do
47
- context 'on constants' do
48
- let(:other) { parse_expression('TestApp::Literal::Deep') }
49
-
50
- it { should be(input[0..-2].length) }
51
- end
52
-
53
- context 'on singleton method' do
54
- let(:other) { parse_expression('TestApp::Literal.foo') }
55
-
56
- it { should be(input[0..-2].length) }
57
- end
58
-
59
- context 'on instance method' do
60
- let(:other) { parse_expression('TestApp::Literal#foo') }
61
-
62
- it { should be(input[0..-2].length) }
63
- end
64
- end
65
- end
66
- end
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Parser do
4
- subject do
5
- Mutant::Config::DEFAULT.expression_parser
6
- end
7
-
8
- def apply
9
- subject.apply(input)
10
- end
11
-
12
- describe '#apply' do
13
- context 'on a valid expression' do
14
- let(:input) { 'Foo' }
15
-
16
- it 'returns sucess' do
17
- expect(apply).to eql(
18
- Mutant::Either::Right.new(
19
- Mutant::Expression::Namespace::Exact.new(scope_name: 'Foo')
20
- )
21
- )
22
- end
23
- end
24
-
25
- context 'on invalid input' do
26
- let(:input) { 'foo bar' }
27
-
28
- it 'returns returns error' do
29
- expect(apply).to eql(
30
- Mutant::Either::Left.new('Expression: "foo bar" is invalid')
31
- )
32
- end
33
- end
34
-
35
- context 'on ambiguous input' do
36
- subject do
37
- described_class.new([test_a, test_b])
38
- end
39
-
40
- let(:test_a) do
41
- Class.new(Mutant::Expression) do
42
- include Anima.new
43
- const_set(:REGEXP, /\Atest-syntax\z/.freeze)
44
- end
45
- end
46
-
47
- let(:test_b) do
48
- Class.new(Mutant::Expression) do
49
- include Anima.new
50
- const_set(:REGEXP, /^test-syntax$/.freeze)
51
- end
52
- end
53
-
54
- let(:input) { 'test-syntax' }
55
-
56
- it 'returns error' do
57
- expect(apply).to eql(
58
- Mutant::Either::Left.new(
59
- 'Expression: "test-syntax" is ambiguous'
60
- )
61
- )
62
- end
63
- end
64
- end
65
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression do
4
- describe '#prefix?' do
5
- let(:object) { parse_expression('Foo*') }
6
-
7
- subject { object.prefix?(other) }
8
-
9
- context 'when object is a prefix of other' do
10
- let(:other) { parse_expression('Foo::Bar') }
11
-
12
- it { should be(true) }
13
- end
14
-
15
- context 'when other is not a prefix of other' do
16
- let(:other) { parse_expression('Bar') }
17
-
18
- it { should be(false) }
19
- end
20
- end
21
-
22
- describe '.try_parse' do
23
- let(:object) do
24
- Class.new(described_class) do
25
- include Anima.new(:foo)
26
-
27
- const_set(:REGEXP, /(?<foo>foo)/)
28
- end
29
- end
30
-
31
- subject { object.try_parse(input) }
32
-
33
- context 'good input' do
34
- let(:input) { 'foo' }
35
-
36
- it { should eql(object.new(foo: 'foo')) }
37
- end
38
-
39
- context 'bad input' do
40
- let(:input) { 'bar' }
41
-
42
- it { should be(nil) }
43
- end
44
- end
45
- end
@@ -1,201 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'mutant/integration/rspec'
4
-
5
- RSpec.describe Mutant::Integration::Rspec do
6
- let(:object) { described_class.new(Mutant::Config::DEFAULT) }
7
-
8
- let(:rspec_options) { instance_double(RSpec::Core::ConfigurationOptions) }
9
- let(:rspec_runner) { instance_double(RSpec::Core::Runner) }
10
-
11
- let(:example_a) do
12
- double(
13
- 'Example A',
14
- metadata: {
15
- location: 'example-a-location',
16
- full_description: 'example-a-full-description'
17
- }
18
- )
19
- end
20
-
21
- let(:example_b) do
22
- double(
23
- 'Example B',
24
- metadata: {
25
- location: 'example-b-location',
26
- full_description: 'example-b-full-description',
27
- mutant: false
28
- }
29
- )
30
- end
31
-
32
- let(:example_c) do
33
- double(
34
- 'Example C',
35
- metadata: {
36
- location: 'example-c-location',
37
- full_description: 'Example::C blah'
38
- }
39
- )
40
- end
41
-
42
- let(:example_d) do
43
- double(
44
- 'Example D',
45
- metadata: {
46
- location: 'example-d-location',
47
- full_description: "Example::D\nblah"
48
- }
49
- )
50
- end
51
-
52
- let(:example_e) do
53
- double(
54
- 'Example E',
55
- metadata: {
56
- location: 'example-e-location',
57
- full_description: 'Example::E',
58
- mutant_expression: 'Foo'
59
- }
60
- )
61
- end
62
-
63
- let(:examples) do
64
- [
65
- example_a,
66
- example_b,
67
- example_c,
68
- example_d,
69
- example_e
70
- ]
71
- end
72
-
73
- let(:example_groups) do
74
- [
75
- double(
76
- 'root example group',
77
- descendants: [
78
- double('example group', examples: examples)
79
- ]
80
- )
81
- ]
82
- end
83
-
84
- let(:filtered_examples) do
85
- {
86
- double('Key') => examples.dup
87
- }
88
- end
89
-
90
- let(:world) do
91
- double(
92
- 'world',
93
- example_groups: example_groups,
94
- filtered_examples: filtered_examples
95
- )
96
- end
97
-
98
- let(:all_tests) do
99
- [
100
- Mutant::Test.new(
101
- id: 'rspec:0:example-a-location/example-a-full-description',
102
- expression: parse_expression('*')
103
- ),
104
- Mutant::Test.new(
105
- id: 'rspec:1:example-c-location/Example::C blah',
106
- expression: parse_expression('Example::C')
107
- ),
108
- Mutant::Test.new(
109
- id: "rspec:2:example-d-location/Example::D\nblah",
110
- expression: parse_expression('*')
111
- ),
112
- Mutant::Test.new(
113
- id: 'rspec:3:example-e-location/Example::E',
114
- expression: parse_expression('Foo')
115
- )
116
- ]
117
- end
118
-
119
- before do
120
- expect(RSpec::Core::ConfigurationOptions).to receive(:new)
121
- .with(%w[spec --fail-fast])
122
- .and_return(rspec_options)
123
-
124
- expect(RSpec::Core::Runner).to receive(:new)
125
- .with(rspec_options)
126
- .and_return(rspec_runner)
127
-
128
- expect(RSpec).to receive_messages(world: world)
129
- allow(Mutant::Timer).to receive_messages(now: Mutant::Timer.now)
130
- end
131
-
132
- describe '#all_tests' do
133
- subject { object.all_tests }
134
-
135
- it { should eql(all_tests) }
136
- end
137
-
138
- describe '#setup' do
139
- subject { object.setup }
140
-
141
- before do
142
- expect(rspec_runner).to receive(:setup) do |error, output|
143
- expect(error).to be($stderr)
144
- output.write('foo')
145
- end
146
- end
147
-
148
- it { should be(object) }
149
- end
150
-
151
- describe '#call' do
152
- subject { object.call(tests) }
153
-
154
- before do
155
- expect(rspec_runner).to receive(:setup) do |_errors, output|
156
- output.write('the-test-output')
157
- end
158
-
159
- object.setup
160
- end
161
-
162
- let(:tests) { [all_tests.fetch(0)] }
163
-
164
- before do
165
- expect(world).to receive(:ordered_example_groups) do
166
- filtered_examples.values.flatten
167
- end
168
- expect(rspec_runner).to receive(:run_specs).with([example_a]).and_return(exit_status)
169
- end
170
-
171
- context 'on unsuccessful exit' do
172
- let(:exit_status) { 1 }
173
-
174
- it 'should return failed result' do
175
- expect(subject).to eql(
176
- Mutant::Result::Test.new(
177
- output: 'the-test-output',
178
- passed: false,
179
- runtime: 0.0,
180
- tests: tests
181
- )
182
- )
183
- end
184
- end
185
-
186
- context 'on successful exit' do
187
- let(:exit_status) { 0 }
188
-
189
- it 'should return passed result' do
190
- expect(subject).to eql(
191
- Mutant::Result::Test.new(
192
- output: 'the-test-output',
193
- passed: true,
194
- runtime: 0.0,
195
- tests: tests
196
- )
197
- )
198
- end
199
- end
200
- end
201
- end