Updated to latest rspec
[gitorious:georgyos-clone.git] / vendor / plugins / rspec / spec / spec / story / step_spec.rb
1 require File.dirname(__FILE__) + '/story_helper'
2
3 module Spec
4   module Story
5     describe Step, "matching" do
6       it "should match a text string" do
7         step = Step.new("this text") {}
8         step.matches?("this text").should be_true
9       end
10       
11       it "should not match a text string that does not start the same" do
12         step = Step.new("this text") {}
13         step.matches?("Xthis text").should be_false
14       end
15       
16       it "should not match a text string that does not end the same" do
17         step = Step.new("this text") {}
18         step.matches?("this textX").should be_false
19       end
20       
21       it "should match a text string with a param" do
22         step = Step.new("this $param text") {}
23         step.matches?("this anything text").should be_true
24       end
25       
26       it "should not be greedy" do
27         step = Step.new("enter $value for $key") {}
28         step.parse_args("enter 3 for keys for a piano").should == ['3','keys for a piano']
29       end
30       
31       it "should match a text string with 3 params" do
32         step = Step.new("1 $one 2 $two 3 $three 4") {}
33         step.matches?("1 a 2 b 3 c 4").should be_true
34       end
35       
36       it "should match a text string with a param at the beginning" do
37         step = Step.new("$one 2 3") {}
38         step.matches?("a 2 3").should be_true
39       end
40       
41       it "should match a text string with a param at the end" do
42         step = Step.new("1 2 $three") {}
43         step.matches?("1 2 c").should be_true
44       end
45
46       it "should match a text string with a dollar sign ($)" do
47         step = Step.new("show me the $$money") {}
48         step.matches?("show me the $kwan").should be_true
49       end
50
51       it "should match a string with an escaped dollar sign" do
52         step = Step.new("show me the \$money") {}
53         step.matches?("show me the $kwan").should be_true
54       end
55       
56       it "should not match a different string" do
57         step = Step.new("this text") {}
58         step.matches?("other text").should be_false
59       end
60
61       it "should match a regexp" do
62         step = Step.new(/this text/) {}
63         step.matches?("this text").should be_true
64       end
65       
66       it "should match a regexp with a match group" do
67         step = Step.new(/this (.*) text/) {}
68         step.matches?("this anything text").should be_true
69       end
70       
71       it "should match a regexp with a named variable" do
72         step = Step.new(/this $variable text/) {}
73         step.matches?("this anything text").should be_true
74       end
75       
76       it "should not match a non matching regexp" do
77         step = Step.new(/this (.*) text/) {}
78         step.matches?("other anything text").should be_false
79       end
80       
81       it "should not match a non matching regexp with a named variable" do
82         step = Step.new(/this $variable text/) {}
83         step.matches?("other anything text").should be_false
84       end
85       
86       it "should not get bogged down by parens in strings" do
87         step = Step.new("before () after") {}
88         step.matches?("before () after").should be_true
89       end
90       
91       it "should not get bogged down by regular expression special characters in strings" do
92         step = Step.new("These characters should work ? ( ) [ ] { } ^ !") {}
93         step.matches?("These characters should work ? ( ) [ ] { } ^ !").should be_true
94       end
95       
96       it "should match any option of an alteration" do
97         step = Step.new(/(he|she) is cool/) {}
98         step.matches?("he is cool").should be_true
99         step.matches?("she is cool").should be_true
100       end
101       
102       it "should match alteration as well as a variable" do
103         step = Step.new(/(he|she) is (.*)/) {}
104         step.matches?("he is cool").should be_true
105         step.parse_args("he is cool").should == ['he', 'cool']
106       end
107       
108       it "should match alteration as well as a named variable" do
109         step = Step.new(/(he|she) is $adjective/) {}
110         step.matches?("he is cool").should be_true
111         step.parse_args("he is cool").should == ['he', 'cool']
112       end
113       
114       it "should match alteration as well as a anonymous and named variable" do
115         step = Step.new(/(he|she) is (.*?) $adjective/) {}
116         step.matches?("he is very cool").should be_true
117         step.parse_args("he is very cool").should == ['he', 'very', 'cool']
118       end
119
120       it "should match a regex with a dollar sign ($)" do
121         step = Step.new(/show me the \$\d+/) {}
122         step.matches?("show me the $123").should be_true
123       end
124
125       it "should match a regex with a dollar sign and named variable" do
126         step = Step.new(/show me the \$$money/) {}
127         step.matches?("show me the $123").should be_true
128       end
129       
130       it "should match a multiline regex" do
131         step = Step.new(/.* should have text.$text/) {}
132         step.matches?(<<TEXT).should be_true
133           should have text
134           this is the text
135           and so is this
136 TEXT
137       end
138       
139       it "should match the beginning of the string, not the line" do
140         step = Step.new(/should have text/) {}
141         step.matches?(<<TEXT).should be_false
142 whatever
143 should have text
144 TEXT
145       end
146
147       it "should match the end of the string, not the line" do
148         step = Step.new(/should have text/) {}
149         step.matches?(<<TEXT).should be_false
150 should have text
151 whatever
152 TEXT
153       end
154     end
155     
156     describe Step do
157       it "should be pending with no block" do
158         step = Step.new("foo")
159         lambda {
160           step.perform(Object.new)
161         }.should raise_error(Spec::Example::ExamplePendingError, "Not Yet Implemented")
162       end
163       
164       it "should perform itself on an object" do
165         # given
166         $instance = nil
167         step = Step.new 'step' do
168           $instance = self
169         end
170         instance = Object.new
171         
172         # when
173         step.perform(instance, "step")
174         
175         # then
176         $instance.should == instance
177       end
178       
179       it "should perform itself with one parameter with match expression" do
180         # given
181         $result = nil
182         step = Step.new 'an account with $count dollars' do |count|
183           $result = count
184         end
185         instance = Object.new
186         
187         # when
188         args = step.parse_args("an account with 3 dollars")
189         step.perform(instance, *args)
190         
191         # then
192         $result.should == "3"
193       end
194       
195       it "should perform itself with one parameter without a match expression" do
196         # given
197         $result = nil
198         step = Step.new 'an account with a balance of' do |amount|
199           $result = amount
200         end
201         instance = Object.new
202         
203         # when
204         step.perform(instance, 20)
205         
206         # then
207         $result.should == 20
208       end
209       
210       it "should perform itself with 2 parameters" do
211         # given
212         $account_type = nil
213         $amount = nil
214         step = Step.new 'a $account_type account with $amount dollars' do |account_type, amount|
215           $account_type = account_type
216           $amount = amount
217         end
218         instance = Object.new
219         
220         # when
221         args = step.parse_args("a savings account with 3 dollars")
222         step.perform(instance, *args)
223         
224         # then
225         $account_type.should == "savings"
226         $amount.should == "3"
227       end
228
229       it "should perform itself when defined with a regexp with 2 parameters" do
230         # given
231         $pronoun = nil
232         $adjective = nil
233         step = Step.new /(he|she) is (.*)/ do |pronoun, adjective|
234           $pronoun = pronoun
235           $adjective = adjective
236         end
237         instance = Object.new
238         
239         # when
240         args = step.parse_args("he is cool")
241         step.perform(instance, *args)
242         
243         # then
244         $pronoun.should == "he"
245         $adjective.should == "cool"
246       end
247
248     end
249   end
250 end