mutant 0.2.20 → 0.3.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +10 -11
  3. data/Changelog.md +93 -38
  4. data/Gemfile +3 -1
  5. data/Gemfile.devtools +16 -20
  6. data/Guardfile +1 -1
  7. data/README.md +36 -16
  8. data/Rakefile +21 -2
  9. data/TODO +11 -7
  10. data/bin/mutant +4 -0
  11. data/bin/zombie +4 -0
  12. data/config/devtools.yml +2 -0
  13. data/config/flay.yml +2 -2
  14. data/config/flog.yml +1 -1
  15. data/config/{site.reek → reek.yml} +94 -70
  16. data/lib/mutant/cli/classifier/method.rb +100 -0
  17. data/lib/mutant/cli/classifier/namespace.rb +47 -0
  18. data/lib/mutant/cli/classifier/scope.rb +35 -0
  19. data/lib/mutant/cli/classifier.rb +141 -0
  20. data/lib/mutant/cli.rb +115 -162
  21. data/lib/mutant/color.rb +2 -2
  22. data/lib/mutant/config.rb +27 -0
  23. data/lib/mutant/constants.rb +32 -17
  24. data/lib/mutant/context/scope.rb +33 -51
  25. data/lib/mutant/context.rb +8 -19
  26. data/lib/mutant/differ.rb +5 -5
  27. data/lib/mutant/helper.rb +2 -17
  28. data/lib/mutant/killer/forked.rb +44 -0
  29. data/lib/mutant/killer/forking.rb +3 -57
  30. data/lib/mutant/killer/rspec.rb +16 -20
  31. data/lib/mutant/killer/static.rb +6 -7
  32. data/lib/mutant/killer.rb +48 -74
  33. data/lib/mutant/loader.rb +6 -6
  34. data/lib/mutant/matcher/chain.rb +4 -25
  35. data/lib/mutant/matcher/method/instance.rb +14 -24
  36. data/lib/mutant/matcher/method/singleton.rb +35 -46
  37. data/lib/mutant/matcher/method.rb +95 -83
  38. data/lib/mutant/matcher/{scope_methods.rb → methods.rb} +53 -76
  39. data/lib/mutant/matcher/namespace.rb +71 -0
  40. data/lib/mutant/matcher/scope.rb +34 -0
  41. data/lib/mutant/matcher.rb +24 -34
  42. data/lib/mutant/mutation/evil.rb +35 -0
  43. data/lib/mutant/mutation/filter/code.rb +7 -28
  44. data/lib/mutant/mutation/filter/regexp.rb +6 -18
  45. data/lib/mutant/mutation/filter/whitelist.rb +5 -4
  46. data/lib/mutant/mutation/filter.rb +10 -9
  47. data/lib/mutant/mutation/neutral.rb +35 -0
  48. data/lib/mutant/mutation.rb +21 -61
  49. data/lib/mutant/mutator/node/argument.rb +88 -0
  50. data/lib/mutant/mutator/node/arguments.rb +52 -0
  51. data/lib/mutant/mutator/node/assignment.rb +34 -38
  52. data/lib/mutant/mutator/node/begin.rb +33 -0
  53. data/lib/mutant/mutator/node/block.rb +14 -14
  54. data/lib/mutant/mutator/node/case.rb +59 -0
  55. data/lib/mutant/mutator/node/define.rb +26 -22
  56. data/lib/mutant/mutator/node/if.rb +31 -71
  57. data/lib/mutant/mutator/node/literal/array.rb +25 -9
  58. data/lib/mutant/mutator/node/literal/boolean.rb +13 -30
  59. data/lib/mutant/mutator/node/literal/dynamic.rb +6 -5
  60. data/lib/mutant/mutator/node/literal/fixnum.rb +18 -7
  61. data/lib/mutant/mutator/node/literal/float.rb +15 -8
  62. data/lib/mutant/mutator/node/literal/hash.rb +33 -52
  63. data/lib/mutant/mutator/node/literal/nil.rb +8 -7
  64. data/lib/mutant/mutator/node/literal/range.rb +25 -50
  65. data/lib/mutant/mutator/node/literal/regex.rb +15 -23
  66. data/lib/mutant/mutator/node/literal/string.rb +7 -6
  67. data/lib/mutant/mutator/node/literal/symbol.rb +7 -6
  68. data/lib/mutant/mutator/node/literal.rb +4 -46
  69. data/lib/mutant/mutator/node/mlhs.rb +27 -0
  70. data/lib/mutant/mutator/node/noop.rb +18 -43
  71. data/lib/mutant/mutator/node/return.rb +8 -8
  72. data/lib/mutant/mutator/node/send/binary.rb +31 -0
  73. data/lib/mutant/mutator/node/send.rb +106 -72
  74. data/lib/mutant/mutator/node/super.rb +15 -20
  75. data/lib/mutant/mutator/node/when.rb +32 -7
  76. data/lib/mutant/mutator/node/while.rb +9 -7
  77. data/lib/mutant/mutator/node.rb +116 -66
  78. data/lib/mutant/mutator/registry.rb +14 -11
  79. data/lib/mutant/mutator/util/array.rb +9 -9
  80. data/lib/mutant/mutator/util/symbol.rb +6 -20
  81. data/lib/mutant/mutator/util.rb +6 -3
  82. data/lib/mutant/mutator.rb +12 -28
  83. data/lib/mutant/node_helpers.rb +28 -0
  84. data/lib/mutant/random.rb +3 -2
  85. data/lib/mutant/reporter/cli/printer/config.rb +174 -0
  86. data/lib/mutant/reporter/cli/printer/killer.rb +42 -0
  87. data/lib/mutant/reporter/cli/printer/mutation.rb +55 -0
  88. data/lib/mutant/reporter/cli/printer/subject.rb +147 -0
  89. data/lib/mutant/reporter/cli/printer.rb +165 -0
  90. data/lib/mutant/reporter/cli.rb +9 -277
  91. data/lib/mutant/reporter/null.rb +6 -30
  92. data/lib/mutant/reporter.rb +6 -73
  93. data/lib/mutant/runner/config.rb +82 -0
  94. data/lib/mutant/runner/mutation.rb +58 -0
  95. data/lib/mutant/runner/subject.rb +81 -0
  96. data/lib/mutant/runner.rb +42 -92
  97. data/lib/mutant/singleton_methods.rb +2 -2
  98. data/lib/mutant/strategy/method_expansion.rb +51 -0
  99. data/lib/mutant/strategy/rspec/dm2/lookup/method.rb +142 -0
  100. data/lib/mutant/strategy/rspec/dm2/lookup.rb +61 -0
  101. data/lib/mutant/strategy/rspec/dm2.rb +22 -0
  102. data/lib/mutant/strategy/rspec.rb +20 -22
  103. data/lib/mutant/strategy/static.rb +18 -0
  104. data/lib/mutant/strategy.rb +15 -50
  105. data/lib/mutant/subject/method.rb +100 -0
  106. data/lib/mutant/subject.rb +18 -49
  107. data/lib/mutant/support/method_object.rb +4 -2
  108. data/lib/mutant.rb +40 -35
  109. data/mutant.gemspec +9 -8
  110. data/spec/integration/mutant/rspec_killer_spec.rb +3 -3
  111. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +9 -0
  112. data/spec/integration/mutant/zombie_spec.rb +1 -1
  113. data/spec/shared/method_matcher_behavior.rb +35 -0
  114. data/spec/shared/mutator_behavior.rb +63 -32
  115. data/spec/spec_helper.rb +13 -3
  116. data/spec/support/ice_nine_config.rb +8 -0
  117. data/spec/support/rspec.rb +1 -1
  118. data/spec/support/zombie.rb +1 -1
  119. data/spec/unit/mutant/cli/class_methods/new_spec.rb +42 -28
  120. data/spec/unit/mutant/cli/class_methods/run_spec.rb +15 -13
  121. data/spec/unit/mutant/cli/classifier/class_methods/build_spec.rb +44 -0
  122. data/spec/unit/mutant/context/scope/root_spec.rb +4 -4
  123. data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +6 -5
  124. data/spec/unit/mutant/killer/success_predicate_spec.rb +28 -0
  125. data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +1 -1
  126. data/spec/unit/mutant/matcher/chain/each_spec.rb +1 -1
  127. data/spec/unit/mutant/matcher/chain/matchers_spec.rb +1 -1
  128. data/spec/unit/mutant/matcher/method/instance/each_spec.rb +112 -0
  129. data/spec/unit/mutant/matcher/method/singleton/each_spec.rb +93 -0
  130. data/spec/unit/mutant/matcher/methods/instance/each_spec.rb +59 -0
  131. data/spec/unit/mutant/matcher/methods/singleton/each_spec.rb +53 -0
  132. data/spec/unit/mutant/matcher/namespace/each_spec.rb +37 -0
  133. data/spec/unit/mutant/mutator/node/begin/mutation_spec.rb +33 -0
  134. data/spec/unit/mutant/mutator/node/block/mutation_spec.rb +42 -14
  135. data/spec/unit/mutant/mutator/node/case/mutation_spec.rb +319 -0
  136. data/spec/unit/mutant/mutator/node/define/mutation_spec.rb +31 -27
  137. data/spec/unit/mutant/mutator/node/if/mutation_spec.rb +75 -0
  138. data/spec/unit/mutant/mutator/node/literal/fixnum_spec.rb +1 -1
  139. data/spec/unit/mutant/mutator/node/literal/hash_spec.rb +2 -2
  140. data/spec/unit/mutant/mutator/node/literal/nil_spec.rb +1 -3
  141. data/spec/unit/mutant/mutator/node/literal/regex_spec.rb +1 -9
  142. data/spec/unit/mutant/mutator/node/return/mutation_spec.rb +6 -2
  143. data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +111 -108
  144. data/spec/unit/mutant/mutator/node/super/mutation_spec.rb +0 -33
  145. data/spec/unit/mutant/mutator/node/while/mutation_spec.rb +2 -2
  146. data/spec/unit/mutant/runner/config/subjects_spec.rb +38 -0
  147. data/spec/unit/mutant/runner/config/success_predicate_spec.rb +53 -0
  148. data/spec/unit/mutant/runner/failed_predicte_spec.rb +33 -0
  149. data/spec/unit/mutant/runner/mutation/killer_spec.rb +39 -0
  150. data/spec/unit/mutant/runner/subject/success_predicate_spec.rb +49 -0
  151. data/spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb +49 -0
  152. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +52 -0
  153. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +42 -0
  154. data/spec/unit/mutant/subject/context_spec.rb +6 -3
  155. data/spec/unit/mutant/subject/each_spec.rb +11 -8
  156. data/spec/unit/mutant/subject/node_spec.rb +6 -2
  157. data/test_app/spec/shared/method_filter_parse_behavior.rb +0 -2
  158. data/test_app/spec/shared/method_match_behavior.rb +1 -1
  159. data/test_app/spec/spec_helper.rb +4 -2
  160. metadata +101 -109
  161. data/config/roodi.yml +0 -26
  162. data/lib/mutant/matcher/method/classifier.rb +0 -141
  163. data/lib/mutant/matcher/object_space.rb +0 -114
  164. data/lib/mutant/mutator/node/actual_arguments.rb +0 -25
  165. data/lib/mutant/mutator/node/default_arguments.rb +0 -25
  166. data/lib/mutant/mutator/node/formal_arguments_19/default_mutations.rb +0 -33
  167. data/lib/mutant/mutator/node/formal_arguments_19/pattern_argument_expansion.rb +0 -35
  168. data/lib/mutant/mutator/node/formal_arguments_19/require_defaults.rb +0 -37
  169. data/lib/mutant/mutator/node/formal_arguments_19.rb +0 -41
  170. data/lib/mutant/mutator/node/iter_19.rb +0 -27
  171. data/lib/mutant/mutator/node/literal/empty_array.rb +0 -26
  172. data/lib/mutant/mutator/node/pattern_arguments.rb +0 -41
  173. data/lib/mutant/mutator/node/pattern_variable.rb +0 -23
  174. data/lib/mutant/mutator/node/receiver_case.rb +0 -122
  175. data/lib/mutant/mutator/node/send/binary_operator_method.rb +0 -61
  176. data/lib/mutant/mutator/node/send/with_arguments.rb +0 -81
  177. data/lib/mutant/reporter/stats.rb +0 -120
  178. data/lib/mutant/strategy/rspec/example_lookup.rb +0 -163
  179. data/spec/integration/mutant/method_matching_spec.rb +0 -269
  180. data/spec/shared/method_match_behavior.rb +0 -39
  181. data/spec/unit/mutant/killer/fail_ques_spec.rb +0 -39
  182. data/spec/unit/mutant/matcher/class_methods/from_string_spec.rb +0 -49
  183. data/spec/unit/mutant/matcher/class_methods/parse_spec.rb +0 -12
  184. data/spec/unit/mutant/matcher/method/class_methods/parse_spec.rb +0 -21
  185. data/spec/unit/mutant/matcher/method/classifier/class_methods/run_spec.rb +0 -52
  186. data/spec/unit/mutant/matcher/object_space/class_methods/parse_spec.rb +0 -24
  187. data/spec/unit/mutant/matcher/object_space/each_spec.rb +0 -31
  188. data/spec/unit/mutant/mutator/node/if_statement/mutation_spec.rb +0 -60
  189. data/spec/unit/mutant/mutator/node/receiver_case/mutation_spec.rb +0 -27
  190. data/spec/unit/mutant/strategy/rspec/example_lookup/spec_file_spec.rb +0 -236
  191. data/spec/unit/mutant/subject/class_methods/new_spec.rb +0 -13
  192. data/tasks/metrics/ci.rake +0 -7
  193. data/tasks/metrics/flay.rake +0 -41
  194. data/tasks/metrics/flog.rake +0 -43
  195. data/tasks/metrics/heckle.rake +0 -216
  196. data/tasks/metrics/metric_fu.rake +0 -31
  197. data/tasks/metrics/reek.rake +0 -15
  198. data/tasks/metrics/roodi.rake +0 -15
  199. data/tasks/metrics/yardstick.rake +0 -23
  200. data/tasks/spec.rake +0 -45
  201. data/tasks/yard.rake +0 -9
data/lib/mutant/helper.rb CHANGED
@@ -19,20 +19,5 @@ module Mutant
19
19
  Marshal.load(Marshal.dump(object))
20
20
  end
21
21
 
22
- # Extract option from options hash
23
- #
24
- # @param [Hash] options
25
- # @param [Object] key
26
- #
27
- # @return [Object] value
28
- #
29
- # @api private
30
- #
31
- def self.extract_option(options, key)
32
- options.fetch(key) do
33
- raise ArgumentError,"Missing #{key.inspect} in options"
34
- end
35
- end
36
-
37
- end
38
- end
22
+ end # Helper
23
+ end # Mutant
@@ -0,0 +1,44 @@
1
+ module Mutant
2
+ class Killer
3
+
4
+ # Killer that executes other killer in forked environment
5
+ class Forked < self
6
+
7
+ # Initialize object
8
+ #
9
+ # @param [Killer] killer
10
+ # @param [Strategy] strategy
11
+ # @param [Mutation] mutation
12
+ #
13
+ # @api private
14
+ #
15
+ def initialize(killer, strategy, mutation)
16
+ @killer = killer
17
+ super(strategy, mutation)
18
+ end
19
+
20
+ private
21
+
22
+ # Run killer
23
+ #
24
+ # @return [true]
25
+ # if mutant was killed
26
+ #
27
+ # @return [false]
28
+ # otherwise
29
+ #
30
+ # @api private
31
+ #
32
+ def run
33
+ pid = fork do
34
+ killer = @killer.new(strategy, mutation)
35
+ exit(killer.success? ? CLI::EXIT_SUCCESS : CLI::EXIT_FAILURE)
36
+ end
37
+
38
+ status = Process.wait2(pid).last
39
+ status.exited? && status.success?
40
+ end
41
+
42
+ end # Forked
43
+ end # Killer
44
+ end # Mutant
@@ -1,59 +1,6 @@
1
1
  module Mutant
2
2
  class Killer
3
3
 
4
- # Killer that executes other killer in forked environment
5
- class Forked < self
6
-
7
- # Initialize object
8
- #
9
- # @param [Killer] killer
10
- # @param [Strategy] strategy
11
- # @param [Mutation] mutation
12
- #
13
- # @api private
14
- #
15
- def initialize(killer, strategy, mutation)
16
- @killer = killer
17
- super(strategy, mutation)
18
- end
19
-
20
- # Return killer type
21
- #
22
- # @return [String]
23
- #
24
- # @api private
25
- #
26
- def type
27
- @killer.type
28
- end
29
-
30
- private
31
-
32
- # Run killer
33
- #
34
- # @return [true]
35
- # if mutant was killed
36
- #
37
- # @return [false]
38
- # otherwise
39
- #
40
- # @api private
41
- #
42
- def run
43
- fork do
44
- begin
45
- killer = @killer.new(strategy, mutation)
46
- Kernel.exit(killer.fail? ? 1 : 0)
47
- rescue
48
- Kernel.exit(1)
49
- end
50
- end
51
-
52
- status = Process.wait2.last
53
- status.exitstatus.zero?
54
- end
55
- end
56
-
57
4
  # A killer that executes other killer in forked environemnts
58
5
  class Forking < self
59
6
  include Equalizer.new(:killer)
@@ -92,7 +39,6 @@ module Mutant
92
39
  Forked.new(killer, strategy, mutation)
93
40
  end
94
41
 
95
- end
96
-
97
- end
98
- end
42
+ end # Forking
43
+ end # Killer
44
+ end # Mutant
@@ -2,36 +2,31 @@ module Mutant
2
2
  class Killer
3
3
  # Runner for rspec tests
4
4
  class Rspec < self
5
- TYPE = 'rspec'.freeze
6
5
 
7
6
  private
8
7
 
9
- # Initialize rspec runner
10
- #
11
- # @return [undefined]
12
- #
13
- # @api private
14
- #
15
- def initialize(*)
16
- @error_stream, @output_stream = StringIO.new, StringIO.new
17
- super
18
- end
19
-
20
8
  # Run rspec test
21
9
  #
22
10
  # @return [true]
23
- # returns true when test is NOT successful and the mutant was killed
11
+ # when test is NOT successful
24
12
  #
25
13
  # @return [false]
26
- # returns false otherwise
14
+ # otherwise
27
15
  #
28
16
  # @api private
29
17
  #
30
18
  def run
31
19
  mutation.insert
32
- !::RSpec::Core::Runner.run(command_line_arguments, strategy.error_stream, strategy.output_stream).zero?
20
+ # TODO: replace with real streams from configuration
21
+ require 'stringio'
22
+ null = StringIO.new
23
+ args = command_line_arguments
24
+ begin
25
+ !::RSpec::Core::Runner.run(args, null, null).zero?
26
+ rescue StandardError
27
+ true
28
+ end
33
29
  end
34
- memoize :run
35
30
 
36
31
  # Return command line arguments
37
32
  #
@@ -42,8 +37,9 @@ module Mutant
42
37
  def command_line_arguments
43
38
  %W(
44
39
  --fail-fast
45
- ) + strategy.spec_files(mutation)
40
+ ) + strategy.spec_files(mutation.subject)
46
41
  end
47
- end
48
- end
49
- end
42
+
43
+ end # Rspec
44
+ end # Killer
45
+ end # Mutant
@@ -19,15 +19,14 @@ module Mutant
19
19
 
20
20
  # Killer that is always successful
21
21
  class Success < self
22
- TYPE = 'success'.freeze
23
22
  RESULT = true
24
- end
23
+ end # Success
25
24
 
26
25
  # Killer that always fails
27
26
  class Fail < self
28
- TYPE = 'fail'.freeze
29
27
  RESULT = false
30
- end
31
- end
32
- end
33
- end
28
+ end # Fail
29
+
30
+ end # Static
31
+ end # Killer
32
+ end # Mutant
data/lib/mutant/killer.rb CHANGED
@@ -1,113 +1,87 @@
1
1
  module Mutant
2
2
  # Abstract base class for mutant killers
3
3
  class Killer
4
- include Adamantium::Flat, AbstractType
5
-
6
- # Test for kill failure
7
- #
8
- # @return [true]
9
- # returns true when mutant was killed
10
- #
11
- # @return [false]
12
- # returns false otherwise
13
- #
14
- # @api private
15
- #
16
- def fail?
17
- !@killed
18
- end
4
+ include Adamantium::Flat, AbstractType, Equalizer.new(:strategy, :mutation, :killed?)
19
5
 
20
- # Return runtime of killer
6
+ # Return strategy
21
7
  #
22
- # @return [Float]
8
+ # @return [Strategy]
23
9
  #
24
10
  # @api private
25
11
  #
26
- attr_reader :runtime
12
+ attr_reader :strategy
27
13
 
28
- # Return original source
14
+ # Return mutation to kill
29
15
  #
30
- # @return [String]
16
+ # @return [Mutation]
31
17
  #
32
18
  # @api private
33
19
  #
34
- def original_source
35
- mutation.original_source
36
- end
20
+ attr_reader :mutation
37
21
 
38
- # Return mutated source
22
+ # Initialize killer object
39
23
  #
40
- # @return [String]
24
+ # @param [Strategy] strategy
25
+ # @param [Mutation] mutation
26
+ #
27
+ # @return [undefined]
41
28
  #
42
29
  # @api private
43
30
  #
44
- def mutation_source
45
- mutation.source
31
+ def initialize(strategy, mutation)
32
+ @strategy, @mutation = strategy, mutation
33
+ run_with_benchmark
46
34
  end
47
35
 
48
- # Return strategy
49
- #
50
- # @return [Strategy]
51
- #
52
- # @api private
36
+ # Test for kill failure
53
37
  #
54
- attr_reader :strategy
55
-
56
- # Return name of killer
38
+ # @return [true]
39
+ # when killer succeeded
57
40
  #
58
- # @return [String]
41
+ # @return [false]
42
+ # otherwise
59
43
  #
60
44
  # @api private
61
45
  #
62
- def self.type
63
- self::TYPE
46
+ def success?
47
+ mutation.success?(self)
64
48
  end
49
+ memoize :success?
65
50
 
66
- # Return identification
67
- #
68
- # @return [String]
51
+ # Test if mutant was killed
69
52
  #
70
- # @api private
71
- #
72
- def identification
73
- "#{type}:#{mutation.identification}".freeze
74
- end
75
- memoize :identification
76
-
77
- # Return mae of killer
53
+ # @return [true]
54
+ # if mutant was killed
78
55
  #
79
- # @return [String]
56
+ # @return [false]
57
+ # otherwise
80
58
  #
81
59
  # @api private
82
60
  #
83
- def type
84
- self.class.type
61
+ def killed?
62
+ @killed
85
63
  end
86
64
 
87
- # Return mutation to kill
65
+ # Return runtime of killer
88
66
  #
89
- # @return [Mutation]
67
+ # @return [Float]
90
68
  #
91
69
  # @api private
92
70
  #
93
- attr_reader :mutation
94
-
95
- private
71
+ attr_reader :runtime
96
72
 
97
- # Initialize killer object
98
- #
99
- # @param [Mutation] mutation
73
+ # Return mutated source
100
74
  #
101
- # @return [undefined]
75
+ # @return [String]
102
76
  #
103
77
  # @api private
104
78
  #
105
- def initialize(strategy, mutation)
106
- @strategy, @mutation = strategy, mutation
107
-
108
- run_with_benchmark
79
+ def mutation_source
80
+ mutation.source
109
81
  end
110
82
 
83
+ private
84
+
111
85
  # Run with taking the time
112
86
  #
113
87
  # @return [undefined]
@@ -115,23 +89,23 @@ module Mutant
115
89
  # @api private
116
90
  #
117
91
  def run_with_benchmark
118
- start_time = Time.now
119
- @killed = run
120
- end_time = Time.now
121
- @runtime = end_time - start_time
92
+ times = Benchmark.measure do
93
+ @killed = run
94
+ end
95
+ @runtime = times.real
122
96
  end
123
97
 
124
- # Run test
98
+ # Run killer
125
99
  #
126
100
  # @return [true]
127
- # returns true when mutant was killed
101
+ # when mutant was killed
128
102
  #
129
103
  # @return [false]
130
- # returns false otherwise
104
+ # otherwise
131
105
  #
132
106
  # @api private
133
107
  #
134
108
  abstract_method :run
135
109
 
136
- end
137
- end
110
+ end # Killer
111
+ end # Mutant
data/lib/mutant/loader.rb CHANGED
@@ -16,7 +16,7 @@ module Mutant
16
16
 
17
17
  # Initialize and insert mutation into vm
18
18
  #
19
- # @param [Rubinius::AST::Script] root
19
+ # @param [Parser::AST::Node] root
20
20
  # @param [Subject] subject
21
21
  #
22
22
  # @return [undefined]
@@ -40,7 +40,7 @@ module Mutant
40
40
  # @api private
41
41
  #
42
42
  def run
43
- Kernel.eval(source, TOPLEVEL_BINDING, @subject.source_path, @subject.source_line)
43
+ eval(source, TOPLEVEL_BINDING, @subject.source_path, @subject.source_line)
44
44
  end
45
45
 
46
46
  # Return source
@@ -50,9 +50,9 @@ module Mutant
50
50
  # @api private
51
51
  #
52
52
  def source
53
- ToSource.to_source(@root)
53
+ Unparser.unparse(@root)
54
54
  end
55
- end
55
+ end # Eval
56
56
 
57
- end
58
- end
57
+ end # Loader
58
+ end # Mutant
@@ -2,7 +2,7 @@ module Mutant
2
2
  class Matcher
3
3
  # A chain of matchers
4
4
  class Chain < self
5
- include Equalizer.new(:matchers)
5
+ include Concord::Public.new(:matchers)
6
6
 
7
7
  # Enumerate subjects
8
8
  #
@@ -24,14 +24,6 @@ module Mutant
24
24
  self
25
25
  end
26
26
 
27
- # Return the chain of matchers
28
- #
29
- # @return [Enumerable<Chain>]
30
- #
31
- # @api private
32
- #
33
- attr_reader :matchers
34
-
35
27
  # Build matcher chain
36
28
  #
37
29
  # @param [Enumerable<Matcher>] matchers
@@ -48,19 +40,6 @@ module Mutant
48
40
  new(matchers)
49
41
  end
50
42
 
51
- private
52
-
53
- # Initialize chain matcher
54
- #
55
- # @param [Enumerable<Matcher>] matchers
56
- #
57
- # @return [undefined]
58
- #
59
- # @api private
60
- #
61
- def initialize(matchers)
62
- @matchers = matchers
63
- end
64
- end
65
- end
66
- end
43
+ end # Chain
44
+ end # Matcher
45
+ end # Mutant
@@ -1,9 +1,9 @@
1
1
  module Mutant
2
2
  class Matcher
3
- class Method < self
3
+ class Method
4
4
  # Matcher for instance methods
5
5
  class Instance < self
6
-
6
+ SUBJECT_CLASS = Subject::Method::Instance
7
7
 
8
8
  # Return identification
9
9
  #
@@ -14,27 +14,15 @@ module Mutant
14
14
  def identification
15
15
  "#{scope.name}##{method_name}"
16
16
  end
17
+ memoize :identification
17
18
 
18
- # Test if method is public
19
- #
20
- # @return [true]
21
- # if method is public
22
- #
23
- # @return [false]
24
- # otherwise
25
- #
26
- # @api private
27
- #
28
- def public?
29
- scope.public_method_defined?(method_name)
30
- end
31
- memoize :public?
19
+ NAME_INDEX = 0
32
20
 
33
21
  private
34
22
 
35
23
  # Check if node is matched
36
24
  #
37
- # @param [Rubinius::AST::Node] node
25
+ # @param [Parser::AST::Node] node
38
26
  #
39
27
  # @return [true]
40
28
  # returns true if node matches method
@@ -45,12 +33,14 @@ module Mutant
45
33
  # @api private
46
34
  #
47
35
  def match?(node)
48
- node.line == source_line &&
49
- node.class == Rubinius::AST::Define &&
50
- node.name == method_name
36
+ location = node.location || return
37
+ expression = location.expression || return
38
+ expression.line == source_line &&
39
+ node.type == :def &&
40
+ node.children[NAME_INDEX] == method_name
51
41
  end
52
42
 
53
- end
54
- end
55
- end
56
- end
43
+ end # Instance
44
+ end # Method
45
+ end # Matcher
46
+ end # Mutant