mspec 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,24 +5,27 @@ require 'mspec/mocks/mock'
5
5
  require 'mspec/runner/example'
6
6
 
7
7
  describe ExampleState do
8
- it "is initialized with the describe and it strings" do
9
- ExampleState.new("This", "does").should be_kind_of(ExampleState)
8
+ it "is initialized with the ContextState, #it string, and #it block" do
9
+ prc = lambda { }
10
+ context = ContextState.new ""
11
+ ExampleState.new(context, "does", prc).should be_kind_of(ExampleState)
10
12
  end
11
13
  end
12
14
 
13
15
  describe ExampleState, "#describe" do
14
16
  before :each do
15
- @state = ExampleState.new("describe", "it")
17
+ @context = ContextState.new Object, "#to_s"
18
+ @state = ExampleState.new @context, "it"
16
19
  end
17
20
 
18
- it "returns the arguments to the #describe block stringified and concatenated" do
19
- @state.describe.should == "describe"
21
+ it "returns the ContextState#description" do
22
+ @state.describe.should == @context.description
20
23
  end
21
24
  end
22
25
 
23
26
  describe ExampleState, "#it" do
24
27
  before :each do
25
- @state = ExampleState.new("describe", "it")
28
+ @state = ExampleState.new ContextState.new("describe"), "it"
26
29
  end
27
30
 
28
31
  it "returns the argument to the #it block" do
@@ -30,67 +33,80 @@ describe ExampleState, "#it" do
30
33
  end
31
34
  end
32
35
 
33
- describe ExampleState, "#unfiltered?" do
36
+ describe ExampleState, "#context=" do
37
+ before :each do
38
+ @state = ExampleState.new ContextState.new("describe"), "it"
39
+ @context = ContextState.new "New#context"
40
+ end
41
+
42
+ it "sets the containing ContextState" do
43
+ @state.context = @context
44
+ @state.context.should == @context
45
+ end
46
+
47
+ it "resets the description" do
48
+ @state.description.should == "describe it"
49
+ @state.context = @context
50
+ @state.description.should == "New#context it"
51
+ end
52
+ end
53
+
54
+ describe ExampleState, "#example" do
55
+ before :each do
56
+ @proc = lambda { }
57
+ @state = ExampleState.new ContextState.new("describe"), "it", @proc
58
+ end
59
+
60
+ it "returns the #it block" do
61
+ @state.example.should == @proc
62
+ end
63
+ end
64
+
65
+ describe ExampleState, "#filtered?" do
34
66
  before :each do
35
67
  MSpec.store :include, nil
36
68
  MSpec.store :exclude, nil
37
69
 
38
- @state = ExampleState.new("describe", "it")
70
+ @state = ExampleState.new ContextState.new("describe"), "it"
39
71
  @filter = mock("filter")
40
72
  end
41
73
 
42
- it "returns true if MSpec include filters list is empty" do
43
- @state.unfiltered?.should == true
74
+ it "returns false if MSpec include filters list is empty" do
75
+ @state.filtered?.should == false
44
76
  end
45
77
 
46
- it "returns true if MSpec include filters match this spec" do
78
+ it "returns false if MSpec include filters match this spec" do
47
79
  @filter.should_receive(:===).and_return(true)
48
80
  MSpec.register :include, @filter
49
- @state.unfiltered?.should == true
81
+ @state.filtered?.should == false
50
82
  end
51
83
 
52
- it "returns false if MSpec include filters do not match this spec" do
84
+ it "returns true if MSpec include filters do not match this spec" do
53
85
  @filter.should_receive(:===).and_return(false)
54
86
  MSpec.register :include, @filter
55
- @state.unfiltered?.should == false
87
+ @state.filtered?.should == true
56
88
  end
57
89
 
58
- it "returns true if MSpec exclude filters list is empty" do
59
- @state.unfiltered?.should == true
90
+ it "returns false if MSpec exclude filters list is empty" do
91
+ @state.filtered?.should == false
60
92
  end
61
93
 
62
- it "returns true if MSpec exclude filters do not match this spec" do
94
+ it "returns false if MSpec exclude filters do not match this spec" do
63
95
  @filter.should_receive(:===).and_return(false)
64
96
  MSpec.register :exclude, @filter
65
- @state.unfiltered?.should == true
97
+ @state.filtered?.should == false
66
98
  end
67
99
 
68
- it "returns false if MSpec exclude filters match this spec" do
100
+ it "returns true if MSpec exclude filters match this spec" do
69
101
  @filter.should_receive(:===).and_return(true)
70
102
  MSpec.register :exclude, @filter
71
- @state.unfiltered?.should == false
103
+ @state.filtered?.should == true
72
104
  end
73
105
 
74
- it "returns false if MSpec include and exclude filters match this spec" do
106
+ it "returns true if MSpec include and exclude filters match this spec" do
75
107
  @filter.should_receive(:===).twice.and_return(true)
76
108
  MSpec.register :include, @filter
77
109
  MSpec.register :exclude, @filter
78
- @state.unfiltered?.should == false
79
- end
80
- end
81
-
82
- describe ExampleState, "#filtered?" do
83
- before :each do
84
- @state = ExampleState.new("describe", "it")
85
- end
86
-
87
- it "returns true if #unfiltered returns false" do
88
- @state.should_receive(:unfiltered?).and_return(false)
89
110
  @state.filtered?.should == true
90
111
  end
91
-
92
- it "returns false if #unfiltered returns true" do
93
- @state.should_receive(:unfiltered?).and_return(true)
94
- @state.filtered?.should == false
95
- end
96
112
  end
@@ -5,7 +5,8 @@ require 'mspec/runner/exception'
5
5
 
6
6
  describe ExceptionState, "#initialize" do
7
7
  it "takes a state, location (e.g. before :each), and exception" do
8
- state = ExampleState.new "Class#method", "does something"
8
+ context = ContextState.new "Class#method"
9
+ state = ExampleState.new context, "does something"
9
10
  exc = Exception.new "Fail!"
10
11
  ExceptionState.new(state, "location", exc).should be_kind_of(ExceptionState)
11
12
  end
@@ -13,7 +14,8 @@ end
13
14
 
14
15
  describe ExceptionState, "#description" do
15
16
  before :each do
16
- @state = ExampleState.new "Class#method", "does something"
17
+ context = ContextState.new "Class#method"
18
+ @state = ExampleState.new context, "does something"
17
19
  end
18
20
 
19
21
  it "returns the state description if state was not nil" do
@@ -34,7 +36,8 @@ end
34
36
 
35
37
  describe ExceptionState, "#describe" do
36
38
  before :each do
37
- @state = ExampleState.new "Class#method", "does something"
39
+ context = ContextState.new "Class#method"
40
+ @state = ExampleState.new context, "does something"
38
41
  end
39
42
 
40
43
  it "returns the ExampleState#describe string if created with a non-nil state" do
@@ -48,7 +51,8 @@ end
48
51
 
49
52
  describe ExceptionState, "#it" do
50
53
  before :each do
51
- @state = ExampleState.new "Class#method", "does something"
54
+ context = ContextState.new "Class#method"
55
+ @state = ExampleState.new context, "does something"
52
56
  end
53
57
 
54
58
  it "returns the ExampleState#it string if created with a non-nil state" do
@@ -62,7 +66,7 @@ end
62
66
 
63
67
  describe ExceptionState, "#failure?" do
64
68
  before :each do
65
- @state = ExampleState.new "C#m", "works"
69
+ @state = ExampleState.new ContextState.new("C#m"), "works"
66
70
  end
67
71
 
68
72
  it "returns true if the exception is an ExpectationNotMetError" do
@@ -145,7 +145,7 @@ end
145
145
 
146
146
  describe DottedFormatter, "#before" do
147
147
  before :each do
148
- @state = ExampleState.new("describe", "it")
148
+ @state = ExampleState.new ContextState.new("describe"), "it"
149
149
  @formatter = DottedFormatter.new
150
150
  @formatter.exception ExceptionState.new(nil, nil, ExpectationNotMetError.new("Failed!"))
151
151
  end
@@ -167,7 +167,7 @@ describe DottedFormatter, "#after" do
167
167
  before :each do
168
168
  $stdout = @out = IOStub.new
169
169
  @formatter = DottedFormatter.new
170
- @state = ExampleState.new("describe", "it")
170
+ @state = ExampleState.new ContextState.new("describe"), "it"
171
171
  end
172
172
 
173
173
  after :each do
@@ -211,7 +211,8 @@ describe DottedFormatter, "#finish" do
211
211
  TimerAction.stub!(:new).and_return(@timer)
212
212
 
213
213
  $stdout = @out = IOStub.new
214
- @state = ExampleState.new("Class#method", "runs")
214
+ context = ContextState.new "Class#method"
215
+ @state = ExampleState.new(context, "runs")
215
216
  MSpec.stub!(:register)
216
217
  @formatter = DottedFormatter.new
217
218
  @formatter.register
@@ -95,7 +95,7 @@ describe HtmlFormatter, "#exception" do
95
95
  $stdout = @out = IOStub.new
96
96
  @formatter = HtmlFormatter.new
97
97
  @formatter.register
98
- @state = ExampleState.new("describe", "it")
98
+ @state = ExampleState.new ContextState.new("describe"), "it"
99
99
  end
100
100
 
101
101
  after :each do
@@ -119,7 +119,7 @@ describe HtmlFormatter, "#after" do
119
119
  $stdout = @out = IOStub.new
120
120
  @formatter = HtmlFormatter.new
121
121
  @formatter.register
122
- @state = ExampleState.new("describe", "it")
122
+ @state = ExampleState.new ContextState.new("describe"), "it"
123
123
  end
124
124
 
125
125
  after :each do
@@ -148,7 +148,8 @@ describe HtmlFormatter, "#finish" do
148
148
  TimerAction.stub!(:new).and_return(@timer)
149
149
 
150
150
  $stdout = @out = IOStub.new
151
- @state = ExampleState.new("describe", "it")
151
+ context = ContextState.new "describe"
152
+ @state = ExampleState.new(context, "it")
152
153
  MSpec.stub!(:register)
153
154
  @formatter = HtmlFormatter.new
154
155
  @formatter.register
@@ -34,7 +34,7 @@ describe SpecdocFormatter, "#before" do
34
34
  before :each do
35
35
  $stdout = @out = IOStub.new
36
36
  @formatter = SpecdocFormatter.new
37
- @state = ExampleState.new "describe", "it"
37
+ @state = ExampleState.new ContextState.new("describe"), "it"
38
38
  end
39
39
 
40
40
  after :each do
@@ -59,7 +59,8 @@ describe SpecdocFormatter, "#exception" do
59
59
  before :each do
60
60
  $stdout = @out = IOStub.new
61
61
  @formatter = SpecdocFormatter.new
62
- @state = ExampleState.new "describe", "it"
62
+ context = ContextState.new "describe"
63
+ @state = ExampleState.new context, "it"
63
64
  end
64
65
 
65
66
  after :each do
@@ -7,7 +7,8 @@ describe SummaryFormatter, "#after" do
7
7
  $stdout = @out = IOStub.new
8
8
  @formatter = SummaryFormatter.new
9
9
  @formatter.register
10
- @state = ExampleState.new("describe", "it")
10
+ context = ContextState.new "describe"
11
+ @state = ExampleState.new(context, "it")
11
12
  end
12
13
 
13
14
  after :each do
@@ -10,7 +10,8 @@ describe UnitdiffFormatter, "#finish" do
10
10
  TimerAction.stub!(:new).and_return(@timer)
11
11
 
12
12
  $stdout = @out = IOStub.new
13
- @state = ExampleState.new("describe", "it")
13
+ context = ContextState.new "describe"
14
+ @state = ExampleState.new(context, "it")
14
15
  MSpec.stub!(:register)
15
16
  @formatter = UnitdiffFormatter.new
16
17
  @formatter.register
@@ -57,7 +57,8 @@ describe YamlFormatter, "#finish" do
57
57
  TimerAction.stub!(:new).and_return(@timer)
58
58
 
59
59
  $stdout = IOStub.new
60
- @state = ExampleState.new("describe", "it")
60
+ context = ContextState.new "describe"
61
+ @state = ExampleState.new(context, "it")
61
62
 
62
63
  @formatter = YamlFormatter.new
63
64
  @formatter.stub!(:backtrace).and_return("")
@@ -87,11 +87,12 @@ end
87
87
 
88
88
  describe MSpec, ".protect" do
89
89
  before :each do
90
- MSpec.stack.clear
91
- @es = ExampleState.new "C#m", "runs"
92
- @cs = ContextState.new
90
+ MSpec.clear_current
91
+ @cs = ContextState.new "C#m"
93
92
  @cs.stub!(:state).and_return(@es)
94
- MSpec.stack.push @cs
93
+ @cs.parent = MSpec.current
94
+
95
+ @es = ExampleState.new @cs, "runs"
95
96
  ScratchPad.record Exception.new("Sharp!")
96
97
  end
97
98
 
@@ -107,6 +108,15 @@ describe MSpec, ".protect" do
107
108
  MSpec.protect("") { raise Exception, "Now you see me..." }
108
109
  end
109
110
 
111
+ it "does not rescue SystemExit" do
112
+ begin
113
+ MSpec.protect("") { exit 1 }
114
+ rescue SystemExit
115
+ ScratchPad.record :system_exit
116
+ end
117
+ ScratchPad.recorded.should == :system_exit
118
+ end
119
+
110
120
  it "calls all the exception actions" do
111
121
  exc = ExceptionState.new @es, "testing", ScratchPad.recorded
112
122
  ExceptionState.stub!(:new).and_return(exc)
@@ -123,18 +133,43 @@ describe MSpec, ".protect" do
123
133
  end
124
134
  end
125
135
 
126
- describe MSpec, ".stack" do
127
- it "returns an array" do
128
- MSpec.stack.should be_kind_of(Array)
136
+ describe MSpec, ".register_current" do
137
+ before :each do
138
+ MSpec.clear_current
139
+ end
140
+
141
+ it "sets the value returned by MSpec.current" do
142
+ MSpec.current.should be_nil
143
+ MSpec.register_current :a
144
+ MSpec.current.should == :a
145
+ end
146
+ end
147
+
148
+ describe MSpec, ".clear_current" do
149
+ it "sets the value returned by MSpec.current to nil" do
150
+ MSpec.register_current :a
151
+ MSpec.current.should_not be_nil
152
+ MSpec.clear_current
153
+ MSpec.current.should be_nil
129
154
  end
130
155
  end
131
156
 
132
157
  describe MSpec, ".current" do
133
- it "returns the top of the execution stack" do
134
- MSpec.stack.clear
135
- MSpec.stack.push :a
136
- MSpec.stack.push :b
137
- MSpec.current.should == :b
158
+ before :each do
159
+ MSpec.clear_current
160
+ end
161
+
162
+ it "returns nil if no ContextState has been registered" do
163
+ MSpec.current.should be_nil
164
+ end
165
+
166
+ it "returns the most recently registered ContextState" do
167
+ first = ContextState.new ""
168
+ second = ContextState.new ""
169
+ MSpec.register_current first
170
+ MSpec.current.should == first
171
+ MSpec.register_current second
172
+ MSpec.current.should == second
138
173
  end
139
174
  end
140
175
 
@@ -187,23 +222,32 @@ end
187
222
 
188
223
  describe MSpec, ".describe" do
189
224
  before :each do
190
- MSpec.stack.clear
225
+ MSpec.clear_current
226
+ @cs = ContextState.new ""
227
+ ContextState.stub!(:new).and_return(@cs)
228
+ MSpec.stub!(:current).and_return(nil)
229
+ MSpec.stub!(:register_current)
191
230
  end
192
231
 
193
- it "accepts one argument" do
194
- MSpec.describe(Object) { ScratchPad.record MSpec.current }
195
- ScratchPad.recorded.should be_kind_of(ContextState)
232
+ it "creates a new ContextState for the block" do
233
+ ContextState.should_receive(:new).and_return(@cs)
234
+ MSpec.describe(Object) { }
196
235
  end
197
236
 
198
- it "pushes a new ContextState instance on the stack" do
199
- MSpec.describe(Object, "msg") { ScratchPad.record MSpec.current }
200
- ScratchPad.recorded.should be_kind_of(ContextState)
237
+ it "accepts an optional second argument" do
238
+ ContextState.should_receive(:new).and_return(@cs)
239
+ MSpec.describe(Object, "msg") { }
201
240
  end
202
241
 
203
- it "pops the ContextState instance off the stack when finished" do
204
- MSpec.describe(Object, "msg") { ScratchPad.record MSpec.current }
205
- ScratchPad.recorded.should be_kind_of(ContextState)
206
- MSpec.stack.should == []
242
+ it "registers the newly created ContextState" do
243
+ MSpec.should_receive(:register_current).with(@cs).twice
244
+ MSpec.describe(Object) { }
245
+ end
246
+
247
+ it "invokes the ContextState#describe method" do
248
+ prc = lambda { }
249
+ @cs.should_receive(:describe).with(&prc)
250
+ MSpec.describe(Object, "msg", &prc)
207
251
  end
208
252
  end
209
253
 
@@ -419,3 +463,23 @@ describe MSpec, ".clear_expectations" do
419
463
  MSpec.expectation?.should be_false
420
464
  end
421
465
  end
466
+
467
+ describe MSpec, ".register_shared" do
468
+ it "stores a shared ContextState by description" do
469
+ parent = ContextState.new "container"
470
+ state = ContextState.new "shared"
471
+ state.parent = parent
472
+ prc = lambda { }
473
+ state.describe(&prc)
474
+ MSpec.register_shared(state)
475
+ MSpec.retrieve(:shared)["shared"].should == state
476
+ end
477
+ end
478
+
479
+ describe MSpec, ".retrieve_shared" do
480
+ it "retrieves the shared ContextState matching description" do
481
+ state = ContextState.new ""
482
+ MSpec.retrieve(:shared)["shared"] = state
483
+ MSpec.retrieve_shared(:shared).should == state
484
+ end
485
+ end