From c13aa27e52c3ba10a329cf5a70b25fbf2a72d556 Mon Sep 17 00:00:00 2001 From: eregon Date: Thu, 27 Jul 2017 12:10:23 +0000 Subject: [PATCH] Update to ruby/mspec@353605f git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59430 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- spec/mspec/lib/mspec/guards/guard.rb | 28 ++- spec/mspec/lib/mspec/matchers/base.rb | 2 +- spec/mspec/lib/mspec/utils/script.rb | 2 +- spec/mspec/spec/guards/guard_spec.rb | 246 ++++++++++++++++++++++++ spec/mspec/spec/guards/platform_spec.rb | 51 +++-- spec/mspec/spec/guards/version_spec.rb | 7 + spec/mspec/tool/find.rb | 10 + spec/mspec/tool/sync/sync.yml | 4 - 8 files changed, 315 insertions(+), 35 deletions(-) create mode 100755 spec/mspec/tool/find.rb delete mode 100644 spec/mspec/tool/sync/sync.yml diff --git a/spec/mspec/lib/mspec/guards/guard.rb b/spec/mspec/lib/mspec/guards/guard.rb index 88adbba260..322a08145d 100644 --- a/spec/mspec/lib/mspec/guards/guard.rb +++ b/spec/mspec/lib/mspec/guards/guard.rb @@ -76,14 +76,22 @@ class SpecGuard def run_if(name, &block) @name = name - yield if yield?(false) + if block + yield if yield?(false) + else + yield?(false) + end ensure unregister end def run_unless(name, &block) @name = name - yield if yield?(true) + if block + yield if yield?(true) + else + yield?(true) + end ensure unregister end @@ -115,3 +123,19 @@ class SpecGuard raise "must be implemented by the subclass" end end + +# Combined guards + +def guard(condition, &block) + raise "condition must be a Proc" unless condition.is_a?(Proc) + raise LocalJumpError, "no block given" unless block + return yield if MSpec.mode? :unguarded or MSpec.mode? :verify or MSpec.mode? :report + yield if condition.call +end + +def guard_not(condition, &block) + raise "condition must be a Proc" unless condition.is_a?(Proc) + raise LocalJumpError, "no block given" unless block + return yield if MSpec.mode? :unguarded or MSpec.mode? :verify or MSpec.mode? :report + yield unless condition.call +end diff --git a/spec/mspec/lib/mspec/matchers/base.rb b/spec/mspec/lib/mspec/matchers/base.rb index 86b2fb4cec..fc2d36c84a 100644 --- a/spec/mspec/lib/mspec/matchers/base.rb +++ b/spec/mspec/lib/mspec/matchers/base.rb @@ -5,7 +5,7 @@ class MSpecEnv include MSpecMatchers end -# Expactations are sometimes used in a module body +# Expectations are sometimes used in a module body class Module include MSpecMatchers end diff --git a/spec/mspec/lib/mspec/utils/script.rb b/spec/mspec/lib/mspec/utils/script.rb index 910dcd22a7..146e3367af 100644 --- a/spec/mspec/lib/mspec/utils/script.rb +++ b/spec/mspec/lib/mspec/utils/script.rb @@ -234,7 +234,7 @@ class MSpecScript files patterns end - def cores(max = 1) + def cores(max) require 'etc' [Etc.nprocessors, max].min end diff --git a/spec/mspec/spec/guards/guard_spec.rb b/spec/mspec/spec/guards/guard_spec.rb index ca7dba6455..f2828dd4ad 100644 --- a/spec/mspec/spec/guards/guard_spec.rb +++ b/spec/mspec/spec/guards/guard_spec.rb @@ -178,3 +178,249 @@ SomeClass#reverse returns false ] end end + +describe SpecGuard, ".run_if" do + before :each do + @guard = SpecGuard.new + ScratchPad.clear + end + + it "yields if match? returns true" do + @guard.stub(:match?).and_return(true) + @guard.run_if(:name) { ScratchPad.record :yield } + ScratchPad.recorded.should == :yield + end + + it "does not yield if match? returns false" do + @guard.stub(:match?).and_return(false) + @guard.run_if(:name) { fail } + end + + it "returns the result of the block if match? is true" do + @guard.stub(:match?).and_return(true) + @guard.run_if(:name) { 42 }.should == 42 + end + + it "returns nil if given a block and match? is false" do + @guard.stub(:match?).and_return(false) + @guard.run_if(:name) { 42 }.should == nil + end + + it "returns what #match? returns when no block is given" do + @guard.stub(:match?).and_return(true) + @guard.run_if(:name).should == true + @guard.stub(:match?).and_return(false) + @guard.run_if(:name).should == false + end +end + +describe SpecGuard, ".run_unless" do + before :each do + @guard = SpecGuard.new + ScratchPad.clear + end + + it "yields if match? returns false" do + @guard.stub(:match?).and_return(false) + @guard.run_unless(:name) { ScratchPad.record :yield } + ScratchPad.recorded.should == :yield + end + + it "does not yield if match? returns true" do + @guard.stub(:match?).and_return(true) + @guard.run_unless(:name) { fail } + end + + it "returns the result of the block if match? is false" do + @guard.stub(:match?).and_return(false) + @guard.run_unless(:name) { 42 }.should == 42 + end + + it "returns nil if given a block and match? is true" do + @guard.stub(:match?).and_return(true) + @guard.run_unless(:name) { 42 }.should == nil + end + + it "returns the opposite of what #match? returns when no block is given" do + @guard.stub(:match?).and_return(true) + @guard.run_unless(:name).should == false + @guard.stub(:match?).and_return(false) + @guard.run_unless(:name).should == true + end +end + +describe Object, "#guard" do + before :each do + ScratchPad.clear + end + + after :each do + MSpec.clear_modes + end + + it "allows to combine guards" do + guard1 = VersionGuard.new 'x.x.x' + VersionGuard.stub(:new).and_return(guard1) + guard2 = PlatformGuard.new :dummy + PlatformGuard.stub(:new).and_return(guard2) + + guard1.stub(:match?).and_return(true) + guard2.stub(:match?).and_return(true) + guard -> { ruby_version_is "2.4" and platform_is :linux } do + ScratchPad.record :yield + end + ScratchPad.recorded.should == :yield + + guard1.stub(:match?).and_return(false) + guard2.stub(:match?).and_return(true) + guard -> { ruby_version_is "2.4" and platform_is :linux } do + fail + end + + guard1.stub(:match?).and_return(true) + guard2.stub(:match?).and_return(false) + guard -> { ruby_version_is "2.4" and platform_is :linux } do + fail + end + + guard1.stub(:match?).and_return(false) + guard2.stub(:match?).and_return(false) + guard -> { ruby_version_is "2.4" and platform_is :linux } do + fail + end + end + + it "yields when the Proc returns true" do + guard -> { true } do + ScratchPad.record :yield + end + ScratchPad.recorded.should == :yield + end + + it "does not yield when the Proc returns false" do + guard -> { false } do + fail + end + end + + it "yields if MSpec.mode?(:unguarded) is true" do + MSpec.register_mode :unguarded + + guard -> { false } do + ScratchPad.record :yield1 + end + ScratchPad.recorded.should == :yield1 + + guard -> { true } do + ScratchPad.record :yield2 + end + ScratchPad.recorded.should == :yield2 + end + + it "yields if MSpec.mode?(:verify) is true" do + MSpec.register_mode :verify + + guard -> { false } do + ScratchPad.record :yield1 + end + ScratchPad.recorded.should == :yield1 + + guard -> { true } do + ScratchPad.record :yield2 + end + ScratchPad.recorded.should == :yield2 + end + + it "yields if MSpec.mode?(:report) is true" do + MSpec.register_mode :report + + guard -> { false } do + ScratchPad.record :yield1 + end + ScratchPad.recorded.should == :yield1 + + guard -> { true } do + ScratchPad.record :yield2 + end + ScratchPad.recorded.should == :yield2 + end + + it "raises an error if no Proc is given" do + -> { guard :foo }.should raise_error(RuntimeError) + end + + it "requires a block" do + -> { + guard(-> { true }) + }.should raise_error(LocalJumpError) + -> { + guard(-> { false }) + }.should raise_error(LocalJumpError) + end +end + +describe Object, "#guard_not" do + before :each do + ScratchPad.clear + end + + it "allows to combine guards" do + guard1 = VersionGuard.new 'x.x.x' + VersionGuard.stub(:new).and_return(guard1) + guard2 = PlatformGuard.new :dummy + PlatformGuard.stub(:new).and_return(guard2) + + guard1.stub(:match?).and_return(true) + guard2.stub(:match?).and_return(true) + guard_not -> { ruby_version_is "2.4" and platform_is :linux } do + fail + end + + guard1.stub(:match?).and_return(false) + guard2.stub(:match?).and_return(true) + guard_not -> { ruby_version_is "2.4" and platform_is :linux } do + ScratchPad.record :yield1 + end + ScratchPad.recorded.should == :yield1 + + guard1.stub(:match?).and_return(true) + guard2.stub(:match?).and_return(false) + guard_not -> { ruby_version_is "2.4" and platform_is :linux } do + ScratchPad.record :yield2 + end + ScratchPad.recorded.should == :yield2 + + guard1.stub(:match?).and_return(false) + guard2.stub(:match?).and_return(false) + guard_not -> { ruby_version_is "2.4" and platform_is :linux } do + ScratchPad.record :yield3 + end + ScratchPad.recorded.should == :yield3 + end + + it "yields when the Proc returns false" do + guard_not -> { false } do + ScratchPad.record :yield + end + ScratchPad.recorded.should == :yield + end + + it "does not yield when the Proc returns true" do + guard_not -> { true } do + fail + end + end + + it "raises an error if no Proc is given" do + -> { guard_not :foo }.should raise_error(RuntimeError) + end + + it "requires a block" do + -> { + guard_not(-> { true }) + }.should raise_error(LocalJumpError) + -> { + guard_not(-> { false }) + }.should raise_error(LocalJumpError) + end +end diff --git a/spec/mspec/spec/guards/platform_spec.rb b/spec/mspec/spec/guards/platform_spec.rb index f0af12c1f8..749963d3db 100644 --- a/spec/mspec/spec/guards/platform_spec.rb +++ b/spec/mspec/spec/guards/platform_spec.rb @@ -20,6 +20,13 @@ describe Object, "#platform_is" do ScratchPad.recorded.should == :yield end + it "returns what #os? returns when no block is given" do + PlatformGuard.stub(:os?).and_return(true) + platform_is(:solarce).should == true + PlatformGuard.stub(:os?).and_return(false) + platform_is(:solarce).should == false + end + it "sets the name of the guard to :platform_is" do platform_is(:solarce) { } @guard.name.should == :platform_is @@ -53,6 +60,13 @@ describe Object, "#platform_is_not" do ScratchPad.recorded.should == :yield end + it "returns the opposite of what #os? returns when no block is given" do + PlatformGuard.stub(:os?).and_return(true) + platform_is_not(:solarce).should == false + PlatformGuard.stub(:os?).and_return(false) + platform_is_not(:solarce).should == true + end + it "sets the name of the guard to :platform_is_not" do platform_is_not(:solarce) { } @guard.name.should == :platform_is_not @@ -110,66 +124,49 @@ describe Object, "#platform_is_not :wordsize => SIZE_SPEC" do end describe PlatformGuard, ".implementation?" do - before :all do - @verbose = $VERBOSE - $VERBOSE = nil - end - - after :all do - $VERBOSE = @verbose - end - - before :each do - @ruby_engine = Object.const_get :RUBY_ENGINE - end - - after :each do - Object.const_set :RUBY_ENGINE, @ruby_engine - end - it "returns true if passed :ruby and RUBY_ENGINE == 'ruby'" do - Object.const_set :RUBY_ENGINE, 'ruby' + stub_const 'RUBY_ENGINE', 'ruby' PlatformGuard.implementation?(:ruby).should == true end it "returns true if passed :rubinius and RUBY_ENGINE == 'rbx'" do - Object.const_set :RUBY_ENGINE, 'rbx' + stub_const 'RUBY_ENGINE', 'rbx' PlatformGuard.implementation?(:rubinius).should == true end it "returns true if passed :jruby and RUBY_ENGINE == 'jruby'" do - Object.const_set :RUBY_ENGINE, 'jruby' + stub_const 'RUBY_ENGINE', 'jruby' PlatformGuard.implementation?(:jruby).should == true end it "returns true if passed :ironruby and RUBY_ENGINE == 'ironruby'" do - Object.const_set :RUBY_ENGINE, 'ironruby' + stub_const 'RUBY_ENGINE', 'ironruby' PlatformGuard.implementation?(:ironruby).should == true end it "returns true if passed :maglev and RUBY_ENGINE == 'maglev'" do - Object.const_set :RUBY_ENGINE, 'maglev' + stub_const 'RUBY_ENGINE', 'maglev' PlatformGuard.implementation?(:maglev).should == true end it "returns true if passed :topaz and RUBY_ENGINE == 'topaz'" do - Object.const_set :RUBY_ENGINE, 'topaz' + stub_const 'RUBY_ENGINE', 'topaz' PlatformGuard.implementation?(:topaz).should == true end it "returns true if passed :ruby and RUBY_ENGINE matches /^ruby/" do - Object.const_set :RUBY_ENGINE, 'ruby' + stub_const 'RUBY_ENGINE', 'ruby' PlatformGuard.implementation?(:ruby).should == true - Object.const_set :RUBY_ENGINE, 'ruby1.8' + stub_const 'RUBY_ENGINE', 'ruby1.8' PlatformGuard.implementation?(:ruby).should == true - Object.const_set :RUBY_ENGINE, 'ruby1.9' + stub_const 'RUBY_ENGINE', 'ruby1.9' PlatformGuard.implementation?(:ruby).should == true end it "raises an error when passed an unrecognized name" do - Object.const_set :RUBY_ENGINE, 'ruby' + stub_const 'RUBY_ENGINE', 'ruby' lambda { PlatformGuard.implementation?(:python) }.should raise_error(/unknown implementation/) diff --git a/spec/mspec/spec/guards/version_spec.rb b/spec/mspec/spec/guards/version_spec.rb index f11e3dbd94..07eb451ec9 100644 --- a/spec/mspec/spec/guards/version_spec.rb +++ b/spec/mspec/spec/guards/version_spec.rb @@ -68,6 +68,13 @@ describe Object, "#ruby_version_is" do ScratchPad.recorded.should_not == :yield end + it "returns what #match? returns when no block is given" do + @guard.stub(:match?).and_return(true) + ruby_version_is('x.x.x').should == true + @guard.stub(:match?).and_return(false) + ruby_version_is('x.x.x').should == false + end + it "sets the name of the guard to :ruby_version_is" do ruby_version_is("") { } @guard.name.should == :ruby_version_is diff --git a/spec/mspec/tool/find.rb b/spec/mspec/tool/find.rb new file mode 100755 index 0000000000..322b023f15 --- /dev/null +++ b/spec/mspec/tool/find.rb @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +Dir.chdir('../rubyspec') do + regexp = Regexp.new(ARGV[0]) + Dir.glob('**/*.rb') do |file| + contents = File.read(file) + if regexp =~ contents + puts file + end + end +end diff --git a/spec/mspec/tool/sync/sync.yml b/spec/mspec/tool/sync/sync.yml deleted file mode 100644 index c0e1690bf4..0000000000 --- a/spec/mspec/tool/sync/sync.yml +++ /dev/null @@ -1,4 +0,0 @@ -mri: 4e95b8c265d4d365477a05fe6701186415576303 -truffleruby: c8fb3e592bf354cd67893555c671955cc54c32ff -jruby: d834e4279090998ba3ef087d81278734cab4c50a -rbx: 7799d9fa48467cdbfceeed6765a63366d9dc8b0e