git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59430 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2017-07-27 12:10:23 +00:00
Родитель aa30bfd536
Коммит c13aa27e52
8 изменённых файлов: 315 добавлений и 35 удалений

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -234,7 +234,7 @@ class MSpecScript
files patterns
end
def cores(max = 1)
def cores(max)
require 'etc'
[Etc.nprocessors, max].min
end

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

10
spec/mspec/tool/find.rb Executable file
Просмотреть файл

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

Просмотреть файл

@ -1,4 +0,0 @@
mri: 4e95b8c265d4d365477a05fe6701186415576303
truffleruby: c8fb3e592bf354cd67893555c671955cc54c32ff
jruby: d834e4279090998ba3ef087d81278734cab4c50a
rbx: 7799d9fa48467cdbfceeed6765a63366d9dc8b0e