mutant 0.5.26 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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