Updated RubySpec source to 55122684.
[rbx.git] / spec / frozen / 1.8 / language / next_spec.rb
blobfe8bdc6f540dfb6b87b2779484c7aeac6f718416
1 require File.dirname(__FILE__) + '/../spec_helper'
3 class NextSpecs
4   def self.yielding_method(expected)
5     yield.should == expected
6     :method_return_value
7   end
8 end
10 describe "The next statement" do
11   it "raises a LocalJumpError if used not within block or while/for loop" do
12     def bad_meth; next; end
13     lambda { bad_meth }.should raise_error(LocalJumpError)
14   end
15 end
17 describe "The next statement from within the block" do
18   it "ends block execution" do
19     a = []
20     lambda {
21       a << 1
22       next
23       a << 2
24     }.call
25     a.should == [1]
26   end
28   it "causes block to return nil if invoked without arguments" do
29     lambda { 123; next; 456 }.call.should == nil
30   end
32   it "returns the argument passed" do
33     lambda { 123; next 234; 345 }.call.should == 234
34   end
36   it "returns to the invoking method" do
37     NextSpecs.yielding_method(nil) { next }.should == :method_return_value
38   end
40   it "returns to the invoking method, with the specified value" do
41     NextSpecs.yielding_method(nil) {
42       next nil;
43       fail("next didn't end the block execution")
44     }.should == :method_return_value
46     NextSpecs.yielding_method(1) {
47       next 1
48       fail("next didn't end the block execution")
49     }.should == :method_return_value
51     NextSpecs.yielding_method([1, 2, 3]) {
52       next 1, 2, 3
53       fail("next didn't end the block execution")
54     }.should == :method_return_value
55   end
57   it "returns to the currently yielding method in case of chained calls" do
58     class ChainedNextTest
59       def self.meth_with_yield(&b)
60         yield.should == :next_return_value
61         :method_return_value
62       end
63       def self.invoking_method(&b)
64         meth_with_yield(&b)
65       end
66       def self.enclosing_method
67         invoking_method do
68           next :next_return_value
69           :wrong_return_value
70         end
71       end
72     end
74     ChainedNextTest.enclosing_method.should == :method_return_value
75   end
77 end
79 describe "Assignment via next" do
80   it "assigns objects" do
81     def r(val); a = yield(); val.should == a; end
82     r(nil){next}
83     r(nil){next nil}
84     r(1){next 1}
85     r([]){next []}
86     r([1]){next [1]}
87     r([nil]){next [nil]}
88     r([[]]){next [[]]}
89     r([]){next [*[]]}
90     r([1]){next [*[1]]}
91     r([1,2]){next [*[1,2]]}
92   end
93   
94   it "assigns splatted objects" do
95     def r(val); a = yield(); val.should == a; end
96     r(nil){next *nil}
97     r(1){next *1}
98     r(nil){next *[]}
99     r(1){next *[1]}
100     r(nil){next *[nil]}
101     r([]){next *[[]]}
102     r(nil){next *[*[]]}
103     r(1){next *[*[1]]}
104     r([1,2]){next *[*[1,2]]}
105   end
106   
107   it "assigns objects to a splatted reference" do
108     def r(val); *a = yield(); val.should == a; end
109     r([nil]){next}
110     r([nil]){next nil}
111     r([1]){next 1}
112     r([[]]){next []}
113     r([[1]]){next [1]}
114     r([[nil]]){next [nil]}
115     r([[[]]]){next [[]]}
116     r([[1,2]]){next [1,2]}
117     r([[]]){next [*[]]}
118     r([[1]]){next [*[1]]}
119     r([[1,2]]){next [*[1,2]]}
120   end
121   
122   it "assigns splatted objects to a splatted reference via a splatted yield" do
123     def r(val); *a = *yield(); val.should == a; end
124     r([nil]){next *nil}
125     r([1]){next *1}
126     r([nil]){next *[]}
127     r([1]){next *[1]}
128     r([nil]){next *[nil]}
129     r([]){next *[[]]}
130     r([1,2]){next *[1,2]}
131     r([nil]){next *[*[]]}
132     r([1]){next *[*[1]]}
133     r([1,2]){next *[*[1,2]]}
134   end
135   
136   it "assigns objects to multiple variables" do
137     def r(val); a,b,*c = yield(); val.should == [a,b,c]; end
138     r([nil,nil,[]]){next}
139     r([nil,nil,[]]){next nil}
140     r([1,nil,[]]){next 1}
141     r([nil,nil,[]]){next []}
142     r([1,nil,[]]){next [1]}
143     r([nil,nil,[]]){next [nil]}
144     r([[],nil,[]]){next [[]]}
145     r([1,2,[]]){next [1,2]}
146     r([nil,nil,[]]){next [*[]]}
147     r([1,nil,[]]){next [*[1]]}
148     r([1,2,[]]){next [*[1,2]]}
149   end
151   it "assigns splatted objects to multiple variables" do
152    def r(val); a,b,*c = *yield(); val.should == [a,b,c]; end
153    r([nil,nil,[]]){next *nil}
154    r([1,nil,[]]){next *1}
155    r([nil,nil,[]]){next *[]}
156    r([1,nil,[]]){next *[1]}
157    r([nil,nil,[]]){next *[nil]}
158    r([nil,nil,[]]){next *[[]]}
159    r([1,2,[]]){next *[1,2]}
160    r([nil,nil,[]]){next *[*[]]}
161    r([1,nil,[]]){next *[*[1]]}
162    r([1,2,[]]){next *[*[1,2]]}
163  end