rspec 0.9.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +24 -0
- data/EXAMPLES.rd +6 -2
- data/README +9 -9
- data/Rakefile +32 -29
- data/examples/not_yet_implemented_spec.rb +12 -0
- data/examples/shared_behaviours_example.rb +8 -0
- data/examples/stack_spec.rb +1 -0
- data/lib/spec/dsl/behaviour.rb +21 -6
- data/lib/spec/dsl/behaviour_callbacks.rb +44 -26
- data/lib/spec/dsl/behaviour_eval.rb +21 -12
- data/lib/spec/dsl/behaviour_factory.rb +23 -13
- data/lib/spec/dsl/configuration.rb +85 -5
- data/lib/spec/dsl/description.rb +14 -6
- data/lib/spec/dsl/example.rb +2 -2
- data/lib/spec/matchers.rb +5 -5
- data/lib/spec/matchers/be.rb +16 -0
- data/lib/spec/matchers/operator_matcher.rb +21 -1
- data/lib/spec/matchers/raise_error.rb +1 -1
- data/lib/spec/rake/verify_rcov.rb +5 -1
- data/lib/spec/runner.rb +7 -27
- data/lib/spec/runner/behaviour_runner.rb +1 -1
- data/lib/spec/runner/extensions/kernel.rb +20 -0
- data/lib/spec/runner/formatter/base_formatter.rb +6 -1
- data/lib/spec/runner/formatter/base_text_formatter.rb +10 -2
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +1 -1
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +1 -1
- data/lib/spec/runner/formatter/html_formatter.rb +63 -31
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +5 -0
- data/lib/spec/runner/formatter/rdoc_formatter.rb +4 -0
- data/lib/spec/runner/formatter/specdoc_formatter.rb +6 -1
- data/lib/spec/runner/option_parser.rb +1 -1
- data/lib/spec/runner/reporter.rb +13 -4
- data/lib/spec/runner/spec_parser.rb +1 -1
- data/lib/spec/version.rb +5 -5
- data/spec/spec/dsl/behaviour_spec.rb +88 -24
- data/spec/spec/dsl/configuration_spec.rb +8 -1
- data/spec/spec/dsl/example_class_spec.rb +1 -1
- data/spec/spec/dsl/example_instance_spec.rb +5 -5
- data/spec/spec/dsl/shared_behaviour_spec.rb +24 -2
- data/spec/spec/matchers/be_spec.rb +20 -2
- data/spec/spec/matchers/operator_matcher_spec.rb +158 -0
- data/spec/spec/runner/command_line_spec.rb +5 -4
- data/spec/spec/runner/drb_command_line_spec.rb +15 -8
- data/spec/spec/runner/formatter/html_formatter_spec.rb +22 -5
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +7 -2
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +1 -1
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +6 -1
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +1 -1
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +15 -5
- data/spec/spec/runner/option_parser_spec.rb +5 -0
- data/spec/spec/runner/reporter_spec.rb +23 -5
- data/spec/spec/runner/spec_matcher_spec.rb +1 -1
- data/spec/spec/runner/spec_parser_spec.rb +1 -1
- data/spec/spec_helper.rb +38 -2
- metadata +41 -42
- data/spec/spec/matchers/should_===_spec.rb +0 -38
- data/spec/spec/matchers/should_==_spec.rb +0 -37
- data/spec/spec/matchers/should_=~_spec.rb +0 -36
@@ -70,6 +70,14 @@ module Spec
|
|
70
70
|
@output.flush
|
71
71
|
end
|
72
72
|
|
73
|
+
def example_not_implemented(name)
|
74
|
+
@current_example_number += 1
|
75
|
+
@output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>"
|
76
|
+
@output.puts " <script type=\"text/javascript\">makeYellow('behaviour_#{current_behaviour_number}');</script>"
|
77
|
+
move_progress
|
78
|
+
@output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{escape(name)}</span></dd>"
|
79
|
+
@output.flush
|
80
|
+
end
|
73
81
|
# Override this method if you wish to output extra HTML for a failed spec. For example, you
|
74
82
|
# could output links to images or other files produced during the specs.
|
75
83
|
#
|
@@ -90,11 +98,12 @@ module Spec
|
|
90
98
|
def dump_failure(counter, failure)
|
91
99
|
end
|
92
100
|
|
93
|
-
def dump_summary(duration, example_count, failure_count)
|
101
|
+
def dump_summary(duration, example_count, failure_count, not_implemented_count)
|
94
102
|
if @dry_run
|
95
103
|
totals = "This was a dry-run"
|
96
104
|
else
|
97
105
|
totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
|
106
|
+
totals << ", #{not_implemented_count} not implemented" if not_implemented_count > 0
|
98
107
|
end
|
99
108
|
@output.puts "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{duration} seconds</strong>\";</script>"
|
100
109
|
@output.puts "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{totals}\";</script>"
|
@@ -120,8 +129,10 @@ module Spec
|
|
120
129
|
<meta http-equiv="Pragma" content="no-cache" />
|
121
130
|
<style type="text/css">
|
122
131
|
body {
|
123
|
-
margin: 0;
|
132
|
+
margin: 0;
|
133
|
+
padding: 0;
|
124
134
|
background: #fff;
|
135
|
+
font-size: 80%;
|
125
136
|
}
|
126
137
|
</style>
|
127
138
|
</head>
|
@@ -161,7 +172,21 @@ function moveProgressBar(percentDone) {
|
|
161
172
|
}
|
162
173
|
function makeRed(element_id) {
|
163
174
|
document.getElementById(element_id).style.background = '#C40D0D';
|
164
|
-
|
175
|
+
document.getElementById(element_id).style.color = '#FFFFFF';
|
176
|
+
}
|
177
|
+
|
178
|
+
function makeYellow(element_id) {
|
179
|
+
if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D')
|
180
|
+
{
|
181
|
+
document.getElementById(element_id).style.background = '#FAF834';
|
182
|
+
document.getElementById(element_id).style.color = '#000000';
|
183
|
+
}
|
184
|
+
else
|
185
|
+
{
|
186
|
+
document.getElementById(element_id).style.background = '#FAF834';
|
187
|
+
document.getElementById(element_id).style.color = '#000000';
|
188
|
+
}
|
189
|
+
}
|
165
190
|
EOF
|
166
191
|
end
|
167
192
|
|
@@ -171,15 +196,16 @@ EOF
|
|
171
196
|
background: #65C400; color: #fff;
|
172
197
|
}
|
173
198
|
|
174
|
-
|
199
|
+
.rspec-report h1 {
|
175
200
|
margin: 0px 10px 0px 10px;
|
176
201
|
padding: 10px;
|
177
|
-
font:
|
202
|
+
font-family: "Lucida Grande", Helvetica, sans-serif;
|
203
|
+
font-size: 1.8em;
|
178
204
|
}
|
179
205
|
|
180
206
|
#summary {
|
181
207
|
margin: 0; padding: 5px 10px;
|
182
|
-
font:
|
208
|
+
font-family: "Lucida Grande", Helvetica, sans-serif;
|
183
209
|
text-align: right;
|
184
210
|
position: absolute;
|
185
211
|
top: 0px;
|
@@ -187,11 +213,11 @@ div.rspec-report h1 {
|
|
187
213
|
}
|
188
214
|
|
189
215
|
#summary p {
|
190
|
-
margin: 0 0 2px;
|
216
|
+
margin: 0 0 0 2px;
|
191
217
|
}
|
192
218
|
|
193
219
|
#summary #totals {
|
194
|
-
font-size:
|
220
|
+
font-size: 1.2em;
|
195
221
|
}
|
196
222
|
|
197
223
|
.behaviour {
|
@@ -228,7 +254,13 @@ dd.spec.failed {
|
|
228
254
|
color: #C20000; background: #FFFBD3;
|
229
255
|
}
|
230
256
|
|
231
|
-
|
257
|
+
dd.spec.not_implemented {
|
258
|
+
border-left: 5px solid #FAF834;
|
259
|
+
border-bottom: 1px solid #FAF834;
|
260
|
+
background: #FCFB98; color: #131313;
|
261
|
+
}
|
262
|
+
|
263
|
+
.backtrace {
|
232
264
|
color: #000;
|
233
265
|
font-size: 12px;
|
234
266
|
}
|
@@ -238,7 +270,7 @@ a {
|
|
238
270
|
}
|
239
271
|
|
240
272
|
/* Ruby code, style similar to vibrant ink */
|
241
|
-
|
273
|
+
.ruby {
|
242
274
|
font-size: 12px;
|
243
275
|
font-family: monospace;
|
244
276
|
color: white;
|
@@ -246,27 +278,27 @@ pre.ruby {
|
|
246
278
|
padding: 0.1em 0 0.2em 0;
|
247
279
|
}
|
248
280
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
281
|
+
.ruby .keyword { color: #FF6600; }
|
282
|
+
.ruby .constant { color: #339999; }
|
283
|
+
.ruby .attribute { color: white; }
|
284
|
+
.ruby .global { color: white; }
|
285
|
+
.ruby .module { color: white; }
|
286
|
+
.ruby .class { color: white; }
|
287
|
+
.ruby .string { color: #66FF00; }
|
288
|
+
.ruby .ident { color: white; }
|
289
|
+
.ruby .method { color: #FFCC00; }
|
290
|
+
.ruby .number { color: white; }
|
291
|
+
.ruby .char { color: white; }
|
292
|
+
.ruby .comment { color: #9933CC; }
|
293
|
+
.ruby .symbol { color: white; }
|
294
|
+
.ruby .regex { color: #44B4CC; }
|
295
|
+
.ruby .punct { color: white; }
|
296
|
+
.ruby .escape { color: white; }
|
297
|
+
.ruby .interp { color: white; }
|
298
|
+
.ruby .expr { color: white; }
|
299
|
+
|
300
|
+
.ruby .offending { background-color: gray; }
|
301
|
+
.ruby .linenum {
|
270
302
|
width: 75px;
|
271
303
|
padding: 0.1em 1em 0.2em 0;
|
272
304
|
color: #000000;
|
data/lib/spec/runner/reporter.rb
CHANGED
@@ -17,9 +17,12 @@ module Spec
|
|
17
17
|
@formatters.each{|f| f.example_started(name)}
|
18
18
|
end
|
19
19
|
|
20
|
-
def example_finished(name, error=nil, failure_location=nil)
|
20
|
+
def example_finished(name, error=nil, failure_location=nil, not_implemented = false)
|
21
21
|
@example_names << name
|
22
|
-
|
22
|
+
|
23
|
+
if not_implemented
|
24
|
+
example_not_implemented(name)
|
25
|
+
elsif error.nil?
|
23
26
|
example_passed(name)
|
24
27
|
else
|
25
28
|
example_failed(name, error, failure_location)
|
@@ -40,7 +43,7 @@ module Spec
|
|
40
43
|
def dump
|
41
44
|
@formatters.each{|f| f.start_dump}
|
42
45
|
dump_failures
|
43
|
-
@formatters.each{|f| f.dump_summary(duration, @example_names.length, @failures.length)}
|
46
|
+
@formatters.each{|f| f.dump_summary(duration, @example_names.length, @failures.length, @not_implemented_count)}
|
44
47
|
@failures.length
|
45
48
|
end
|
46
49
|
|
@@ -49,6 +52,7 @@ module Spec
|
|
49
52
|
def clear!
|
50
53
|
@behaviour_names = []
|
51
54
|
@failures = []
|
55
|
+
@not_implemented_count = 0
|
52
56
|
@example_names = []
|
53
57
|
@start_time = nil
|
54
58
|
@end_time = nil
|
@@ -66,7 +70,7 @@ module Spec
|
|
66
70
|
return @end_time - @start_time unless (@end_time.nil? or @start_time.nil?)
|
67
71
|
return "0.0"
|
68
72
|
end
|
69
|
-
|
73
|
+
|
70
74
|
def example_passed(name)
|
71
75
|
@formatters.each{|f| f.example_passed(name)}
|
72
76
|
end
|
@@ -79,6 +83,11 @@ module Spec
|
|
79
83
|
@formatters.each{|f| f.example_failed(name, @failures.length, failure)}
|
80
84
|
end
|
81
85
|
|
86
|
+
def example_not_implemented(name)
|
87
|
+
@not_implemented_count += 1
|
88
|
+
@formatters.each{|f| f.example_not_implemented(name)}
|
89
|
+
end
|
90
|
+
|
82
91
|
class Failure
|
83
92
|
attr_reader :exception
|
84
93
|
|
@@ -41,7 +41,7 @@ module Spec
|
|
41
41
|
def parse_description(str)
|
42
42
|
return str[1..-2] if str =~ /^['"].*['"]$/
|
43
43
|
if matches = /^(.*)\s*,\s*['"](.*)['"]$/.match(str)
|
44
|
-
return
|
44
|
+
return ::Spec::DSL::Description.generate_description(matches[1], matches[2])
|
45
45
|
end
|
46
46
|
return str
|
47
47
|
end
|
data/lib/spec/version.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Spec
|
2
2
|
module VERSION
|
3
3
|
unless defined? MAJOR
|
4
|
-
MAJOR =
|
5
|
-
MINOR =
|
6
|
-
TINY =
|
4
|
+
MAJOR = 1
|
5
|
+
MINOR = 0
|
6
|
+
TINY = 0
|
7
7
|
RELEASE_CANDIDATE = nil
|
8
8
|
|
9
|
-
# RANDOM_TOKEN: 0.
|
10
|
-
REV = "$LastChangedRevision:
|
9
|
+
# RANDOM_TOKEN: 0.805184248412641
|
10
|
+
REV = "$LastChangedRevision: 1986 $".match(/LastChangedRevision: (\d+)/)[1]
|
11
11
|
|
12
12
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
13
13
|
TAG = "REL_#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('_')}".upcase.gsub(/\.|-/, '_')
|
@@ -11,20 +11,12 @@ module Spec
|
|
11
11
|
|
12
12
|
describe Behaviour, "class methods" do
|
13
13
|
before :each do
|
14
|
-
@original_before_all_parts = Behaviour.before_all_parts.dup
|
15
|
-
@original_after_all_parts = Behaviour.after_all_parts.dup
|
16
|
-
@original_before_each_parts = Behaviour.before_each_parts.dup
|
17
|
-
@original_after_each_parts = Behaviour.after_each_parts.dup
|
18
|
-
|
19
14
|
@reporter = FakeReporter.new(mock("formatter", :null_object => true), mock("backtrace_tweaker", :null_object => true))
|
20
15
|
@behaviour = Behaviour.new("example") {}
|
21
16
|
end
|
22
17
|
|
23
18
|
after :each do
|
24
|
-
Behaviour.
|
25
|
-
Behaviour.instance_variable_set(:@after_all_parts, @original_after_all_parts)
|
26
|
-
Behaviour.instance_variable_set(:@before_each_parts, @original_before_each_parts)
|
27
|
-
Behaviour.instance_variable_set(:@after_each_parts, @original_after_each_parts)
|
19
|
+
Behaviour.clear_before_and_after!
|
28
20
|
end
|
29
21
|
|
30
22
|
it "should not run before(:all) or after(:all) on dry run" do
|
@@ -96,20 +88,12 @@ module Spec
|
|
96
88
|
|
97
89
|
describe Behaviour do
|
98
90
|
before :each do
|
99
|
-
@original_before_all_parts = Behaviour.before_all_parts.dup
|
100
|
-
@original_after_all_parts = Behaviour.after_all_parts.dup
|
101
|
-
@original_before_each_parts = Behaviour.before_each_parts.dup
|
102
|
-
@original_after_each_parts = Behaviour.after_each_parts.dup
|
103
|
-
|
104
91
|
@reporter = FakeReporter.new(mock("formatter", :null_object => true), mock("backtrace_tweaker", :null_object => true))
|
105
92
|
@behaviour = Behaviour.new("example") {}
|
106
93
|
end
|
107
94
|
|
108
95
|
after :each do
|
109
|
-
Behaviour.
|
110
|
-
Behaviour.instance_variable_set(:@after_all_parts, @original_after_all_parts)
|
111
|
-
Behaviour.instance_variable_set(:@before_each_parts, @original_before_each_parts)
|
112
|
-
Behaviour.instance_variable_set(:@after_each_parts, @original_after_each_parts)
|
96
|
+
Behaviour.clear_before_and_after!
|
113
97
|
end
|
114
98
|
|
115
99
|
it "should send reporter add_behaviour" do
|
@@ -255,6 +239,50 @@ module Spec
|
|
255
239
|
@behaviour.run(@reporter)
|
256
240
|
context_instance_value_in.should == context_instance_value_out
|
257
241
|
end
|
242
|
+
|
243
|
+
it "should not add global before callbacks for untargetted behaviours" do
|
244
|
+
fiddle = []
|
245
|
+
|
246
|
+
Behaviour.before(:all) { fiddle << "Behaviour.before(:all)" }
|
247
|
+
Behaviour.prepend_before(:all) { fiddle << "Behaviour.prepend_before(:all)" }
|
248
|
+
Behaviour.before(:each, :behaviour_type => :special) { fiddle << "Behaviour.before(:each, :behaviour_type => :special)" }
|
249
|
+
Behaviour.prepend_before(:each, :behaviour_type => :special) { fiddle << "Behaviour.prepend_before(:each, :behaviour_type => :special)" }
|
250
|
+
Behaviour.before(:all, :behaviour_type => :special) { fiddle << "Behaviour.before(:all, :behaviour_type => :special)" }
|
251
|
+
Behaviour.prepend_before(:all, :behaviour_type => :special) { fiddle << "Behaviour.prepend_before(:all, :behaviour_type => :special)" }
|
252
|
+
|
253
|
+
behaviour = Behaviour.new("I'm not special", :behaviour_type => :not_special) {}
|
254
|
+
behaviour.run(@reporter)
|
255
|
+
fiddle.should == [
|
256
|
+
'Behaviour.prepend_before(:all)',
|
257
|
+
'Behaviour.before(:all)',
|
258
|
+
]
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should add global before callbacks for targetted behaviours" do
|
262
|
+
fiddle = []
|
263
|
+
|
264
|
+
Behaviour.before(:all) { fiddle << "Behaviour.before(:all)" }
|
265
|
+
Behaviour.prepend_before(:all) { fiddle << "Behaviour.prepend_before(:all)" }
|
266
|
+
Behaviour.before(:each, :behaviour_type => :special) { fiddle << "Behaviour.before(:each, :behaviour_type => :special)" }
|
267
|
+
Behaviour.prepend_before(:each, :behaviour_type => :special) { fiddle << "Behaviour.prepend_before(:each, :behaviour_type => :special)" }
|
268
|
+
Behaviour.before(:all, :behaviour_type => :special) { fiddle << "Behaviour.before(:all, :behaviour_type => :special)" }
|
269
|
+
Behaviour.prepend_before(:all, :behaviour_type => :special) { fiddle << "Behaviour.prepend_before(:all, :behaviour_type => :special)" }
|
270
|
+
|
271
|
+
Behaviour.append_before(:behaviour_type => :special) { fiddle << "Behaviour.append_before(:each, :behaviour_type => :special)" }
|
272
|
+
|
273
|
+
behaviour = Behaviour.new("I'm not special", :behaviour_type => :special) {}
|
274
|
+
behaviour.it("test") {true}
|
275
|
+
behaviour.run(@reporter)
|
276
|
+
fiddle.should == [
|
277
|
+
'Behaviour.prepend_before(:all)',
|
278
|
+
'Behaviour.before(:all)',
|
279
|
+
'Behaviour.prepend_before(:all, :behaviour_type => :special)',
|
280
|
+
'Behaviour.before(:all, :behaviour_type => :special)',
|
281
|
+
'Behaviour.prepend_before(:each, :behaviour_type => :special)',
|
282
|
+
'Behaviour.before(:each, :behaviour_type => :special)',
|
283
|
+
'Behaviour.append_before(:each, :behaviour_type => :special)',
|
284
|
+
]
|
285
|
+
end
|
258
286
|
|
259
287
|
it "before callbacks are ordered from global to local" do
|
260
288
|
fiddle = []
|
@@ -399,14 +427,50 @@ module Spec
|
|
399
427
|
mod1_method_called.should be_true
|
400
428
|
mod2_method_called.should be_true
|
401
429
|
end
|
430
|
+
|
431
|
+
it "should not include untargeted modules" do
|
432
|
+
special_method_called = false
|
433
|
+
special_mod = Module.new do
|
434
|
+
define_method :special_method do
|
435
|
+
special_method_called = true
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
behaviour = Behaviour.new("I'm not special", :behaviour_type => :not_special) {}
|
440
|
+
behaviour.include special_mod, :behaviour_type => :special
|
441
|
+
behaviour.it "test" do
|
442
|
+
special_method
|
443
|
+
end
|
444
|
+
behaviour.run(@reporter)
|
445
|
+
|
446
|
+
special_method_called.should be_false
|
447
|
+
end
|
448
|
+
|
449
|
+
it "should include targeted modules" do
|
450
|
+
special_method_called = false
|
451
|
+
special_mod = Module.new do
|
452
|
+
define_method :special_method do
|
453
|
+
special_method_called = true
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
behaviour = Behaviour.new("I'm not special", :behaviour_type => :special) {}
|
458
|
+
behaviour.include special_mod, :behaviour_type => :special
|
459
|
+
behaviour.it "test" do
|
460
|
+
special_method
|
461
|
+
end
|
462
|
+
behaviour.run(@reporter)
|
463
|
+
|
464
|
+
special_method_called.should be_true
|
465
|
+
end
|
402
466
|
|
403
467
|
it "should have accessible class methods from included module" do
|
404
468
|
mod1_method_called = false
|
405
469
|
mod1 = Module.new do
|
406
470
|
class_methods = Module.new do
|
407
|
-
|
408
|
-
|
409
|
-
|
471
|
+
define_method :mod1_method do
|
472
|
+
mod1_method_called = true
|
473
|
+
end
|
410
474
|
end
|
411
475
|
|
412
476
|
metaclass.class_eval do
|
@@ -419,9 +483,9 @@ module Spec
|
|
419
483
|
mod2_method_called = false
|
420
484
|
mod2 = Module.new do
|
421
485
|
class_methods = Module.new do
|
422
|
-
|
423
|
-
|
424
|
-
|
486
|
+
define_method :mod2_method do
|
487
|
+
mod2_method_called = true
|
488
|
+
end
|
425
489
|
end
|
426
490
|
|
427
491
|
metaclass.class_eval do
|