mutant 0.5.26 → 0.6.0

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +1 -0
  4. data/Changelog.md +16 -3
  5. data/Gemfile +0 -2
  6. data/Gemfile.devtools +2 -2
  7. data/README.md +9 -15
  8. data/bin/mutant +0 -1
  9. data/config/flay.yml +1 -1
  10. data/config/flog.yml +1 -1
  11. data/config/mutant.yml +1 -1
  12. data/config/reek.yml +14 -11
  13. data/config/rubocop.yml +1 -1
  14. data/lib/mutant.rb +22 -21
  15. data/lib/mutant/ast.rb +47 -0
  16. data/lib/mutant/cli.rb +7 -4
  17. data/lib/mutant/config.rb +1 -0
  18. data/lib/mutant/context.rb +1 -1
  19. data/lib/mutant/diff.rb +38 -7
  20. data/lib/mutant/env.rb +22 -3
  21. data/lib/mutant/expression.rb +15 -4
  22. data/lib/mutant/integration.rb +1 -1
  23. data/lib/mutant/isolation.rb +2 -4
  24. data/lib/mutant/matcher.rb +1 -1
  25. data/lib/mutant/matcher/method.rb +1 -1
  26. data/lib/mutant/matcher/method/singleton.rb +1 -1
  27. data/lib/mutant/matcher/methods.rb +0 -2
  28. data/lib/mutant/meta/example.rb +0 -2
  29. data/lib/mutant/meta/example/dsl.rb +1 -1
  30. data/lib/mutant/mutator.rb +1 -1
  31. data/lib/mutant/mutator/node.rb +3 -3
  32. data/lib/mutant/mutator/node/begin.rb +1 -1
  33. data/lib/mutant/mutator/node/block.rb +16 -3
  34. data/lib/mutant/mutator/node/if.rb +1 -1
  35. data/lib/mutant/mutator/node/literal/fixnum.rb +1 -1
  36. data/lib/mutant/mutator/node/resbody.rb +0 -2
  37. data/lib/mutant/mutator/node/send.rb +17 -7
  38. data/lib/mutant/mutator/node/send/index.rb +0 -2
  39. data/lib/mutant/mutator/registry.rb +1 -1
  40. data/lib/mutant/mutator/util.rb +1 -1
  41. data/lib/mutant/mutator/util/array.rb +1 -1
  42. data/lib/mutant/reporter.rb +13 -3
  43. data/lib/mutant/reporter/cli.rb +54 -8
  44. data/lib/mutant/reporter/cli/format.rb +197 -0
  45. data/lib/mutant/reporter/cli/printer.rb +402 -22
  46. data/lib/mutant/reporter/cli/tput.rb +27 -0
  47. data/lib/mutant/reporter/null.rb +4 -34
  48. data/lib/mutant/reporter/trace.rb +6 -38
  49. data/lib/mutant/result.rb +44 -56
  50. data/lib/mutant/runner.rb +99 -52
  51. data/lib/mutant/runner/collector.rb +134 -0
  52. data/lib/mutant/subject/method/instance.rb +12 -4
  53. data/lib/mutant/version.rb +1 -1
  54. data/lib/mutant/warning_filter.rb +0 -2
  55. data/lib/mutant/zombifier/file.rb +1 -1
  56. data/meta/block.rb +17 -1
  57. data/meta/send.rb +123 -1
  58. data/mutant-rspec.gemspec +3 -3
  59. data/mutant.gemspec +1 -1
  60. data/spec/integration/mutant/corpus_spec.rb +4 -195
  61. data/spec/integration/mutant/null_spec.rb +1 -3
  62. data/spec/integration/mutant/rspec_spec.rb +1 -3
  63. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +1 -3
  64. data/spec/integration/mutant/zombie_spec.rb +1 -3
  65. data/spec/integrations.yml +7 -0
  66. data/spec/shared/method_matcher_behavior.rb +1 -1
  67. data/spec/spec_helper.rb +1 -0
  68. data/spec/support/compress_helper.rb +1 -0
  69. data/spec/support/corpus.rb +239 -0
  70. data/spec/support/mutation_verifier.rb +2 -4
  71. data/spec/unit/mutant/cli_spec.rb +20 -13
  72. data/spec/unit/mutant/context/root_spec.rb +1 -3
  73. data/spec/unit/mutant/context/scope/root_spec.rb +1 -3
  74. data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +1 -3
  75. data/spec/unit/mutant/diff_spec.rb +37 -19
  76. data/spec/unit/mutant/expression/method_spec.rb +5 -7
  77. data/spec/unit/mutant/expression/methods_spec.rb +5 -7
  78. data/spec/unit/mutant/expression/namespace/flat_spec.rb +6 -8
  79. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +6 -7
  80. data/spec/unit/mutant/expression_spec.rb +14 -5
  81. data/spec/unit/mutant/integration_spec.rb +14 -3
  82. data/spec/unit/mutant/isolation_spec.rb +2 -4
  83. data/spec/unit/mutant/loader/eval_spec.rb +1 -3
  84. data/spec/unit/mutant/matcher/chain_spec.rb +1 -3
  85. data/spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb +21 -0
  86. data/spec/unit/mutant/matcher/compiler_spec.rb +28 -3
  87. data/spec/unit/mutant/matcher/filter_spec.rb +1 -3
  88. data/spec/unit/mutant/matcher/method/instance_spec.rb +3 -5
  89. data/spec/unit/mutant/matcher/method/singleton_spec.rb +22 -4
  90. data/spec/unit/mutant/matcher/methods/instance_spec.rb +7 -6
  91. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +4 -6
  92. data/spec/unit/mutant/matcher/namespace_spec.rb +1 -3
  93. data/spec/unit/mutant/matcher/null_spec.rb +1 -3
  94. data/spec/unit/mutant/mutation_spec.rb +1 -3
  95. data/spec/unit/mutant/mutator/node_spec.rb +1 -3
  96. data/spec/unit/mutant/reporter/cli_spec.rb +444 -206
  97. data/spec/unit/mutant/reporter/null_spec.rb +1 -3
  98. data/spec/unit/mutant/require_highjack_spec.rb +1 -3
  99. data/spec/unit/mutant/runner_spec.rb +42 -28
  100. data/spec/unit/mutant/subject/context_spec.rb +1 -3
  101. data/spec/unit/mutant/subject/method/instance_spec.rb +27 -19
  102. data/spec/unit/mutant/subject/method/singleton_spec.rb +49 -17
  103. data/spec/unit/mutant/subject_spec.rb +1 -3
  104. data/spec/unit/mutant/test_spec.rb +1 -3
  105. data/spec/unit/mutant/warning_expectation.rb +1 -3
  106. data/spec/unit/mutant/warning_filter_spec.rb +1 -3
  107. data/spec/unit/mutant_spec.rb +13 -3
  108. data/test_app/Gemfile.devtools +2 -2
  109. data/test_app/spec/unit/test_app/literal/string_spec.rb +1 -1
  110. metadata +10 -21
  111. data/lib/mutant/matcher/method/finder.rb +0 -72
  112. data/lib/mutant/reporter/cli/progress.rb +0 -10
  113. data/lib/mutant/reporter/cli/progress/config.rb +0 -30
  114. data/lib/mutant/reporter/cli/progress/env.rb +0 -30
  115. data/lib/mutant/reporter/cli/progress/noop.rb +0 -27
  116. data/lib/mutant/reporter/cli/progress/result.rb +0 -12
  117. data/lib/mutant/reporter/cli/progress/result/mutation.rb +0 -45
  118. data/lib/mutant/reporter/cli/progress/result/subject.rb +0 -54
  119. data/lib/mutant/reporter/cli/progress/subject.rb +0 -27
  120. data/lib/mutant/reporter/cli/registry.rb +0 -81
  121. data/lib/mutant/reporter/cli/report.rb +0 -10
  122. data/lib/mutant/reporter/cli/report/env.rb +0 -92
  123. data/lib/mutant/reporter/cli/report/mutation.rb +0 -103
  124. data/lib/mutant/reporter/cli/report/subject.rb +0 -32
  125. data/lib/mutant/reporter/cli/report/test.rb +0 -28
  126. data/lib/mutant/walker.rb +0 -53
  127. data/spec/shared/mutator_behavior.rb +0 -55
@@ -1,103 +0,0 @@
1
- module Mutant
2
- class Reporter
3
- class CLI
4
- class Report
5
-
6
- # Reporter for mutations
7
- class Mutation < self
8
-
9
- handle Mutant::Result::Mutation
10
-
11
- delegate :mutation, :failed_test_results
12
-
13
- DIFF_ERROR_MESSAGE = 'BUG: Mutation NOT resulted in exactly one diff. Please report a reproduction!'.freeze
14
-
15
- MAP = {
16
- Mutant::Mutation::Evil => :evil_details,
17
- Mutant::Mutation::Neutral => :neutral_details,
18
- Mutant::Mutation::Noop => :noop_details
19
- }.freeze
20
-
21
- NEUTRAL_MESSAGE =
22
- "--- Neutral failure ---\n" \
23
- "Original code was inserted unmutated. And the test did NOT PASS.\n" \
24
- "Your tests do not pass initially or you found a bug in mutant / unparser.\n" \
25
- "Subject AST:\n" \
26
- "%s\n" \
27
- "Unparsed Source:\n" \
28
- "%s\n" \
29
- "Test Reports: %d\n"
30
-
31
- NOOP_MESSAGE =
32
- "---- Noop failure -----\n" \
33
- "No code was inserted. And the test did NOT PASS.\n" \
34
- "This is typically a problem of your specs not passing unmutated.\n" \
35
- "Test Reports: %d\n"
36
-
37
- FOOTER = '-----------------------'.freeze
38
-
39
- # Run report printer
40
- #
41
- # @return [self]
42
- #
43
- # @api private
44
- #
45
- def run
46
- puts(mutation.identification)
47
- print_details
48
- puts(FOOTER)
49
- self
50
- end
51
-
52
- private
53
-
54
- # Return details
55
- #
56
- # @return [undefined]
57
- #
58
- # @api private
59
- #
60
- def print_details
61
- send(MAP.fetch(mutation.class))
62
- end
63
-
64
- # Return evil details
65
- #
66
- # @return [String]
67
- #
68
- # @api private
69
- #
70
- def evil_details
71
- original, current = mutation.original_source, mutation.source
72
- diff = Mutant::Diff.build(original, current)
73
- diff = color? ? diff.colorized_diff : diff.diff
74
- puts(diff || DIFF_ERROR_MESSAGE)
75
- end
76
-
77
- # Noop details
78
- #
79
- # @return [String]
80
- #
81
- # @api private
82
- #
83
- def noop_details
84
- info(NOOP_MESSAGE, failed_test_results.length)
85
- visit_collection(failed_test_results)
86
- end
87
-
88
- # Neutral details
89
- #
90
- # @return [String]
91
- #
92
- # @api private
93
- #
94
- def neutral_details
95
- info(NEUTRAL_MESSAGE, mutation.subject.node.inspect, mutation.source, failed_test_results.length)
96
- visit_collection(failed_test_results)
97
- end
98
-
99
- end # Mutation
100
- end # Report
101
- end # CLI
102
- end # Reporter
103
- end # Mutant
@@ -1,32 +0,0 @@
1
- module Mutant
2
- class Reporter
3
- class CLI
4
- class Report
5
-
6
- # Subject report printer
7
- class Subject < self
8
-
9
- delegate :subject, :failed_mutations
10
-
11
- handle(Mutant::Result::Subject)
12
-
13
- # Run report printer
14
- #
15
- # @return [self]
16
- #
17
- # @api private
18
- #
19
- def run
20
- status(subject.identification)
21
- subject.tests.each do |test|
22
- puts("- #{test.identification}")
23
- end
24
- visit_collection(object.alive_mutation_results)
25
- self
26
- end
27
-
28
- end # Subject
29
- end # Report
30
- end # CLI
31
- end # Reporter
32
- end # Mutant
@@ -1,28 +0,0 @@
1
- module Mutant
2
- class Reporter
3
- class CLI
4
- class Report
5
- # Test result reporter
6
- class Test < self
7
-
8
- handle(Mutant::Result::Test)
9
-
10
- delegate :test, :runtime
11
-
12
- # Run test result reporter
13
- #
14
- # @return [self]
15
- #
16
- # @api private
17
- #
18
- def run
19
- status('- %s / runtime: %s', test.identification, object.runtime)
20
- puts('Test Output:')
21
- puts(object.output)
22
- end
23
-
24
- end
25
- end # Report
26
- end # CLI
27
- end # Reporter
28
- end # Mutant
@@ -1,53 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Mutant
4
-
5
- # Walker for all ast nodes
6
- class Walker
7
-
8
- # Run walkter
9
- #
10
- # @param [Parser::AST::Node] root
11
- #
12
- # @return [self]
13
- #
14
- # @api private
15
- #
16
- def self.run(root, &block)
17
- new(root, block)
18
- self
19
- end
20
-
21
- private_class_method :new
22
-
23
- # Initialize and run walker
24
- #
25
- # @param [Parser::AST::Node] root
26
- # @param [#call(node)] block
27
- #
28
- # @return [undefined]
29
- #
30
- # @api private
31
- #
32
- def initialize(root, block)
33
- @root, @block = root, block
34
- dispatch(root)
35
- end
36
-
37
- private
38
-
39
- # Perform dispatch
40
- #
41
- # @param [Parser::AST::Node] node
42
- #
43
- # @return [undefined]
44
- #
45
- # @api private
46
- #
47
- def dispatch(node)
48
- @block.call(node)
49
- node.children.grep(Parser::AST::Node).each(&method(:dispatch))
50
- end
51
- end # Walker
52
-
53
- end # Mutant
@@ -1,55 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- shared_examples_for 'a mutator' do
4
- subject { object.each(node, &yields.method(:<<)) }
5
-
6
- let(:yields) { [] }
7
- let(:object) { described_class }
8
-
9
- unless instance_methods.include?(:node)
10
- let(:node) { parse(source) }
11
- end
12
-
13
- it_should_behave_like 'a command method'
14
-
15
- context 'with no block' do
16
- subject { object.each(node) }
17
-
18
- it { should be_instance_of(to_enum.class) }
19
-
20
- def coerce(input)
21
- case input
22
- when String
23
- Parser::CurrentRuby.parse(input)
24
- when Parser::AST::Node
25
- input
26
- else
27
- raise
28
- end
29
- end
30
-
31
- def normalize(node)
32
- Unparser::Preprocessor.run(node)
33
- end
34
-
35
- let(:expected_mutations) do
36
- mutations.map(&method(:coerce)).map(&method(:normalize))
37
- end
38
-
39
- it 'generates the expected mutations' do
40
- generated_mutations = subject.map(&method(:normalize))
41
-
42
- verifier = MutationVerifier.new(node, expected_mutations, generated_mutations)
43
-
44
- unless verifier.success?
45
- fail verifier.error_report
46
- end
47
- end
48
- end
49
- end
50
-
51
- shared_examples_for 'a noop mutator' do
52
- let(:mutations) { [] }
53
-
54
- it_should_behave_like 'a mutator'
55
- end