mutant 0.8.8 → 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +9 -0
  3. data/README.md +1 -1
  4. data/Rakefile +12 -8
  5. data/bin/mutant +5 -1
  6. data/config/flay.yml +1 -1
  7. data/lib/mutant.rb +18 -17
  8. data/lib/mutant/actor.rb +1 -7
  9. data/lib/mutant/actor/env.rb +0 -4
  10. data/lib/mutant/actor/mailbox.rb +0 -4
  11. data/lib/mutant/actor/receiver.rb +0 -4
  12. data/lib/mutant/actor/sender.rb +0 -2
  13. data/lib/mutant/ast.rb +1 -5
  14. data/lib/mutant/ast/meta/const.rb +0 -2
  15. data/lib/mutant/ast/meta/optarg.rb +0 -2
  16. data/lib/mutant/ast/meta/send.rb +0 -12
  17. data/lib/mutant/ast/named_children.rb +0 -10
  18. data/lib/mutant/ast/sexp.rb +1 -5
  19. data/lib/mutant/cli.rb +19 -38
  20. data/lib/mutant/color.rb +1 -7
  21. data/lib/mutant/config.rb +11 -7
  22. data/lib/mutant/context.rb +0 -4
  23. data/lib/mutant/context/scope.rb +0 -18
  24. data/lib/mutant/delegator.rb +0 -6
  25. data/lib/mutant/diff.rb +0 -18
  26. data/lib/mutant/env.rb +8 -24
  27. data/lib/mutant/env/bootstrap.rb +18 -41
  28. data/lib/mutant/expression.rb +0 -8
  29. data/lib/mutant/expression/method.rb +6 -7
  30. data/lib/mutant/expression/methods.rb +5 -9
  31. data/lib/mutant/expression/namespace.rb +0 -13
  32. data/lib/mutant/expression/parser.rb +0 -6
  33. data/lib/mutant/integration.rb +2 -20
  34. data/lib/mutant/isolation.rb +0 -4
  35. data/lib/mutant/loader.rb +20 -35
  36. data/lib/mutant/matcher.rb +1 -1
  37. data/lib/mutant/matcher/chain.rb +1 -3
  38. data/lib/mutant/matcher/compiler.rb +0 -8
  39. data/lib/mutant/matcher/config.rb +2 -10
  40. data/lib/mutant/matcher/filter.rb +1 -3
  41. data/lib/mutant/matcher/method.rb +4 -26
  42. data/lib/mutant/matcher/method/instance.rb +1 -7
  43. data/lib/mutant/matcher/method/singleton.rb +0 -12
  44. data/lib/mutant/matcher/methods.rb +1 -19
  45. data/lib/mutant/matcher/namespace.rb +1 -7
  46. data/lib/mutant/matcher/null.rb +1 -3
  47. data/lib/mutant/matcher/scope.rb +1 -5
  48. data/lib/mutant/matcher/static.rb +0 -2
  49. data/lib/mutant/meta.rb +0 -2
  50. data/lib/mutant/meta/example.rb +0 -28
  51. data/lib/mutant/meta/example/dsl.rb +2 -16
  52. data/lib/mutant/mutation.rb +9 -18
  53. data/lib/mutant/mutator.rb +0 -24
  54. data/lib/mutant/mutator/node.rb +1 -33
  55. data/lib/mutant/mutator/node/and_asgn.rb +0 -2
  56. data/lib/mutant/mutator/node/argument.rb +0 -10
  57. data/lib/mutant/mutator/node/arguments.rb +0 -12
  58. data/lib/mutant/mutator/node/begin.rb +0 -4
  59. data/lib/mutant/mutator/node/binary.rb +2 -11
  60. data/lib/mutant/mutator/node/block.rb +0 -6
  61. data/lib/mutant/mutator/node/break.rb +0 -2
  62. data/lib/mutant/mutator/node/case.rb +0 -6
  63. data/lib/mutant/mutator/node/conditional_loop.rb +0 -2
  64. data/lib/mutant/mutator/node/const.rb +1 -3
  65. data/lib/mutant/mutator/node/define.rb +4 -11
  66. data/lib/mutant/mutator/node/defined.rb +0 -2
  67. data/lib/mutant/mutator/node/dstr.rb +0 -2
  68. data/lib/mutant/mutator/node/dsym.rb +0 -2
  69. data/lib/mutant/mutator/node/generic.rb +1 -3
  70. data/lib/mutant/mutator/node/if.rb +0 -8
  71. data/lib/mutant/mutator/node/kwbegin.rb +0 -2
  72. data/lib/mutant/mutator/node/literal/array.rb +0 -4
  73. data/lib/mutant/mutator/node/literal/boolean.rb +0 -2
  74. data/lib/mutant/mutator/node/literal/fixnum.rb +0 -6
  75. data/lib/mutant/mutator/node/literal/float.rb +0 -6
  76. data/lib/mutant/mutator/node/literal/hash.rb +0 -6
  77. data/lib/mutant/mutator/node/literal/nil.rb +0 -2
  78. data/lib/mutant/mutator/node/literal/range.rb +0 -8
  79. data/lib/mutant/mutator/node/literal/regex.rb +0 -4
  80. data/lib/mutant/mutator/node/literal/string.rb +0 -2
  81. data/lib/mutant/mutator/node/literal/symbol.rb +0 -2
  82. data/lib/mutant/mutator/node/masgn.rb +0 -2
  83. data/lib/mutant/mutator/node/match_current_line.rb +0 -2
  84. data/lib/mutant/mutator/node/mlhs.rb +0 -2
  85. data/lib/mutant/mutator/node/named_value/access.rb +0 -8
  86. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +1 -7
  87. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -4
  88. data/lib/mutant/mutator/node/next.rb +0 -2
  89. data/lib/mutant/mutator/node/noop.rb +0 -2
  90. data/lib/mutant/mutator/node/nthref.rb +0 -2
  91. data/lib/mutant/mutator/node/op_asgn.rb +0 -2
  92. data/lib/mutant/mutator/node/or_asgn.rb +0 -2
  93. data/lib/mutant/mutator/node/resbody.rb +0 -4
  94. data/lib/mutant/mutator/node/rescue.rb +0 -10
  95. data/lib/mutant/mutator/node/return.rb +0 -2
  96. data/lib/mutant/mutator/node/send.rb +4 -32
  97. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -6
  98. data/lib/mutant/mutator/node/send/binary.rb +0 -6
  99. data/lib/mutant/mutator/node/send/index.rb +0 -6
  100. data/lib/mutant/mutator/node/splat.rb +0 -2
  101. data/lib/mutant/mutator/node/super.rb +0 -2
  102. data/lib/mutant/mutator/node/when.rb +0 -10
  103. data/lib/mutant/mutator/node/yield.rb +0 -2
  104. data/lib/mutant/mutator/node/zsuper.rb +0 -2
  105. data/lib/mutant/mutator/registry.rb +0 -6
  106. data/lib/mutant/mutator/util.rb +0 -4
  107. data/lib/mutant/mutator/util/array.rb +0 -6
  108. data/lib/mutant/mutator/util/symbol.rb +0 -2
  109. data/lib/mutant/parallel.rb +21 -17
  110. data/lib/mutant/parallel/master.rb +0 -28
  111. data/lib/mutant/parallel/source.rb +0 -10
  112. data/lib/mutant/parallel/worker.rb +15 -10
  113. data/lib/mutant/parser.rb +23 -0
  114. data/lib/mutant/reporter.rb +5 -8
  115. data/lib/mutant/reporter/cli.rb +1 -15
  116. data/lib/mutant/reporter/cli/format.rb +3 -25
  117. data/lib/mutant/reporter/cli/printer.rb +0 -18
  118. data/lib/mutant/reporter/cli/printer/config.rb +0 -2
  119. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -2
  120. data/lib/mutant/reporter/cli/printer/env_result.rb +0 -2
  121. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -4
  122. data/lib/mutant/reporter/cli/printer/mutation_result.rb +0 -16
  123. data/lib/mutant/reporter/cli/printer/status.rb +0 -6
  124. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -4
  125. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -8
  126. data/lib/mutant/reporter/cli/printer/subject_result.rb +0 -2
  127. data/lib/mutant/reporter/cli/printer/test_result.rb +0 -2
  128. data/lib/mutant/reporter/cli/tput.rb +0 -4
  129. data/lib/mutant/repository.rb +4 -22
  130. data/lib/mutant/require_highjack.rb +0 -2
  131. data/lib/mutant/result.rb +23 -43
  132. data/lib/mutant/runner.rb +7 -20
  133. data/lib/mutant/runner/sink.rb +43 -86
  134. data/lib/mutant/selector.rb +0 -2
  135. data/lib/mutant/selector/expression.rb +0 -2
  136. data/lib/mutant/subject.rb +0 -22
  137. data/lib/mutant/subject/method.rb +2 -10
  138. data/lib/mutant/subject/method/instance.rb +0 -6
  139. data/lib/mutant/subject/method/singleton.rb +0 -2
  140. data/lib/mutant/test.rb +4 -3
  141. data/lib/mutant/version.rb +1 -1
  142. data/lib/mutant/warning_filter.rb +0 -10
  143. data/lib/mutant/zombifier.rb +5 -20
  144. data/meta/or_asgn.rb +6 -0
  145. data/meta/send.rb +29 -0
  146. data/mutant-rspec.gemspec +1 -1
  147. data/spec/integration/mutant/rspec_spec.rb +1 -1
  148. data/spec/integrations.yml +2 -3
  149. data/spec/shared/method_matcher_behavior.rb +7 -7
  150. data/spec/spec_helper.rb +2 -9
  151. data/spec/support/corpus.rb +37 -30
  152. data/spec/support/rb_bug.rb +1 -2
  153. data/spec/support/ruby_vm.rb +6 -3
  154. data/spec/support/shared_context.rb +19 -20
  155. data/spec/unit/mutant/actor/binding_spec.rb +6 -6
  156. data/spec/unit/mutant/actor/env_spec.rb +2 -2
  157. data/spec/unit/mutant/actor/mailbox_spec.rb +6 -6
  158. data/spec/unit/mutant/actor/message_spec.rb +2 -2
  159. data/spec/unit/mutant/actor/receiver_spec.rb +4 -4
  160. data/spec/unit/mutant/actor/sender_spec.rb +6 -6
  161. data/spec/unit/mutant/ast_spec.rb +9 -0
  162. data/spec/unit/mutant/cli_spec.rb +16 -10
  163. data/spec/unit/mutant/context/scope/root_spec.rb +1 -1
  164. data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +1 -1
  165. data/spec/unit/mutant/context/scope_spec.rb +3 -3
  166. data/spec/unit/mutant/context_spec.rb +0 -22
  167. data/spec/unit/mutant/env/boostrap_spec.rb +34 -41
  168. data/spec/unit/mutant/env_spec.rb +74 -32
  169. data/spec/unit/mutant/integration/rspec_spec.rb +23 -17
  170. data/spec/unit/mutant/integration_spec.rb +4 -4
  171. data/spec/unit/mutant/isolation_spec.rb +4 -4
  172. data/spec/unit/mutant/loader_spec.rb +42 -0
  173. data/spec/unit/mutant/matcher/compiler_spec.rb +3 -3
  174. data/spec/unit/mutant/matcher/config_spec.rb +1 -1
  175. data/spec/unit/mutant/matcher/method/instance_spec.rb +8 -1
  176. data/spec/unit/mutant/matcher/method/singleton_spec.rb +8 -1
  177. data/spec/unit/mutant/matcher/namespace_spec.rb +7 -8
  178. data/spec/unit/mutant/matcher/null_spec.rb +3 -2
  179. data/spec/unit/mutant/mutation_spec.rb +11 -5
  180. data/spec/unit/mutant/mutator/registry_spec.rb +1 -1
  181. data/spec/unit/mutant/parallel/master_spec.rb +9 -9
  182. data/spec/unit/mutant/parallel/source/array_spec.rb +3 -3
  183. data/spec/unit/mutant/parallel/worker_spec.rb +5 -5
  184. data/spec/unit/mutant/parallel_spec.rb +4 -4
  185. data/spec/unit/mutant/parser_spec.rb +24 -0
  186. data/spec/unit/mutant/reporter/cli/printer_spec.rb +3 -3
  187. data/spec/unit/mutant/reporter/cli/tput_spec.rb +2 -2
  188. data/spec/unit/mutant/reporter/cli_spec.rb +7 -7
  189. data/spec/unit/mutant/reporter/null_spec.rb +5 -4
  190. data/spec/unit/mutant/repository/diff_spec.rb +30 -18
  191. data/spec/unit/mutant/repository/subject_filter_spec.rb +5 -5
  192. data/spec/unit/mutant/require_highjack_spec.rb +1 -1
  193. data/spec/unit/mutant/result/env_spec.rb +9 -9
  194. data/spec/unit/mutant/result/subject_spec.rb +5 -5
  195. data/spec/unit/mutant/runner/driver_spec.rb +4 -4
  196. data/spec/unit/mutant/runner/{sink/mutation_spec.rb → sink_spec.rb} +16 -4
  197. data/spec/unit/mutant/runner_spec.rb +31 -31
  198. data/spec/unit/mutant/selector/expression_spec.rb +8 -8
  199. data/spec/unit/mutant/subject/method/instance_spec.rb +9 -3
  200. data/spec/unit/mutant/subject/method/singleton_spec.rb +1 -1
  201. data/spec/unit/mutant/subject_spec.rb +1 -5
  202. data/spec/unit/mutant_spec.rb +3 -3
  203. metadata +9 -15
  204. data/config/mutant.yml +0 -14
  205. data/lib/mutant/cache.rb +0 -29
  206. data/lib/mutant/reporter/trace.rb +0 -36
  207. data/spec/support/rspec.rb +0 -21
  208. data/spec/unit/mutant/cache_spec.rb +0 -22
  209. data/spec/unit/mutant/loader/eval_spec.rb +0 -44
  210. data/spec/unit/mutant/reporter/trace_spec.rb +0 -21
  211. data/test_app/Gemfile.rspec3.2 +0 -7
@@ -21,6 +21,12 @@ Mutant::Meta::Example.add do
21
21
  mutation '@a ||= 2'
22
22
  end
23
23
 
24
+ Mutant::Meta::Example.add do
25
+ source 'Foo ||= nil'
26
+
27
+ singleton_mutations
28
+ end
29
+
24
30
  Mutant::Meta::Example.add do
25
31
  source '@a ||= self.bar'
26
32
 
@@ -223,6 +223,22 @@ Mutant::Meta::Example.add do
223
223
  mutation 'self.gsub(a, b)'
224
224
  end
225
225
 
226
+ Mutant::Meta::Example.add do
227
+ source 'foo.values_at(a, b)'
228
+
229
+ singleton_mutations
230
+ mutation 'foo.fetch_values(a, b)'
231
+ mutation 'foo'
232
+ mutation 'self.values_at(a, b)'
233
+ mutation 'foo.values_at(a)'
234
+ mutation 'foo.values_at(b)'
235
+ mutation 'foo.values_at(nil, b)'
236
+ mutation 'foo.values_at(self, b)'
237
+ mutation 'foo.values_at(a, nil)'
238
+ mutation 'foo.values_at(a, self)'
239
+ mutation 'foo.values_at'
240
+ end
241
+
226
242
  Mutant::Meta::Example.add do
227
243
  source 'foo.__send__(bar)'
228
244
 
@@ -359,6 +375,15 @@ Mutant::Meta::Example.add do
359
375
  mutation 'foo(nil)'
360
376
  end
361
377
 
378
+ Mutant::Meta::Example.add do
379
+ source 'self.fetch(nil)'
380
+
381
+ singleton_mutations
382
+ mutation 'self.fetch'
383
+ mutation 'fetch(nil)'
384
+ mutation 'self.key?(nil)'
385
+ end
386
+
362
387
  Unparser::Constants::KEYWORDS.each do |keyword|
363
388
  Mutant::Meta::Example.add do
364
389
  source "foo.#{keyword}(nil)"
@@ -405,6 +430,7 @@ Mutant::Meta::Example.add do
405
430
  mutation 'foo[]'
406
431
  mutation 'foo.at(1)'
407
432
  mutation 'foo.fetch(1)'
433
+ mutation 'foo.key?(1)'
408
434
  mutation 'self[1]'
409
435
  mutation 'foo[0]'
410
436
  mutation 'foo[2]'
@@ -420,6 +446,7 @@ Mutant::Meta::Example.add do
420
446
  mutation 'self.foo'
421
447
  mutation 'self.foo.at()'
422
448
  mutation 'self.foo.fetch()'
449
+ mutation 'self.foo.key?()'
423
450
  mutation 'self[]'
424
451
  mutation 'foo[]'
425
452
  end
@@ -433,6 +460,7 @@ Mutant::Meta::Example.add do
433
460
  mutation 'self[]'
434
461
  mutation 'self.at(foo)'
435
462
  mutation 'self.fetch(foo)'
463
+ mutation 'self.key?(foo)'
436
464
  mutation 'foo'
437
465
  end
438
466
 
@@ -444,6 +472,7 @@ Mutant::Meta::Example.add do
444
472
  mutation 'foo[]'
445
473
  mutation 'foo.at(*bar)'
446
474
  mutation 'foo.fetch(*bar)'
475
+ mutation 'foo.key?(*bar)'
447
476
  mutation 'foo[nil]'
448
477
  mutation 'foo[self]'
449
478
  mutation 'foo[bar]'
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.extra_rdoc_files = %w[TODO LICENSE]
17
17
 
18
18
  gem.add_runtime_dependency('mutant', "~> #{gem.version}")
19
- gem.add_runtime_dependency('rspec-core', '>= 3.2.0', '< 3.5.0')
19
+ gem.add_runtime_dependency('rspec-core', '>= 3.3.0', '< 3.5.0')
20
20
 
21
21
  gem.add_development_dependency('bundler', '~> 1.3', '>= 1.3.5')
22
22
  end
@@ -2,7 +2,7 @@ RSpec.describe 'rspec integration', mutant: false do
2
2
 
3
3
  let(:base_cmd) { 'bundle exec mutant -I lib --require test_app --use rspec' }
4
4
 
5
- %w[3.2 3.3 3.4].each do |version|
5
+ %w[3.3 3.4].each do |version|
6
6
  context "RSpec #{version}" do
7
7
  let(:gemfile) { "Gemfile.rspec#{version}" }
8
8
 
@@ -1,18 +1,17 @@
1
1
  ---
2
2
  - name: rubyspec
3
3
  namespace: Rubyspec
4
- repo_uri: 'https://github.com/rubyspec/rubyspec.git'
4
+ repo_uri: 'https://github.com/ruby/rubyspec.git'
5
5
  mutation_coverage: false
6
6
  mutation_generation: true
7
7
  expect_coverage: 0 # not run
8
8
  exclude:
9
9
  # Binary encoded source subjected to limitations see README of unparser
10
10
  - core/array/pack/{b,h,u}_spec.rb
11
- - language/versions/*1.8*
11
+ - language/regexp/escapes_spec.rb
12
12
  - core/array/pack/shared/float.rb
13
13
  - core/array/pack/shared/integer.rb
14
14
  - core/array/pack/{c,m,w}_spec.rb
15
- - core/regexp/shared/new.rb
16
15
  - core/regexp/shared/quote.rb
17
16
  - core/encoding/compatible_spec.rb
18
17
  - core/io/readpartial_spec.rb
@@ -11,7 +11,7 @@ RSpec.shared_examples_for 'a method matcher' do
11
11
  expect(name).to eql(method_name)
12
12
  end
13
13
 
14
- it 'has epxected line number' do
14
+ it 'has expected line number' do
15
15
  expect(node.location.expression.line).to eql(method_line)
16
16
  end
17
17
 
@@ -33,13 +33,13 @@ RSpec.shared_examples_for 'a method matcher' do
33
33
  end
34
34
 
35
35
  RSpec.shared_examples_for 'skipped candidate' do
36
- it 'does not emit matcher' do
37
- expect(subject).to eql([])
36
+ before do
37
+ expected_warnings.each do |warning|
38
+ expect(env).to receive(:warn).with(warning).and_return(env)
39
+ end
38
40
  end
39
41
 
40
- it 'does warn' do
41
- subject
42
-
43
- expect(env.config.reporter.warn_calls).to eql(expected_warnings)
42
+ it 'does not emit matcher' do
43
+ expect(subject).to eql([])
44
44
  end
45
45
  end
@@ -33,9 +33,8 @@ $LOAD_PATH << File.join(TestApp.root, 'lib')
33
33
  require 'test_app'
34
34
 
35
35
  module Fixtures
36
- TEST_CONFIG = Mutant::Config::DEFAULT.with(reporter: Mutant::Reporter::Trace.new)
37
- TEST_CACHE = Mutant::Cache.new
38
- TEST_ENV = Mutant::Env::Bootstrap.(TEST_CONFIG, TEST_CACHE)
36
+ TEST_CONFIG = Mutant::Config::DEFAULT.with(reporter: Mutant::Reporter::Null.new)
37
+ TEST_ENV = Mutant::Env::Bootstrap.(TEST_CONFIG)
39
38
  end # Fixtures
40
39
 
41
40
  module ParserHelper
@@ -43,12 +42,6 @@ module ParserHelper
43
42
  Unparser.unparse(node)
44
43
  end
45
44
 
46
- def test_env
47
- Fixtures::TEST_ENV.with(
48
- config: Mutant::Config::DEFAULT.with(reporter: Mutant::Reporter::Trace.new)
49
- )
50
- end
51
-
52
45
  def parse(string)
53
46
  Unparser::Preprocessor.run(Parser::CurrentRuby.parse(string))
54
47
  end
@@ -2,6 +2,7 @@ require 'morpher'
2
2
  require 'anima'
3
3
  require 'mutant'
4
4
 
5
+ # @api private
5
6
  module MutantSpec
6
7
  ROOT = Pathname.new(__FILE__).parent.parent.parent
7
8
 
@@ -9,20 +10,28 @@ module MutantSpec
9
10
  #
10
11
  # rubocop:disable MethodLength
11
12
  module Corpus
13
+ TMP = ROOT.join('tmp').freeze
14
+ EXCLUDE_GLOB_FORMAT = '{%s}'.freeze
15
+ RUBY_GLOB_PATTERN = '**/*.rb'.freeze
16
+
17
+ # Not in the docs. Number from chatting with their support.
18
+ # 2 processors allocated per container, 4 processes works well.
19
+ CIRCLE_CI_CONTAINER_PROCESSES = 4
20
+
21
+ private_constant(*constants(false))
22
+
12
23
  # Project under corpus test
13
24
  # rubocop:disable ClassLength
14
- TMP = ROOT.join('tmp').freeze
15
-
16
25
  class Project
17
26
  MUTEX = Mutex.new
18
27
  include Adamantium, Anima.new(
19
- :name,
20
- :repo_uri,
21
28
  :exclude,
29
+ :expect_coverage,
22
30
  :mutation_coverage,
23
31
  :mutation_generation,
32
+ :name,
24
33
  :namespace,
25
- :expect_coverage
34
+ :repo_uri
26
35
  )
27
36
 
28
37
  # Verify mutation coverage
@@ -31,8 +40,6 @@ module MutantSpec
31
40
  # if successful
32
41
  #
33
42
  # @raise [Exception]
34
- #
35
- # @api private
36
43
  def verify_mutation_coverage
37
44
  checkout
38
45
  Dir.chdir(repo_path) do
@@ -59,20 +66,16 @@ module MutantSpec
59
66
  #
60
67
  # @raise [Exception]
61
68
  # otherwise
62
- #
63
- # rubocop:disable AbcSize
64
- #
65
- # @api private
66
69
  def verify_mutation_generation
67
70
  checkout
68
71
  start = Time.now
69
- paths = Pathname.glob(repo_path.join('**/*.rb')).sort_by(&:size).reverse
72
+
70
73
  options = {
71
74
  finish: method(:finish),
72
75
  start: method(:start),
73
76
  in_processes: parallel_processes
74
77
  }
75
- total = Parallel.map(paths, options) do |path|
78
+ total = Parallel.map(effective_ruby_paths, options) do |path|
76
79
  count = 0
77
80
  node =
78
81
  begin
@@ -100,8 +103,6 @@ module MutantSpec
100
103
  # Checkout repository
101
104
  #
102
105
  # @return [self]
103
- #
104
- # @api private
105
106
  def checkout
106
107
  return self if noinstall?
107
108
  TMP.mkdir unless TMP.directory?
@@ -126,8 +127,6 @@ module MutantSpec
126
127
  # Install mutant
127
128
  #
128
129
  # @return [undefined]
129
- #
130
- # @api private
131
130
  def install_mutant
132
131
  return if noinstall?
133
132
  relative = ROOT.relative_path_from(repo_path)
@@ -138,20 +137,34 @@ module MutantSpec
138
137
  end
139
138
  lockfile = repo_path.join('Gemfile.lock')
140
139
  lockfile.delete if lockfile.exist?
141
- system('bundle install')
140
+ system(%w[bundle])
142
141
  end
143
142
 
144
- # Not in the docs. Number from chatting with their support.
145
- CIRCLE_CI_CONTAINER_PROCESSES = 2
143
+ # The effective ruby file paths
144
+ #
145
+ # @return [Array<Pathname>]
146
+ def effective_ruby_paths
147
+ paths = Pathname
148
+ .glob(repo_path.join(RUBY_GLOB_PATTERN))
149
+ .sort_by(&:size)
150
+ .reverse
151
+
152
+ paths - excluded_paths
153
+ end
154
+
155
+ # The excluded file paths
156
+ #
157
+ # @return [Array<Pathname>]
158
+ def excluded_paths
159
+ Pathname.glob(repo_path.join(EXCLUDE_GLOB_FORMAT % exclude.join(',')))
160
+ end
146
161
 
147
162
  # Number of parallel processes to use
148
163
  #
149
164
  # @return [Fixnum]
150
- #
151
- # @api private
152
165
  def parallel_processes
153
- if ENV['CI']
154
- Mutant::Config::DEFAULT.jobs
166
+ if ENV.key?('CI')
167
+ CIRCLE_CI_CONTAINER_PROCESSES
155
168
  else
156
169
  Parallel.processor_count
157
170
  end
@@ -160,8 +173,6 @@ module MutantSpec
160
173
  # Repository path
161
174
  #
162
175
  # @return [Pathname]
163
- #
164
- # @api private
165
176
  def repo_path
166
177
  TMP.join(name)
167
178
  end
@@ -169,8 +180,6 @@ module MutantSpec
169
180
  # Test if installation should be skipped
170
181
  #
171
182
  # @return [Boolean]
172
- #
173
- # @api private
174
183
  def noinstall?
175
184
  ENV.key?('NOINSTALL')
176
185
  end
@@ -205,8 +214,6 @@ module MutantSpec
205
214
  # Helper method to execute system commands
206
215
  #
207
216
  # @param [Array<String>] arguments
208
- #
209
- # @api private
210
217
  def system(arguments)
211
218
  return if Kernel.system(*arguments)
212
219
  if block_given?
@@ -1,5 +1,6 @@
1
1
  require 'ffi'
2
2
 
3
+ # @api private
3
4
  module RbBug
4
5
  extend FFI::Library
5
6
  ffi_lib 'ruby'
@@ -8,8 +9,6 @@ module RbBug
8
9
  # Call the test bug
9
10
  #
10
11
  # @return [undefined]
11
- #
12
- # @api private
13
12
  def self.call
14
13
  rb_bug('%s', :string, 'test bug')
15
14
  end
@@ -12,7 +12,10 @@ module MutantSpec
12
12
 
13
13
  # An event being expected, can advance the VM
14
14
  class EventExpectation
15
- include AbstractType, Anima.new(:expected_payload, :trigger_requires)
15
+ include AbstractType, Anima.new(
16
+ :expected_payload,
17
+ :trigger_requires
18
+ )
16
19
 
17
20
  DEFAULTS = IceNine.deep_freeze(trigger_requires: [])
18
21
 
@@ -56,8 +59,8 @@ module MutantSpec
56
59
  handle_event(
57
60
  EventObservation.new(
58
61
  EventExpectation::Eval,
59
- binding: binding,
60
- source: source,
62
+ binding: binding,
63
+ source: source,
61
64
  source_location: location
62
65
  )
63
66
  )
@@ -25,22 +25,22 @@ module SharedContext
25
25
  # rubocop:disable MethodLength
26
26
  # rubocop:disable AbcSize
27
27
  def setup_shared_context
28
- let(:env) { double('env', config: config, subjects: [subject_a], mutations: mutations) }
29
- let(:job_a) { Mutant::Parallel::Job.new(index: 0, payload: mutation_a) }
30
- let(:job_b) { Mutant::Parallel::Job.new(index: 1, payload: mutation_b) }
31
- let(:job_a_result) { Mutant::Runner::JobResult.new(job: job_a, result: mutation_a_result) }
32
- let(:job_b_result) { Mutant::Runner::JobResult.new(job: job_b, result: mutation_b_result) }
33
- let(:test_a) { double('test a', identification: 'test-a') }
34
- let(:test_b) { double('test b', identification: 'test-b') }
35
- let(:output) { StringIO.new }
36
- let(:matchable_scopes) { double('matchable scopes', length: 10) }
37
- let(:message_sequence) { FakeActor::MessageSequence.new }
38
- let(:mutations) { [mutation_a, mutation_b] }
39
- let(:mutation_a_node) { s(:false) }
40
- let(:mutation_b_node) { s(:nil) }
41
- let(:mutation_b) { Mutant::Mutation::Evil.new(subject_a, mutation_b_node) }
42
- let(:mutation_a) { Mutant::Mutation::Evil.new(subject_a, mutation_a_node) }
43
- let(:subject_a_node) { s(:true) }
28
+ let(:env) { instance_double(Mutant::Env, config: config, subjects: [subject_a], mutations: mutations) }
29
+ let(:job_a) { Mutant::Parallel::Job.new(index: 0, payload: mutation_a) }
30
+ let(:job_b) { Mutant::Parallel::Job.new(index: 1, payload: mutation_b) }
31
+ let(:job_a_result) { Mutant::Runner::JobResult.new(job: job_a, result: mutation_a_result) }
32
+ let(:job_b_result) { Mutant::Runner::JobResult.new(job: job_b, result: mutation_b_result) }
33
+ let(:test_a) { instance_double(Mutant::Test, identification: 'test-a') }
34
+ let(:test_b) { instance_double(Mutant::Test, identification: 'test-b') }
35
+ let(:output) { StringIO.new }
36
+ let(:matchable_scopes) { instance_double(Array, length: 10) }
37
+ let(:message_sequence) { FakeActor::MessageSequence.new }
38
+ let(:mutations) { [mutation_a, mutation_b] }
39
+ let(:mutation_a_node) { s(:false) }
40
+ let(:mutation_b_node) { s(:nil) }
41
+ let(:mutation_b) { Mutant::Mutation::Evil.new(subject_a, mutation_b_node) }
42
+ let(:mutation_a) { Mutant::Mutation::Evil.new(subject_a, mutation_a_node) }
43
+ let(:subject_a_node) { s(:true) }
44
44
 
45
45
  let(:status) do
46
46
  Mutant::Parallel::Status.new(
@@ -53,16 +53,15 @@ module SharedContext
53
53
  let(:config) do
54
54
  Mutant::Config::DEFAULT.with(
55
55
  jobs: 1,
56
- reporter: Mutant::Reporter::Trace.new
56
+ reporter: Mutant::Reporter::Null.new
57
57
  )
58
58
  end
59
59
 
60
60
  let(:subject_a) do
61
- double(
62
- 'subject a',
61
+ instance_double(
62
+ Mutant::Subject,
63
63
  node: subject_a_node,
64
64
  source: Unparser.unparse(subject_a_node),
65
- tests: [test_a],
66
65
  identification: 'subject-a'
67
66
  )
68
67
  end
@@ -1,10 +1,10 @@
1
1
  RSpec.describe Mutant::Actor::Binding do
2
- let(:actor_a) { double('Actor-A', sender: sender_a, receiver: receiver_a) }
3
- let(:sender_a) { double('Sender-A') }
4
- let(:sender_b) { double('Sender-B') }
5
- let(:receiver_a) { double('Receiver-A') }
6
- let(:payload) { double('Payload') }
7
- let(:type) { double('Type') }
2
+ let(:actor_a) { instance_double(Mutant::Actor::Mailbox, sender: sender_a, receiver: receiver_a) }
3
+ let(:sender_a) { instance_double(Mutant::Actor::Sender) }
4
+ let(:sender_b) { instance_double(Mutant::Actor::Sender) }
5
+ let(:receiver_a) { instance_double(Mutant::Actor::Receiver) }
6
+ let(:payload) { instance_double(Object) }
7
+ let(:type) { instance_double(Symbol) }
8
8
 
9
9
  let(:object) { described_class.new(actor_a, sender_b) }
10
10