mutest 0.0.9 → 0.0.10
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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +38 -0
- data/{config/rubocop.yml → .rubocop.yml} +80 -183
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -3
- data/Gemfile.lock +41 -52
- data/README.md +16 -0
- data/Rakefile +1 -1
- data/lib/mutest.rb +5 -4
- data/lib/mutest/actor.rb +7 -6
- data/lib/mutest/actor/env.rb +3 -3
- data/lib/mutest/actor/mailbox.rb +5 -4
- data/lib/mutest/actor/receiver.rb +6 -5
- data/lib/mutest/actor/sender.rb +5 -4
- data/lib/mutest/ast.rb +4 -3
- data/lib/mutest/ast/meta.rb +3 -3
- data/lib/mutest/ast/meta/const.rb +7 -5
- data/lib/mutest/ast/meta/optarg.rb +6 -5
- data/lib/mutest/ast/meta/resbody.rb +6 -5
- data/lib/mutest/ast/meta/restarg.rb +6 -5
- data/lib/mutest/ast/meta/send.rb +8 -20
- data/lib/mutest/ast/meta/symbol.rb +6 -5
- data/lib/mutest/ast/named_children.rb +5 -5
- data/lib/mutest/ast/node_predicates.rb +4 -4
- data/lib/mutest/ast/nodes.rb +3 -3
- data/lib/mutest/ast/regexp.rb +3 -3
- data/lib/mutest/ast/regexp/transformer.rb +19 -11
- data/lib/mutest/ast/regexp/transformer/alternative.rb +6 -6
- data/lib/mutest/ast/regexp/transformer/character_set.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/direct.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/options_group.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/quantifier.rb +11 -13
- data/lib/mutest/ast/regexp/transformer/recursive.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/root.rb +6 -6
- data/lib/mutest/ast/regexp/transformer/text.rb +7 -7
- data/lib/mutest/ast/sexp.rb +3 -3
- data/lib/mutest/ast/types.rb +8 -6
- data/lib/mutest/cli.rb +5 -3
- data/lib/mutest/color.rb +4 -3
- data/lib/mutest/config.rb +4 -3
- data/lib/mutest/context.rb +4 -3
- data/lib/mutest/diff.rb +5 -3
- data/lib/mutest/env.rb +5 -5
- data/lib/mutest/env/bootstrap.rb +7 -5
- data/lib/mutest/expression.rb +7 -5
- data/lib/mutest/expression/method.rb +4 -4
- data/lib/mutest/expression/methods.rb +4 -4
- data/lib/mutest/expression/namespace.rb +9 -8
- data/lib/mutest/expression/parser.rb +9 -8
- data/lib/mutest/integration.rb +5 -3
- data/lib/mutest/integration/null.rb +3 -3
- data/lib/mutest/isolation.rb +2 -2
- data/lib/mutest/isolation/fork.rb +4 -4
- data/lib/mutest/isolation/none.rb +4 -4
- data/lib/mutest/loader.rb +2 -2
- data/lib/mutest/matcher.rb +4 -3
- data/lib/mutest/matcher/chain.rb +3 -3
- data/lib/mutest/matcher/compiler.rb +7 -5
- data/lib/mutest/matcher/config.rb +5 -4
- data/lib/mutest/matcher/filter.rb +3 -3
- data/lib/mutest/matcher/method.rb +13 -13
- data/lib/mutest/matcher/method/instance.rb +6 -6
- data/lib/mutest/matcher/method/singleton.rb +5 -5
- data/lib/mutest/matcher/methods.rb +7 -6
- data/lib/mutest/matcher/namespace.rb +3 -3
- data/lib/mutest/matcher/null.rb +3 -3
- data/lib/mutest/matcher/scope.rb +3 -3
- data/lib/mutest/matcher/static.rb +3 -3
- data/lib/mutest/meta.rb +4 -4
- data/lib/mutest/meta/example.rb +5 -4
- data/lib/mutest/meta/example/dsl.rb +12 -11
- data/lib/mutest/meta/example/verification.rb +7 -6
- data/lib/mutest/mutation.rb +7 -6
- data/lib/mutest/mutator.rb +6 -6
- data/lib/mutest/mutator/node.rb +19 -7
- data/lib/mutest/mutator/node/and_asgn.rb +4 -4
- data/lib/mutest/mutator/node/argument.rb +6 -5
- data/lib/mutest/mutator/node/arguments.rb +18 -5
- data/lib/mutest/mutator/node/begin.rb +4 -4
- data/lib/mutest/mutator/node/binary.rb +4 -4
- data/lib/mutest/mutator/node/block.rb +6 -5
- data/lib/mutest/mutator/node/block_pass.rb +4 -4
- data/lib/mutest/mutator/node/break.rb +4 -4
- data/lib/mutest/mutator/node/case.rb +6 -4
- data/lib/mutest/mutator/node/class.rb +4 -4
- data/lib/mutest/mutator/node/conditional_loop.rb +4 -4
- data/lib/mutest/mutator/node/const.rb +4 -4
- data/lib/mutest/mutator/node/define.rb +6 -6
- data/lib/mutest/mutator/node/defined.rb +4 -4
- data/lib/mutest/mutator/node/dstr.rb +4 -4
- data/lib/mutest/mutator/node/dsym.rb +4 -4
- data/lib/mutest/mutator/node/generic.rb +5 -4
- data/lib/mutest/mutator/node/if.rb +6 -4
- data/lib/mutest/mutator/node/index.rb +128 -0
- data/lib/mutest/mutator/node/kwbegin.rb +4 -4
- data/lib/mutest/mutator/node/literal.rb +4 -4
- data/lib/mutest/mutator/node/literal/array.rb +8 -6
- data/lib/mutest/mutator/node/literal/boolean.rb +5 -5
- data/lib/mutest/mutator/node/literal/fixnum.rb +5 -5
- data/lib/mutest/mutator/node/literal/float.rb +5 -5
- data/lib/mutest/mutator/node/literal/hash.rb +6 -6
- data/lib/mutest/mutator/node/literal/nil.rb +5 -5
- data/lib/mutest/mutator/node/literal/range.rb +5 -5
- data/lib/mutest/mutator/node/literal/regex.rb +5 -5
- data/lib/mutest/mutator/node/literal/string.rb +5 -5
- data/lib/mutest/mutator/node/literal/symbol.rb +5 -5
- data/lib/mutest/mutator/node/masgn.rb +4 -4
- data/lib/mutest/mutator/node/match_current_line.rb +4 -4
- data/lib/mutest/mutator/node/mlhs.rb +4 -4
- data/lib/mutest/mutator/node/named_value/access.rb +6 -6
- data/lib/mutest/mutator/node/named_value/constant_assignment.rb +6 -5
- data/lib/mutest/mutator/node/named_value/variable_assignment.rb +5 -5
- data/lib/mutest/mutator/node/next.rb +4 -4
- data/lib/mutest/mutator/node/nthref.rb +4 -4
- data/lib/mutest/mutator/node/op_asgn.rb +4 -4
- data/lib/mutest/mutator/node/or_asgn.rb +5 -4
- data/lib/mutest/mutator/node/procarg_zero.rb +45 -0
- data/lib/mutest/mutator/node/regexp.rb +6 -6
- data/lib/mutest/mutator/node/regexp/alternation_meta.rb +5 -5
- data/lib/mutest/mutator/node/regexp/capture_group.rb +5 -5
- data/lib/mutest/mutator/node/regexp/character_type.rb +5 -5
- data/lib/mutest/mutator/node/regexp/end_of_line_anchor.rb +5 -5
- data/lib/mutest/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +5 -5
- data/lib/mutest/mutator/node/regexp/one_or_more.rb +5 -5
- data/lib/mutest/mutator/node/regexp/zero_or_more.rb +5 -5
- data/lib/mutest/mutator/node/regopt.rb +4 -4
- data/lib/mutest/mutator/node/resbody.rb +6 -4
- data/lib/mutest/mutator/node/rescue.rb +6 -4
- data/lib/mutest/mutator/node/return.rb +5 -4
- data/lib/mutest/mutator/node/send.rb +6 -34
- data/lib/mutest/mutator/node/send/attribute_assignment.rb +5 -5
- data/lib/mutest/mutator/node/send/binary.rb +5 -5
- data/lib/mutest/mutator/node/send/conditional.rb +5 -5
- data/lib/mutest/mutator/node/splat.rb +4 -4
- data/lib/mutest/mutator/node/super.rb +4 -4
- data/lib/mutest/mutator/node/when.rb +4 -4
- data/lib/mutest/mutator/node/yield.rb +4 -4
- data/lib/mutest/mutator/node/zsuper.rb +4 -4
- data/lib/mutest/mutator/util.rb +3 -3
- data/lib/mutest/mutator/util/array.rb +6 -6
- data/lib/mutest/mutator/util/symbol.rb +4 -4
- data/lib/mutest/parallel.rb +16 -12
- data/lib/mutest/parallel/master.rb +4 -4
- data/lib/mutest/parallel/source.rb +6 -5
- data/lib/mutest/parallel/worker.rb +6 -5
- data/lib/mutest/parser.rb +4 -3
- data/lib/mutest/registry.rb +6 -5
- data/lib/mutest/reporter.rb +2 -2
- data/lib/mutest/reporter/cli.rb +3 -3
- data/lib/mutest/reporter/cli/format.rb +9 -8
- data/lib/mutest/reporter/cli/printer.rb +8 -8
- data/lib/mutest/reporter/cli/printer/config.rb +5 -5
- data/lib/mutest/reporter/cli/printer/env_progress.rb +16 -16
- data/lib/mutest/reporter/cli/printer/env_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/mutation_progress_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/mutation_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/status.rb +6 -5
- data/lib/mutest/reporter/cli/printer/status_progressive.rb +5 -5
- data/lib/mutest/reporter/cli/printer/subject_progress.rb +5 -5
- data/lib/mutest/reporter/cli/printer/subject_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/test_result.rb +5 -5
- data/lib/mutest/reporter/cli/tput.rb +6 -5
- data/lib/mutest/reporter/null.rb +3 -3
- data/lib/mutest/reporter/sequence.rb +3 -3
- data/lib/mutest/repository.rb +9 -7
- data/lib/mutest/require_highjack.rb +2 -2
- data/lib/mutest/requirer.rb +2 -2
- data/lib/mutest/result.rb +18 -12
- data/lib/mutest/runner.rb +6 -3
- data/lib/mutest/runner/sink.rb +3 -3
- data/lib/mutest/scope.rb +2 -2
- data/lib/mutest/selector.rb +4 -3
- data/lib/mutest/selector/expression.rb +3 -3
- data/lib/mutest/source_file.rb +6 -5
- data/lib/mutest/subject.rb +5 -3
- data/lib/mutest/subject/method.rb +3 -3
- data/lib/mutest/subject/method/instance.rb +5 -5
- data/lib/mutest/subject/method/singleton.rb +4 -4
- data/lib/mutest/test.rb +4 -3
- data/lib/mutest/util.rb +3 -3
- data/lib/mutest/version.rb +2 -2
- data/lib/mutest/warning_filter.rb +3 -3
- data/lib/mutest/zombifier.rb +5 -4
- data/meta/block.rb +22 -3
- data/meta/case.rb +29 -1
- data/meta/index.rb +132 -0
- data/meta/indexasgn.rb +42 -0
- data/meta/lambda.rb +17 -0
- data/meta/send.rb +5 -139
- data/mutest-rspec.gemspec +1 -1
- data/mutest.gemspec +11 -12
- data/spec/integration/mutest/rspec_spec.rb +1 -1
- data/spec/shared/framework_integration_behavior.rb +1 -1
- data/spec/shared/idempotent_method_behavior.rb +2 -1
- data/spec/spec_helper.rb +5 -5
- data/spec/support/compress_helper.rb +2 -1
- data/spec/support/corpus.rb +12 -8
- data/spec/support/fake_actor.rb +19 -14
- data/spec/support/file_system.rb +10 -7
- data/spec/support/ice_nine_config.rb +3 -3
- data/spec/support/ruby_vm.rb +10 -11
- data/spec/support/shared_context.rb +1 -1
- data/spec/support/test_app.rb +1 -1
- data/spec/support/warning.rb +8 -7
- data/spec/support/xspec.rb +18 -17
- data/spec/unit/mutest/actor/binding_spec.rb +1 -0
- data/spec/unit/mutest/ast/meta/optarg_spec.rb +1 -0
- data/spec/unit/mutest/ast/meta/send/proc_predicate_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send_spec.rb +14 -18
- data/spec/unit/mutest/ast/regexp_spec.rb +4 -3
- data/spec/unit/mutest/ast_spec.rb +1 -1
- data/spec/unit/mutest/cli_spec.rb +15 -15
- data/spec/unit/mutest/env/bootstrap_spec.rb +1 -1
- data/spec/unit/mutest/integration_spec.rb +1 -0
- data/spec/unit/mutest/isolation/none_spec.rb +1 -1
- data/spec/unit/mutest/matcher/config_spec.rb +1 -0
- data/spec/unit/mutest/mutator/node_spec.rb +1 -1
- data/spec/unit/mutest/parallel/master_spec.rb +3 -3
- data/spec/unit/mutest/reporter/cli/printer_spec.rb +2 -0
- data/spec/unit/mutest/reporter/cli/tput_spec.rb +2 -0
- data/spec/unit/mutest/reporter/cli_spec.rb +2 -0
- data/spec/unit/mutest/repository/diff_spec.rb +1 -1
- data/spec/unit/mutest/runner_spec.rb +1 -1
- data/spec/unit/mutest/subject_spec.rb +1 -1
- data/spec/unit/mutest/warning_filter_spec.rb +2 -3
- data/spec/unit/mutest/zombifier_spec.rb +1 -1
- data/test_app/Gemfile.rspec3.8 +7 -0
- metadata +67 -68
- data/.buildkite/hooks/pre-command +0 -3
- data/.buildkite/pipeline.yml +0 -38
- data/.gitmodules +0 -3
- data/circle.yml +0 -10
- data/config/triage.yml +0 -2
- data/config/yardstick.yml +0 -2
- data/lib/mutest/mutator/node/send/index.rb +0 -47
data/README.md
CHANGED
@@ -4,6 +4,22 @@ mutest
|
|
4
4
|
|
5
5
|
`mutest` is a mutation testing tool for ruby designed to help audit the thoroughness of your test suite and encourage you to write more robust code.
|
6
6
|
|
7
|
+
## Relationship to `mutant`
|
8
|
+
|
9
|
+
`mutest` is a fork of the [mutant](https://github.com/mbj/mutant) project with a few minor additions. There are a handful of mutations which have been added, removed, or altered (see the [CHANGELOG](CHANGELOG.md) for details) as well as an inline disable comment system. This means that `mutest` allows you to do something like this:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
# mutest:disable
|
13
|
+
dont_mutate(me: true) # This line is not mutated because of the significant comment above.
|
14
|
+
mutate(me: true) # This line would continue to be mutated.
|
15
|
+
```
|
16
|
+
|
17
|
+
The `mutant` project, however, only allows disabling mutations on the method selector level and these subjects must be passed as a command line argument to the `mutant` executable.
|
18
|
+
|
19
|
+
Otherwise, `mutest` project is effectively identical to `mutant`, which is the brainchild and excellent work of [Markus Schirp](https://github.com/mbj).
|
20
|
+
|
21
|
+
###### Note: Referring to the mutant documentation may be helpful for using `mutest`, as it is generally applicable.
|
22
|
+
|
7
23
|
## How it works
|
8
24
|
|
9
25
|
`mutest` parses your ruby code, inserts modifications, and then runs your test suite. If your test suite still _passes_ after `mutest` has mutated your code, you have an _alive_ mutation--meaning your tests do not thoroughly cover the modified part of your code. If your tests _fail_ after the code has been modified, the mutation is _killed_. This means that your test suite was able to detect the semantic change and provide adequate coverage of that condition.
|
data/Rakefile
CHANGED
data/lib/mutest.rb
CHANGED
@@ -38,7 +38,7 @@ module Mutest
|
|
38
38
|
def self.ci?
|
39
39
|
ENV.key?('CI')
|
40
40
|
end
|
41
|
-
end
|
41
|
+
end
|
42
42
|
|
43
43
|
require 'mutest/version'
|
44
44
|
require 'mutest/env'
|
@@ -136,7 +136,6 @@ require 'mutest/mutator/node/send'
|
|
136
136
|
require 'mutest/mutator/node/send/binary'
|
137
137
|
require 'mutest/mutator/node/send/conditional'
|
138
138
|
require 'mutest/mutator/node/send/attribute_assignment'
|
139
|
-
require 'mutest/mutator/node/send/index'
|
140
139
|
require 'mutest/mutator/node/when'
|
141
140
|
require 'mutest/mutator/node/class'
|
142
141
|
require 'mutest/mutator/node/define'
|
@@ -152,6 +151,8 @@ require 'mutest/mutator/node/regopt'
|
|
152
151
|
require 'mutest/mutator/node/resbody'
|
153
152
|
require 'mutest/mutator/node/rescue'
|
154
153
|
require 'mutest/mutator/node/match_current_line'
|
154
|
+
require 'mutest/mutator/node/index'
|
155
|
+
require 'mutest/mutator/node/procarg_zero'
|
155
156
|
require 'mutest/loader'
|
156
157
|
require 'mutest/context'
|
157
158
|
require 'mutest/scope'
|
@@ -242,5 +243,5 @@ module Mutest
|
|
242
243
|
reporter: Reporter::CLI.build($stdout),
|
243
244
|
zombie: false
|
244
245
|
)
|
245
|
-
end
|
246
|
-
end
|
246
|
+
end
|
247
|
+
end
|
data/lib/mutest/actor.rb
CHANGED
@@ -3,7 +3,7 @@ module Mutest
|
|
3
3
|
module Actor
|
4
4
|
# Error raised when actor signalling protocol is violated
|
5
5
|
class ProtocolError < RuntimeError
|
6
|
-
end
|
6
|
+
end
|
7
7
|
|
8
8
|
# Undefined message payload
|
9
9
|
Undefined = Class.new do
|
@@ -30,7 +30,7 @@ module Mutest
|
|
30
30
|
def self.new(_type, _payload = Undefined)
|
31
31
|
super
|
32
32
|
end
|
33
|
-
end
|
33
|
+
end
|
34
34
|
|
35
35
|
# Binding to other actors sender for simple RPC
|
36
36
|
class Binding
|
@@ -44,9 +44,10 @@ module Mutest
|
|
44
44
|
def call(type)
|
45
45
|
other.call(Message.new(type, mailbox.sender))
|
46
46
|
message = mailbox.receiver.call
|
47
|
-
|
47
|
+
raise ProtocolError, "Expected #{type} but got #{message.type}" unless type.equal?(message.type)
|
48
|
+
|
48
49
|
message.payload
|
49
50
|
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/mutest/actor/env.rb
CHANGED
data/lib/mutest/actor/mailbox.rb
CHANGED
@@ -2,7 +2,8 @@ module Mutest
|
|
2
2
|
module Actor
|
3
3
|
# Unbound mailbox
|
4
4
|
class Mailbox
|
5
|
-
include
|
5
|
+
include Concord::Public.new(:receiver, :sender)
|
6
|
+
include Adamantium::Flat
|
6
7
|
|
7
8
|
# New mailbox
|
8
9
|
#
|
@@ -26,6 +27,6 @@ module Mutest
|
|
26
27
|
def bind(other)
|
27
28
|
Binding.new(self, other)
|
28
29
|
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -2,7 +2,8 @@ module Mutest
|
|
2
2
|
module Actor
|
3
3
|
# Receiver side of an actor
|
4
4
|
class Receiver
|
5
|
-
include
|
5
|
+
include Concord.new(:condition_variable, :mutex, :messages)
|
6
|
+
include Adamantium::Flat
|
6
7
|
|
7
8
|
# Receives a message, blocking
|
8
9
|
#
|
@@ -12,7 +13,7 @@ module Mutest
|
|
12
13
|
message = try_blocking_receive
|
13
14
|
return message unless message.equal?(Undefined)
|
14
15
|
end
|
15
|
-
|
16
|
+
raise ProtocolError
|
16
17
|
end
|
17
18
|
|
18
19
|
private
|
@@ -34,6 +35,6 @@ module Mutest
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/mutest/actor/sender.rb
CHANGED
@@ -2,7 +2,8 @@ module Mutest
|
|
2
2
|
module Actor
|
3
3
|
# Sender for messages to acting thread
|
4
4
|
class Sender
|
5
|
-
include
|
5
|
+
include Concord.new(:condition_variable, :mutex, :messages)
|
6
|
+
include Adamantium::Flat
|
6
7
|
|
7
8
|
# Send a message to actor
|
8
9
|
#
|
@@ -17,6 +18,6 @@ module Mutest
|
|
17
18
|
|
18
19
|
self
|
19
20
|
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/mutest/ast.rb
CHANGED
@@ -14,7 +14,8 @@ module Mutest
|
|
14
14
|
# @return [nil]
|
15
15
|
# otherwise
|
16
16
|
def self.find_last_path(node, &predicate)
|
17
|
-
|
17
|
+
raise ArgumentError, 'block expected' unless block_given?
|
18
|
+
|
18
19
|
path = []
|
19
20
|
walk(node, [node]) do |candidate, stack|
|
20
21
|
path = stack.dup if predicate.call(candidate)
|
@@ -40,5 +41,5 @@ module Mutest
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
private_class_method :walk
|
43
|
-
end
|
44
|
-
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/mutest/ast/meta.rb
CHANGED
@@ -4,7 +4,9 @@ module Mutest
|
|
4
4
|
module Meta
|
5
5
|
# Metadata for const nodes
|
6
6
|
class Const
|
7
|
-
include
|
7
|
+
include NodePredicates
|
8
|
+
include Concord.new(:node)
|
9
|
+
include NamedChildren
|
8
10
|
|
9
11
|
children :base, :name
|
10
12
|
|
@@ -16,7 +18,7 @@ module Mutest
|
|
16
18
|
def possible_top_level?
|
17
19
|
base.nil? || n_cbase?(base)
|
18
20
|
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -4,7 +4,8 @@ module Mutest
|
|
4
4
|
module Meta
|
5
5
|
# Metadata for optional argument nodes
|
6
6
|
class Optarg
|
7
|
-
include
|
7
|
+
include Concord.new(:node)
|
8
|
+
include NamedChildren
|
8
9
|
|
9
10
|
UNDERSCORE = '_'.freeze
|
10
11
|
|
@@ -18,7 +19,7 @@ module Mutest
|
|
18
19
|
def used?
|
19
20
|
!name.to_s.start_with?(UNDERSCORE)
|
20
21
|
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -4,12 +4,13 @@ module Mutest
|
|
4
4
|
module Meta
|
5
5
|
# Metadata for resbody nodes
|
6
6
|
class Resbody
|
7
|
-
include
|
7
|
+
include Concord.new(:node)
|
8
|
+
include NamedChildren
|
8
9
|
|
9
10
|
children :captures, :assignment, :body
|
10
11
|
|
11
12
|
public :captures, :assignment, :body
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -4,12 +4,13 @@ module Mutest
|
|
4
4
|
module Meta
|
5
5
|
# Metadata for restarg nodes
|
6
6
|
class Restarg
|
7
|
-
include
|
7
|
+
include Concord.new(:node)
|
8
|
+
include NamedChildren
|
8
9
|
|
9
10
|
children :name
|
10
11
|
|
11
12
|
public :name
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/mutest/ast/meta/send.rb
CHANGED
@@ -4,7 +4,9 @@ module Mutest
|
|
4
4
|
module Meta
|
5
5
|
# Metadata for send nodes
|
6
6
|
class Send
|
7
|
-
include
|
7
|
+
include NodePredicates
|
8
|
+
include Concord.new(:node)
|
9
|
+
include NamedChildren
|
8
10
|
|
9
11
|
children :receiver, :selector
|
10
12
|
|
@@ -28,14 +30,7 @@ module Mutest
|
|
28
30
|
naked_proc? || proc_new?
|
29
31
|
end
|
30
32
|
|
31
|
-
# Test if AST node is a valid assignment
|
32
|
-
#
|
33
|
-
# @return [Boolean]
|
34
|
-
def assignment?
|
35
|
-
index_assignment? || attribute_assignment?
|
36
|
-
end
|
37
|
-
|
38
|
-
# Test if AST node is an attribute assignment?
|
33
|
+
# Test if AST node is a valid attribute assignment
|
39
34
|
#
|
40
35
|
# @return [Boolean]
|
41
36
|
def attribute_assignment?
|
@@ -43,13 +38,6 @@ module Mutest
|
|
43
38
|
selector.to_s.end_with?(ATTRIBUTE_ASSIGNMENT_SELECTOR_SUFFIX)
|
44
39
|
end
|
45
40
|
|
46
|
-
# Test if AST node is an index assign
|
47
|
-
#
|
48
|
-
# @return [Boolean]
|
49
|
-
def index_assignment?
|
50
|
-
selector.equal?(INDEX_ASSIGNMENT_SELECTOR)
|
51
|
-
end
|
52
|
-
|
53
41
|
# Test for binary operator implemented as method
|
54
42
|
#
|
55
43
|
# @return [Boolean]
|
@@ -89,7 +77,7 @@ module Mutest
|
|
89
77
|
n_const?(receiver) &&
|
90
78
|
Const.new(receiver).name.equal?(:Proc)
|
91
79
|
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -4,12 +4,13 @@ module Mutest
|
|
4
4
|
module Meta
|
5
5
|
# Metadata for symbol nodes
|
6
6
|
class Symbol
|
7
|
-
include
|
7
|
+
include Concord.new(:node)
|
8
|
+
include NamedChildren
|
8
9
|
|
9
10
|
children :name
|
10
11
|
|
11
12
|
public :name
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -24,7 +24,7 @@ module Mutest
|
|
24
24
|
def children
|
25
25
|
node.children
|
26
26
|
end
|
27
|
-
end
|
27
|
+
end
|
28
28
|
|
29
29
|
# Methods mixed in at class level
|
30
30
|
module ClassMethods
|
@@ -80,7 +80,7 @@ module Mutest
|
|
80
80
|
define_method(name, &block)
|
81
81
|
private(name)
|
82
82
|
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -3,7 +3,7 @@ module Mutest
|
|
3
3
|
# Module for node predicates
|
4
4
|
module NodePredicates
|
5
5
|
Types::ALL.each do |type|
|
6
|
-
|
6
|
+
raise "method: #{type} is already defined" if instance_methods(true).include?(type)
|
7
7
|
|
8
8
|
name = "n_#{type.to_s.chomp('?')}?"
|
9
9
|
|
@@ -12,6 +12,6 @@ module Mutest
|
|
12
12
|
end
|
13
13
|
private name
|
14
14
|
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/mutest/ast/nodes.rb
CHANGED
data/lib/mutest/ast/regexp.rb
CHANGED
@@ -52,7 +52,11 @@ module Mutest
|
|
52
52
|
class ExpressionToAST
|
53
53
|
PREFIX = :regexp
|
54
54
|
|
55
|
-
include
|
55
|
+
include Adamantium
|
56
|
+
include AbstractType
|
57
|
+
include AST::Sexp
|
58
|
+
include Procto.call
|
59
|
+
include Concord.new(:expression)
|
56
60
|
|
57
61
|
private
|
58
62
|
|
@@ -93,11 +97,14 @@ module Mutest
|
|
93
97
|
def type
|
94
98
|
:"#{PREFIX}_#{expression.token}_#{expression.type}"
|
95
99
|
end
|
96
|
-
end
|
100
|
+
end
|
97
101
|
|
98
102
|
# Abstract node transformer
|
99
103
|
class ASTToExpression
|
100
|
-
include
|
104
|
+
include Adamantium
|
105
|
+
include AbstractType
|
106
|
+
include Procto.call
|
107
|
+
include Concord.new(:node)
|
101
108
|
|
102
109
|
# Call generic transform method and freeze result
|
103
110
|
#
|
@@ -119,7 +126,7 @@ module Mutest
|
|
119
126
|
def subexpressions
|
120
127
|
node.children.map(&Regexp.public_method(:to_expression))
|
121
128
|
end
|
122
|
-
end
|
129
|
+
end
|
123
130
|
|
124
131
|
# Mixin for node transformers
|
125
132
|
#
|
@@ -143,7 +150,8 @@ module Mutest
|
|
143
150
|
new(table)
|
144
151
|
end
|
145
152
|
|
146
|
-
include
|
153
|
+
include Adamantium
|
154
|
+
include Concord.new(:table)
|
147
155
|
|
148
156
|
# Types defined by the table
|
149
157
|
#
|
@@ -160,7 +168,7 @@ module Mutest
|
|
160
168
|
def lookup(type)
|
161
169
|
table.fetch(type)
|
162
170
|
end
|
163
|
-
end
|
171
|
+
end
|
164
172
|
|
165
173
|
private
|
166
174
|
|
@@ -177,8 +185,8 @@ module Mutest
|
|
177
185
|
def expression_class
|
178
186
|
self.class::TABLE.lookup(node.type).regexp_class
|
179
187
|
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|