mutest 0.0.1 → 0.0.2
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 +4 -4
- data/.buildkite/hooks/pre-command +3 -0
- data/.buildkite/pipeline.yml +51 -0
- data/.gitattributes +1 -0
- data/.gitignore +38 -0
- data/.rspec +5 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +216 -0
- data/Gemfile.shared +3 -0
- data/LICENSE +21 -0
- data/README.md +8 -0
- data/Rakefile +24 -0
- data/bin/mutest +39 -0
- data/build/Dockerfile +71 -0
- data/build/docker-bootstrap.sh +85 -0
- data/build/docker-exec +29 -0
- data/build/make-docker +3 -0
- data/build/ruby_matrix +1 -0
- data/build/run +5 -0
- data/build/strict-mode.sh +16 -0
- data/circle.yml +7 -0
- data/config/devtools.yml +2 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/reek.yml +137 -0
- data/config/rubocop.yml +395 -0
- data/config/triage.yml +2 -0
- data/config/yardstick.yml +2 -0
- data/lib/mutest.rb +243 -0
- data/lib/mutest/actor.rb +52 -0
- data/lib/mutest/actor/env.rb +28 -0
- data/lib/mutest/actor/mailbox.rb +31 -0
- data/lib/mutest/actor/receiver.rb +39 -0
- data/lib/mutest/actor/sender.rb +22 -0
- data/lib/mutest/ast.rb +44 -0
- data/lib/mutest/ast/meta.rb +7 -0
- data/lib/mutest/ast/meta/const.rb +22 -0
- data/lib/mutest/ast/meta/optarg.rb +24 -0
- data/lib/mutest/ast/meta/resbody.rb +15 -0
- data/lib/mutest/ast/meta/restarg.rb +15 -0
- data/lib/mutest/ast/meta/send.rb +89 -0
- data/lib/mutest/ast/meta/symbol.rb +15 -0
- data/lib/mutest/ast/named_children.rb +86 -0
- data/lib/mutest/ast/node_predicates.rb +17 -0
- data/lib/mutest/ast/nodes.rb +22 -0
- data/lib/mutest/ast/regexp.rb +50 -0
- data/lib/mutest/ast/regexp/transformer.rb +184 -0
- data/lib/mutest/ast/regexp/transformer/alternative.rb +39 -0
- data/lib/mutest/ast/regexp/transformer/character_set.rb +46 -0
- data/lib/mutest/ast/regexp/transformer/direct.rb +101 -0
- data/lib/mutest/ast/regexp/transformer/options_group.rb +65 -0
- data/lib/mutest/ast/regexp/transformer/quantifier.rb +112 -0
- data/lib/mutest/ast/regexp/transformer/recursive.rb +50 -0
- data/lib/mutest/ast/regexp/transformer/root.rb +28 -0
- data/lib/mutest/ast/regexp/transformer/text.rb +55 -0
- data/lib/mutest/ast/sexp.rb +26 -0
- data/lib/mutest/ast/types.rb +140 -0
- data/lib/mutest/cli.rb +196 -0
- data/lib/mutest/color.rb +39 -0
- data/lib/mutest/config.rb +28 -0
- data/lib/mutest/context.rb +98 -0
- data/lib/mutest/diff.rb +111 -0
- data/lib/mutest/env.rb +59 -0
- data/lib/mutest/env/bootstrap.rb +159 -0
- data/lib/mutest/expression.rb +55 -0
- data/lib/mutest/expression/method.rb +54 -0
- data/lib/mutest/expression/methods.rb +58 -0
- data/lib/mutest/expression/namespace.rb +75 -0
- data/lib/mutest/expression/parser.rb +64 -0
- data/lib/mutest/integration.rb +75 -0
- data/lib/mutest/isolation.rb +11 -0
- data/lib/mutest/isolation/fork.rb +72 -0
- data/lib/mutest/isolation/none.rb +23 -0
- data/lib/mutest/loader.rb +27 -0
- data/lib/mutest/matcher.rb +14 -0
- data/lib/mutest/matcher/chain.rb +19 -0
- data/lib/mutest/matcher/compiler.rb +55 -0
- data/lib/mutest/matcher/config.rb +81 -0
- data/lib/mutest/matcher/filter.rb +19 -0
- data/lib/mutest/matcher/method.rb +138 -0
- data/lib/mutest/matcher/method/instance.rb +63 -0
- data/lib/mutest/matcher/method/singleton.rb +88 -0
- data/lib/mutest/matcher/methods.rb +109 -0
- data/lib/mutest/matcher/namespace.rb +41 -0
- data/lib/mutest/matcher/null.rb +17 -0
- data/lib/mutest/matcher/scope.rb +38 -0
- data/lib/mutest/matcher/static.rb +15 -0
- data/lib/mutest/meta.rb +33 -0
- data/lib/mutest/meta/example.rb +32 -0
- data/lib/mutest/meta/example/dsl.rb +107 -0
- data/lib/mutest/meta/example/verification.rb +85 -0
- data/lib/mutest/mutation.rb +101 -0
- data/lib/mutest/mutator.rb +117 -0
- data/lib/mutest/mutator/node.rb +166 -0
- data/lib/mutest/mutator/node/and_asgn.rb +25 -0
- data/lib/mutest/mutator/node/argument.rb +68 -0
- data/lib/mutest/mutator/node/arguments.rb +90 -0
- data/lib/mutest/mutator/node/begin.rb +21 -0
- data/lib/mutest/mutator/node/binary.rb +64 -0
- data/lib/mutest/mutator/node/block.rb +51 -0
- data/lib/mutest/mutator/node/break.rb +21 -0
- data/lib/mutest/mutator/node/case.rb +47 -0
- data/lib/mutest/mutator/node/class.rb +21 -0
- data/lib/mutest/mutator/node/conditional_loop.rb +25 -0
- data/lib/mutest/mutator/node/const.rb +23 -0
- data/lib/mutest/mutator/node/define.rb +79 -0
- data/lib/mutest/mutator/node/defined.rb +24 -0
- data/lib/mutest/mutator/node/dstr.rb +20 -0
- data/lib/mutest/mutator/node/dsym.rb +20 -0
- data/lib/mutest/mutator/node/generic.rb +77 -0
- data/lib/mutest/mutator/node/if.rb +57 -0
- data/lib/mutest/mutator/node/kwbegin.rb +20 -0
- data/lib/mutest/mutator/node/literal.rb +19 -0
- data/lib/mutest/mutator/node/literal/array.rb +37 -0
- data/lib/mutest/mutator/node/literal/boolean.rb +27 -0
- data/lib/mutest/mutator/node/literal/fixnum.rb +36 -0
- data/lib/mutest/mutator/node/literal/float.rb +45 -0
- data/lib/mutest/mutator/node/literal/hash.rb +52 -0
- data/lib/mutest/mutator/node/literal/nil.rb +20 -0
- data/lib/mutest/mutator/node/literal/range.rb +38 -0
- data/lib/mutest/mutator/node/literal/regex.rb +76 -0
- data/lib/mutest/mutator/node/literal/string.rb +21 -0
- data/lib/mutest/mutator/node/literal/symbol.rb +26 -0
- data/lib/mutest/mutator/node/masgn.rb +21 -0
- data/lib/mutest/mutator/node/match_current_line.rb +22 -0
- data/lib/mutest/mutator/node/mlhs.rb +21 -0
- data/lib/mutest/mutator/node/named_value/access.rb +54 -0
- data/lib/mutest/mutator/node/named_value/constant_assignment.rb +42 -0
- data/lib/mutest/mutator/node/named_value/variable_assignment.rb +47 -0
- data/lib/mutest/mutator/node/next.rb +22 -0
- data/lib/mutest/mutator/node/noop.rb +19 -0
- data/lib/mutest/mutator/node/nthref.rb +22 -0
- data/lib/mutest/mutator/node/op_asgn.rb +50 -0
- data/lib/mutest/mutator/node/or_asgn.rb +26 -0
- data/lib/mutest/mutator/node/regexp.rb +33 -0
- data/lib/mutest/mutator/node/regexp/alternation_meta.rb +21 -0
- data/lib/mutest/mutator/node/regexp/capture_group.rb +26 -0
- data/lib/mutest/mutator/node/regexp/character_type.rb +29 -0
- data/lib/mutest/mutator/node/regexp/end_of_line_anchor.rb +21 -0
- data/lib/mutest/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +21 -0
- data/lib/mutest/mutator/node/regexp/one_or_more.rb +29 -0
- data/lib/mutest/mutator/node/regexp/zero_or_more.rb +29 -0
- data/lib/mutest/mutator/node/regopt.rb +28 -0
- data/lib/mutest/mutator/node/resbody.rb +34 -0
- data/lib/mutest/mutator/node/rescue.rb +69 -0
- data/lib/mutest/mutator/node/return.rb +24 -0
- data/lib/mutest/mutator/node/send.rb +270 -0
- data/lib/mutest/mutator/node/send/attribute_assignment.rb +39 -0
- data/lib/mutest/mutator/node/send/binary.rb +45 -0
- data/lib/mutest/mutator/node/send/conditional.rb +21 -0
- data/lib/mutest/mutator/node/send/index.rb +47 -0
- data/lib/mutest/mutator/node/splat.rb +23 -0
- data/lib/mutest/mutator/node/super.rb +24 -0
- data/lib/mutest/mutator/node/when.rb +60 -0
- data/lib/mutest/mutator/node/yield.rb +21 -0
- data/lib/mutest/mutator/node/zsuper.rb +20 -0
- data/lib/mutest/mutator/util.rb +11 -0
- data/lib/mutest/mutator/util/array.rb +42 -0
- data/lib/mutest/mutator/util/symbol.rb +19 -0
- data/lib/mutest/parallel.rb +89 -0
- data/lib/mutest/parallel/master.rb +181 -0
- data/lib/mutest/parallel/source.rb +57 -0
- data/lib/mutest/parallel/worker.rb +76 -0
- data/lib/mutest/parser.rb +22 -0
- data/lib/mutest/registry.rb +43 -0
- data/lib/mutest/reporter.rb +39 -0
- data/lib/mutest/reporter/cli.rb +87 -0
- data/lib/mutest/reporter/cli/format.rb +135 -0
- data/lib/mutest/reporter/cli/printer.rb +124 -0
- data/lib/mutest/reporter/cli/printer/config.rb +24 -0
- data/lib/mutest/reporter/cli/printer/env_progress.rb +76 -0
- data/lib/mutest/reporter/cli/printer/env_result.rb +20 -0
- data/lib/mutest/reporter/cli/printer/mutation_progress_result.rb +31 -0
- data/lib/mutest/reporter/cli/printer/mutation_result.rb +127 -0
- data/lib/mutest/reporter/cli/printer/status.rb +49 -0
- data/lib/mutest/reporter/cli/printer/status_progressive.rb +46 -0
- data/lib/mutest/reporter/cli/printer/subject_progress.rb +65 -0
- data/lib/mutest/reporter/cli/printer/subject_result.rb +23 -0
- data/lib/mutest/reporter/cli/printer/test_result.rb +28 -0
- data/lib/mutest/reporter/cli/tput.rb +43 -0
- data/lib/mutest/reporter/null.rb +14 -0
- data/lib/mutest/reporter/sequence.rb +24 -0
- data/lib/mutest/repository.rb +80 -0
- data/lib/mutest/require_highjack.rb +24 -0
- data/lib/mutest/result.rb +212 -0
- data/lib/mutest/runner.rb +81 -0
- data/lib/mutest/runner/sink.rb +63 -0
- data/lib/mutest/scope.rb +6 -0
- data/lib/mutest/selector.rb +13 -0
- data/lib/mutest/selector/expression.rb +25 -0
- data/lib/mutest/source_file.rb +47 -0
- data/lib/mutest/subject.rb +94 -0
- data/lib/mutest/subject/method.rb +42 -0
- data/lib/mutest/subject/method/instance.rb +43 -0
- data/lib/mutest/subject/method/singleton.rb +19 -0
- data/lib/mutest/test.rb +14 -0
- data/lib/mutest/util.rb +18 -0
- data/lib/mutest/version.rb +4 -0
- data/lib/mutest/warning_filter.rb +58 -0
- data/lib/mutest/zombifier.rb +119 -0
- data/meta/and.rb +13 -0
- data/meta/and_asgn.rb +12 -0
- data/meta/array.rb +28 -0
- data/meta/begin.rb +19 -0
- data/meta/block.rb +104 -0
- data/meta/block_pass.rb +6 -0
- data/meta/blockarg.rb +8 -0
- data/meta/break.rb +8 -0
- data/meta/case.rb +221 -0
- data/meta/casgn.rb +26 -0
- data/meta/cbase.rb +6 -0
- data/meta/class.rb +10 -0
- data/meta/const.rb +15 -0
- data/meta/csend.rb +8 -0
- data/meta/cvar.rb +5 -0
- data/meta/cvasgn.rb +8 -0
- data/meta/date.rb +57 -0
- data/meta/def.rb +260 -0
- data/meta/defined.rb +7 -0
- data/meta/dstr.rb +11 -0
- data/meta/dsym.rb +12 -0
- data/meta/ensure.rb +7 -0
- data/meta/false.rb +6 -0
- data/meta/float.rb +35 -0
- data/meta/gvar.rb +5 -0
- data/meta/gvasgn.rb +8 -0
- data/meta/hash.rb +22 -0
- data/meta/if.rb +75 -0
- data/meta/int.rb +16 -0
- data/meta/ivar.rb +6 -0
- data/meta/ivasgn.rb +21 -0
- data/meta/kwarg.rb +8 -0
- data/meta/kwbegin.rb +7 -0
- data/meta/kwoptarg.rb +11 -0
- data/meta/kwrestarg.rb +17 -0
- data/meta/lvar.rb +14 -0
- data/meta/lvasgn.rb +8 -0
- data/meta/masgn.rb +5 -0
- data/meta/match_current_line.rb +13 -0
- data/meta/next.rb +9 -0
- data/meta/nil.rb +3 -0
- data/meta/nthref.rb +12 -0
- data/meta/op_assgn.rb +39 -0
- data/meta/or.rb +13 -0
- data/meta/or_asgn.rb +48 -0
- data/meta/range.rb +37 -0
- data/meta/redo.rb +3 -0
- data/meta/regexp.rb +84 -0
- data/meta/regexp/character_types.rb +20 -0
- data/meta/regexp/regexp_alternation_meta.rb +11 -0
- data/meta/regexp/regexp_bol_anchor.rb +8 -0
- data/meta/regexp/regexp_bos_anchor.rb +16 -0
- data/meta/regexp/regexp_capture_group.rb +17 -0
- data/meta/regexp/regexp_eol_anchor.rb +8 -0
- data/meta/regexp/regexp_eos_anchor.rb +6 -0
- data/meta/regexp/regexp_eos_ob_eol_anchor.rb +8 -0
- data/meta/regexp/regexp_one_or_more.rb +32 -0
- data/meta/regexp/regexp_root_expression.rb +8 -0
- data/meta/regexp/regexp_zero_or_more.rb +32 -0
- data/meta/regopt.rb +8 -0
- data/meta/rescue.rb +87 -0
- data/meta/restarg.rb +9 -0
- data/meta/return.rb +14 -0
- data/meta/self.rb +5 -0
- data/meta/send.rb +849 -0
- data/meta/str.rb +5 -0
- data/meta/super.rb +25 -0
- data/meta/sym.rb +6 -0
- data/meta/true.rb +6 -0
- data/meta/until.rb +15 -0
- data/meta/while.rb +24 -0
- data/meta/yield.rb +8 -0
- data/mutest-rspec.gemspec +22 -0
- data/mutest.gemspec +45 -0
- data/spec/integration/mutest/corpus_spec.rb +18 -0
- data/spec/integration/mutest/isolation/fork_spec.rb +8 -0
- data/spec/integration/mutest/null_spec.rb +13 -0
- data/spec/integration/mutest/rspec_spec.rb +11 -0
- data/spec/integration/mutest/test_mutator_handles_types_spec.rb +7 -0
- data/spec/integrations.yml +32 -0
- data/spec/rcov.opts +7 -0
- data/spec/shared/framework_integration_behavior.rb +44 -0
- data/spec/shared/method_matcher_behavior.rb +49 -0
- data/spec/spec_helper.rb +70 -0
- data/spec/support/compress_helper.rb +9 -0
- data/spec/support/corpus.rb +331 -0
- data/spec/support/fake_actor.rb +107 -0
- data/spec/support/file_system.rb +60 -0
- data/spec/support/ice_nine_config.rb +8 -0
- data/spec/support/rb_bug.rb +15 -0
- data/spec/support/ruby_vm.rb +82 -0
- data/spec/support/shared_context.rb +125 -0
- data/spec/support/test_app.rb +5 -0
- data/spec/support/warning.rb +73 -0
- data/spec/support/warnings.yml +5 -0
- data/spec/support/xspec.rb +175 -0
- data/spec/unit/mutest/actor/binding_spec.rb +32 -0
- data/spec/unit/mutest/actor/env_spec.rb +29 -0
- data/spec/unit/mutest/actor/mailbox_spec.rb +25 -0
- data/spec/unit/mutest/actor/message_spec.rb +22 -0
- data/spec/unit/mutest/actor/receiver_spec.rb +56 -0
- data/spec/unit/mutest/actor/sender_spec.rb +22 -0
- data/spec/unit/mutest/ast/meta/optarg_spec.rb +21 -0
- data/spec/unit/mutest/ast/meta/send/proc_predicate_spec.rb +28 -0
- data/spec/unit/mutest/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +37 -0
- data/spec/unit/mutest/ast/meta/send_spec.rb +42 -0
- data/spec/unit/mutest/ast/named_children_spec.rb +87 -0
- data/spec/unit/mutest/ast/regexp/parse_spec.rb +5 -0
- data/spec/unit/mutest/ast/regexp/supported_predicate_spec.rb +14 -0
- data/spec/unit/mutest/ast/regexp/transformer/lookup_table/table_spec.rb +19 -0
- data/spec/unit/mutest/ast/regexp/transformer/lookup_table_spec.rb +33 -0
- data/spec/unit/mutest/ast/regexp/transformer_spec.rb +19 -0
- data/spec/unit/mutest/ast/regexp_spec.rb +625 -0
- data/spec/unit/mutest/ast/sexp_spec.rb +36 -0
- data/spec/unit/mutest/ast_spec.rb +55 -0
- data/spec/unit/mutest/cli_spec.rb +247 -0
- data/spec/unit/mutest/context_spec.rb +141 -0
- data/spec/unit/mutest/diff_spec.rb +185 -0
- data/spec/unit/mutest/env/bootstrap_spec.rb +188 -0
- data/spec/unit/mutest/env_spec.rb +100 -0
- data/spec/unit/mutest/expression/method_spec.rb +44 -0
- data/spec/unit/mutest/expression/methods_spec.rb +59 -0
- data/spec/unit/mutest/expression/namespace/exact_spec.rb +26 -0
- data/spec/unit/mutest/expression/namespace/recursive_spec.rb +64 -0
- data/spec/unit/mutest/expression/parser_spec.rb +67 -0
- data/spec/unit/mutest/expression_spec.rb +45 -0
- data/spec/unit/mutest/integration/null_spec.rb +28 -0
- data/spec/unit/mutest/integration/rspec_spec.rb +197 -0
- data/spec/unit/mutest/integration_spec.rb +26 -0
- data/spec/unit/mutest/isolation/fork_spec.rb +155 -0
- data/spec/unit/mutest/isolation/none_spec.rb +16 -0
- data/spec/unit/mutest/loader_spec.rb +42 -0
- data/spec/unit/mutest/matcher/chain_spec.rb +24 -0
- data/spec/unit/mutest/matcher/compiler/subject_prefix_spec.rb +24 -0
- data/spec/unit/mutest/matcher/compiler_spec.rb +76 -0
- data/spec/unit/mutest/matcher/config_spec.rb +45 -0
- data/spec/unit/mutest/matcher/filter_spec.rb +20 -0
- data/spec/unit/mutest/matcher/method/instance_spec.rb +125 -0
- data/spec/unit/mutest/matcher/method/singleton_spec.rb +85 -0
- data/spec/unit/mutest/matcher/methods/instance_spec.rb +58 -0
- data/spec/unit/mutest/matcher/methods/singleton_spec.rb +54 -0
- data/spec/unit/mutest/matcher/namespace_spec.rb +35 -0
- data/spec/unit/mutest/matcher/null_spec.rb +10 -0
- data/spec/unit/mutest/matcher/scope_spec.rb +33 -0
- data/spec/unit/mutest/matcher/static_spec.rb +11 -0
- data/spec/unit/mutest/meta/example/dsl_spec.rb +123 -0
- data/spec/unit/mutest/meta/example/verification_spec.rb +120 -0
- data/spec/unit/mutest/meta/example_spec.rb +32 -0
- data/spec/unit/mutest/mutation_spec.rb +129 -0
- data/spec/unit/mutest/mutator/node_spec.rb +43 -0
- data/spec/unit/mutest/mutator_spec.rb +30 -0
- data/spec/unit/mutest/parallel/driver_spec.rb +26 -0
- data/spec/unit/mutest/parallel/master_spec.rb +335 -0
- data/spec/unit/mutest/parallel/source/array_spec.rb +47 -0
- data/spec/unit/mutest/parallel/worker_spec.rb +65 -0
- data/spec/unit/mutest/parallel_spec.rb +16 -0
- data/spec/unit/mutest/parser_spec.rb +24 -0
- data/spec/unit/mutest/registry_spec.rb +45 -0
- data/spec/unit/mutest/reporter/cli/printer/config_spec.rb +29 -0
- data/spec/unit/mutest/reporter/cli/printer/env_progress_spec.rb +74 -0
- data/spec/unit/mutest/reporter/cli/printer/env_result_spec.rb +35 -0
- data/spec/unit/mutest/reporter/cli/printer/mutation_progress_result_spec.rb +23 -0
- data/spec/unit/mutest/reporter/cli/printer/mutation_result_spec.rb +110 -0
- data/spec/unit/mutest/reporter/cli/printer/status_progressive_spec.rb +43 -0
- data/spec/unit/mutest/reporter/cli/printer/status_spec.rb +119 -0
- data/spec/unit/mutest/reporter/cli/printer/subject_progress_spec.rb +34 -0
- data/spec/unit/mutest/reporter/cli/printer/subject_result_spec.rb +37 -0
- data/spec/unit/mutest/reporter/cli/printer/test_result_spec.rb +14 -0
- data/spec/unit/mutest/reporter/cli/printer_spec.rb +161 -0
- data/spec/unit/mutest/reporter/cli/tput_spec.rb +48 -0
- data/spec/unit/mutest/reporter/cli_spec.rb +212 -0
- data/spec/unit/mutest/reporter/null_spec.rb +12 -0
- data/spec/unit/mutest/reporter/sequence_spec.rb +29 -0
- data/spec/unit/mutest/repository/diff_spec.rb +106 -0
- data/spec/unit/mutest/repository/subject_filter_spec.rb +28 -0
- data/spec/unit/mutest/require_highjack_spec.rb +71 -0
- data/spec/unit/mutest/result/class_methods_spec.rb +49 -0
- data/spec/unit/mutest/result/env_spec.rb +82 -0
- data/spec/unit/mutest/result/mutation_spec.rb +37 -0
- data/spec/unit/mutest/result/subject_spec.rb +109 -0
- data/spec/unit/mutest/result_spec.rb +31 -0
- data/spec/unit/mutest/runner/sink_spec.rb +172 -0
- data/spec/unit/mutest/runner_spec.rb +69 -0
- data/spec/unit/mutest/selector/expression_spec.rb +59 -0
- data/spec/unit/mutest/source_file_spec.rb +42 -0
- data/spec/unit/mutest/subject/method/instance/memoized_spec.rb +78 -0
- data/spec/unit/mutest/subject/method/instance_spec.rb +64 -0
- data/spec/unit/mutest/subject/method/singleton_spec.rb +51 -0
- data/spec/unit/mutest/subject_spec.rb +87 -0
- data/spec/unit/mutest/util/one_spec.rb +20 -0
- data/spec/unit/mutest/warning_filter_spec.rb +99 -0
- data/spec/unit/mutest/zombifier_spec.rb +120 -0
- data/spec/unit/mutest_spec.rb +15 -0
- data/test_app/.rspec +1 -0
- data/test_app/Gemfile.rspec3.4 +7 -0
- data/test_app/Gemfile.rspec3.5 +7 -0
- data/test_app/lib/test_app.rb +109 -0
- data/test_app/lib/test_app/literal.rb +40 -0
- data/test_app/spec/spec_helper.rb +9 -0
- data/test_app/spec/unit/test_app/literal_spec.rb +20 -0
- metadata +784 -9
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Node meta information mixin
|
|
4
|
+
module Meta
|
|
5
|
+
# Metadata for const nodes
|
|
6
|
+
class Const
|
|
7
|
+
include NamedChildren, Concord.new(:node), NodePredicates
|
|
8
|
+
|
|
9
|
+
children :base, :name
|
|
10
|
+
|
|
11
|
+
public :base, :name
|
|
12
|
+
|
|
13
|
+
# Test if AST node is possibly a top level constant
|
|
14
|
+
#
|
|
15
|
+
# @return [Boolean]
|
|
16
|
+
def possible_top_level?
|
|
17
|
+
base.nil? || n_cbase?(base)
|
|
18
|
+
end
|
|
19
|
+
end # Const
|
|
20
|
+
end # Meta
|
|
21
|
+
end # AST
|
|
22
|
+
end # Mutest
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Node meta information mixin
|
|
4
|
+
module Meta
|
|
5
|
+
# Metadata for optional argument nodes
|
|
6
|
+
class Optarg
|
|
7
|
+
include NamedChildren, Concord.new(:node)
|
|
8
|
+
|
|
9
|
+
UNDERSCORE = '_'.freeze
|
|
10
|
+
|
|
11
|
+
children :name, :default_value
|
|
12
|
+
|
|
13
|
+
public :name, :default_value
|
|
14
|
+
|
|
15
|
+
# Test if optarg definition intends to be used
|
|
16
|
+
#
|
|
17
|
+
# @return [Boolean]
|
|
18
|
+
def used?
|
|
19
|
+
!name.to_s.start_with?(UNDERSCORE)
|
|
20
|
+
end
|
|
21
|
+
end # Optarg
|
|
22
|
+
end # Meta
|
|
23
|
+
end # AST
|
|
24
|
+
end # Mutest
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Node meta information mixin
|
|
4
|
+
module Meta
|
|
5
|
+
# Metadata for resbody nodes
|
|
6
|
+
class Resbody
|
|
7
|
+
include NamedChildren, Concord.new(:node)
|
|
8
|
+
|
|
9
|
+
children :captures, :assignment, :body
|
|
10
|
+
|
|
11
|
+
public :captures, :assignment, :body
|
|
12
|
+
end # Resbody
|
|
13
|
+
end # Meta
|
|
14
|
+
end # AST
|
|
15
|
+
end # Mutest
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Node meta information mixin
|
|
4
|
+
module Meta
|
|
5
|
+
# Metadata for restarg nodes
|
|
6
|
+
class Restarg
|
|
7
|
+
include NamedChildren, Concord.new(:node)
|
|
8
|
+
|
|
9
|
+
children :name
|
|
10
|
+
|
|
11
|
+
public :name
|
|
12
|
+
end # Restarg
|
|
13
|
+
end # Meta
|
|
14
|
+
end # AST
|
|
15
|
+
end # Mutest
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Node meta information mixin
|
|
4
|
+
module Meta
|
|
5
|
+
# Metadata for send nodes
|
|
6
|
+
class Send
|
|
7
|
+
include NamedChildren, Concord.new(:node), NodePredicates
|
|
8
|
+
|
|
9
|
+
children :receiver, :selector
|
|
10
|
+
|
|
11
|
+
public :receiver, :selector
|
|
12
|
+
|
|
13
|
+
INDEX_ASSIGNMENT_SELECTOR = :[]=
|
|
14
|
+
ATTRIBUTE_ASSIGNMENT_SELECTOR_SUFFIX = '='.freeze
|
|
15
|
+
|
|
16
|
+
# Arguments of mutated node
|
|
17
|
+
#
|
|
18
|
+
# @return [Enumerable<Parser::AST::Node>]
|
|
19
|
+
alias_method :arguments, :remaining_children
|
|
20
|
+
|
|
21
|
+
public :arguments
|
|
22
|
+
|
|
23
|
+
# Test if node is defining a proc
|
|
24
|
+
#
|
|
25
|
+
# @return [Boolean]
|
|
26
|
+
def proc?
|
|
27
|
+
naked_proc? || proc_new?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Test if AST node is a valid assignment target
|
|
31
|
+
#
|
|
32
|
+
# @return [Boolean]
|
|
33
|
+
def assignment?
|
|
34
|
+
index_assignment? || attribute_assignment?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Test if AST node is an attribute assignment?
|
|
38
|
+
#
|
|
39
|
+
# @return [Boolean]
|
|
40
|
+
def attribute_assignment?
|
|
41
|
+
!Types::METHOD_OPERATORS.include?(selector) &&
|
|
42
|
+
selector.to_s.end_with?(ATTRIBUTE_ASSIGNMENT_SELECTOR_SUFFIX)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Test if AST node is an index assign
|
|
46
|
+
#
|
|
47
|
+
# @return [Boolean]
|
|
48
|
+
def index_assignment?
|
|
49
|
+
selector.equal?(INDEX_ASSIGNMENT_SELECTOR)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Test for binary operator implemented as method
|
|
53
|
+
#
|
|
54
|
+
# @return [Boolean]
|
|
55
|
+
def binary_method_operator?
|
|
56
|
+
Types::BINARY_METHOD_OPERATORS.include?(selector)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Test if receiver is possibly a top level constant
|
|
60
|
+
#
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
def receiver_possible_top_level_const?
|
|
63
|
+
return false unless receiver && n_const?(receiver)
|
|
64
|
+
|
|
65
|
+
Const.new(receiver).possible_top_level?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
# Test if node is `proc { ... }`
|
|
71
|
+
#
|
|
72
|
+
# @return [Boolean]
|
|
73
|
+
def naked_proc?
|
|
74
|
+
!receiver && selector.equal?(:proc)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Test if node is `Proc.new { ... }`
|
|
78
|
+
#
|
|
79
|
+
# @return [Boolean]
|
|
80
|
+
def proc_new?
|
|
81
|
+
receiver &&
|
|
82
|
+
selector.equal?(:new) &&
|
|
83
|
+
n_const?(receiver) &&
|
|
84
|
+
Const.new(receiver).name.equal?(:Proc)
|
|
85
|
+
end
|
|
86
|
+
end # Send
|
|
87
|
+
end # Meta
|
|
88
|
+
end # AST
|
|
89
|
+
end # Mutest
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Node meta information mixin
|
|
4
|
+
module Meta
|
|
5
|
+
# Metadata for symbol nodes
|
|
6
|
+
class Symbol
|
|
7
|
+
include NamedChildren, Concord.new(:node)
|
|
8
|
+
|
|
9
|
+
children :name
|
|
10
|
+
|
|
11
|
+
public :name
|
|
12
|
+
end # Symbol
|
|
13
|
+
end # Meta
|
|
14
|
+
end # AST
|
|
15
|
+
end # Mutest
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Helper methods to define named children
|
|
4
|
+
module NamedChildren
|
|
5
|
+
# Hook called when module gets included
|
|
6
|
+
#
|
|
7
|
+
# @param [Class, Module] host
|
|
8
|
+
#
|
|
9
|
+
# @return [undefined]
|
|
10
|
+
def self.included(host)
|
|
11
|
+
host.class_eval do
|
|
12
|
+
include InstanceMethods
|
|
13
|
+
extend ClassMethods
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Methods mixed int ot instance level
|
|
18
|
+
module InstanceMethods
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
# Mutated nodes children
|
|
22
|
+
#
|
|
23
|
+
# @return [Array<Parser::AST::Node]
|
|
24
|
+
def children
|
|
25
|
+
node.children
|
|
26
|
+
end
|
|
27
|
+
end # InstanceMethods
|
|
28
|
+
|
|
29
|
+
# Methods mixed in at class level
|
|
30
|
+
module ClassMethods
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# Define named child
|
|
34
|
+
#
|
|
35
|
+
# @param [Symbol] name
|
|
36
|
+
# @param [Fixnum] index
|
|
37
|
+
#
|
|
38
|
+
# @return [undefined]
|
|
39
|
+
def define_named_child(name, index)
|
|
40
|
+
define_private_method(name) do
|
|
41
|
+
children.at(index)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Define remaining children
|
|
46
|
+
#
|
|
47
|
+
# @param [Array<Symbol>] names
|
|
48
|
+
#
|
|
49
|
+
# @return [undefined]
|
|
50
|
+
def define_remaining_children(names)
|
|
51
|
+
define_private_method(:remaining_children_with_index) do
|
|
52
|
+
children.each_with_index.drop(names.length)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
define_private_method(:remaining_children_indices) do
|
|
56
|
+
children.each_index.drop(names.length)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
define_private_method(:remaining_children) do
|
|
60
|
+
children.drop(names.length)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Create name helpers
|
|
65
|
+
#
|
|
66
|
+
# @return [undefined]
|
|
67
|
+
def children(*names)
|
|
68
|
+
names.each_with_index do |name, index|
|
|
69
|
+
define_named_child(name, index)
|
|
70
|
+
end
|
|
71
|
+
define_remaining_children(names)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Define private method
|
|
75
|
+
#
|
|
76
|
+
# @param [Symbol] name
|
|
77
|
+
#
|
|
78
|
+
# @return [undefined]
|
|
79
|
+
def define_private_method(name, &block)
|
|
80
|
+
define_method(name, &block)
|
|
81
|
+
private(name)
|
|
82
|
+
end
|
|
83
|
+
end # ClassMethods
|
|
84
|
+
end # NamedChildren
|
|
85
|
+
end # AST
|
|
86
|
+
end # Mutest
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Module for node predicates
|
|
4
|
+
module NodePredicates
|
|
5
|
+
Types::ALL.each do |type|
|
|
6
|
+
fail "method: #{type} is already defined" if instance_methods(true).include?(type)
|
|
7
|
+
|
|
8
|
+
name = "n_#{type.to_s.chomp('?')}?"
|
|
9
|
+
|
|
10
|
+
define_method(name) do |node|
|
|
11
|
+
node.type.equal?(type)
|
|
12
|
+
end
|
|
13
|
+
private name
|
|
14
|
+
end
|
|
15
|
+
end # NodePredicates
|
|
16
|
+
end # AST
|
|
17
|
+
end # Mutest
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Singleton nodes
|
|
4
|
+
#
|
|
5
|
+
# :reek:TooManyConstants
|
|
6
|
+
module Nodes
|
|
7
|
+
extend Sexp
|
|
8
|
+
|
|
9
|
+
N_NAN = s(:send, s(:float, 0.0), :/, s(:float, 0.0))
|
|
10
|
+
N_INFINITY = s(:send, s(:float, 1.0), :/, s(:float, 0.0))
|
|
11
|
+
N_NEGATIVE_INFINITY = s(:send, s(:float, -1.0), :/, s(:float, 0.0))
|
|
12
|
+
N_RAISE = s(:send, nil, :raise)
|
|
13
|
+
N_TRUE = s(:true)
|
|
14
|
+
N_FALSE = s(:false)
|
|
15
|
+
N_NIL = s(:nil)
|
|
16
|
+
N_EMPTY = s(:empty)
|
|
17
|
+
N_SELF = s(:self)
|
|
18
|
+
N_ZSUPER = s(:zsuper)
|
|
19
|
+
N_EMPTY_SUPER = s(:super)
|
|
20
|
+
end # Nodes
|
|
21
|
+
end # AST
|
|
22
|
+
end # Mutest
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
# Regexp source mapper
|
|
4
|
+
module Regexp
|
|
5
|
+
UNSUPPORTED_EXPRESSION_TYPE = :conditional
|
|
6
|
+
|
|
7
|
+
private_constant(*constants(false))
|
|
8
|
+
|
|
9
|
+
# Parse regex string into expression
|
|
10
|
+
#
|
|
11
|
+
# @param regexp [String]
|
|
12
|
+
#
|
|
13
|
+
# @return [Regexp::Expression]
|
|
14
|
+
def self.parse(regexp)
|
|
15
|
+
::Regexp::Parser.parse(regexp)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Check if expression is supported by mapper
|
|
19
|
+
#
|
|
20
|
+
# @param expression [Regexp::Expression]
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
def self.supported?(expression)
|
|
24
|
+
expression.terminal? || expression.all? do |subexp|
|
|
25
|
+
!subexp.type.equal?(UNSUPPORTED_EXPRESSION_TYPE) && supported?(subexp)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Convert expression into ast node
|
|
30
|
+
#
|
|
31
|
+
# @param expression [Regexp::Expression]
|
|
32
|
+
#
|
|
33
|
+
# @return [Parser::AST::Node]
|
|
34
|
+
def self.to_ast(expression)
|
|
35
|
+
ast_type = :"regexp_#{expression.token}_#{expression.type}"
|
|
36
|
+
|
|
37
|
+
Transformer.lookup(ast_type).to_ast(expression)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Convert node into expression
|
|
41
|
+
#
|
|
42
|
+
# @param node [Parser::AST::Node]
|
|
43
|
+
#
|
|
44
|
+
# @return [Regexp::Expression]
|
|
45
|
+
def self.to_expression(node)
|
|
46
|
+
Transformer.lookup(node.type).to_expression(node)
|
|
47
|
+
end
|
|
48
|
+
end # Regexp
|
|
49
|
+
end # AST
|
|
50
|
+
end # Mutest
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
module Mutest
|
|
2
|
+
module AST
|
|
3
|
+
module Regexp
|
|
4
|
+
# Regexp bijective mapper
|
|
5
|
+
#
|
|
6
|
+
# Transforms parsed regular expression representation from
|
|
7
|
+
# `Regexp::Expression` instances (provided by `regexp_parser`) into
|
|
8
|
+
# equivalent representations using `Parser::AST::Node`
|
|
9
|
+
class Transformer
|
|
10
|
+
include AbstractType
|
|
11
|
+
|
|
12
|
+
REGISTRY = Registry.new
|
|
13
|
+
|
|
14
|
+
# Lookup transformer class for regular expression node type
|
|
15
|
+
#
|
|
16
|
+
# @param type [Symbol]
|
|
17
|
+
#
|
|
18
|
+
# @return [Class<Transformer>]
|
|
19
|
+
def self.lookup(type)
|
|
20
|
+
REGISTRY.lookup(type)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Register transformer class as responsible for handling node type
|
|
24
|
+
#
|
|
25
|
+
# @param type [Symbol]
|
|
26
|
+
#
|
|
27
|
+
# @return [undefined]
|
|
28
|
+
def self.register(type)
|
|
29
|
+
REGISTRY.register(type, self)
|
|
30
|
+
end
|
|
31
|
+
private_class_method :register
|
|
32
|
+
|
|
33
|
+
# Transform expression
|
|
34
|
+
#
|
|
35
|
+
# @param expression [Regexp::Expression]
|
|
36
|
+
#
|
|
37
|
+
# @return [Parser::AST::Node]
|
|
38
|
+
def self.to_ast(expression)
|
|
39
|
+
self::ExpressionToAST.call(expression)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Transform node
|
|
43
|
+
#
|
|
44
|
+
# @param node [Parser::AST::Node]
|
|
45
|
+
#
|
|
46
|
+
# @return [Regexp::Expression]
|
|
47
|
+
def self.to_expression(node)
|
|
48
|
+
self::ASTToExpression.call(node)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Abstract expression transformer
|
|
52
|
+
class ExpressionToAST
|
|
53
|
+
PREFIX = :regexp
|
|
54
|
+
|
|
55
|
+
include Concord.new(:expression), Procto.call, AST::Sexp, AbstractType, Adamantium
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
# Node with provided children using node type constructed in `type`
|
|
60
|
+
#
|
|
61
|
+
# @param [Object,Parser::AST::Node] child of node
|
|
62
|
+
#
|
|
63
|
+
# @return [Parser::AST::Node]
|
|
64
|
+
def ast(*children)
|
|
65
|
+
s(type, *children)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Wrap provided node in a quantifier
|
|
69
|
+
#
|
|
70
|
+
# @param node [Parser::AST::Node]
|
|
71
|
+
#
|
|
72
|
+
# @return [Parser::AST::Node]
|
|
73
|
+
# quantifier node wrapping provided node if expression is quantified
|
|
74
|
+
#
|
|
75
|
+
# @return [Parser::AST::Node]
|
|
76
|
+
# original node otherwise
|
|
77
|
+
def quantify(node)
|
|
78
|
+
return node unless expression.quantified?
|
|
79
|
+
|
|
80
|
+
Quantifier.to_ast(expression.quantifier).append(node)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Transformed children of expression
|
|
84
|
+
#
|
|
85
|
+
# @return [Array<Parser::AST::Node>]
|
|
86
|
+
def children
|
|
87
|
+
expression.expressions.map(&Regexp.method(:to_ast))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Node type constructed from token and type of `Regexp::Expression`
|
|
91
|
+
#
|
|
92
|
+
# @return [Symbol]
|
|
93
|
+
def type
|
|
94
|
+
:"#{PREFIX}_#{expression.token}_#{expression.type}"
|
|
95
|
+
end
|
|
96
|
+
end # ExpressionToAST
|
|
97
|
+
|
|
98
|
+
# Abstract node transformer
|
|
99
|
+
class ASTToExpression
|
|
100
|
+
include Concord.new(:node), Procto.call, AbstractType, Adamantium
|
|
101
|
+
|
|
102
|
+
# Call generic transform method and freeze result
|
|
103
|
+
#
|
|
104
|
+
# @return [Regexp::Expression]
|
|
105
|
+
def call
|
|
106
|
+
transform.freeze
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
# Transformation of ast into expression
|
|
112
|
+
#
|
|
113
|
+
# @return [Regexp::Expression]
|
|
114
|
+
abstract_method :transform
|
|
115
|
+
|
|
116
|
+
# Transformed children of node
|
|
117
|
+
#
|
|
118
|
+
# @return [Array<Regexp::Expression>]
|
|
119
|
+
def subexpressions
|
|
120
|
+
node.children.map(&Regexp.public_method(:to_expression))
|
|
121
|
+
end
|
|
122
|
+
end # ASTToExpression
|
|
123
|
+
|
|
124
|
+
# Mixin for node transformers
|
|
125
|
+
#
|
|
126
|
+
# Helps construct a mapping from Parser::AST::Node domain to
|
|
127
|
+
# Regexp::Expression domain
|
|
128
|
+
module LookupTable
|
|
129
|
+
Mapping = Class.new.include(Concord::Public.new(:token, :regexp_class))
|
|
130
|
+
|
|
131
|
+
# Table mapping ast types to object information for regexp domain
|
|
132
|
+
class Table
|
|
133
|
+
# Coerce array of mapping information into structured table
|
|
134
|
+
#
|
|
135
|
+
# @param [Array(Symbol, Array, Class<Regexp::Expression>)]
|
|
136
|
+
#
|
|
137
|
+
# @return [Table]
|
|
138
|
+
def self.create(*rows)
|
|
139
|
+
table = rows.map do |ast_type, token, klass|
|
|
140
|
+
[ast_type, Mapping.new(::Regexp::Token.new(*token), klass)]
|
|
141
|
+
end.to_h
|
|
142
|
+
|
|
143
|
+
new(table)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
include Concord.new(:table), Adamantium
|
|
147
|
+
|
|
148
|
+
# Types defined by the table
|
|
149
|
+
#
|
|
150
|
+
# @return [Array<Symbol>]
|
|
151
|
+
def types
|
|
152
|
+
table.keys
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Lookup mapping information given an ast node type
|
|
156
|
+
#
|
|
157
|
+
# @param type [Symbol]
|
|
158
|
+
#
|
|
159
|
+
# @return [Mapping]
|
|
160
|
+
def lookup(type)
|
|
161
|
+
table.fetch(type)
|
|
162
|
+
end
|
|
163
|
+
end # Table
|
|
164
|
+
|
|
165
|
+
private
|
|
166
|
+
|
|
167
|
+
# Lookup expression token given node type
|
|
168
|
+
#
|
|
169
|
+
# @return [Regexp::Token]
|
|
170
|
+
def expression_token
|
|
171
|
+
self.class::TABLE.lookup(node.type).token
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Lookup regexp class given node type
|
|
175
|
+
#
|
|
176
|
+
# @return [Class<Regexp::Expression>]
|
|
177
|
+
def expression_class
|
|
178
|
+
self.class::TABLE.lookup(node.type).regexp_class
|
|
179
|
+
end
|
|
180
|
+
end # LookupTable
|
|
181
|
+
end # Transformer
|
|
182
|
+
end # Regexp
|
|
183
|
+
end # AST
|
|
184
|
+
end # Mutest
|