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/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
|