rspec 0.9.3 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +13 -0
- data/EXAMPLES.rd +1 -1
- data/Rakefile +6 -1
- data/lib/spec/dsl/behaviour.rb +1 -1
- data/lib/spec/dsl/behaviour_eval.rb +5 -7
- data/lib/spec/dsl/configuration.rb +3 -2
- data/lib/spec/matchers/include.rb +28 -8
- data/lib/spec/runner/behaviour_runner.rb +2 -2
- data/lib/spec/runner/formatter/base_text_formatter.rb +5 -0
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +1 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +1 -0
- data/lib/spec/runner/formatter/html_formatter.rb +136 -116
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -0
- data/lib/spec/runner/formatter/rdoc_formatter.rb +4 -3
- data/lib/spec/runner/formatter/specdoc_formatter.rb +4 -1
- data/lib/spec/runner/reporter.rb +0 -8
- data/lib/spec/version.rb +3 -3
- data/spec/spec/dsl/behaviour_spec.rb +18 -10
- data/spec/spec/dsl/shared_behaviour_spec.rb +2 -2
- data/spec/spec/matchers/include_spec.rb +12 -0
- data/spec/spec/runner/behaviour_runner_spec.rb +4 -0
- data/spec/spec/runner/option_parser_spec.rb +5 -0
- metadata +4 -4
data/CHANGES
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
= RSpec Changelog
|
2
2
|
|
3
|
+
== Version 0.9.4
|
4
|
+
This release introduces massive improvements to Spec::Ui - the user interface functional testing
|
5
|
+
extension to RSpec. There are also some minor bug fixes to the RSpec core.
|
6
|
+
|
7
|
+
* Massive improvements to Spec::Ui. Complete support for all Watir's ie.xxx(how, what) methods. Inline screenshots and HTML.
|
8
|
+
* Reactivated --timeout, which had mysteriously been deactivated in a recent release.
|
9
|
+
* Fixed [#10669] Kernel#describe override does not cover Kernel#context
|
10
|
+
* Applied [#10636] Added spec for OptionParser in Runner (Patch from Scott Taylor)
|
11
|
+
* Added [#10516] should_include should be able to accept multiple items
|
12
|
+
* Applied [#10631] redirect_to matcher doesn't respect request.host (Patch from Tim Lucas)
|
13
|
+
* Each formatter now flushes their own IO. This is to avoid buffering of output.
|
14
|
+
* Fixed [#10670] IVarProxy#delete raises exception when instance variable does not exist
|
15
|
+
|
3
16
|
== Version 0.9.3
|
4
17
|
This is a bugfix release.
|
5
18
|
|
data/EXAMPLES.rd
CHANGED
data/Rakefile
CHANGED
@@ -29,7 +29,12 @@ task :default => [:verify_rcov]
|
|
29
29
|
|
30
30
|
desc "Run all specs"
|
31
31
|
Spec::Rake::SpecTask.new do |t|
|
32
|
-
t.spec_files = FileList[
|
32
|
+
t.spec_files = FileList[
|
33
|
+
'spec/**/*_spec.rb',
|
34
|
+
'../RSpec.tmbundle/Support/spec/*_spec.rb'
|
35
|
+
# TODO: get these in too - need to fix coverage
|
36
|
+
# '../spec_ui/spec/**/*_spec.rb'
|
37
|
+
]
|
33
38
|
t.spec_opts = ['--options', 'spec.opts']
|
34
39
|
t.rcov = true
|
35
40
|
t.rcov_dir = '../doc/output/coverage'
|
data/lib/spec/dsl/behaviour.rb
CHANGED
@@ -55,7 +55,7 @@ module Spec
|
|
55
55
|
public
|
56
56
|
|
57
57
|
def run(reporter, dry_run=false, reverse=false, timeout=nil)
|
58
|
-
|
58
|
+
raise "shared behaviours should never run" if shared?
|
59
59
|
reporter.add_behaviour(description)
|
60
60
|
prepare_execution_context_class
|
61
61
|
errors = run_before_all(reporter, dry_run)
|
@@ -13,9 +13,11 @@ module Spec
|
|
13
13
|
derive_execution_context_class_from_behaviour_superclass
|
14
14
|
end
|
15
15
|
|
16
|
-
def include(
|
17
|
-
|
18
|
-
|
16
|
+
def include(*mods)
|
17
|
+
mods.each do |mod|
|
18
|
+
included_modules << mod
|
19
|
+
mod.send :included, self
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def it_should_behave_like(behaviour_description)
|
@@ -123,10 +125,6 @@ module Spec
|
|
123
125
|
CompositeProcBuilder.new(parts).proc(&error_handler)
|
124
126
|
end
|
125
127
|
|
126
|
-
def add_superclass_method(parts, method_name)
|
127
|
-
parts << behaviour_superclass.instance_method(method_name) if behaviour_superclass.instance_methods.include?(method_name)
|
128
|
-
end
|
129
|
-
|
130
128
|
private
|
131
129
|
|
132
130
|
def execution_context_class
|
@@ -15,8 +15,9 @@ module Spec
|
|
15
15
|
@mock_framework ||= mock_framework_path("rspec")
|
16
16
|
end
|
17
17
|
|
18
|
-
def include(
|
19
|
-
included_modules << mod
|
18
|
+
def include(*mods)
|
19
|
+
# mods.each {|mod|included_modules << mod}
|
20
|
+
included_modules.push(*mods)
|
20
21
|
end
|
21
22
|
|
22
23
|
def included_modules
|
@@ -3,13 +3,16 @@ module Spec
|
|
3
3
|
|
4
4
|
class Include #:nodoc:
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(*expecteds)
|
7
|
+
@expecteds = expecteds
|
8
8
|
end
|
9
9
|
|
10
10
|
def matches?(actual)
|
11
11
|
@actual = actual
|
12
|
-
|
12
|
+
@expecteds.each do |expected|
|
13
|
+
return false unless actual.include?(expected)
|
14
|
+
end
|
15
|
+
true
|
13
16
|
end
|
14
17
|
|
15
18
|
def failure_message
|
@@ -21,12 +24,26 @@ module Spec
|
|
21
24
|
end
|
22
25
|
|
23
26
|
def description
|
24
|
-
"include #{@
|
27
|
+
"include #{_pretty_print(@expecteds)}"
|
25
28
|
end
|
26
29
|
|
27
30
|
private
|
28
31
|
def _message(maybe_not="")
|
29
|
-
"expected #{@actual.inspect} #{maybe_not}to include #{@
|
32
|
+
"expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def _pretty_print(array)
|
36
|
+
result = ""
|
37
|
+
array.each_with_index do |item, index|
|
38
|
+
if index < (array.length - 2)
|
39
|
+
result << "#{item.inspect}, "
|
40
|
+
elsif index < (array.length - 1)
|
41
|
+
result << "#{item.inspect} and "
|
42
|
+
else
|
43
|
+
result << "#{item.inspect}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
result
|
30
47
|
end
|
31
48
|
end
|
32
49
|
|
@@ -35,16 +52,19 @@ module Spec
|
|
35
52
|
# should_not include(expected)
|
36
53
|
#
|
37
54
|
# Passes if actual includes expected. This works for
|
38
|
-
# collections and Strings
|
55
|
+
# collections and Strings. You can also pass in multiple args
|
56
|
+
# and it will only pass if all args are found in collection.
|
39
57
|
#
|
40
58
|
# == Examples
|
41
59
|
#
|
42
60
|
# [1,2,3].should include(3)
|
61
|
+
# [1,2,3].should include(2,3) #would pass
|
62
|
+
# [1,2,3].should include(2,3,4) #would fail
|
43
63
|
# [1,2,3].should_not include(4)
|
44
64
|
# "spread".should include("read")
|
45
65
|
# "spread".should_not include("red")
|
46
|
-
def include(expected)
|
47
|
-
Matchers::Include.new(expected)
|
66
|
+
def include(*expected)
|
67
|
+
Matchers::Include.new(*expected)
|
48
68
|
end
|
49
69
|
end
|
50
70
|
end
|
@@ -11,7 +11,7 @@ module Spec
|
|
11
11
|
unless specified_examples.nil? || specified_examples.empty? #|| behaviour.matches?(specified_examples)
|
12
12
|
behaviour.retain_examples_matching!(specified_examples) #if behaviour.matches?(specified_examples)
|
13
13
|
end
|
14
|
-
@behaviours << behaviour
|
14
|
+
@behaviours << behaviour if behaviour.number_of_examples != 0 && !behaviour.shared?
|
15
15
|
end
|
16
16
|
|
17
17
|
# Runs all contexts and returns the number of failures.
|
@@ -42,7 +42,7 @@ module Spec
|
|
42
42
|
|
43
43
|
def run_behaviours(behaviours)
|
44
44
|
behaviours.each do |behaviour|
|
45
|
-
behaviour.run(@options.reporter, @options.dry_run, @options.reverse)
|
45
|
+
behaviour.run(@options.reporter, @options.dry_run, @options.reverse, @options.timeout)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -16,6 +16,9 @@ module Spec
|
|
16
16
|
@output = File.open(where, 'w')
|
17
17
|
elsif where == STDOUT
|
18
18
|
@output = Kernel
|
19
|
+
def @output.flush
|
20
|
+
STDOUT.flush
|
21
|
+
end
|
19
22
|
else
|
20
23
|
@output = where
|
21
24
|
end
|
@@ -40,6 +43,7 @@ module Spec
|
|
40
43
|
@output.puts magenta(failure.exception.message)
|
41
44
|
end
|
42
45
|
@output.puts format_backtrace(failure.exception.backtrace)
|
46
|
+
@output.flush
|
43
47
|
end
|
44
48
|
|
45
49
|
def dump_summary(duration, example_count, failure_count)
|
@@ -53,6 +57,7 @@ module Spec
|
|
53
57
|
else
|
54
58
|
@output.puts red(summary)
|
55
59
|
end
|
60
|
+
@output.flush
|
56
61
|
end
|
57
62
|
|
58
63
|
def format_backtrace(backtrace)
|
@@ -7,7 +7,6 @@ module Spec
|
|
7
7
|
super
|
8
8
|
@current_behaviour_number = 0
|
9
9
|
@current_example_number = 0
|
10
|
-
@html_header = true
|
11
10
|
end
|
12
11
|
|
13
12
|
# The number of the currently running behaviour
|
@@ -23,10 +22,9 @@ module Spec
|
|
23
22
|
def start(example_count)
|
24
23
|
@example_count = example_count
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@output.puts REPORT_HEADER
|
25
|
+
@output.puts html_header
|
26
|
+
@output.puts report_header
|
27
|
+
@output.flush
|
30
28
|
end
|
31
29
|
|
32
30
|
def add_behaviour(name)
|
@@ -38,17 +36,20 @@ module Spec
|
|
38
36
|
@output.puts "<div class=\"behaviour\">"
|
39
37
|
@output.puts " <dl>"
|
40
38
|
@output.puts " <dt id=\"behaviour_#{current_behaviour_number}\">#{escape(name)}</dt>"
|
39
|
+
@output.flush
|
41
40
|
end
|
42
41
|
|
43
42
|
def start_dump
|
44
43
|
@output.puts " </dl>"
|
45
44
|
@output.puts "</div>"
|
45
|
+
@output.flush
|
46
46
|
end
|
47
47
|
|
48
48
|
def example_passed(name)
|
49
49
|
@current_example_number += 1
|
50
50
|
move_progress
|
51
51
|
@output.puts " <dd class=\"spec passed\"><span class=\"passed_spec_name\">#{escape(name)}</span></dd>"
|
52
|
+
@output.flush
|
52
53
|
end
|
53
54
|
|
54
55
|
def example_failed(name, counter, failure)
|
@@ -66,6 +67,7 @@ module Spec
|
|
66
67
|
@output.puts extra unless extra == ""
|
67
68
|
@output.puts " </div>"
|
68
69
|
@output.puts " </dd>"
|
70
|
+
@output.flush
|
69
71
|
end
|
70
72
|
|
71
73
|
# Override this method if you wish to output extra HTML for a failed spec. For example, you
|
@@ -78,6 +80,7 @@ module Spec
|
|
78
80
|
def move_progress
|
79
81
|
percent_done = @example_count == 0 ? 100.0 : (current_example_number.to_f / @example_count.to_f * 1000).to_i / 10.0
|
80
82
|
@output.puts " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
|
83
|
+
@output.flush
|
81
84
|
end
|
82
85
|
|
83
86
|
def escape(string)
|
@@ -97,13 +100,13 @@ module Spec
|
|
97
100
|
@output.puts "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{totals}\";</script>"
|
98
101
|
@output.puts "</div>"
|
99
102
|
@output.puts "</div>"
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
103
|
+
@output.puts "</body>"
|
104
|
+
@output.puts "</html>"
|
105
|
+
@output.flush
|
104
106
|
end
|
105
107
|
|
106
|
-
|
108
|
+
def html_header
|
109
|
+
<<-EOF
|
107
110
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
108
111
|
<!DOCTYPE html
|
109
112
|
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
@@ -124,136 +127,153 @@ module Spec
|
|
124
127
|
</head>
|
125
128
|
<body>
|
126
129
|
EOF
|
130
|
+
end
|
127
131
|
|
128
|
-
|
132
|
+
def report_header
|
133
|
+
<<-EOF
|
129
134
|
<div class="rspec-report">
|
130
135
|
<script type="text/javascript">
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
function makeRed(element_id) {
|
135
|
-
document.getElementById(element_id).style.background = '#C40D0D';
|
136
|
-
}
|
136
|
+
// <![CDATA[
|
137
|
+
#{global_scripts}
|
138
|
+
// ]]>
|
137
139
|
</script>
|
138
140
|
<style type="text/css">
|
139
|
-
|
140
|
-
|
141
|
-
}
|
141
|
+
#{global_styles}
|
142
|
+
</style>
|
142
143
|
|
143
|
-
|
144
|
-
|
145
|
-
padding: 10px;
|
146
|
-
font: bold 18px "Lucida Grande", Helvetica, sans-serif;
|
147
|
-
}
|
144
|
+
<div id="rspec-header">
|
145
|
+
<h1>RSpec Results</h1>
|
148
146
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
top: 0px;
|
155
|
-
right: 0px;
|
156
|
-
}
|
147
|
+
<div id="summary">
|
148
|
+
<p id="duration"> </p>
|
149
|
+
<p id="totals"> </p>
|
150
|
+
</div>
|
151
|
+
</div>
|
157
152
|
|
158
|
-
|
159
|
-
|
160
|
-
|
153
|
+
<div class="results">
|
154
|
+
EOF
|
155
|
+
end
|
161
156
|
|
162
|
-
|
163
|
-
|
164
|
-
|
157
|
+
def global_scripts
|
158
|
+
<<-EOF
|
159
|
+
function moveProgressBar(percentDone) {
|
160
|
+
document.getElementById("rspec-header").style.width = percentDone +"%";
|
161
|
+
}
|
162
|
+
function makeRed(element_id) {
|
163
|
+
document.getElementById(element_id).style.background = '#C40D0D';
|
164
|
+
}
|
165
|
+
EOF
|
166
|
+
end
|
167
|
+
|
168
|
+
def global_styles
|
169
|
+
<<-EOF
|
170
|
+
#rspec-header {
|
171
|
+
background: #65C400; color: #fff;
|
172
|
+
}
|
165
173
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
174
|
+
div.rspec-report h1 {
|
175
|
+
margin: 0px 10px 0px 10px;
|
176
|
+
padding: 10px;
|
177
|
+
font: bold 18px "Lucida Grande", Helvetica, sans-serif;
|
178
|
+
}
|
170
179
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
180
|
+
#summary {
|
181
|
+
margin: 0; padding: 5px 10px;
|
182
|
+
font: bold 10px "Lucida Grande", Helvetica, sans-serif;
|
183
|
+
text-align: right;
|
184
|
+
position: absolute;
|
185
|
+
top: 0px;
|
186
|
+
right: 0px;
|
187
|
+
}
|
175
188
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
color: #fff;
|
180
|
-
font-weight: bold;
|
181
|
-
}
|
189
|
+
#summary p {
|
190
|
+
margin: 0 0 2px;
|
191
|
+
}
|
182
192
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
}
|
193
|
+
#summary #totals {
|
194
|
+
font-size: 14px;
|
195
|
+
}
|
187
196
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
}
|
197
|
+
.behaviour {
|
198
|
+
margin: 0 10px 5px;
|
199
|
+
background: #fff;
|
200
|
+
}
|
193
201
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
}
|
202
|
+
dl {
|
203
|
+
margin: 0; padding: 0 0 5px;
|
204
|
+
font: normal 11px "Lucida Grande", Helvetica, sans-serif;
|
205
|
+
}
|
199
206
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
207
|
+
dt {
|
208
|
+
padding: 3px;
|
209
|
+
background: #65C400;
|
210
|
+
color: #fff;
|
211
|
+
font-weight: bold;
|
212
|
+
}
|
204
213
|
|
205
|
-
|
206
|
-
|
207
|
-
|
214
|
+
dd {
|
215
|
+
margin: 5px 0 5px 5px;
|
216
|
+
padding: 3px 3px 3px 18px;
|
217
|
+
}
|
208
218
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
background-color: black;
|
215
|
-
padding: 0.1em 0 0.2em 0;
|
216
|
-
}
|
219
|
+
dd.spec.passed {
|
220
|
+
border-left: 5px solid #65C400;
|
221
|
+
border-bottom: 1px solid #65C400;
|
222
|
+
background: #DBFFB4; color: #3D7700;
|
223
|
+
}
|
217
224
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
pre.ruby .class { color: white; }
|
224
|
-
pre.ruby .string { color: #66FF00; }
|
225
|
-
pre.ruby .ident { color: white; }
|
226
|
-
pre.ruby .method { color: #FFCC00; }
|
227
|
-
pre.ruby .number { color: white; }
|
228
|
-
pre.ruby .char { color: white; }
|
229
|
-
pre.ruby .comment { color: #9933CC; }
|
230
|
-
pre.ruby .symbol { color: white; }
|
231
|
-
pre.ruby .regex { color: #44B4CC; }
|
232
|
-
pre.ruby .punct { color: white; }
|
233
|
-
pre.ruby .escape { color: white; }
|
234
|
-
pre.ruby .interp { color: white; }
|
235
|
-
pre.ruby .expr { color: white; }
|
225
|
+
dd.spec.failed {
|
226
|
+
border-left: 5px solid #C20000;
|
227
|
+
border-bottom: 1px solid #C20000;
|
228
|
+
color: #C20000; background: #FFFBD3;
|
229
|
+
}
|
236
230
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
color: #000000;
|
242
|
-
background-color: #FFFBD3;
|
243
|
-
}
|
244
|
-
</style>
|
231
|
+
div.backtrace {
|
232
|
+
color: #000;
|
233
|
+
font-size: 12px;
|
234
|
+
}
|
245
235
|
|
246
|
-
|
247
|
-
|
236
|
+
a {
|
237
|
+
color: #BE5C00;
|
238
|
+
}
|
248
239
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
240
|
+
/* Ruby code, style similar to vibrant ink */
|
241
|
+
pre.ruby {
|
242
|
+
font-size: 12px;
|
243
|
+
font-family: monospace;
|
244
|
+
color: white;
|
245
|
+
background-color: black;
|
246
|
+
padding: 0.1em 0 0.2em 0;
|
247
|
+
}
|
254
248
|
|
255
|
-
|
249
|
+
pre.ruby .keyword { color: #FF6600; }
|
250
|
+
pre.ruby .constant { color: #339999; }
|
251
|
+
pre.ruby .attribute { color: white; }
|
252
|
+
pre.ruby .global { color: white; }
|
253
|
+
pre.ruby .module { color: white; }
|
254
|
+
pre.ruby .class { color: white; }
|
255
|
+
pre.ruby .string { color: #66FF00; }
|
256
|
+
pre.ruby .ident { color: white; }
|
257
|
+
pre.ruby .method { color: #FFCC00; }
|
258
|
+
pre.ruby .number { color: white; }
|
259
|
+
pre.ruby .char { color: white; }
|
260
|
+
pre.ruby .comment { color: #9933CC; }
|
261
|
+
pre.ruby .symbol { color: white; }
|
262
|
+
pre.ruby .regex { color: #44B4CC; }
|
263
|
+
pre.ruby .punct { color: white; }
|
264
|
+
pre.ruby .escape { color: white; }
|
265
|
+
pre.ruby .interp { color: white; }
|
266
|
+
pre.ruby .expr { color: white; }
|
267
|
+
|
268
|
+
pre.ruby .offending { background-color: gray; }
|
269
|
+
pre.ruby .linenum {
|
270
|
+
width: 75px;
|
271
|
+
padding: 0.1em 1em 0.2em 0;
|
272
|
+
color: #000000;
|
273
|
+
background-color: #FFFBD3;
|
274
|
+
}
|
256
275
|
EOF
|
276
|
+
end
|
257
277
|
end
|
258
278
|
end
|
259
279
|
end
|
@@ -7,14 +7,17 @@ module Spec
|
|
7
7
|
|
8
8
|
def example_failed(name, counter, failure)
|
9
9
|
@output.print failure.expectation_not_met? ? red('F') : magenta('F')
|
10
|
+
@output.flush
|
10
11
|
end
|
11
12
|
|
12
13
|
def example_passed(name)
|
13
14
|
@output.print green('.')
|
15
|
+
@output.flush
|
14
16
|
end
|
15
17
|
|
16
18
|
def start_dump
|
17
19
|
@output.puts
|
20
|
+
@output.flush
|
18
21
|
end
|
19
22
|
end
|
20
23
|
end
|
@@ -3,15 +3,16 @@ module Spec
|
|
3
3
|
module Formatter
|
4
4
|
class RdocFormatter < BaseTextFormatter
|
5
5
|
def add_behaviour(name)
|
6
|
-
@output.
|
6
|
+
@output.puts "# #{name}"
|
7
7
|
end
|
8
8
|
|
9
9
|
def example_passed(name)
|
10
|
-
@output.
|
10
|
+
@output.puts "# * #{name}"
|
11
|
+
@output.flush
|
11
12
|
end
|
12
13
|
|
13
14
|
def example_failed(name, counter, failure)
|
14
|
-
@output.
|
15
|
+
@output.puts "# * #{name} [#{counter} - FAILED]"
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
@@ -5,14 +5,17 @@ module Spec
|
|
5
5
|
def add_behaviour(name)
|
6
6
|
@output.puts
|
7
7
|
@output.puts name
|
8
|
+
@output.flush
|
8
9
|
end
|
9
10
|
|
10
11
|
def example_failed(name, counter, failure)
|
11
12
|
@output.puts failure.expectation_not_met? ? red("- #{name} (FAILED - #{counter})") : magenta("- #{name} (ERROR - #{counter})")
|
13
|
+
@output.flush
|
12
14
|
end
|
13
15
|
|
14
16
|
def example_passed(name)
|
15
|
-
@output.
|
17
|
+
@output.puts green("- #{name}")
|
18
|
+
@output.flush
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
data/lib/spec/runner/reporter.rb
CHANGED
@@ -11,12 +11,10 @@ module Spec
|
|
11
11
|
def add_behaviour(name)
|
12
12
|
@formatters.each{|f| f.add_behaviour(name)}
|
13
13
|
@behaviour_names << name
|
14
|
-
STDOUT.flush
|
15
14
|
end
|
16
15
|
|
17
16
|
def example_started(name)
|
18
17
|
@formatters.each{|f| f.example_started(name)}
|
19
|
-
STDOUT.flush
|
20
18
|
end
|
21
19
|
|
22
20
|
def example_finished(name, error=nil, failure_location=nil)
|
@@ -26,14 +24,12 @@ module Spec
|
|
26
24
|
else
|
27
25
|
example_failed(name, error, failure_location)
|
28
26
|
end
|
29
|
-
STDOUT.flush
|
30
27
|
end
|
31
28
|
|
32
29
|
def start(number_of_examples)
|
33
30
|
clear!
|
34
31
|
@start_time = Time.new
|
35
32
|
@formatters.each{|f| f.start(number_of_examples)}
|
36
|
-
STDOUT.flush
|
37
33
|
end
|
38
34
|
|
39
35
|
def end
|
@@ -45,7 +41,6 @@ module Spec
|
|
45
41
|
@formatters.each{|f| f.start_dump}
|
46
42
|
dump_failures
|
47
43
|
@formatters.each{|f| f.dump_summary(duration, @example_names.length, @failures.length)}
|
48
|
-
STDOUT.flush
|
49
44
|
@failures.length
|
50
45
|
end
|
51
46
|
|
@@ -65,7 +60,6 @@ module Spec
|
|
65
60
|
@formatters.each{|f| f.dump_failure(index, failure)}
|
66
61
|
index + 1
|
67
62
|
end
|
68
|
-
STDOUT.flush
|
69
63
|
end
|
70
64
|
|
71
65
|
def duration
|
@@ -75,7 +69,6 @@ module Spec
|
|
75
69
|
|
76
70
|
def example_passed(name)
|
77
71
|
@formatters.each{|f| f.example_passed(name)}
|
78
|
-
STDOUT.flush
|
79
72
|
end
|
80
73
|
|
81
74
|
def example_failed(name, error, failure_location)
|
@@ -84,7 +77,6 @@ module Spec
|
|
84
77
|
failure = Failure.new(example_name, error)
|
85
78
|
@failures << failure
|
86
79
|
@formatters.each{|f| f.example_failed(name, @failures.length, failure)}
|
87
|
-
STDOUT.flush
|
88
80
|
end
|
89
81
|
|
90
82
|
class Failure
|
data/lib/spec/version.rb
CHANGED
@@ -3,11 +3,11 @@ module Spec
|
|
3
3
|
unless defined? MAJOR
|
4
4
|
MAJOR = 0
|
5
5
|
MINOR = 9
|
6
|
-
TINY =
|
6
|
+
TINY = 4
|
7
7
|
RELEASE_CANDIDATE = nil
|
8
8
|
|
9
|
-
# RANDOM_TOKEN: 0.
|
10
|
-
REV = "$LastChangedRevision:
|
9
|
+
# RANDOM_TOKEN: 0.310952573062985
|
10
|
+
REV = "$LastChangedRevision: 1935 $".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(/\.|-/, '_')
|
@@ -389,8 +389,7 @@ module Spec
|
|
389
389
|
end
|
390
390
|
end
|
391
391
|
|
392
|
-
@behaviour.include mod1
|
393
|
-
@behaviour.include mod2
|
392
|
+
@behaviour.include mod1, mod2
|
394
393
|
|
395
394
|
@behaviour.it("test") do
|
396
395
|
mod1_method
|
@@ -432,8 +431,7 @@ module Spec
|
|
432
431
|
end
|
433
432
|
end
|
434
433
|
|
435
|
-
@behaviour.include mod1
|
436
|
-
@behaviour.include mod2
|
434
|
+
@behaviour.include mod1, mod2
|
437
435
|
|
438
436
|
@behaviour.mod1_method
|
439
437
|
@behaviour.mod2_method
|
@@ -461,24 +459,34 @@ module Spec
|
|
461
459
|
end
|
462
460
|
|
463
461
|
it "should include any modules included using configuration" do
|
464
|
-
|
462
|
+
mod1 = Module.new do
|
465
463
|
class << self
|
466
464
|
def included(mod)
|
467
|
-
$
|
465
|
+
$included_modules << self
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
mod2 = Module.new do
|
471
|
+
class << self
|
472
|
+
def included(mod)
|
473
|
+
$included_modules << self
|
468
474
|
end
|
469
475
|
end
|
470
476
|
end
|
471
477
|
|
472
478
|
begin
|
473
|
-
$
|
474
|
-
Spec::Runner.configuration.include(
|
479
|
+
$included_modules = []
|
480
|
+
Spec::Runner.configuration.include(mod1, mod2)
|
475
481
|
|
476
482
|
behaviour = Behaviour.new('example') do
|
477
483
|
end.run(@reporter)
|
478
484
|
|
479
|
-
$
|
485
|
+
$included_modules.should include(mod1)
|
486
|
+
$included_modules.should include(mod2)
|
480
487
|
ensure
|
481
|
-
Spec::Runner.configuration.included_modules.delete(
|
488
|
+
Spec::Runner.configuration.included_modules.delete(mod1)
|
489
|
+
Spec::Runner.configuration.included_modules.delete(mod2)
|
482
490
|
end
|
483
491
|
end
|
484
492
|
|
@@ -52,11 +52,11 @@ module Spec
|
|
52
52
|
@behaviour.should_not be_shared
|
53
53
|
end
|
54
54
|
|
55
|
-
it "should
|
55
|
+
it "should raise if run when shared" do
|
56
56
|
behaviour = make_shared_behaviour("context", :shared => true) {}
|
57
57
|
$spec_ran = false
|
58
58
|
behaviour.it("test") {$spec_ran = true}
|
59
|
-
behaviour.run(@formatter)
|
59
|
+
lambda { behaviour.run(@formatter) }.should raise_error
|
60
60
|
$spec_ran.should be_false
|
61
61
|
end
|
62
62
|
|
@@ -16,6 +16,18 @@ describe "should include(expected)" do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
describe "should include(with, multiple, args)" do
|
20
|
+
it "should pass if target includes all items" do
|
21
|
+
[1,2,3].should include(1,2,3)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should fail if target does not include any one of the items" do
|
25
|
+
lambda {
|
26
|
+
[1,2,3].should include(1,2,4)
|
27
|
+
}.should fail_with("expected [1, 2, 3] to include 1, 2 and 4")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
19
31
|
describe "should_not include(expected)" do
|
20
32
|
it "should pass if target does not include expected" do
|
21
33
|
[1,2,3].should_not include(4)
|
@@ -9,6 +9,7 @@ module Spec
|
|
9
9
|
desired_context.should_receive(:run)
|
10
10
|
desired_context.should_receive(:retain_examples_matching!)
|
11
11
|
desired_context.should_receive(:number_of_examples).twice.and_return(1)
|
12
|
+
desired_context.should_receive(:shared?).and_return(false)
|
12
13
|
|
13
14
|
other_context = mock("other context")
|
14
15
|
other_context.should_receive(:run).never
|
@@ -60,6 +61,7 @@ module Spec
|
|
60
61
|
context = mock("context", :null_object => true)
|
61
62
|
context.should_receive(:number_of_examples).twice.and_return(1)
|
62
63
|
context.should_receive(:run).and_return(0)
|
64
|
+
context.should_receive(:shared?).and_return(false)
|
63
65
|
|
64
66
|
reporter = mock("reporter")
|
65
67
|
reporter.should_receive(:start).with(1)
|
@@ -91,9 +93,11 @@ module Spec
|
|
91
93
|
runner = Spec::Runner::BehaviourRunner.new(options)
|
92
94
|
c1 = mock("c1")
|
93
95
|
c1.should_receive(:number_of_examples).twice.and_return(1)
|
96
|
+
c1.should_receive(:shared?).and_return(false)
|
94
97
|
|
95
98
|
c2 = mock("c2")
|
96
99
|
c2.should_receive(:number_of_examples).twice.and_return(2)
|
100
|
+
c2.should_receive(:shared?).and_return(false)
|
97
101
|
c2.should_receive(:run) do
|
98
102
|
c1.should_receive(:run)
|
99
103
|
end
|
@@ -112,6 +112,11 @@ describe "OptionParser" do
|
|
112
112
|
"Sir, if you were my husband, I would poison your drink.",
|
113
113
|
"Madam, if you were my wife, I would drink it."])
|
114
114
|
end
|
115
|
+
|
116
|
+
it "should read no examples if given an empty file" do
|
117
|
+
options = parse(["--example", File.dirname(__FILE__) + '/empty_file.txt'])
|
118
|
+
options.examples.should eql([])
|
119
|
+
end
|
115
120
|
|
116
121
|
it "should use html formatter when format is h" do
|
117
122
|
options = parse(["--format", "h"])
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: rspec
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2007-05-
|
8
|
-
summary: RSpec-0.9.
|
6
|
+
version: 0.9.4
|
7
|
+
date: 2007-05-10 00:00:00 +02:00
|
8
|
+
summary: RSpec-0.9.4 (r1935) - BDD for Ruby http://rspec.rubyforge.org/
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: rspec-devel@rubyforge.org
|