Skip to content

Commit

Permalink
Update frozen language/return specs and tags
Browse files Browse the repository at this point in the history
  • Loading branch information
Wilson Bilkovich committed Oct 27, 2008
1 parent 6bf20ab commit bad4f57
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 34 deletions.
64 changes: 36 additions & 28 deletions spec/frozen/1.8/language/return_spec.rb
@@ -1,7 +1,7 @@
require File.dirname(__FILE__) + '/../spec_helper'

describe "Assignment via return" do
it "assigns objects to block variables" do
describe "The return keyword" do
it "assigns to block variables" do
def r; return nil; end; a = r(); a.should == nil
def r; return 1; end; a = r(); a.should == 1
def r; return []; end; a = r(); a.should == []
Expand All @@ -11,14 +11,7 @@ def r; return [[]]; end; a = r(); a.should == [[]]
def r; return [*[]]; end; a = r(); a.should == []
def r; return [*[1]]; end; a = r(); a.should == [1]
def r; return [*[1,2]]; end; a = r(); a.should == [1,2]

# return with expressions separated by commas
def r; return 1, 2, 3; end;
a = r(); a.should == [1, 2, 3]
a = *r(); a.should == [1, 2, 3]
*a = r(); a.should == [[1, 2, 3]]
*a = *r(); a.should == [1, 2, 3]
a,*c = r(); [a, c].should == [1, [2,3]]
def r; return 1, 2, 3; end; a = r(); a.should == [1, 2, 3]
end

it "assigns splatted objects to block variables" do
Expand All @@ -32,7 +25,7 @@ def r; return *[*[1]]; end; a = r(); a.should == 1
def r; return *[*[1,2]]; end; a = r(); a.should == [1,2]
end

it "assigns objects to block variables that include the splat operator inside the block" do
it "assigns to a block variable with a splat on the RHS" do
def r; return; end; a = *r(); a.should == nil
def r; return nil; end; a = *r(); a.should == nil
def r; return 1; end; a = *r(); a.should == 1
Expand All @@ -44,9 +37,10 @@ def r; return [1,2]; end; a = *r(); a.should == [1,2]
def r; return [*[]]; end; a = *r(); a.should == nil
def r; return [*[1]]; end; a = *r(); a.should == 1
def r; return [*[1,2]]; end; a = *r(); a.should == [1,2]
def r; return 1, 2, 3; end; a = *r(); a.should == [1, 2, 3]
end
it "assigns objects to splatted block variables that include the splat operator inside the block" do

it "assigns to a block variable with a splat on the LHS" do
def r; return *nil; end; *a = r(); a.should == [nil]
def r; return *1; end; *a = r(); a.should == [1]
def r; return *[]; end; *a = r(); a.should == [nil]
Expand All @@ -56,9 +50,10 @@ def r; return *[[]]; end; *a = r(); a.should == [[]]
def r; return *[*[]]; end; *a = r(); a.should == [nil]
def r; return *[*[1]]; end; *a = r(); a.should == [1]
def r; return *[*[1,2]]; end; *a = r(); a.should == [[1,2]]
def r; return 1, 2, 3; end; *a = r(); a.should == [[1, 2, 3]]
end
it "assigns objects to splatted block variables that include the splat operator inside the block" do

it "assigns to a block variable with splats on the LHS and RHS" do
def r; return *nil; end; *a = *r(); a.should == [nil]
def r; return *1; end; *a = *r(); a.should == [1]
def r; return *[]; end; *a = *r(); a.should == [nil]
Expand All @@ -67,10 +62,11 @@ def r; return *[nil]; end; *a = *r(); a.should == [nil]
def r; return *[[]]; end; *a = *r(); a.should == []
def r; return *[*[]]; end; *a = *r(); a.should == [nil]
def r; return *[*[1]]; end; *a = *r(); a.should == [1]
def r; return *[*[1,2]]; end; *a = *r(); a.should == [1,2]
def r; return *[*[1,2]]; end; *a = *r(); a.should == [1,2]
def r; return 1, 2, 3; end; *a = *r(); a.should == [1, 2, 3]
end
it "assigns objects to multiple block variables" do

it "assigns to multiple block variables" do
def r; return; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return nil; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return 1; end; a,b,*c = r(); [a,b,c].should == [1,nil,[]]
Expand All @@ -81,9 +77,10 @@ def r; return [[]]; end; a,b,*c = r(); [a,b,c].should == [[],nil,[]]
def r; return [*[]]; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return [*[1]]; end; a,b,*c = r(); [a,b,c].should == [1,nil,[]]
def r; return [*[1,2]]; end; a,b,*c = r(); [a,b,c].should == [1,2,[]]
def r; return 1, 2, 3; end; a,*c = r(); [a, c].should == [1, [2,3]]
end
it "assigns splatted objects to multiple block variables" do

it "assigns to multiple block variables with a splatted value" do
def r; return *nil; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return *1; end; a,b,*c = r(); [a,b,c].should == [1,nil,[]]
def r; return *[]; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
Expand All @@ -92,7 +89,11 @@ def r; return *[nil]; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return *[[]]; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return *[*[]]; end; a,b,*c = r(); [a,b,c].should == [nil,nil,[]]
def r; return *[*[1]]; end; a,b,*c = r(); [a,b,c].should == [1,nil,[]]
def r; return *[*[1,2]]; end; a,b,*c = r(); [a,b,c].should == [1,2,[]]
def r; return *[*[1,2]]; end; a,b,*c = r(); [a,b,c].should == [1,2,[]]
end

it "raises a ThreadError if used to exit a thread" do
lambda { Thread.new { return }.join }.should raise_error(ThreadError)
end
end

Expand Down Expand Up @@ -143,7 +144,7 @@ def f(a)
ensure
a << 2
return 2
end
end
ensure
a << 1
return 1
Expand All @@ -155,12 +156,24 @@ def f(a)
end
end

describe "Executing return from within a block" do
describe "Return from within a block" do
it "raises a LocalJumpError if there is no lexicaly enclosing method" do
def f; yield end
lambda { f { return 5 } }.should raise_error(LocalJumpError)
end

it "causes lambda to return nil if invoked without any arguments" do
lambda { return; 456 }.call.should be_nil
end

it "causes lambda to return nil if invoked with an empty expression" do
lambda { return (); 456 }.call.should be_nil
end

it "causes lambda to return the value passed to return" do
lambda { return 123; 456 }.call.should == 123
end

it "causes the method that lexically encloses the block to return" do
def meth_with_yield
yield
Expand Down Expand Up @@ -199,11 +212,6 @@ def self.enclosing_method

ChainedReturnTest.enclosing_method.should == :return_value
end
end

describe "The return statement" do
it "raises a ThreadError if used to exit a thread" do
lambda { Thread.new { return }.join }.should raise_error(ThreadError)
end
end

11 changes: 5 additions & 6 deletions spec/tags/frozen/1.8/language/return_tags.txt
@@ -1,6 +1,5 @@
fails:Executing return from within a block raises a LocalJumpError
fails:Executing return from within a block causes the method calling the method that yields to the block to return
fails:Assignment via return assigns objects to block variables
fails:Assignment via return assigns objects to splatted block variables that include the splat operator inside the block
fails:Assignment via return assigns splatted objects to block variables
fails:Assignment via return assigns splatted objects to multiple block variables
fails:The return keyword assigns splatted objects to block variables
fails:The return keyword assigns to a block variable with a splat on the LHS
fails:The return keyword assigns to a block variable with splats on the LHS and RHS
fails:The return keyword assigns to multiple block variables with a splatted value
fails:Return from within a block raises a LocalJumpError if there is no lexicaly enclosing method

0 comments on commit bad4f57

Please sign in to comment.