mutest 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- 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/mutest-rspec.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.extra_rdoc_files = %w[LICENSE]
|
17
17
|
|
18
18
|
gem.add_runtime_dependency('mutest', "~> #{gem.version}")
|
19
|
-
gem.add_runtime_dependency('rspec-core', '>= 3.4.0', '< 3.
|
19
|
+
gem.add_runtime_dependency('rspec-core', '>= 3.4.0', '< 3.9.0')
|
20
20
|
|
21
21
|
gem.add_development_dependency('bundler', '~> 1.3', '>= 1.3.5')
|
22
22
|
end
|
data/mutest.gemspec
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require File.expand_path('../lib/mutest/version', __FILE__)
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/BlockLength
|
4
3
|
Gem::Specification.new do |gem|
|
5
4
|
gem.name = 'mutest'
|
6
5
|
gem.version = Mutest::VERSION.dup
|
@@ -22,21 +21,21 @@ Gem::Specification.new do |gem|
|
|
22
21
|
gem.extra_rdoc_files = %w[LICENSE]
|
23
22
|
gem.executables = %w[mutest]
|
24
23
|
|
25
|
-
gem.required_ruby_version = '>= 2.
|
24
|
+
gem.required_ruby_version = '>= 2.3'
|
26
25
|
|
27
|
-
gem.add_runtime_dependency('parser', '>= 2.5.0.1', '< 2.6')
|
28
|
-
gem.add_runtime_dependency('ast', '~> 2.2')
|
29
|
-
gem.add_runtime_dependency('diff-lcs', '~> 1.2')
|
30
|
-
gem.add_runtime_dependency('parallel', '~> 1.3')
|
31
|
-
gem.add_runtime_dependency('morpher', '~> 0.2.6')
|
32
|
-
gem.add_runtime_dependency('procto', '~> 0.0.2')
|
33
26
|
gem.add_runtime_dependency('abstract_type', '~> 0.0.7')
|
34
|
-
gem.add_runtime_dependency('unparser', '~> 0.2.5')
|
35
|
-
gem.add_runtime_dependency('ice_nine', '~> 0.11.1')
|
36
27
|
gem.add_runtime_dependency('adamantium', '~> 0.2.0')
|
37
|
-
gem.add_runtime_dependency('memoizable', '~> 0.4.2')
|
38
|
-
gem.add_runtime_dependency('equalizer', '~> 0.0.9')
|
39
28
|
gem.add_runtime_dependency('anima', '~> 0.3.0')
|
29
|
+
gem.add_runtime_dependency('ast', '~> 2.2')
|
40
30
|
gem.add_runtime_dependency('concord', '~> 0.1.5')
|
31
|
+
gem.add_runtime_dependency('diff-lcs', '~> 1.2')
|
32
|
+
gem.add_runtime_dependency('equalizer', '~> 0.0.9')
|
33
|
+
gem.add_runtime_dependency('ice_nine', '~> 0.11.1')
|
34
|
+
gem.add_runtime_dependency('memoizable', '~> 0.4.2')
|
35
|
+
gem.add_runtime_dependency('morpher', '~> 0.2.6')
|
36
|
+
gem.add_runtime_dependency('parallel', '~> 1.3')
|
37
|
+
gem.add_runtime_dependency('parser', '>= 2.5.0.1', '< 2.6')
|
38
|
+
gem.add_runtime_dependency('procto', '~> 0.0.2')
|
41
39
|
gem.add_runtime_dependency('regexp_parser', '~> 0.4.9')
|
40
|
+
gem.add_runtime_dependency('unparser', '~> 0.4.2')
|
42
41
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
RSpec.describe 'rspec integration', mutest: false do
|
2
2
|
let(:base_cmd) { 'bundle exec mutest -I lib --require test_app --use rspec' }
|
3
3
|
|
4
|
-
%w[3.4 3.5 3.6 3.7].each do |version|
|
4
|
+
%w[3.4 3.5 3.6 3.7 3.8].each do |version|
|
5
5
|
context "RSpec #{version}" do
|
6
6
|
let(:gemfile) { "Gemfile.rspec#{version}" }
|
7
7
|
|
@@ -2,7 +2,7 @@ RSpec.shared_examples_for 'framework integration' do
|
|
2
2
|
around do |example|
|
3
3
|
Bundler.with_clean_env do
|
4
4
|
Dir.chdir(TestApp.root) do
|
5
|
-
Kernel.system("bundle install --gemfile=#{gemfile}") ||
|
5
|
+
Kernel.system("bundle install --gemfile=#{gemfile}") || raise('Bundle install failed!')
|
6
6
|
ENV['BUNDLE_GEMFILE'] = gemfile
|
7
7
|
example.run
|
8
8
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
RSpec.shared_examples_for 'an idempotent method' do
|
2
2
|
it 'is idempotent' do
|
3
3
|
first = subject
|
4
|
-
|
4
|
+
raise 'RSpec not configured for threadsafety' unless RSpec.configuration.threadsafe?
|
5
|
+
|
5
6
|
mutex = __memoized.instance_variable_get(:@mutex)
|
6
7
|
memoized = __memoized.instance_variable_get(:@memoized)
|
7
8
|
mutex.synchronize { memoized.delete(:subject) }
|
data/spec/spec_helper.rb
CHANGED
@@ -32,7 +32,7 @@ module MutestSpec
|
|
32
32
|
SPECS_PATH = Pathname.new(__dir__).expand_path.freeze
|
33
33
|
PROJECT_ROOT = SPECS_PATH.parent.freeze
|
34
34
|
UNIT_TEST_TIMOUT = 10.0
|
35
|
-
end
|
35
|
+
end
|
36
36
|
|
37
37
|
Dir.glob(MutestSpec::SPECS_PATH.join('{shared,support}/**/*.rb')).each(&method(:require))
|
38
38
|
|
@@ -43,7 +43,7 @@ require 'test_app'
|
|
43
43
|
module Fixtures
|
44
44
|
TEST_CONFIG = Mutest::Config::DEFAULT.with(reporter: Mutest::Reporter::Null.new)
|
45
45
|
TEST_ENV = Mutest::Env::Bootstrap.(TEST_CONFIG)
|
46
|
-
end
|
46
|
+
end
|
47
47
|
|
48
48
|
module ParserHelper
|
49
49
|
def generate(node)
|
@@ -51,19 +51,19 @@ module ParserHelper
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def parse(string)
|
54
|
-
Unparser::Preprocessor.run(
|
54
|
+
Unparser::Preprocessor.run(Unparser.parse(string))
|
55
55
|
end
|
56
56
|
|
57
57
|
def parse_expression(string)
|
58
58
|
Mutest::Config::DEFAULT.expression_parser.(string)
|
59
59
|
end
|
60
|
-
end
|
60
|
+
end
|
61
61
|
|
62
62
|
module MessageHelper
|
63
63
|
def message(*arguments)
|
64
64
|
Mutest::Actor::Message.new(*arguments)
|
65
65
|
end
|
66
|
-
end
|
66
|
+
end
|
67
67
|
|
68
68
|
RSpec.configure do |config|
|
69
69
|
config.extend(SharedContext)
|
data/spec/support/corpus.rb
CHANGED
@@ -31,7 +31,7 @@ module MutestSpec
|
|
31
31
|
|
32
32
|
DEFAULT_MUTATION_COUNT = 0
|
33
33
|
|
34
|
-
include
|
34
|
+
include Anima.new(
|
35
35
|
:expected_errors,
|
36
36
|
:mutation_coverage,
|
37
37
|
:mutation_generation,
|
@@ -40,6 +40,7 @@ module MutestSpec
|
|
40
40
|
:repo_uri,
|
41
41
|
:repo_ref
|
42
42
|
)
|
43
|
+
include Adamantium
|
43
44
|
|
44
45
|
# Verify mutation coverage
|
45
46
|
#
|
@@ -95,6 +96,7 @@ module MutestSpec
|
|
95
96
|
# @return [self]
|
96
97
|
def checkout
|
97
98
|
return self if noinstall?
|
99
|
+
|
98
100
|
TMP.mkdir unless TMP.directory?
|
99
101
|
|
100
102
|
if repo_path.exist?
|
@@ -158,6 +160,7 @@ module MutestSpec
|
|
158
160
|
# @return [undefined]
|
159
161
|
def install_mutest
|
160
162
|
return if noinstall?
|
163
|
+
|
161
164
|
relative = ROOT.relative_path_from(repo_path)
|
162
165
|
repo_path.join('Gemfile').open('a') do |file|
|
163
166
|
file << "gem 'mutest', path: '#{relative}'\n"
|
@@ -241,7 +244,7 @@ module MutestSpec
|
|
241
244
|
if block_given?
|
242
245
|
yield
|
243
246
|
else
|
244
|
-
|
247
|
+
raise "System command failed!: #{arguments.join(' ')}"
|
245
248
|
end
|
246
249
|
end
|
247
250
|
|
@@ -253,9 +256,10 @@ module MutestSpec
|
|
253
256
|
def initialize(*error_info)
|
254
257
|
super(MESSAGE % error_info)
|
255
258
|
end
|
256
|
-
end
|
259
|
+
end
|
257
260
|
|
258
|
-
include
|
261
|
+
include Adamantium
|
262
|
+
include Concord.new(:map)
|
259
263
|
|
260
264
|
# Assert that we expect to encounter the provided exception for this path
|
261
265
|
#
|
@@ -295,7 +299,7 @@ module MutestSpec
|
|
295
299
|
def to_h
|
296
300
|
map
|
297
301
|
end
|
298
|
-
end
|
302
|
+
end
|
299
303
|
|
300
304
|
LOADER =
|
301
305
|
Morpher.build do
|
@@ -326,6 +330,6 @@ module MutestSpec
|
|
326
330
|
end
|
327
331
|
|
328
332
|
ALL = LOADER.call(YAML.load_file(ROOT.join('spec', 'integrations.yml')))
|
329
|
-
end
|
330
|
-
end
|
331
|
-
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
data/spec/support/fake_actor.rb
CHANGED
@@ -11,13 +11,15 @@ module FakeActor
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def verify(other)
|
14
|
-
|
15
|
-
|
14
|
+
raise "Got:\n#{other.inspect}\nExpected:\n#{inspect}" unless eql?(other)
|
15
|
+
|
16
|
+
block&.call(other.message)
|
16
17
|
end
|
17
|
-
end
|
18
|
+
end
|
18
19
|
|
19
20
|
class MessageSequence
|
20
|
-
include
|
21
|
+
include Concord::Public.new(:messages)
|
22
|
+
include Adamantium::Flat
|
21
23
|
|
22
24
|
def self.new
|
23
25
|
super([])
|
@@ -29,23 +31,26 @@ module FakeActor
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def sending(expectation)
|
32
|
-
|
34
|
+
raise "Unexpected send: #{expectation.inspect}" if messages.empty?
|
35
|
+
|
33
36
|
expected = messages.shift
|
34
37
|
expected.verify(expectation)
|
35
38
|
self
|
36
39
|
end
|
37
40
|
|
38
41
|
def receiving(name)
|
39
|
-
|
42
|
+
raise "No message to read for #{name.inspect}" if messages.empty?
|
43
|
+
|
40
44
|
expected = messages.shift
|
41
|
-
|
45
|
+
raise "Unexpected message #{expected.inspect} for #{name.inspect}" unless expected.name.eql?(name)
|
46
|
+
|
42
47
|
expected.message
|
43
48
|
end
|
44
49
|
|
45
50
|
def consumed?
|
46
51
|
messages.empty?
|
47
52
|
end
|
48
|
-
end
|
53
|
+
end
|
49
54
|
|
50
55
|
class Env
|
51
56
|
include Concord.new(:messages, :mailbox_names)
|
@@ -68,10 +73,10 @@ module FakeActor
|
|
68
73
|
|
69
74
|
def next_name
|
70
75
|
@mailbox_names.shift.tap do |name|
|
71
|
-
name or
|
76
|
+
name or raise 'Tried to spawn actor when no name available'
|
72
77
|
end
|
73
78
|
end
|
74
|
-
end
|
79
|
+
end
|
75
80
|
|
76
81
|
class Mailbox
|
77
82
|
include Concord.new(:name, :messages)
|
@@ -87,7 +92,7 @@ module FakeActor
|
|
87
92
|
def bind(sender)
|
88
93
|
Mutest::Actor::Binding.new(self, sender)
|
89
94
|
end
|
90
|
-
end
|
95
|
+
end
|
91
96
|
|
92
97
|
class Sender
|
93
98
|
include Concord.new(:name, :messages)
|
@@ -95,7 +100,7 @@ module FakeActor
|
|
95
100
|
def call(message)
|
96
101
|
messages.sending(Expectation.new(name, message))
|
97
102
|
end
|
98
|
-
end
|
103
|
+
end
|
99
104
|
|
100
105
|
class Receiver
|
101
106
|
include Concord::Public.new(:name, :messages)
|
@@ -103,5 +108,5 @@ module FakeActor
|
|
103
108
|
def call
|
104
109
|
messages.receiving(name)
|
105
110
|
end
|
106
|
-
end
|
107
|
-
end
|
111
|
+
end
|
112
|
+
end
|
data/spec/support/file_system.rb
CHANGED
@@ -6,7 +6,8 @@ module MutestSpec
|
|
6
6
|
requires: []
|
7
7
|
)
|
8
8
|
|
9
|
-
include
|
9
|
+
include Anima.new(*DEFAULTS.keys)
|
10
|
+
include Adamantium
|
10
11
|
|
11
12
|
def self.new(attributes = DEFAULTS)
|
12
13
|
super(DEFAULTS.merge(attributes))
|
@@ -15,10 +16,11 @@ module MutestSpec
|
|
15
16
|
DOES_NOT_EXIST = new
|
16
17
|
|
17
18
|
alias_method :file?, :file
|
18
|
-
end
|
19
|
+
end
|
19
20
|
|
20
21
|
class FakePathname
|
21
|
-
include
|
22
|
+
include Concord.new(:file_system, :pathname)
|
23
|
+
include Adamantium
|
22
24
|
|
23
25
|
def join(*arguments)
|
24
26
|
self.class.new(
|
@@ -44,10 +46,11 @@ module MutestSpec
|
|
44
46
|
def state
|
45
47
|
file_system.state(pathname.to_s)
|
46
48
|
end
|
47
|
-
end
|
49
|
+
end
|
48
50
|
|
49
51
|
class FileSystem
|
50
|
-
include
|
52
|
+
include Concord.new(:file_states)
|
53
|
+
include Adamantium
|
51
54
|
|
52
55
|
def state(filename)
|
53
56
|
file_states.fetch(filename, FileState::DOES_NOT_EXIST)
|
@@ -56,5 +59,5 @@ module MutestSpec
|
|
56
59
|
def path(filename)
|
57
60
|
FakePathname.new(self, Pathname.new(filename))
|
58
61
|
end
|
59
|
-
end
|
60
|
-
end
|
62
|
+
end
|
63
|
+
end
|
data/spec/support/ruby_vm.rb
CHANGED
@@ -8,15 +8,16 @@ module MutestSpec
|
|
8
8
|
# An event being observed by the VM handlers
|
9
9
|
class EventObservation
|
10
10
|
include Concord::Public.new(:type, :payload)
|
11
|
-
end
|
11
|
+
end
|
12
12
|
|
13
13
|
# An event being expected, can advance the VM
|
14
14
|
class EventExpectation
|
15
|
-
include
|
15
|
+
include Anima.new(
|
16
16
|
:expected_payload,
|
17
17
|
:trigger_requires,
|
18
18
|
:return_value
|
19
19
|
)
|
20
|
+
include AbstractType
|
20
21
|
|
21
22
|
DEFAULTS = IceNine.deep_freeze(trigger_requires: [])
|
22
23
|
|
@@ -25,9 +26,7 @@ module MutestSpec
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def handle(vm, observation)
|
28
|
-
unless match?(observation)
|
29
|
-
fail "Unexpected event observation: #{observation.inspect}, expected #{inspect}"
|
30
|
-
end
|
29
|
+
raise "Unexpected event observation: #{observation.inspect}, expected #{inspect}" unless match?(observation)
|
31
30
|
|
32
31
|
trigger_requires.each(&vm.method(:require))
|
33
32
|
|
@@ -42,12 +41,12 @@ module MutestSpec
|
|
42
41
|
|
43
42
|
# Expectation and advance on require calls
|
44
43
|
class Require < self
|
45
|
-
end
|
44
|
+
end
|
46
45
|
|
47
46
|
# Expectation and advance on eval calls
|
48
47
|
class Eval < self
|
49
|
-
end
|
50
|
-
end
|
48
|
+
end
|
49
|
+
end
|
51
50
|
|
52
51
|
# A fake implementation of Kernel#require
|
53
52
|
def require(logical_name)
|
@@ -74,9 +73,9 @@ module MutestSpec
|
|
74
73
|
private
|
75
74
|
|
76
75
|
def handle_event(observation)
|
77
|
-
|
76
|
+
raise "Unexpected event: #{observation.type} / #{observation.payload}" if expected_events.empty?
|
78
77
|
|
79
78
|
expected_events.slice!(0).handle(self, observation).return_value
|
80
79
|
end
|
81
|
-
end
|
82
|
-
end
|
80
|
+
end
|
81
|
+
end
|
data/spec/support/test_app.rb
CHANGED
data/spec/support/warning.rb
CHANGED
@@ -17,7 +17,7 @@ module MutestSpec
|
|
17
17
|
def self.assert_no_warnings
|
18
18
|
return if EXTRACTOR.warnings.empty?
|
19
19
|
|
20
|
-
|
20
|
+
raise UnexpectedWarnings, EXTRACTOR.warnings.to_a
|
21
21
|
end
|
22
22
|
|
23
23
|
class UnexpectedWarnings < StandardError
|
@@ -26,12 +26,13 @@ module MutestSpec
|
|
26
26
|
def initialize(warnings)
|
27
27
|
super(MSG % warnings.join("\n"))
|
28
28
|
end
|
29
|
-
end
|
29
|
+
end
|
30
30
|
|
31
31
|
class Extractor < DelegateClass(IO)
|
32
|
-
PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z
|
32
|
+
PATTERN = /\A(?:.+):(?:\d+): warning: (?:.+)\n\z/.freeze
|
33
33
|
|
34
|
-
include
|
34
|
+
include Memoizable
|
35
|
+
include Equalizer.new(:whitelist, :seen, :io)
|
35
36
|
|
36
37
|
def initialize(io, whitelist)
|
37
38
|
@whitelist = whitelist
|
@@ -63,11 +64,11 @@ module MutestSpec
|
|
63
64
|
end
|
64
65
|
|
65
66
|
attr_reader :whitelist, :seen, :io
|
66
|
-
end
|
67
|
+
end
|
67
68
|
|
68
69
|
warnings = Pathname.new(__dir__).join('warnings.yml').freeze
|
69
70
|
whitelist = IceNine.deep_freeze(YAML.safe_load(warnings.read))
|
70
71
|
|
71
72
|
EXTRACTOR = Extractor.new(STDERR, whitelist)
|
72
|
-
end
|
73
|
-
end
|
73
|
+
end
|
74
|
+
end
|