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.
- checksums.yaml +7 -0
- data/.travis.yml +10 -11
- data/Changelog.md +93 -38
- data/Gemfile +3 -1
- data/Gemfile.devtools +16 -20
- data/Guardfile +1 -1
- data/README.md +36 -16
- data/Rakefile +21 -2
- data/TODO +11 -7
- data/bin/mutant +4 -0
- data/bin/zombie +4 -0
- data/config/devtools.yml +2 -0
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/{site.reek → reek.yml} +94 -70
- data/lib/mutant/cli/classifier/method.rb +100 -0
- data/lib/mutant/cli/classifier/namespace.rb +47 -0
- data/lib/mutant/cli/classifier/scope.rb +35 -0
- data/lib/mutant/cli/classifier.rb +141 -0
- data/lib/mutant/cli.rb +115 -162
- data/lib/mutant/color.rb +2 -2
- data/lib/mutant/config.rb +27 -0
- data/lib/mutant/constants.rb +32 -17
- data/lib/mutant/context/scope.rb +33 -51
- data/lib/mutant/context.rb +8 -19
- data/lib/mutant/differ.rb +5 -5
- data/lib/mutant/helper.rb +2 -17
- data/lib/mutant/killer/forked.rb +44 -0
- data/lib/mutant/killer/forking.rb +3 -57
- data/lib/mutant/killer/rspec.rb +16 -20
- data/lib/mutant/killer/static.rb +6 -7
- data/lib/mutant/killer.rb +48 -74
- data/lib/mutant/loader.rb +6 -6
- data/lib/mutant/matcher/chain.rb +4 -25
- data/lib/mutant/matcher/method/instance.rb +14 -24
- data/lib/mutant/matcher/method/singleton.rb +35 -46
- data/lib/mutant/matcher/method.rb +95 -83
- data/lib/mutant/matcher/{scope_methods.rb → methods.rb} +53 -76
- data/lib/mutant/matcher/namespace.rb +71 -0
- data/lib/mutant/matcher/scope.rb +34 -0
- data/lib/mutant/matcher.rb +24 -34
- data/lib/mutant/mutation/evil.rb +35 -0
- data/lib/mutant/mutation/filter/code.rb +7 -28
- data/lib/mutant/mutation/filter/regexp.rb +6 -18
- data/lib/mutant/mutation/filter/whitelist.rb +5 -4
- data/lib/mutant/mutation/filter.rb +10 -9
- data/lib/mutant/mutation/neutral.rb +35 -0
- data/lib/mutant/mutation.rb +21 -61
- data/lib/mutant/mutator/node/argument.rb +88 -0
- data/lib/mutant/mutator/node/arguments.rb +52 -0
- data/lib/mutant/mutator/node/assignment.rb +34 -38
- data/lib/mutant/mutator/node/begin.rb +33 -0
- data/lib/mutant/mutator/node/block.rb +14 -14
- data/lib/mutant/mutator/node/case.rb +59 -0
- data/lib/mutant/mutator/node/define.rb +26 -22
- data/lib/mutant/mutator/node/if.rb +31 -71
- data/lib/mutant/mutator/node/literal/array.rb +25 -9
- data/lib/mutant/mutator/node/literal/boolean.rb +13 -30
- data/lib/mutant/mutator/node/literal/dynamic.rb +6 -5
- data/lib/mutant/mutator/node/literal/fixnum.rb +18 -7
- data/lib/mutant/mutator/node/literal/float.rb +15 -8
- data/lib/mutant/mutator/node/literal/hash.rb +33 -52
- data/lib/mutant/mutator/node/literal/nil.rb +8 -7
- data/lib/mutant/mutator/node/literal/range.rb +25 -50
- data/lib/mutant/mutator/node/literal/regex.rb +15 -23
- data/lib/mutant/mutator/node/literal/string.rb +7 -6
- data/lib/mutant/mutator/node/literal/symbol.rb +7 -6
- data/lib/mutant/mutator/node/literal.rb +4 -46
- data/lib/mutant/mutator/node/mlhs.rb +27 -0
- data/lib/mutant/mutator/node/noop.rb +18 -43
- data/lib/mutant/mutator/node/return.rb +8 -8
- data/lib/mutant/mutator/node/send/binary.rb +31 -0
- data/lib/mutant/mutator/node/send.rb +106 -72
- data/lib/mutant/mutator/node/super.rb +15 -20
- data/lib/mutant/mutator/node/when.rb +32 -7
- data/lib/mutant/mutator/node/while.rb +9 -7
- data/lib/mutant/mutator/node.rb +116 -66
- data/lib/mutant/mutator/registry.rb +14 -11
- data/lib/mutant/mutator/util/array.rb +9 -9
- data/lib/mutant/mutator/util/symbol.rb +6 -20
- data/lib/mutant/mutator/util.rb +6 -3
- data/lib/mutant/mutator.rb +12 -28
- data/lib/mutant/node_helpers.rb +28 -0
- data/lib/mutant/random.rb +3 -2
- data/lib/mutant/reporter/cli/printer/config.rb +174 -0
- data/lib/mutant/reporter/cli/printer/killer.rb +42 -0
- data/lib/mutant/reporter/cli/printer/mutation.rb +55 -0
- data/lib/mutant/reporter/cli/printer/subject.rb +147 -0
- data/lib/mutant/reporter/cli/printer.rb +165 -0
- data/lib/mutant/reporter/cli.rb +9 -277
- data/lib/mutant/reporter/null.rb +6 -30
- data/lib/mutant/reporter.rb +6 -73
- data/lib/mutant/runner/config.rb +82 -0
- data/lib/mutant/runner/mutation.rb +58 -0
- data/lib/mutant/runner/subject.rb +81 -0
- data/lib/mutant/runner.rb +42 -92
- data/lib/mutant/singleton_methods.rb +2 -2
- data/lib/mutant/strategy/method_expansion.rb +51 -0
- data/lib/mutant/strategy/rspec/dm2/lookup/method.rb +142 -0
- data/lib/mutant/strategy/rspec/dm2/lookup.rb +61 -0
- data/lib/mutant/strategy/rspec/dm2.rb +22 -0
- data/lib/mutant/strategy/rspec.rb +20 -22
- data/lib/mutant/strategy/static.rb +18 -0
- data/lib/mutant/strategy.rb +15 -50
- data/lib/mutant/subject/method.rb +100 -0
- data/lib/mutant/subject.rb +18 -49
- data/lib/mutant/support/method_object.rb +4 -2
- data/lib/mutant.rb +40 -35
- data/mutant.gemspec +9 -8
- data/spec/integration/mutant/rspec_killer_spec.rb +3 -3
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +9 -0
- data/spec/integration/mutant/zombie_spec.rb +1 -1
- data/spec/shared/method_matcher_behavior.rb +35 -0
- data/spec/shared/mutator_behavior.rb +63 -32
- data/spec/spec_helper.rb +13 -3
- data/spec/support/ice_nine_config.rb +8 -0
- data/spec/support/rspec.rb +1 -1
- data/spec/support/zombie.rb +1 -1
- data/spec/unit/mutant/cli/class_methods/new_spec.rb +42 -28
- data/spec/unit/mutant/cli/class_methods/run_spec.rb +15 -13
- data/spec/unit/mutant/cli/classifier/class_methods/build_spec.rb +44 -0
- data/spec/unit/mutant/context/scope/root_spec.rb +4 -4
- data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +6 -5
- data/spec/unit/mutant/killer/success_predicate_spec.rb +28 -0
- data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +1 -1
- data/spec/unit/mutant/matcher/chain/each_spec.rb +1 -1
- data/spec/unit/mutant/matcher/chain/matchers_spec.rb +1 -1
- data/spec/unit/mutant/matcher/method/instance/each_spec.rb +112 -0
- data/spec/unit/mutant/matcher/method/singleton/each_spec.rb +93 -0
- data/spec/unit/mutant/matcher/methods/instance/each_spec.rb +59 -0
- data/spec/unit/mutant/matcher/methods/singleton/each_spec.rb +53 -0
- data/spec/unit/mutant/matcher/namespace/each_spec.rb +37 -0
- data/spec/unit/mutant/mutator/node/begin/mutation_spec.rb +33 -0
- data/spec/unit/mutant/mutator/node/block/mutation_spec.rb +42 -14
- data/spec/unit/mutant/mutator/node/case/mutation_spec.rb +319 -0
- data/spec/unit/mutant/mutator/node/define/mutation_spec.rb +31 -27
- data/spec/unit/mutant/mutator/node/if/mutation_spec.rb +75 -0
- data/spec/unit/mutant/mutator/node/literal/fixnum_spec.rb +1 -1
- data/spec/unit/mutant/mutator/node/literal/hash_spec.rb +2 -2
- data/spec/unit/mutant/mutator/node/literal/nil_spec.rb +1 -3
- data/spec/unit/mutant/mutator/node/literal/regex_spec.rb +1 -9
- data/spec/unit/mutant/mutator/node/return/mutation_spec.rb +6 -2
- data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +111 -108
- data/spec/unit/mutant/mutator/node/super/mutation_spec.rb +0 -33
- data/spec/unit/mutant/mutator/node/while/mutation_spec.rb +2 -2
- data/spec/unit/mutant/runner/config/subjects_spec.rb +38 -0
- data/spec/unit/mutant/runner/config/success_predicate_spec.rb +53 -0
- data/spec/unit/mutant/runner/failed_predicte_spec.rb +33 -0
- data/spec/unit/mutant/runner/mutation/killer_spec.rb +39 -0
- data/spec/unit/mutant/runner/subject/success_predicate_spec.rb +49 -0
- data/spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb +49 -0
- data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +52 -0
- data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +42 -0
- data/spec/unit/mutant/subject/context_spec.rb +6 -3
- data/spec/unit/mutant/subject/each_spec.rb +11 -8
- data/spec/unit/mutant/subject/node_spec.rb +6 -2
- data/test_app/spec/shared/method_filter_parse_behavior.rb +0 -2
- data/test_app/spec/shared/method_match_behavior.rb +1 -1
- data/test_app/spec/spec_helper.rb +4 -2
- metadata +101 -109
- data/config/roodi.yml +0 -26
- data/lib/mutant/matcher/method/classifier.rb +0 -141
- data/lib/mutant/matcher/object_space.rb +0 -114
- data/lib/mutant/mutator/node/actual_arguments.rb +0 -25
- data/lib/mutant/mutator/node/default_arguments.rb +0 -25
- data/lib/mutant/mutator/node/formal_arguments_19/default_mutations.rb +0 -33
- data/lib/mutant/mutator/node/formal_arguments_19/pattern_argument_expansion.rb +0 -35
- data/lib/mutant/mutator/node/formal_arguments_19/require_defaults.rb +0 -37
- data/lib/mutant/mutator/node/formal_arguments_19.rb +0 -41
- data/lib/mutant/mutator/node/iter_19.rb +0 -27
- data/lib/mutant/mutator/node/literal/empty_array.rb +0 -26
- data/lib/mutant/mutator/node/pattern_arguments.rb +0 -41
- data/lib/mutant/mutator/node/pattern_variable.rb +0 -23
- data/lib/mutant/mutator/node/receiver_case.rb +0 -122
- data/lib/mutant/mutator/node/send/binary_operator_method.rb +0 -61
- data/lib/mutant/mutator/node/send/with_arguments.rb +0 -81
- data/lib/mutant/reporter/stats.rb +0 -120
- data/lib/mutant/strategy/rspec/example_lookup.rb +0 -163
- data/spec/integration/mutant/method_matching_spec.rb +0 -269
- data/spec/shared/method_match_behavior.rb +0 -39
- data/spec/unit/mutant/killer/fail_ques_spec.rb +0 -39
- data/spec/unit/mutant/matcher/class_methods/from_string_spec.rb +0 -49
- data/spec/unit/mutant/matcher/class_methods/parse_spec.rb +0 -12
- data/spec/unit/mutant/matcher/method/class_methods/parse_spec.rb +0 -21
- data/spec/unit/mutant/matcher/method/classifier/class_methods/run_spec.rb +0 -52
- data/spec/unit/mutant/matcher/object_space/class_methods/parse_spec.rb +0 -24
- data/spec/unit/mutant/matcher/object_space/each_spec.rb +0 -31
- data/spec/unit/mutant/mutator/node/if_statement/mutation_spec.rb +0 -60
- data/spec/unit/mutant/mutator/node/receiver_case/mutation_spec.rb +0 -27
- data/spec/unit/mutant/strategy/rspec/example_lookup/spec_file_spec.rb +0 -236
- data/spec/unit/mutant/subject/class_methods/new_spec.rb +0 -13
- data/tasks/metrics/ci.rake +0 -7
- data/tasks/metrics/flay.rake +0 -41
- data/tasks/metrics/flog.rake +0 -43
- data/tasks/metrics/heckle.rake +0 -216
- data/tasks/metrics/metric_fu.rake +0 -31
- data/tasks/metrics/reek.rake +0 -15
- data/tasks/metrics/roodi.rake +0 -15
- data/tasks/metrics/yardstick.rake +0 -23
- data/tasks/spec.rake +0 -45
- data/tasks/yard.rake +0 -9
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8076c9cdfc1fcf12d08d67b2b57bafdb5c9baff4
|
4
|
+
data.tar.gz: ab09a106e752bcc776d41ef04b5a77563eee0cf5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a4dc97bbebfc57f572c0c040515403e1d3dd8d87d72c96b8931de25716e9bf9612c56822f65d823227a4f2d461247ab43b5278f5f206726e9146f508d36c05db
|
7
|
+
data.tar.gz: 67f727d12f7e6ba0c522e0d8de73cc8784648a3fa08dabf63eefb9580b560786b7bcafec6fe9733a708f88f6365bc189fac178f20789b1ec6b0723aa4443035d
|
data/.travis.yml
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
language: ruby
|
2
|
-
script: 'bundle exec rake
|
2
|
+
script: 'bundle exec rake ci'
|
3
3
|
rvm:
|
4
|
-
- 1.8.7
|
5
|
-
- 1.9.2
|
6
4
|
- 1.9.3
|
7
5
|
- 2.0.0
|
8
6
|
- ruby-head
|
9
7
|
- rbx-19mode
|
8
|
+
- ruby-head
|
9
|
+
- jruby-19mode
|
10
10
|
matrix:
|
11
11
|
allow_failures:
|
12
|
-
# No
|
13
|
-
- rvm:
|
14
|
-
- rvm: 1.8.7
|
15
|
-
# We'll see what happens
|
16
|
-
- rvm: ruby-head
|
17
|
-
- rvm: 2.0.0
|
12
|
+
- rvm: jruby-19mode # No fork(2) support, workaround planned
|
13
|
+
- rvm: ruby-head # Broken at this time
|
18
14
|
notifications:
|
19
|
-
|
20
|
-
|
15
|
+
irc:
|
16
|
+
channels:
|
17
|
+
- irc.freenode.org#rom-rb
|
18
|
+
on_success: never
|
19
|
+
on_failure: change
|
data/Changelog.md
CHANGED
@@ -1,128 +1,183 @@
|
|
1
|
+
# v0.3.0 2013-06-xx
|
2
|
+
|
3
|
+
Feature:
|
4
|
+
|
5
|
+
* Rewrite all mutators on top of whitequark/parser
|
6
|
+
* Also mutate conditions in case statements
|
7
|
+
|
8
|
+
Bugfixes:
|
9
|
+
|
10
|
+
* Fix all bugs caused by mutant-melbourne
|
11
|
+
|
1
12
|
# v0.2.20 2013-03-1
|
2
13
|
|
3
|
-
*
|
14
|
+
* Update dependencies
|
4
15
|
|
5
16
|
[Compare v0.2.17..v0.2.20](https://github.com/mbj/mutant/compare/v0.2.17...v0.2.20)
|
6
17
|
|
7
18
|
# v0.2.17 2013-01-20
|
8
19
|
|
9
|
-
*
|
20
|
+
* Kill mutations in #initialize from class methods.
|
21
|
+
|
22
|
+
# v0.2.17 2013-01-20
|
23
|
+
|
24
|
+
Other:
|
25
|
+
|
26
|
+
* Update dependencies
|
10
27
|
|
11
28
|
[Compare v0.2.16..v0.2.17](https://github.com/mbj/mutant/compare/v0.2.16...v0.2.17)
|
12
29
|
|
13
30
|
# v0.2.16 2013-01-20
|
14
31
|
|
15
|
-
|
32
|
+
Bugfix:
|
33
|
+
|
34
|
+
* Handle Rubinius::AST::NthRef as noop
|
16
35
|
|
17
36
|
[Compare v0.2.15..v0.2.16](https://github.com/mbj/mutant/compare/v0.2.15...v0.2.16)
|
18
37
|
|
19
38
|
# v0.2.15 2013-01-10
|
20
39
|
|
21
|
-
|
40
|
+
Bugfix:
|
41
|
+
|
42
|
+
* Do not mutate super to super() anymore. This needs a context check in future.
|
22
43
|
|
23
44
|
[Compare v0.2.14..v0.2.15](https://github.com/mbj/mutant/compare/v0.2.14...v0.2.15)
|
24
45
|
|
25
46
|
# v0.2.14 2013-01-09
|
26
47
|
|
27
|
-
|
48
|
+
Bugfix:
|
49
|
+
|
50
|
+
* Do not emit mutation to { nil => nil } for hash literals
|
28
51
|
|
29
52
|
[Compare v0.2.13..v0.2.14](https://github.com/mbj/mutant/compare/v0.2.13...v0.2.14)
|
30
53
|
|
31
54
|
# v0.2.13 2013-01-09
|
32
55
|
|
33
|
-
|
56
|
+
Bugfix:
|
57
|
+
|
58
|
+
* Capture failures that occur in the window between mutation insertion and spec run as kills
|
34
59
|
|
35
60
|
[Compare v0.2.12..v0.2.13](https://github.com/mbj/mutant/compare/v0.2.12...v0.2.13)
|
36
61
|
|
37
62
|
# v0.2.12 2013-01-03
|
38
63
|
|
39
|
-
|
64
|
+
Bugfix:
|
65
|
+
|
66
|
+
* Do not crash when trying to load methods from precompiled ruby under rbx
|
40
67
|
|
41
68
|
[Compare v0.2.11..v0.2.12](https://github.com/mbj/mutant/compare/v0.2.11...v0.2.12)
|
42
69
|
|
43
70
|
# v0.2.11 2013-01-03
|
44
71
|
|
45
|
-
|
46
|
-
|
72
|
+
Feature:
|
73
|
+
|
74
|
+
* Handle binary operator methods in dedicated mutator
|
75
|
+
|
76
|
+
Bugfix:
|
77
|
+
|
78
|
+
* Do not crash when mutating binary operator method
|
47
79
|
|
48
80
|
[Compare v0.2.10..v0.2.11](https://github.com/mbj/mutant/compare/v0.2.10...v0.2.11)
|
49
81
|
|
50
82
|
# v0.2.10 2013-01-03
|
51
83
|
|
52
|
-
|
84
|
+
Bugfix:
|
85
|
+
|
86
|
+
* Do not mutate receivers away when message name is a keyword
|
53
87
|
|
54
88
|
[Compare v0.2.9..v0.2.10](https://github.com/mbj/mutant/compare/v0.2.9...v0.2.10)
|
55
89
|
|
56
90
|
# v0.2.9 2013-01-02
|
57
91
|
|
58
|
-
|
59
|
-
|
92
|
+
Feature:
|
93
|
+
|
94
|
+
* Mutate instance and global variable assignments
|
95
|
+
* Mutate super calls
|
60
96
|
|
61
97
|
[Compare v0.2.8..v0.2.9](https://github.com/mbj/mutant/compare/v0.2.8...v0.2.9)
|
62
98
|
|
63
99
|
# v0.2.8 2012-12-29
|
64
100
|
|
65
|
-
|
66
|
-
|
67
|
-
*
|
101
|
+
Feature:
|
102
|
+
|
103
|
+
* Do not mutate argument or local variable names beginning with an underscore
|
104
|
+
* Mutate unary calls ```coerce(object)``` => ```object```
|
105
|
+
* Mutate method call receivers ```foo.bar``` => ```foo```
|
68
106
|
|
69
107
|
[Compare v0.2.7..v0.2.8](https://github.com/mbj/mutant/compare/v0.2.7...v0.2.8)
|
70
108
|
|
71
109
|
# v0.2.7 2012-12-21
|
72
110
|
|
73
|
-
|
111
|
+
Feature:
|
112
|
+
|
113
|
+
* Use latest adamantium and ice_nine
|
74
114
|
|
75
115
|
[Compare v0.2.6..v0.2.7](https://github.com/mbj/mutant/compare/v0.2.6...v0.2.7)
|
76
116
|
|
77
117
|
# v0.2.6 2012-12-14
|
78
118
|
|
79
|
-
|
119
|
+
Bugfix:
|
120
|
+
|
121
|
+
* Correctly set file and line of injected mutants
|
80
122
|
|
81
123
|
[Compare v0.2.5..v0.2.6](https://github.com/mbj/mutant/compare/v0.2.5...v0.2.6)
|
82
124
|
|
83
125
|
# v0.2.5 2012-12-12
|
84
126
|
|
85
|
-
|
86
|
-
|
87
|
-
*
|
88
|
-
*
|
89
|
-
*
|
90
|
-
*
|
91
|
-
*
|
92
|
-
*
|
93
|
-
*
|
94
|
-
*
|
95
|
-
*
|
96
|
-
|
127
|
+
Feature:
|
128
|
+
|
129
|
+
* Add --debug flag for showing killer output and mutation
|
130
|
+
* Run noop mutation per subject to guard against initial failing specs
|
131
|
+
* Mutate default into required arguments
|
132
|
+
* Mutate default literals
|
133
|
+
* Mutate unwinding of pattern args ```|(a, b), c|``` => ```|a, b, c|```
|
134
|
+
* Mutate define and block arguments
|
135
|
+
* Mutate block arguments, inklusive pattern args
|
136
|
+
* Recurse into block bodies
|
137
|
+
* Unvendor inflector use mbj-inflector from rubygems
|
138
|
+
|
139
|
+
Bugfix:
|
140
|
+
|
141
|
+
* Insert mutations at correct constant scope
|
142
|
+
* Crash on mutating yield, added a noop for now
|
143
|
+
* Crash on singleton methods defined on other than constants or self
|
97
144
|
|
98
145
|
[Compare v0.2.4..v0.2.5](https://github.com/mbj/mutant/compare/v0.2.4...v0.2.5)
|
99
146
|
|
100
147
|
# v0.2.4 2012-12-12
|
101
148
|
|
102
|
-
|
149
|
+
Bugfix:
|
150
|
+
|
151
|
+
* Correctly vendor inflector
|
103
152
|
|
104
153
|
[Compare v0.2.3..v0.2.4](https://github.com/mbj/mutant/compare/v0.2.3...v0.2.4)
|
105
154
|
|
106
155
|
# v0.2.3 2012-12-08
|
107
156
|
|
108
|
-
|
157
|
+
Bugfix:
|
158
|
+
|
159
|
+
* Prepend extra elements to hash and array instead of append. This fixes unkillable mutators in parallel assignments!
|
109
160
|
|
110
161
|
[Compare v0.2.2..v0.2.3](https://github.com/mbj/mutant/compare/v0.2.2...v0.2.3)
|
111
162
|
|
112
163
|
# v0.2.2 2012-12-07
|
113
164
|
|
114
|
-
|
165
|
+
Feature:
|
166
|
+
|
167
|
+
* Add a shitload of operator expansions for dm2 strategy
|
115
168
|
|
116
169
|
[Compare v0.2.1..v0.2.2](https://github.com/mbj/mutant/compare/v0.2.1...v0.2.2)
|
117
170
|
|
118
171
|
# v0.2.1 2012-12-07
|
119
172
|
|
120
|
-
|
121
|
-
|
122
|
-
*
|
123
|
-
*
|
124
|
-
*
|
125
|
-
*
|
173
|
+
Bugfix:
|
174
|
+
|
175
|
+
* Crash on unavailable source location
|
176
|
+
* Incorrect handling of if and unless statements
|
177
|
+
* Expand Foo#initialize to spec/unit/foo in rspec dm2 strategy
|
178
|
+
* Correctly expand [] to element_reader_spec.rb in rspec dm2 strategy
|
179
|
+
* Correctly expand []= to element_writer_spec.rb in rspec dm2 strategy
|
180
|
+
* Correctly expand foo= to foo_writer_spec.rb in rspec dm2 strategy
|
126
181
|
|
127
182
|
[Compare v0.2.0..v0.2.1](https://github.com/mbj/mutant/compare/v0.2.0...v0.2.1)
|
128
183
|
|
data/Gemfile
CHANGED
@@ -2,5 +2,7 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
gem '
|
5
|
+
gem 'mutant', :path => '.'
|
6
|
+
|
7
|
+
gem 'devtools', :git => 'https://github.com/rom-rb/devtools.git'
|
6
8
|
eval(File.read(File.join(File.dirname(__FILE__),'Gemfile.devtools')))
|
data/Gemfile.devtools
CHANGED
@@ -1,27 +1,26 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
group :development do
|
4
|
-
gem 'rake', '~> 10.0
|
4
|
+
gem 'rake', '~> 10.1.0'
|
5
5
|
gem 'rspec', '~> 2.13.0'
|
6
|
-
gem 'yard', '~> 0.8.
|
6
|
+
gem 'yard', '~> 0.8.6.1'
|
7
7
|
end
|
8
8
|
|
9
9
|
group :yard do
|
10
|
-
gem 'kramdown', '~> 0.
|
10
|
+
gem 'kramdown', '~> 1.0.1'
|
11
11
|
end
|
12
12
|
|
13
13
|
group :guard do
|
14
|
-
gem 'guard', '~> 1.
|
14
|
+
gem 'guard', '~> 1.8.1'
|
15
15
|
gem 'guard-bundler', '~> 1.0.0'
|
16
|
-
gem 'guard-rspec', '~>
|
16
|
+
gem 'guard-rspec', '~> 3.0.2'
|
17
17
|
|
18
18
|
# file system change event handling
|
19
|
+
gem 'listen', '~> 1.2.2'
|
19
20
|
gem 'rb-fchange', '~> 0.0.6', :require => false
|
20
21
|
gem 'rb-fsevent', '~> 0.9.3', :require => false
|
21
22
|
gem 'rb-inotify', '~> 0.9.0', :require => false
|
22
23
|
|
23
|
-
gem 'listen', '~> 0.7.3'
|
24
|
-
|
25
24
|
# notification handling
|
26
25
|
gem 'libnotify', '~> 0.8.0', :require => false
|
27
26
|
gem 'rb-notifu', '~> 0.0.4', :require => false
|
@@ -29,21 +28,18 @@ group :guard do
|
|
29
28
|
end
|
30
29
|
|
31
30
|
group :metrics do
|
32
|
-
gem '
|
33
|
-
gem '
|
34
|
-
gem '
|
35
|
-
gem '
|
36
|
-
gem '
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
gem 'backports', '~> 3.3', '>= 3.3.2'
|
32
|
+
gem 'coveralls', '~> 0.6.7'
|
33
|
+
gem 'flay', '~> 2.3.0'
|
34
|
+
gem 'flog', '~> 4.1.0'
|
35
|
+
gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
|
36
|
+
gem 'simplecov', '~> 0.7.1'
|
37
|
+
gem 'yardstick', '~> 0.9.6'
|
38
|
+
|
39
|
+
platforms :ruby_19 do
|
40
40
|
gem 'yard-spellcheck', '~> 0.1.5'
|
41
41
|
end
|
42
42
|
|
43
|
-
platforms :mri_19 do
|
44
|
-
gem 'simplecov', '~> 0.7.1'
|
45
|
-
end
|
46
|
-
|
47
43
|
platforms :rbx do
|
48
44
|
gem 'pelusa', '~> 0.2.2'
|
49
45
|
end
|
@@ -55,6 +51,6 @@ end
|
|
55
51
|
|
56
52
|
platform :jruby do
|
57
53
|
group :jruby do
|
58
|
-
gem 'jruby-openssl', '~> 0.8.
|
54
|
+
gem 'jruby-openssl', '~> 0.8.5'
|
59
55
|
end
|
60
56
|
end
|
data/Guardfile
CHANGED
@@ -4,7 +4,7 @@ guard :bundler do
|
|
4
4
|
watch('Gemfile')
|
5
5
|
end
|
6
6
|
|
7
|
-
guard :rspec, :all_on_start => false, :all_after_pass => false do
|
7
|
+
guard :rspec, :cli => '--fail-fast', :all_on_start => false, :all_after_pass => false do
|
8
8
|
# run all specs if the spec_helper or supporting files files are modified
|
9
9
|
watch('spec/spec_helper.rb') { 'spec/unit' }
|
10
10
|
watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec/unit' }
|
data/README.md
CHANGED
@@ -3,27 +3,36 @@ mutant
|
|
3
3
|
|
4
4
|
[![Build Status](https://secure.travis-ci.org/mbj/mutant.png?branch=master)](http://travis-ci.org/mbj/mutant)
|
5
5
|
[![Dependency Status](https://gemnasium.com/mbj/mutant.png)](https://gemnasium.com/mbj/mutant)
|
6
|
-
[![Code Climate](https://codeclimate.com/
|
6
|
+
[![Code Climate](https://codeclimate.com/github/mbj/mutant.png)](https://codeclimate.com/github/mbj/mutant)
|
7
7
|
|
8
|
-
Mutant is a mutation testing tool for ruby
|
8
|
+
Mutant is a mutation testing tool for ruby. It aims to be better than existing mutation testers.
|
9
9
|
|
10
|
-
The idea is that if code can be changed and your tests do not notice, either that code isn't being covered
|
10
|
+
The idea is that if code can be changed and your tests do not notice, either that code isn't being covered
|
11
11
|
or it does not have a speced side effect.
|
12
12
|
|
13
|
-
Mutant
|
13
|
+
Mutant supports MRI and RBX gte 19-mode (1.9.3!), while support for jruby is planned. It should also work under any ruby
|
14
|
+
engine that supports POSIX-fork(2) semantics.
|
14
15
|
|
15
|
-
|
16
|
+
Only rspec2 is supported currently. This is subject to change.
|
17
|
+
|
18
|
+
It is easy to write a mutation killer for other test/spec frameworks than rspec2.
|
16
19
|
Just create your own Mutant::Killer subclass, and make sure I get a PR!
|
17
20
|
|
18
21
|
See this [ASCII-Cast](http://ascii.io/a/1707) for mutant in action! (v0.2.1)
|
19
22
|
|
20
|
-
|
21
|
-
|
23
|
+
Projects using Mutant
|
24
|
+
---------------------
|
22
25
|
|
23
|
-
The following projects adopted mutant
|
26
|
+
The following projects adopted mutant, and aim 100% mutation coverage:
|
24
27
|
|
25
|
-
* [
|
28
|
+
* [axiom](https://github.com/dkubb/axiom)
|
29
|
+
* [axiom-types](https://github.com/dkubb/axiom-types)
|
30
|
+
* [rom-mapper](https://github.com/rom/rom-mapper)
|
31
|
+
* [rom-session](https://github.com/rom/rom-session)
|
32
|
+
* [event_bus](https://github.com/kevinrutherford/event_bus)
|
26
33
|
* [virtus](https://github.com/solnic/virtus)
|
34
|
+
* [quacky](https://github.com/benmoss/quacky)
|
35
|
+
* [substation](https://github.com/snusnu/substation)
|
27
36
|
* various small/minor stuff under https://github.com/mbj
|
28
37
|
|
29
38
|
Feel free to ping me to add your project to the list!
|
@@ -31,7 +40,7 @@ Feel free to ping me to add your project to the list!
|
|
31
40
|
Installation
|
32
41
|
------------
|
33
42
|
|
34
|
-
Install the gem
|
43
|
+
Install the gem `mutant` via your preferred method.
|
35
44
|
|
36
45
|
Examples
|
37
46
|
--------
|
@@ -42,7 +51,7 @@ CLI will be simplified in the next releases, but currently stick with this:
|
|
42
51
|
cd virtus
|
43
52
|
# Run mutant on virtus namespace (that uses the dm-2 style spec layout)
|
44
53
|
mutant -I lib -r virtus --rspec-dm2 ::Virtus
|
45
|
-
# Run mutant on specific virtus class
|
54
|
+
# Run mutant on specific virtus class
|
46
55
|
mutant -I lib -r virtus --rspec-dm2 ::Virtus::Attribute
|
47
56
|
# Run mutant on specific virtus class method
|
48
57
|
mutant -I lib -r virtus --rspec-dm2 ::Virtus::Attribute.build
|
@@ -53,8 +62,8 @@ mutant -I lib -r virtus --rspec-dm2 ::Virtus::Attribute#name
|
|
53
62
|
Strategies
|
54
63
|
----------
|
55
64
|
|
56
|
-
Mutation testing is slow.
|
57
|
-
Mutant currently supports the following
|
65
|
+
Mutation testing is slow. The key to making it fast is selecting the correct set of tests to run.
|
66
|
+
Mutant currently supports the following built-in strategies for selecting tests/specs.
|
58
67
|
|
59
68
|
### --rspec-dm2
|
60
69
|
|
@@ -70,12 +79,12 @@ Private singleton methods: spec/unit/#{namespace}/#{class_name}/class_methods/*_
|
|
70
79
|
|
71
80
|
#### Expansions:
|
72
81
|
|
73
|
-
Symbolic operator
|
82
|
+
Symbolic operator-like methods are expanded, e.g. ```Foo#<<``` is expanded to:
|
74
83
|
```
|
75
84
|
spec/unit/foo/left_shift_operator_spec.rb
|
76
85
|
````
|
77
86
|
|
78
|
-
The full list of
|
87
|
+
The full list of expansions can be found here:
|
79
88
|
|
80
89
|
https://github.com/mbj/mutant/blob/master/lib/mutant/constants.rb
|
81
90
|
|
@@ -91,7 +100,7 @@ This strategy executes all specs under ``./spec/integration`` for each mutation.
|
|
91
100
|
|
92
101
|
This strategy executes all specs under ``./spec`` for each mutation.
|
93
102
|
|
94
|
-
|
103
|
+
In the future, we plan on allowing explicit selections on the specs to be run, as well as support for other test frameworks.
|
95
104
|
Custom project specific strategies are also on the roadmap.
|
96
105
|
|
97
106
|
Alternatives
|
@@ -99,6 +108,17 @@ Alternatives
|
|
99
108
|
|
100
109
|
* [heckle](https://github.com/seattlerb/heckle)
|
101
110
|
|
111
|
+
Support
|
112
|
+
-------
|
113
|
+
|
114
|
+
I'm very happy to receive/answer feedback/questions and critism.
|
115
|
+
|
116
|
+
Your options:
|
117
|
+
|
118
|
+
* GitHub Issues https://github.com/mbj/mutant/issues
|
119
|
+
* Ping me on https://twitter.com/_m_b_j_
|
120
|
+
* #rom-rb channel on freenode, I hang around on CET daytimes. (nick mbj)
|
121
|
+
|
102
122
|
Credits
|
103
123
|
-------
|
104
124
|
|
data/Rakefile
CHANGED
@@ -1,4 +1,23 @@
|
|
1
|
-
require 'rake'
|
2
1
|
require 'devtools'
|
2
|
+
Devtools.init_rake_tasks
|
3
3
|
|
4
|
-
|
4
|
+
class Rake::Task
|
5
|
+
def overwrite(&block)
|
6
|
+
@actions.clear
|
7
|
+
enhance(&block)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Rake.application.load_imports
|
12
|
+
|
13
|
+
Rake::Task['metrics:mutant'].overwrite do
|
14
|
+
$stderr.puts "Mutant self mutation (Zombie) is deactivated"
|
15
|
+
# project = Devtools.project
|
16
|
+
# require File.expand_path('../spec/support/zombie.rb', __FILE__)
|
17
|
+
# Zombie.setup
|
18
|
+
# status = Zombie::CLI.run(%W(::Mutant --rspec-dm2))
|
19
|
+
# if status.nonzero?
|
20
|
+
# $stderr.puts 'Zombie task is not successful'
|
21
|
+
# $stderr.puts 'Not fatal at this point of development, will be fixed before release of 0.3.0'
|
22
|
+
# end
|
23
|
+
end
|
data/TODO
CHANGED
@@ -2,10 +2,11 @@ Code:
|
|
2
2
|
* Test mutant with dynamically created zombie.
|
3
3
|
* Fix ugly code within default parameter mutations
|
4
4
|
* Break up lib/mutant/mutator/node/send.rb in class specific files
|
5
|
-
* Log all warnings
|
5
|
+
* Log all warnings through reporter, so remove random $stderr.puts calls
|
6
|
+
* Use rational to represent percent values
|
6
7
|
|
7
8
|
AST:
|
8
|
-
*
|
9
|
+
* Use whitequarcks parser and the to be writte unparser. This fixes all RBX AST issues.
|
9
10
|
|
10
11
|
Mutations:
|
11
12
|
* Add binary operator specific mutations (YAY, finally reached this point)
|
@@ -15,11 +16,12 @@ Mutations:
|
|
15
16
|
* Mutate options on Regexp literals
|
16
17
|
* Add mutations for dynamic regexp symbol and string literals
|
17
18
|
* Mutate "def foo; bar; end" to "def foo; self; end"?
|
18
|
-
* Emit negative and positive mutations
|
19
|
+
* Emit negative and positive mutations
|
19
20
|
* Mutate Block catch "def foo(&block)" and block pass "foo(&block)"
|
20
21
|
* Mutate super arguments just like send arguments
|
22
|
+
* Binary operator mutations
|
21
23
|
* Add timeout to terminate infinite loops
|
22
|
-
|
24
|
+
|
23
25
|
Example of a negative mutation:
|
24
26
|
Mutations on local variables and arguments prefixed with an underscore would be emitted as
|
25
27
|
negative mutations that must be alive.
|
@@ -29,18 +31,20 @@ Loader:
|
|
29
31
|
|
30
32
|
Killers:
|
31
33
|
* Move test framework specific stuff to strategy
|
32
|
-
* Add a general master <=> killer IPC interface. So different strategies of isolation
|
34
|
+
* Add a general master <=> killer IPC interface. So different strategies of isolation
|
33
35
|
(fork, vs jruby runtime creation) will work without big impact.
|
34
36
|
|
37
|
+
Kill:
|
38
|
+
* Introduce mutant Kill that acts as a DTO between killer and runner. (Simplifies reporting)
|
39
|
+
|
35
40
|
Strategy:
|
36
41
|
* Aggregate warnings on missing spec files
|
37
42
|
* Provide "expicit files to kill with" strategy
|
38
|
-
* Automatically load ./spec/spec_helper.rb for rspec strategies (No need to specify -I and -r anymore)
|
39
43
|
|
40
44
|
Matcher:
|
41
45
|
* Allow matches on attr_reader with literal name argument(s)?
|
42
46
|
* Allow matches on define_method with literal name argument?
|
43
47
|
|
44
48
|
jruby-support:
|
45
|
-
*
|
49
|
+
* Use whitequarck parser
|
46
50
|
* Create a runtime per mutation to kill mutations in isolation
|
data/bin/mutant
CHANGED
data/bin/zombie
CHANGED
data/config/devtools.yml
ADDED
data/config/flay.yml
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
3
|
-
total_score:
|
2
|
+
threshold: 16
|
3
|
+
total_score: 604
|
data/config/flog.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
---
|
2
|
-
threshold:
|
2
|
+
threshold: 19.8
|