mutant 0.8.10 → 0.8.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -4
  3. data/Changelog.md +8 -0
  4. data/README.md +112 -43
  5. data/Rakefile +2 -16
  6. data/circle.yml +1 -1
  7. data/config/flay.yml +2 -2
  8. data/config/flog.yml +1 -1
  9. data/config/reek.yml +3 -4
  10. data/config/rubocop.yml +53 -16
  11. data/lib/mutant.rb +27 -6
  12. data/lib/mutant/ast/meta/const.rb +2 -0
  13. data/lib/mutant/ast/meta/optarg.rb +2 -0
  14. data/lib/mutant/ast/meta/resbody.rb +2 -0
  15. data/lib/mutant/ast/meta/restarg.rb +2 -0
  16. data/lib/mutant/ast/meta/send.rb +4 -0
  17. data/lib/mutant/ast/meta/symbol.rb +2 -0
  18. data/lib/mutant/ast/named_children.rb +14 -4
  19. data/lib/mutant/ast/nodes.rb +3 -1
  20. data/lib/mutant/ast/regexp.rb +53 -0
  21. data/lib/mutant/ast/regexp/transformer.rb +185 -0
  22. data/lib/mutant/ast/regexp/transformer/alternative.rb +39 -0
  23. data/lib/mutant/ast/regexp/transformer/character_set.rb +46 -0
  24. data/lib/mutant/ast/regexp/transformer/direct.rb +99 -0
  25. data/lib/mutant/ast/regexp/transformer/options_group.rb +66 -0
  26. data/lib/mutant/ast/regexp/transformer/quantifier.rb +112 -0
  27. data/lib/mutant/ast/regexp/transformer/recursive.rb +50 -0
  28. data/lib/mutant/ast/regexp/transformer/root.rb +29 -0
  29. data/lib/mutant/ast/regexp/transformer/text.rb +55 -0
  30. data/lib/mutant/ast/types.rb +92 -5
  31. data/lib/mutant/cli.rb +2 -14
  32. data/lib/mutant/color.rb +1 -1
  33. data/lib/mutant/config.rb +1 -3
  34. data/lib/mutant/expression/methods.rb +1 -1
  35. data/lib/mutant/expression/namespace.rb +2 -2
  36. data/lib/mutant/expression/parser.rb +1 -1
  37. data/lib/mutant/integration.rb +10 -28
  38. data/lib/mutant/isolation.rb +9 -60
  39. data/lib/mutant/isolation/fork.rb +72 -0
  40. data/lib/mutant/isolation/none.rb +25 -0
  41. data/lib/mutant/matcher/config.rb +2 -0
  42. data/lib/mutant/matcher/method/singleton.rb +5 -4
  43. data/lib/mutant/meta.rb +11 -4
  44. data/lib/mutant/meta/example.rb +2 -116
  45. data/lib/mutant/meta/example/dsl.rb +22 -19
  46. data/lib/mutant/meta/example/verification.rb +86 -0
  47. data/lib/mutant/mutator.rb +22 -49
  48. data/lib/mutant/mutator/node.rb +15 -19
  49. data/lib/mutant/mutator/node/and_asgn.rb +1 -1
  50. data/lib/mutant/mutator/node/argument.rb +10 -5
  51. data/lib/mutant/mutator/node/arguments.rb +5 -9
  52. data/lib/mutant/mutator/node/begin.rb +4 -17
  53. data/lib/mutant/mutator/node/block.rb +1 -1
  54. data/lib/mutant/mutator/node/break.rb +1 -1
  55. data/lib/mutant/mutator/node/class.rb +21 -0
  56. data/lib/mutant/mutator/node/conditional_loop.rb +1 -1
  57. data/lib/mutant/mutator/node/define.rb +1 -1
  58. data/lib/mutant/mutator/node/defined.rb +1 -1
  59. data/lib/mutant/mutator/node/dstr.rb +1 -1
  60. data/lib/mutant/mutator/node/dsym.rb +1 -1
  61. data/lib/mutant/mutator/node/generic.rb +3 -3
  62. data/lib/mutant/mutator/node/kwbegin.rb +1 -1
  63. data/lib/mutant/mutator/node/literal.rb +9 -0
  64. data/lib/mutant/mutator/node/literal/boolean.rb +1 -1
  65. data/lib/mutant/mutator/node/literal/fixnum.rb +2 -2
  66. data/lib/mutant/mutator/node/literal/float.rb +4 -6
  67. data/lib/mutant/mutator/node/literal/hash.rb +1 -1
  68. data/lib/mutant/mutator/node/literal/nil.rb +1 -1
  69. data/lib/mutant/mutator/node/literal/range.rb +2 -19
  70. data/lib/mutant/mutator/node/literal/regex.rb +43 -3
  71. data/lib/mutant/mutator/node/literal/string.rb +1 -1
  72. data/lib/mutant/mutator/node/literal/symbol.rb +2 -4
  73. data/lib/mutant/mutator/node/masgn.rb +1 -1
  74. data/lib/mutant/mutator/node/match_current_line.rb +1 -1
  75. data/lib/mutant/mutator/node/mlhs.rb +2 -3
  76. data/lib/mutant/mutator/node/named_value/access.rb +2 -2
  77. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +4 -3
  78. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +4 -4
  79. data/lib/mutant/mutator/node/next.rb +1 -1
  80. data/lib/mutant/mutator/node/nthref.rb +1 -1
  81. data/lib/mutant/mutator/node/or_asgn.rb +1 -1
  82. data/lib/mutant/mutator/node/regexp.rb +44 -0
  83. data/lib/mutant/mutator/node/regopt.rb +31 -0
  84. data/lib/mutant/mutator/node/resbody.rb +1 -1
  85. data/lib/mutant/mutator/node/rescue.rb +1 -3
  86. data/lib/mutant/mutator/node/return.rb +1 -1
  87. data/lib/mutant/mutator/node/send.rb +43 -3
  88. data/lib/mutant/mutator/node/send/attribute_assignment.rb +4 -1
  89. data/lib/mutant/mutator/node/send/conditional.rb +23 -0
  90. data/lib/mutant/mutator/node/send/index.rb +1 -1
  91. data/lib/mutant/mutator/node/splat.rb +1 -1
  92. data/lib/mutant/mutator/node/when.rb +1 -1
  93. data/lib/mutant/mutator/node/yield.rb +1 -1
  94. data/lib/mutant/mutator/util.rb +0 -30
  95. data/lib/mutant/mutator/util/array.rb +4 -16
  96. data/lib/mutant/parallel.rb +1 -1
  97. data/lib/mutant/parallel/worker.rb +1 -1
  98. data/lib/mutant/registry.rb +44 -0
  99. data/lib/mutant/reporter/cli/format.rb +2 -0
  100. data/lib/mutant/reporter/cli/printer.rb +2 -2
  101. data/lib/mutant/reporter/cli/printer/config.rb +0 -1
  102. data/lib/mutant/reporter/cli/printer/env_progress.rb +1 -11
  103. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +1 -1
  104. data/lib/mutant/reporter/cli/printer/mutation_result.rb +2 -0
  105. data/lib/mutant/reporter/cli/tput.rb +1 -1
  106. data/lib/mutant/reporter/sequence.rb +3 -0
  107. data/lib/mutant/require_highjack.rb +6 -2
  108. data/lib/mutant/result.rb +1 -1
  109. data/lib/mutant/subject.rb +5 -5
  110. data/lib/mutant/subject/method/instance.rb +1 -2
  111. data/lib/mutant/util.rb +18 -0
  112. data/lib/mutant/version.rb +1 -1
  113. data/lib/mutant/zombifier.rb +5 -3
  114. data/meta/and.rb +1 -1
  115. data/meta/and_asgn.rb +1 -1
  116. data/meta/array.rb +2 -2
  117. data/meta/begin.rb +2 -2
  118. data/meta/block.rb +7 -7
  119. data/meta/block_pass.rb +1 -1
  120. data/meta/blockarg.rb +1 -1
  121. data/meta/break.rb +1 -1
  122. data/meta/case.rb +2 -2
  123. data/meta/casgn.rb +11 -2
  124. data/meta/cbase.rb +1 -1
  125. data/meta/class.rb +10 -0
  126. data/meta/const.rb +9 -1
  127. data/meta/csend.rb +8 -0
  128. data/meta/cvar.rb +1 -1
  129. data/meta/cvasgn.rb +1 -1
  130. data/meta/date.rb +4 -4
  131. data/meta/def.rb +14 -14
  132. data/meta/defined.rb +1 -1
  133. data/meta/dstr.rb +1 -1
  134. data/meta/dsym.rb +1 -1
  135. data/meta/ensure.rb +1 -1
  136. data/meta/false.rb +1 -1
  137. data/meta/float.rb +3 -3
  138. data/meta/gvar.rb +1 -1
  139. data/meta/gvasgn.rb +1 -1
  140. data/meta/hash.rb +1 -1
  141. data/meta/if.rb +17 -3
  142. data/meta/int.rb +1 -1
  143. data/meta/ivar.rb +1 -1
  144. data/meta/ivasgn.rb +14 -1
  145. data/meta/kwarg.rb +8 -0
  146. data/meta/kwbegin.rb +1 -1
  147. data/meta/kwoptarg.rb +11 -0
  148. data/meta/lvar.rb +1 -1
  149. data/meta/lvasgn.rb +1 -1
  150. data/meta/masgn.rb +1 -1
  151. data/meta/match_current_line.rb +2 -2
  152. data/meta/next.rb +1 -1
  153. data/meta/nil.rb +1 -1
  154. data/meta/nthref.rb +5 -5
  155. data/meta/op_assgn.rb +1 -1
  156. data/meta/or.rb +1 -1
  157. data/meta/or_asgn.rb +5 -5
  158. data/meta/range.rb +2 -8
  159. data/meta/redo.rb +1 -1
  160. data/meta/regexp.rb +106 -0
  161. data/meta/regexp/regexp_bol_anchor.rb +13 -0
  162. data/meta/regexp/regexp_bos_anchor.rb +26 -0
  163. data/meta/regexp/regexp_root_expression.rb +13 -0
  164. data/meta/regopt.rb +8 -0
  165. data/meta/rescue.rb +49 -4
  166. data/meta/restarg.rb +6 -9
  167. data/meta/return.rb +2 -2
  168. data/meta/self.rb +1 -1
  169. data/meta/send.rb +228 -55
  170. data/meta/str.rb +1 -1
  171. data/meta/super.rb +3 -3
  172. data/meta/{symbol.rb → sym.rb} +1 -1
  173. data/meta/true.rb +1 -1
  174. data/meta/until.rb +1 -1
  175. data/meta/while.rb +2 -2
  176. data/meta/yield.rb +1 -1
  177. data/mutant-rspec.gemspec +2 -2
  178. data/mutant.gemspec +6 -5
  179. data/spec/integration/mutant/isolation/fork_spec.rb +8 -0
  180. data/spec/integration/mutant/rspec_spec.rb +1 -1
  181. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +1 -2
  182. data/spec/integrations.yml +93 -24
  183. data/spec/spec_helper.rb +12 -7
  184. data/spec/support/compress_helper.rb +1 -1
  185. data/spec/support/corpus.rb +115 -50
  186. data/spec/support/fake_actor.rb +5 -5
  187. data/spec/support/file_system.rb +1 -1
  188. data/spec/support/ice_nine_config.rb +3 -3
  189. data/spec/support/ruby_vm.rb +11 -12
  190. data/spec/support/shared_context.rb +22 -13
  191. data/spec/support/test_app.rb +1 -1
  192. data/spec/support/warning.rb +64 -0
  193. data/spec/support/warnings.yml +4 -0
  194. data/spec/support/xspec.rb +177 -0
  195. data/spec/unit/mutant/actor/env_spec.rb +2 -2
  196. data/spec/unit/mutant/actor/sender_spec.rb +1 -1
  197. data/spec/unit/mutant/ast/meta/send_spec.rb +1 -1
  198. data/spec/unit/mutant/ast/named_children_spec.rb +26 -0
  199. data/spec/unit/mutant/ast/regexp/parse_spec.rb +7 -0
  200. data/spec/unit/mutant/ast/regexp/supported_predicate_spec.rb +14 -0
  201. data/spec/unit/mutant/ast/regexp/transformer/lookup_table/table_spec.rb +19 -0
  202. data/spec/unit/mutant/ast/regexp/transformer/lookup_table_spec.rb +33 -0
  203. data/spec/unit/mutant/ast/regexp/transformer_spec.rb +19 -0
  204. data/spec/unit/mutant/ast/regexp_spec.rb +617 -0
  205. data/spec/unit/mutant/cli_spec.rb +7 -45
  206. data/spec/unit/mutant/context_spec.rb +4 -7
  207. data/spec/unit/mutant/env/{boostrap_spec.rb → bootstrap_spec.rb} +2 -2
  208. data/spec/unit/mutant/env_spec.rb +13 -16
  209. data/spec/unit/mutant/expression/namespace/{flat_spec.rb → exact_spec.rb} +0 -0
  210. data/spec/unit/mutant/integration/rspec_spec.rb +2 -2
  211. data/spec/unit/mutant/integration_spec.rb +14 -0
  212. data/spec/unit/mutant/isolation/fork_spec.rb +155 -0
  213. data/spec/unit/mutant/isolation/none_spec.rb +16 -0
  214. data/spec/unit/mutant/loader_spec.rb +1 -1
  215. data/spec/unit/mutant/matcher/methods/instance_spec.rb +2 -4
  216. data/spec/unit/mutant/meta/example/dsl_spec.rb +106 -0
  217. data/spec/unit/mutant/meta/example/verification_spec.rb +120 -0
  218. data/spec/unit/mutant/meta/example_spec.rb +32 -0
  219. data/spec/unit/mutant/mutator/node_spec.rb +37 -4
  220. data/spec/unit/mutant/mutator_spec.rb +21 -0
  221. data/spec/unit/mutant/{runner → parallel}/driver_spec.rb +0 -0
  222. data/spec/unit/mutant/parallel/master_spec.rb +13 -13
  223. data/spec/unit/mutant/registry_spec.rb +47 -0
  224. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -4
  225. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -8
  226. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -2
  227. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -8
  228. data/spec/unit/mutant/reporter/cli/printer/status_spec.rb +0 -34
  229. data/spec/unit/mutant/reporter/cli_spec.rb +0 -22
  230. data/spec/unit/mutant/repository/diff_spec.rb +6 -6
  231. data/spec/unit/mutant/require_highjack_spec.rb +38 -14
  232. data/spec/unit/mutant/result/env_spec.rb +1 -4
  233. data/spec/unit/mutant/runner_spec.rb +1 -1
  234. data/spec/unit/mutant/subject/method/instance_spec.rb +1 -1
  235. data/spec/unit/mutant/subject_spec.rb +3 -3
  236. data/spec/unit/mutant/util/one_spec.rb +20 -0
  237. data/spec/unit/mutant/zombifier_spec.rb +18 -18
  238. data/test_app/{Gemfile.rspec3.3 → Gemfile.rspec3.5} +2 -2
  239. metadata +94 -24
  240. data/TODO +0 -21
  241. data/lib/mutant/mutator/node/blockarg.rb +0 -13
  242. data/lib/mutant/mutator/node/restarg.rb +0 -13
  243. data/lib/mutant/mutator/registry.rb +0 -49
  244. data/meta/boolean.rb +0 -13
  245. data/meta/regex.rb +0 -19
  246. data/spec/unit/mutant/isolation_spec.rb +0 -104
  247. data/spec/unit/mutant/mutator/registry_spec.rb +0 -57
@@ -0,0 +1,23 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Send
5
+ class Conditional < self
6
+
7
+ handle(:csend)
8
+
9
+ private
10
+
11
+ # Emit mutations
12
+ #
13
+ # @return [undefined]
14
+ def dispatch
15
+ super()
16
+ emit(s(:send, *children))
17
+ end
18
+
19
+ end # Conditional
20
+ end # Send
21
+ end # Node
22
+ end # Mutator
23
+ end # Mutant
@@ -14,7 +14,7 @@ module Mutant
14
14
 
15
15
  private
16
16
 
17
- # Perform dispatch
17
+ # Emit mutations
18
18
  #
19
19
  # @return [undefined]
20
20
  def dispatch
@@ -10,7 +10,7 @@ module Mutant
10
10
 
11
11
  private
12
12
 
13
- # Perform dispatch
13
+ # Emit mutations
14
14
  #
15
15
  # @return [undefined]
16
16
  def dispatch
@@ -47,7 +47,7 @@ module Mutant
47
47
  # @return [nil]
48
48
  # otherwise
49
49
  def body
50
- children[body_index]
50
+ children.fetch(body_index)
51
51
  end
52
52
 
53
53
  # Index of body node
@@ -13,7 +13,7 @@ module Mutant
13
13
  #
14
14
  # @return [undefined]
15
15
  def dispatch
16
- super
16
+ super()
17
17
  emit_singletons
18
18
  children.each_index(&method(:delete_child))
19
19
  end
@@ -2,36 +2,6 @@ module Mutant
2
2
  class Mutator
3
3
  # Namespace for utility mutators
4
4
  class Util < self
5
-
6
- # Run utility mutator
7
- #
8
- # @param [Object] object
9
- # @param [Object] parent
10
- #
11
- # @return [Enumerator<Object>]
12
- # if no block given
13
- #
14
- # @return [self]
15
- # otherwise
16
- def self.each(object, parent, &block)
17
- return to_enum(__method__, object, parent) unless block_given?
18
-
19
- new(object, parent, block)
20
-
21
- self
22
- end
23
-
24
- private
25
-
26
- # Test if mutation is new
27
- #
28
- # @param [Object] generated
29
- #
30
- # @return [Boolean]
31
- def new?(generated)
32
- !input.eql?(generated)
33
- end
34
-
35
5
  end # Util
36
6
  end # Mutator
37
7
  end # Mutant
@@ -33,7 +33,7 @@ module Mutant
33
33
  # @return [undefined]
34
34
  def dispatch
35
35
  input.each_with_index do |element, index|
36
- Mutator.each(element).each do |mutation|
36
+ Mutator.mutate(element).each do |mutation|
37
37
  dup = dup_input
38
38
  dup[index] = mutation
39
39
  emit(dup)
@@ -42,19 +42,7 @@ module Mutant
42
42
  end
43
43
 
44
44
  end # Element
45
-
46
- private
47
-
48
- # Emit mutations
49
- #
50
- # @return [undefined]
51
- def dispatch
52
- run(Element)
53
- run(Presence)
54
- emit(EMPTY_ARRAY)
55
- end
56
-
57
45
  end # Array
58
- end # Node
59
- end # Mutant
60
- end # Mutator
46
+ end # Util
47
+ end # Mutator
48
+ end # Mutant
@@ -85,7 +85,7 @@ module Mutant
85
85
  :done,
86
86
  :payload
87
87
  )
88
- end
88
+ end # Status
89
89
 
90
90
  end # Parallel
91
91
  end # Mutant
@@ -63,7 +63,7 @@ module Mutant
63
63
  Actor::Message.new(
64
64
  :result,
65
65
  JobResult.new(
66
- job: job,
66
+ job: job,
67
67
  payload: result
68
68
  )
69
69
  )
@@ -0,0 +1,44 @@
1
+ module Mutant
2
+ # Registry for mapping AST types to classes
3
+ class Registry
4
+ include Concord.new(:contents)
5
+
6
+ # Initialize object
7
+ #
8
+ # @return [undefined]
9
+ def initialize
10
+ super({})
11
+ end
12
+
13
+ # Raised when the type is an invalid type
14
+ RegistryError = Class.new(TypeError)
15
+
16
+ # Register class for AST node class
17
+ #
18
+ # @param [Symbol] type
19
+ # @param [Class] class
20
+ #
21
+ # @return [self]
22
+ def register(type, klass)
23
+ fail RegistryError, "Invalid type registration: #{type.inspect}" unless AST::Types::ALL.include?(type)
24
+ fail RegistryError, "Duplicate type registration: #{type.inspect}" if contents.key?(type)
25
+ contents[type] = klass
26
+ self
27
+ end
28
+
29
+ # Lookup class for node
30
+ #
31
+ # @param [Symbol] type
32
+ #
33
+ # @return [Class]
34
+ #
35
+ # @raise [ArgumentError]
36
+ # raises argument error when class cannot be found
37
+ def lookup(type)
38
+ contents.fetch(type) do
39
+ fail RegistryError, "No entry for: #{type.inspect}"
40
+ end
41
+ end
42
+
43
+ end # Registry
44
+ end # Mutant
@@ -2,6 +2,8 @@ module Mutant
2
2
  class Reporter
3
3
  class CLI
4
4
  # CLI output format
5
+ #
6
+ # rubocop:disable FormatString
5
7
  class Format
6
8
  include AbstractType, Anima.new(:tty)
7
9
 
@@ -75,14 +75,14 @@ module Mutant
75
75
  #
76
76
  # @return [undefined]
77
77
  def info(string, *arguments)
78
- puts(format(string, *arguments))
78
+ puts(string % arguments)
79
79
  end
80
80
 
81
81
  # Print a status line to output
82
82
  #
83
83
  # @return [undefined]
84
84
  def status(string, *arguments)
85
- puts(colorize(status_color, format(string, *arguments)))
85
+ puts(colorize(status_color, string % arguments))
86
86
  end
87
87
 
88
88
  # Print a line to output
@@ -14,7 +14,6 @@ module Mutant
14
14
  info 'Mutant configuration:'
15
15
  info 'Matcher: %s', object.matcher.inspect
16
16
  info 'Integration: %s', object.integration
17
- info 'Expect Coverage: %0.2f%%', (object.expected_coverage * 100)
18
17
  info 'Jobs: %d', object.jobs
19
18
  info 'Includes: %s', object.includes
20
19
  info 'Requires: %s', object.requires
@@ -28,8 +28,7 @@ module Mutant
28
28
  [:info, 'Killtime: %0.2fs', :killtime ],
29
29
  [:info, 'Overhead: %0.2f%%', :overhead_percent ],
30
30
  [:info, 'Mutations/s: %0.2f', :mutations_per_second ],
31
- [:status, 'Coverage: %0.2f%%', :coverage_percent ],
32
- [:status, 'Expected: %0.2f%%', :expected_coverage_percent]
31
+ [:status, 'Coverage: %0.2f%%', :coverage_percent ]
33
32
  ])
34
33
 
35
34
  # Run printer
@@ -62,15 +61,6 @@ module Mutant
62
61
  coverage * 100
63
62
  end
64
63
 
65
- # Expected coverage in percent
66
- #
67
- # @return [Float]
68
- #
69
- # @api private
70
- def expected_coverage_percent
71
- env.config.expected_coverage * 100
72
- end
73
-
74
64
  # Overhead in percent
75
65
  #
76
66
  # @return [Float]
@@ -1,7 +1,7 @@
1
1
  module Mutant
2
2
  class Reporter
3
3
  class CLI
4
- class Printer
4
+ class Printer
5
5
  # Printer for mutation progress results
6
6
  class MutationProgressResult < self
7
7
  SUCCESS = '.'.freeze
@@ -3,6 +3,8 @@ module Mutant
3
3
  class CLI
4
4
  class Printer
5
5
  # Reporter for mutation results
6
+ #
7
+ # :reek:TooManyConstants
6
8
  class MutationResult < self
7
9
 
8
10
  delegate :mutation, :test_result
@@ -38,7 +38,7 @@ module Mutant
38
38
  end
39
39
  private_class_method :capture
40
40
 
41
- end # TPUT
41
+ end # Tput
42
42
  end # CLI
43
43
  end # Reporter
44
44
  end # Mutant
@@ -13,6 +13,9 @@ module Mutant
13
13
  end
14
14
  end
15
15
 
16
+ # Minimum reporter delay
17
+ #
18
+ # @return [Float]
16
19
  def delay
17
20
  reporters.map(&:delay).min
18
21
  end
@@ -10,10 +10,14 @@ module Mutant
10
10
  # @return [#call]
11
11
  # the original implementation on singleton
12
12
  def self.call(target, callback)
13
- target.method(:require).tap do
13
+ target.public_method(:require).tap do
14
14
  target.module_eval do
15
+ undef_method(:require)
15
16
  define_method(:require, &callback)
16
- public :require
17
+ class << self
18
+ undef_method(:require)
19
+ end
20
+ define_singleton_method(:require, &callback)
17
21
  end
18
22
  end
19
23
  end
@@ -76,7 +76,7 @@ module Mutant
76
76
  #
77
77
  # @return [Boolean]
78
78
  def success?
79
- coverage.eql?(env.config.expected_coverage)
79
+ coverage.eql?(Rational(1))
80
80
  end
81
81
  memoize :success?
82
82
 
@@ -9,11 +9,11 @@ module Mutant
9
9
  # @return [Enumerable<Mutation>]
10
10
  # @return [undefined]
11
11
  def mutations
12
- mutations = [neutral_mutation]
13
- Mutator.each(node) do |mutant|
14
- mutations << Mutation::Evil.new(self, wrap_node(mutant))
15
- end
16
- mutations
12
+ [neutral_mutation].concat(
13
+ Mutator.mutate(node).map do |mutant|
14
+ Mutation::Evil.new(self, wrap_node(mutant))
15
+ end
16
+ )
17
17
  end
18
18
  memoize :mutations
19
19
 
@@ -24,8 +24,7 @@ module Mutant
24
24
  # @return [self]
25
25
  def prepare
26
26
  scope.__send__(:memoized_methods).instance_variable_get(:@memory).delete(name)
27
- super
28
- self
27
+ super()
29
28
  end
30
29
 
31
30
  private
@@ -0,0 +1,18 @@
1
+ module Mutant
2
+ # Utility methods
3
+ module Util
4
+ # Error raised by `Util.one` if size is less than zero or greater than one
5
+ SizeError = Class.new(IndexError)
6
+
7
+ # Return only element in array if it contains exactly one member
8
+ #
9
+ # @param array [Array]
10
+ #
11
+ # @return [Object] first entry
12
+ def self.one(array)
13
+ return array.first if array.one?
14
+
15
+ fail SizeError, "expected size to be exactly 1 but size was #{array.size}"
16
+ end
17
+ end # Util
18
+ end # Mutant
@@ -1,4 +1,4 @@
1
1
  module Mutant
2
2
  # Current mutant version
3
- VERSION = '0.8.10'.freeze
3
+ VERSION = '0.8.11'.freeze
4
4
  end # Mutant
@@ -57,13 +57,15 @@ module Mutant
57
57
  #
58
58
  # @param [#to_s] logical_name
59
59
  #
60
- # @return [undefined]
60
+ # @return [Bool]
61
+ # true if successful and false if feature already loaded
61
62
  def require(logical_name)
62
63
  logical_name = logical_name.to_s
63
- @original.call(logical_name)
64
- return unless include?(logical_name)
64
+ loaded = @original.call(logical_name)
65
+ return loaded unless include?(logical_name)
65
66
  @zombified << logical_name
66
67
  zombify(find(logical_name))
68
+ true
67
69
  end
68
70
 
69
71
  # Find file by logical path
@@ -1,4 +1,4 @@
1
- Mutant::Meta::Example.add do
1
+ Mutant::Meta::Example.add :and do
2
2
  source 'true and false'
3
3
 
4
4
  singleton_mutations
@@ -1,4 +1,4 @@
1
- Mutant::Meta::Example.add do
1
+ Mutant::Meta::Example.add :and_asgn do
2
2
  source 'a &&= 1'
3
3
 
4
4
  singleton_mutations
@@ -1,4 +1,4 @@
1
- Mutant::Meta::Example.add do
1
+ Mutant::Meta::Example.add :array do
2
2
  source '[true]'
3
3
 
4
4
  singleton_mutations
@@ -8,7 +8,7 @@ Mutant::Meta::Example.add do
8
8
  mutation '[]'
9
9
  end
10
10
 
11
- Mutant::Meta::Example.add do
11
+ Mutant::Meta::Example.add :array do
12
12
  source '[true, false]'
13
13
 
14
14
  singleton_mutations
@@ -1,4 +1,4 @@
1
- Mutant::Meta::Example.add do
1
+ Mutant::Meta::Example.add :begin do
2
2
 
3
3
  source 'true; false'
4
4
  # Mutation of each statement in block
@@ -12,7 +12,7 @@ Mutant::Meta::Example.add do
12
12
  mutation 'false'
13
13
  end
14
14
 
15
- Mutant::Meta::Example.add do
15
+ Mutant::Meta::Example.add :begin do
16
16
 
17
17
  source s(:begin, s(:true))
18
18
  # Mutation of each statement in block