1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
eregon 2017-12-27 16:12:47 +00:00
parent 0f989b87a0
commit a34db218ad
162 changed files with 1267 additions and 621 deletions

View file

@ -3,15 +3,15 @@ require File.expand_path('../../spec_helper', __FILE__)
describe "The 'case'-construct" do
it "evaluates the body of the when clause matching the case target expression" do
case 1
when 2; false
when 1; true
when 2; false
when 1; true
end.should == true
end
it "evaluates the body of the when clause whose array expression includes the case target expression" do
case 2
when 3, 4; false
when 1, 2; true
when 3, 4; false
when 1, 2; true
end.should == true
end
@ -21,7 +21,7 @@ describe "The 'case'-construct" do
def bar; @calls << :bar; end
case true
when foo, bar;
when foo, bar;
end
@calls.should == [:foo, :bar]
@ -29,31 +29,31 @@ describe "The 'case'-construct" do
it "evaluates the body of the when clause whose range expression includes the case target expression" do
case 5
when 21..30; false
when 1..20; true
when 21..30; false
when 1..20; true
end.should == true
end
it "returns nil when no 'then'-bodies are given" do
case "a"
when "a"
when "b"
when "a"
when "b"
end.should == nil
end
it "evaluates the 'else'-body when no other expression matches" do
case "c"
when "a"; 'foo'
when "b"; 'bar'
else 'zzz'
when "a"; 'foo'
when "b"; 'bar'
else 'zzz'
end.should == 'zzz'
end
it "returns nil when no expression matches and 'else'-body is empty" do
case "c"
when "a"; "a"
when "b"; "b"
else
when "a"; "a"
when "b"; "b"
else
end.should == nil
end
@ -70,105 +70,143 @@ describe "The 'case'-construct" do
it "returns the statement following 'then'" do
case "a"
when "a" then 'foo'
when "b" then 'bar'
when "a" then 'foo'
when "b" then 'bar'
end.should == 'foo'
end
it "tests classes with case equality" do
case "a"
when String
'foo'
when Symbol
'bar'
when String
'foo'
when Symbol
'bar'
end.should == 'foo'
end
it "tests with matching regexps" do
case "hello"
when /abc/; false
when /^hell/; true
when /abc/; false
when /^hell/; true
end.should == true
end
it "tests with matching regexps and sets $~ and captures" do
case "foo42"
when /oo(\d+)/
$~.should be_kind_of(MatchData)
$1.should == "42"
else
flunk
end
$~.should be_kind_of(MatchData)
$1.should == "42"
end
it "tests with a regexp interpolated within another regexp" do
digits = '\d+'
case "foo44"
when /oo(#{digits})/
$~.should be_kind_of(MatchData)
$1.should == "44"
else
flunk
end
$~.should be_kind_of(MatchData)
$1.should == "44"
end
it "tests with a string interpolated in a regexp" do
digits_regexp = /\d+/
case "foo43"
when /oo(#{digits_regexp})/
$~.should be_kind_of(MatchData)
$1.should == "43"
else
flunk
end
$~.should be_kind_of(MatchData)
$1.should == "43"
end
it "does not test with equality when given classes" do
case :symbol.class
when Symbol
"bar"
when String
"bar"
else
"foo"
when Symbol
"bar"
when String
"bar"
else
"foo"
end.should == "foo"
end
it "takes lists of values" do
case 'z'
when 'a', 'b', 'c', 'd'
"foo"
when 'x', 'y', 'z'
"bar"
when 'a', 'b', 'c', 'd'
"foo"
when 'x', 'y', 'z'
"bar"
end.should == "bar"
case 'b'
when 'a', 'b', 'c', 'd'
"foo"
when 'x', 'y', 'z'
"bar"
when 'a', 'b', 'c', 'd'
"foo"
when 'x', 'y', 'z'
"bar"
end.should == "foo"
end
it "expands arrays to lists of values" do
case 'z'
when *['a', 'b', 'c', 'd']
"foo"
when *['x', 'y', 'z']
"bar"
when *['a', 'b', 'c', 'd']
"foo"
when *['x', 'y', 'z']
"bar"
end.should == "bar"
end
it "takes an expanded array in addition to a list of values" do
case 'f'
when 'f', *['a', 'b', 'c', 'd']
"foo"
when *['x', 'y', 'z']
"bar"
when 'f', *['a', 'b', 'c', 'd']
"foo"
when *['x', 'y', 'z']
"bar"
end.should == "foo"
case 'b'
when 'f', *['a', 'b', 'c', 'd']
"foo"
when *['x', 'y', 'z']
"bar"
when 'f', *['a', 'b', 'c', 'd']
"foo"
when *['x', 'y', 'z']
"bar"
end.should == "foo"
end
it "takes an expanded array before additional listed values" do
case 'f'
when *['a', 'b', 'c', 'd'], 'f'
"foo"
when *['x', 'y', 'z']
"bar"
when *['a', 'b', 'c', 'd'], 'f'
"foo"
when *['x', 'y', 'z']
"bar"
end.should == 'foo'
end
it "expands arrays from variables before additional listed values" do
a = ['a', 'b', 'c']
case 'a'
when *a, 'd', 'e'
"foo"
when 'x'
"bar"
when *a, 'd', 'e'
"foo"
when 'x'
"bar"
end.should == "foo"
end
it "expands arrays from variables before a single additional listed value" do
a = ['a', 'b', 'c']
case 'a'
when *a, 'd'
"foo"
when 'x'
"bar"
when *a, 'd'
"foo"
when 'x'
"bar"
end.should == "foo"
end
@ -177,10 +215,10 @@ describe "The 'case'-construct" do
b = ['d', 'e', 'f']
case 'f'
when *a, *b, 'g', 'h'
"foo"
when 'x'
"bar"
when *a, *b, 'g', 'h'
"foo"
when 'x'
"bar"
end.should == "foo"
end
@ -190,26 +228,26 @@ describe "The 'case'-construct" do
b = ['f']
case 'f'
when 'f', *a|b
"foo"
when *['x', 'y', 'z']
"bar"
when 'f', *a|b
"foo"
when *['x', 'y', 'z']
"bar"
end.should == "foo"
end
it "never matches when clauses with no values" do
case nil
when *[]
"foo"
when *[]
"foo"
end.should == nil
end
it "lets you define a method after the case statement" do
case (def foo; 'foo'; end; 'f')
when 'a'
'foo'
when 'f'
'bar'
when 'a'
'foo'
when 'f'
'bar'
end.should == 'bar'
end
@ -217,8 +255,8 @@ describe "The 'case'-construct" do
lambda {
eval <<-CODE
case 4
else
true
else
true
end
CODE
}.should raise_error(SyntaxError)
@ -228,9 +266,9 @@ describe "The 'case'-construct" do
lambda {
eval <<-CODE
case 4
else
true
when 4; false
else
true
when 4; false
end
CODE
}.should raise_error(SyntaxError)
@ -287,56 +325,56 @@ end
describe "The 'case'-construct with no target expression" do
it "evaluates the body of the first clause when at least one of its condition expressions is true" do
case
when true, false; 'foo'
when true, false; 'foo'
end.should == 'foo'
end
it "evaluates the body of the first when clause that is not false/nil" do
case
when false; 'foo'
when 2; 'bar'
when 1 == 1; 'baz'
when false; 'foo'
when 2; 'bar'
when 1 == 1; 'baz'
end.should == 'bar'
case
when false; 'foo'
when nil; 'foo'
when 1 == 1; 'bar'
when false; 'foo'
when nil; 'foo'
when 1 == 1; 'bar'
end.should == 'bar'
end
it "evaluates the body of the else clause if all when clauses are false/nil" do
case
when false; 'foo'
when nil; 'foo'
when 1 == 2; 'bar'
else 'baz'
when false; 'foo'
when nil; 'foo'
when 1 == 2; 'bar'
else 'baz'
end.should == 'baz'
end
it "evaluates multiple conditional expressions as a boolean disjunction" do
case
when true, false; 'foo'
else 'bar'
when true, false; 'foo'
else 'bar'
end.should == 'foo'
case
when false, true; 'foo'
else 'bar'
when false, true; 'foo'
else 'bar'
end.should == 'foo'
end
it "evaluates true as only 'true' when true is the first clause" do
case 1
when true; "bad"
when Integer; "good"
when true; "bad"
when Integer; "good"
end.should == "good"
end
it "evaluates false as only 'false' when false is the first clause" do
case nil
when false; "bad"
when nil; "good"
when false; "bad"
when nil; "good"
end.should == "good"
end
@ -352,17 +390,17 @@ describe "The 'case'-construct with no target expression" do
a2 = ['b', 'a', 'r']
case 'f'
when *a1, *['x', 'y', 'z']
"foo"
when *a2, *['x', 'y', 'z']
"bar"
when *a1, *['x', 'y', 'z']
"foo"
when *a2, *['x', 'y', 'z']
"bar"
end.should == "foo"
case 'b'
when *a1, *['x', 'y', 'z']
"foo"
when *a2, *['x', 'y', 'z']
"bar"
when *a1, *['x', 'y', 'z']
"foo"
when *a2, *['x', 'y', 'z']
"bar"
end.should == "bar"
end

View file

@ -234,10 +234,10 @@ describe "A singleton method definition" do
(obj==2).should == 2
end
it "raises RuntimeError if frozen" do
it "raises #{frozen_error_class} if frozen" do
obj = Object.new
obj.freeze
lambda { def obj.foo; end }.should raise_error(RuntimeError)
lambda { def obj.foo; end }.should raise_error(frozen_error_class)
end
end
@ -385,12 +385,12 @@ describe "A method definition inside a metaclass scope" do
lambda { Object.new.a_singleton_method }.should raise_error(NoMethodError)
end
it "raises RuntimeError if frozen" do
it "raises #{frozen_error_class} if frozen" do
obj = Object.new
obj.freeze
class << obj
lambda { def foo; end }.should raise_error(RuntimeError)
lambda { def foo; end }.should raise_error(frozen_error_class)
end
end
end

View file

@ -543,16 +543,12 @@ describe "The defined? keyword for variables" do
defined?($+).should be_nil
end
it "returns nil for $1-$9" do
it "returns nil for any last match global" do
defined?($1).should be_nil
defined?($2).should be_nil
defined?($3).should be_nil
defined?($4).should be_nil
defined?($5).should be_nil
defined?($6).should be_nil
defined?($7).should be_nil
defined?($8).should be_nil
defined?($9).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
@ -587,13 +583,10 @@ describe "The defined? keyword for variables" do
end
it "returns nil for non-captures" do
defined?($3).should be_nil
defined?($4).should be_nil
defined?($5).should be_nil
defined?($6).should be_nil
defined?($7).should be_nil
defined?($8).should be_nil
defined?($9).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
@ -622,16 +615,12 @@ describe "The defined? keyword for variables" do
defined?($+).should be_nil
end
it "returns nil for $1-$9" do
it "returns nil for any last match global" do
defined?($1).should be_nil
defined?($2).should be_nil
defined?($3).should be_nil
defined?($4).should be_nil
defined?($5).should be_nil
defined?($6).should be_nil
defined?($7).should be_nil
defined?($8).should be_nil
defined?($9).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
@ -666,13 +655,10 @@ describe "The defined? keyword for variables" do
end
it "returns nil for non-captures" do
defined?($3).should be_nil
defined?($4).should be_nil
defined?($5).should be_nil
defined?($6).should be_nil
defined?($7).should be_nil
defined?($8).should be_nil
defined?($9).should be_nil
defined?($10).should be_nil
defined?($200).should be_nil
end
end
it "returns 'global-variable' for a global variable that has been assigned" do

View file

@ -30,11 +30,11 @@ $` String The string preceding the match in a successful
is local to the current scope. [r/o, thread]
$' String The string following the match in a successful pattern match. This variable
is local to the current scope. [r/o, thread]
$1 to $9 String The contents of successive groups matched in a successful pattern match. In
$1 to $<N> String The contents of successive groups matched in a successful pattern match. In
"cat" =~/(c|a)(t|z)/, $1 will be set to a and $2 to t. This variable
is local to the current scope. [r/o, thread]
$~ MatchData An object that encapsulates the results of a successful pattern match. The
variables $&, $`, $', and $1 to $9 are all derived from $~. Assigning to $~
variables $&, $`, $', and $1 to $<N> are all derived from $~. Assigning to $~
changes the values of these derived variables. This variable is local to the
current scope. [thread]
=end
@ -645,6 +645,33 @@ describe "Predefined global $," do
end
end
describe "Predefined global $." do
it "can be assigned an Integer" do
$. = 123
$..should == 123
end
it "can be assigned a Float" do
$. = 123.5
$..should == 123
end
it "should call #to_int to convert the object to an Integer" do
obj = mock("good-value")
obj.should_receive(:to_int).and_return(321)
$. = obj
$..should == 321
end
it "raises TypeError if object can't be converted to an Integer" do
obj = mock("bad-value")
obj.should_receive(:to_int).and_return('abc')
lambda { $. = obj }.should raise_error(TypeError)
end
end
describe "Predefined global $_" do
it "is set to the last line read by e.g. StringIO#gets" do
stdin = StringIO.new("foo\nbar\n", "r")

View file

@ -7,7 +7,7 @@ describe "Regexps with back-references" do
$~.to_a.should == ["ll"]
end
it "saves captures in numbered $[1-9] variables" do
it "saves captures in numbered $[1-N] variables" do
"1234567890" =~ /(1)(2)(3)(4)(5)(6)(7)(8)(9)(0)/
$~.to_a.should == ["1234567890", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
$1.should == "1"
@ -19,6 +19,7 @@ describe "Regexps with back-references" do
$7.should == "7"
$8.should == "8"
$9.should == "9"
$10.should == "0"
end
it "will not clobber capture variables across threads" do

View file

@ -403,6 +403,29 @@ describe "Invoking a method" do
specs.rest_len(0,*a,4,*5,6,7,*c,-1).should == 11
end
it "expands the Array elements from the splat after executing the arguments and block if no other arguments follow the splat" do
def self.m(*args, &block)
[args, block]
end
args = [1, nil]
m(*args, &args.pop).should == [[1], nil]
args = [1, nil]
order = []
m(*(order << :args; args), &(order << :block; args.pop)).should == [[1], nil]
order.should == [:args, :block]
end
it "evaluates the splatted arguments before the block if there are other arguments after the splat" do
def self.m(*args, &block)
[args, block]
end
args = [1, nil]
m(*args, 2, &args.pop).should == [[1, nil, 2], nil]
end
it "expands an array to arguments grouped in parentheses" do
specs.destructure2([40,2]).should == 42
end