summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-27 12:10:23 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-27 12:10:23 +0000
commitc13aa27e52c3ba10a329cf5a70b25fbf2a72d556 (patch)
treee9d0dbdd7424682ec9d94f9d5ff9c95d3a0229dd
parentaa30bfd53651ff87983e5706a0d06706e8265c3b (diff)
Update to ruby/mspec@353605f
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59430 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--spec/mspec/lib/mspec/guards/guard.rb28
-rw-r--r--spec/mspec/lib/mspec/matchers/base.rb2
-rw-r--r--spec/mspec/lib/mspec/utils/script.rb2
-rw-r--r--spec/mspec/spec/guards/guard_spec.rb246
-rw-r--r--spec/mspec/spec/guards/platform_spec.rb51
-rw-r--r--spec/mspec/spec/guards/version_spec.rb7
-rwxr-xr-xspec/mspec/tool/find.rb10
-rw-r--r--spec/mspec/tool/sync/sync.yml4
8 files changed, 315 insertions, 35 deletions
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