rspec 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGES → History.txt} +116 -64
- data/Manifest.txt +403 -0
- data/{MIT-LICENSE → README.txt} +43 -0
- data/Rakefile +39 -212
- data/{TODO → TODO.txt} +0 -0
- data/bin/autospec +4 -0
- data/bin/spec +1 -1
- data/examples/pure/yielding_example.rb +33 -0
- data/examples/stories/game-of-life/.loadpath +5 -0
- data/examples/stories/game-of-life/behaviour/everything.rb +1 -1
- data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +17 -17
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +1 -1
- data/lib/autotest/rspec.rb +3 -29
- data/lib/spec.rb +10 -12
- data/lib/spec/adapters.rb +1 -0
- data/lib/spec/adapters/ruby_engine.rb +26 -0
- data/lib/spec/adapters/ruby_engine/mri.rb +8 -0
- data/lib/spec/adapters/ruby_engine/rubinius.rb +8 -0
- data/lib/spec/example/errors.rb +6 -0
- data/lib/spec/example/example_group_methods.rb +17 -14
- data/lib/spec/example/example_matcher.rb +2 -0
- data/lib/spec/example/example_methods.rb +4 -9
- data/lib/spec/example/module_inclusion_warnings.rb +2 -1
- data/lib/spec/expectations/extensions/object.rb +2 -2
- data/lib/spec/expectations/handler.rb +8 -16
- data/lib/spec/extensions/main.rb +2 -17
- data/lib/spec/matchers.rb +8 -2
- data/lib/spec/matchers/be.rb +0 -3
- data/lib/spec/matchers/change.rb +44 -40
- data/lib/spec/matchers/has.rb +1 -1
- data/lib/spec/matchers/have.rb +17 -12
- data/lib/spec/matchers/operator_matcher.rb +10 -4
- data/lib/spec/matchers/simple_matcher.rb +113 -10
- data/lib/spec/mocks.rb +1 -1
- data/lib/spec/mocks/argument_constraints.rb +185 -0
- data/lib/spec/mocks/argument_expectation.rb +35 -173
- data/lib/spec/mocks/framework.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +30 -5
- data/lib/spec/mocks/methods.rb +14 -2
- data/lib/spec/mocks/mock.rb +4 -0
- data/lib/spec/mocks/proxy.rb +46 -5
- data/lib/spec/mocks/spec_methods.rb +9 -1
- data/lib/spec/rake/spectask.rb +14 -22
- data/lib/spec/rake/verify_rcov.rb +3 -3
- data/lib/spec/runner.rb +18 -6
- data/lib/spec/runner/backtrace_tweaker.rb +6 -7
- data/lib/spec/runner/command_line.rb +6 -17
- data/lib/spec/runner/drb_command_line.rb +1 -1
- data/lib/spec/runner/formatter/base_formatter.rb +3 -1
- data/lib/spec/runner/formatter/base_text_formatter.rb +5 -9
- data/lib/spec/runner/formatter/html_formatter.rb +1 -1
- data/lib/spec/runner/formatter/nested_text_formatter.rb +1 -1
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +2 -2
- data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -1
- data/lib/spec/runner/formatter/story/html_formatter.rb +62 -16
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +68 -16
- data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +42 -0
- data/lib/spec/runner/heckle_runner.rb +2 -2
- data/lib/spec/runner/option_parser.rb +2 -1
- data/lib/spec/runner/options.rb +18 -9
- data/lib/spec/runner/reporter.rb +24 -4
- data/lib/spec/runner/spec_parser.rb +1 -1
- data/lib/spec/story/runner.rb +1 -2
- data/lib/spec/story/runner/story_mediator.rb +14 -0
- data/lib/spec/story/runner/story_parser.rb +20 -0
- data/lib/spec/story/step.rb +40 -28
- data/lib/spec/story/step_mother.rb +2 -1
- data/lib/spec/story/world.rb +6 -2
- data/lib/spec/version.rb +13 -22
- data/rake_tasks/failing_examples_with_html.rake +1 -1
- data/rake_tasks/verify_rcov.rake +2 -2
- data/rspec.gemspec +33 -0
- data/spec/autotest/rspec_spec.rb +90 -141
- data/spec/spec/adapters/ruby_engine_spec.rb +16 -0
- data/spec/spec/example/base_formatter_spec.rb +112 -0
- data/spec/spec/example/example_group_factory_spec.rb +2 -2
- data/spec/spec/example/example_group_methods_spec.rb +55 -4
- data/spec/spec/example/example_group_spec.rb +4 -3
- data/spec/spec/example/example_methods_spec.rb +18 -14
- data/spec/spec/example/pending_module_spec.rb +38 -0
- data/spec/spec/example/shared_example_group_spec.rb +1 -1
- data/spec/spec/expectations/extensions/object_spec.rb +0 -12
- data/spec/spec/extensions/main_spec.rb +3 -8
- data/spec/spec/matchers/change_spec.rb +16 -6
- data/spec/spec/matchers/handler_spec.rb +58 -37
- data/spec/spec/matchers/has_spec.rb +10 -0
- data/spec/spec/matchers/have_spec.rb +105 -2
- data/spec/spec/matchers/operator_matcher_spec.rb +35 -2
- data/spec/spec/matchers/simple_matcher_spec.rb +64 -2
- data/spec/spec/mocks/any_number_of_times_spec.rb +7 -0
- data/spec/spec/mocks/bug_report_496.rb +17 -0
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +7 -1
- data/spec/spec/mocks/hash_including_matcher_spec.rb +45 -24
- data/spec/spec/mocks/mock_spec.rb +55 -10
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +54 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +14 -0
- data/spec/spec/mocks/options_hash_spec.rb +18 -28
- data/spec/spec/mocks/partial_mock_spec.rb +2 -0
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +20 -6
- data/spec/spec/mocks/stub_spec.rb +7 -0
- data/spec/spec/runner/command_line_spec.rb +5 -12
- data/spec/spec/runner/drb_command_line_spec.rb +13 -6
- data/spec/spec/runner/formatter/html_formatter_spec.rb +2 -1
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +20 -2
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +2 -1
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +76 -2
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +161 -0
- data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +82 -0
- data/spec/spec/runner/heckle_runner_spec.rb +8 -8
- data/spec/spec/runner/option_parser_spec.rb +21 -6
- data/spec/spec/runner/output_one_time_fixture_runner.rb +1 -1
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -0
- data/spec/spec/runner/reporter_spec.rb +51 -5
- data/spec/spec/runner/spec_parser_spec.rb +4 -4
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +2 -5
- data/spec/spec/story/runner/story_mediator_spec.rb +10 -0
- data/spec/spec/story/runner/story_parser_spec.rb +23 -6
- data/spec/spec/story/scenario_spec.rb +1 -3
- data/spec/spec/story/step_mother_spec.rb +12 -0
- data/spec/spec/story/step_spec.rb +57 -4
- data/spec/spec/story/story_spec.rb +1 -3
- data/spec/spec/story/world_spec.rb +1 -1
- data/spec/spec_helper.rb +21 -68
- data/stories/all.rb +1 -1
- data/stories/configuration/before_blocks.story +21 -0
- data/stories/configuration/stories.rb +7 -0
- data/stories/example_groups/stories.rb +3 -4
- data/stories/resources/spec/before_blocks_example.rb +32 -0
- data/stories/stories/multiline_steps.story +23 -0
- data/stories/stories/steps/multiline_steps.rb +13 -0
- data/stories/stories/stories.rb +6 -0
- data/story_server/prototype/javascripts/builder.js +136 -0
- data/story_server/prototype/javascripts/controls.js +972 -0
- data/story_server/prototype/javascripts/dragdrop.js +976 -0
- data/story_server/prototype/javascripts/effects.js +1117 -0
- data/story_server/prototype/javascripts/prototype.js +4140 -0
- data/story_server/prototype/javascripts/rspec.js +149 -0
- data/story_server/prototype/javascripts/scriptaculous.js +58 -0
- data/story_server/prototype/javascripts/slider.js +276 -0
- data/story_server/prototype/javascripts/sound.js +55 -0
- data/story_server/prototype/javascripts/unittest.js +568 -0
- data/story_server/prototype/lib/server.rb +24 -0
- data/story_server/prototype/stories.html +176 -0
- data/story_server/prototype/stylesheets/rspec.css +136 -0
- data/story_server/prototype/stylesheets/test.css +90 -0
- metadata +166 -166
- data/README +0 -36
- data/UPGRADE +0 -7
- data/bin/spec_translator +0 -8
- data/lib/spec/mocks/argument_constraint_matchers.rb +0 -31
- data/lib/spec/translator.rb +0 -114
- data/spec/spec/example/example_spec.rb +0 -53
- data/spec/spec/runner/execution_context_spec.rb +0 -37
- data/spec/spec/translator_spec.rb +0 -265
data/lib/spec/mocks/methods.rb
CHANGED
@@ -9,8 +9,12 @@ module Spec
|
|
9
9
|
__mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
|
10
10
|
end
|
11
11
|
|
12
|
-
def stub!(
|
13
|
-
|
12
|
+
def stub!(sym_or_hash, opts={})
|
13
|
+
if Hash === sym_or_hash
|
14
|
+
sym_or_hash.each {|method, value| stub!(method).and_return value }
|
15
|
+
else
|
16
|
+
__mock_proxy.add_stub(caller(1)[0], sym_or_hash.to_sym, opts)
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
def received_message?(sym, *args, &block) #:nodoc:
|
@@ -24,6 +28,14 @@ module Spec
|
|
24
28
|
def rspec_reset #:nodoc:
|
25
29
|
__mock_proxy.reset
|
26
30
|
end
|
31
|
+
|
32
|
+
def as_null_object
|
33
|
+
__mock_proxy.act_as_null_object
|
34
|
+
end
|
35
|
+
|
36
|
+
def null_object?
|
37
|
+
__mock_proxy.null_object?
|
38
|
+
end
|
27
39
|
|
28
40
|
private
|
29
41
|
|
data/lib/spec/mocks/mock.rb
CHANGED
data/lib/spec/mocks/proxy.rb
CHANGED
@@ -4,6 +4,16 @@ module Spec
|
|
4
4
|
DEFAULT_OPTIONS = {
|
5
5
|
:null_object => false,
|
6
6
|
}
|
7
|
+
|
8
|
+
@@warn_about_expectations_on_nil = true
|
9
|
+
|
10
|
+
def self.allow_message_expectations_on_nil
|
11
|
+
@@warn_about_expectations_on_nil = false
|
12
|
+
|
13
|
+
# ensure nil.rspec_verify is called even if an expectation is not set in the example
|
14
|
+
# otherwise the allowance would effect subsequent examples
|
15
|
+
$rspec_mocks.add(nil) unless $rspec_mocks.nil?
|
16
|
+
end
|
7
17
|
|
8
18
|
def initialize(target, name, options={})
|
9
19
|
@target = target
|
@@ -20,15 +30,27 @@ module Spec
|
|
20
30
|
def null_object?
|
21
31
|
@options[:null_object]
|
22
32
|
end
|
33
|
+
|
34
|
+
def act_as_null_object
|
35
|
+
@options[:null_object] = true
|
36
|
+
@target
|
37
|
+
end
|
23
38
|
|
24
|
-
def add_message_expectation(expected_from, sym, opts={}, &block)
|
39
|
+
def add_message_expectation(expected_from, sym, opts={}, &block)
|
25
40
|
__add sym
|
26
|
-
|
41
|
+
warn_if_nil_class sym
|
42
|
+
if existing_stub = @stubs.detect {|s| s.sym == sym }
|
43
|
+
expectation = existing_stub.build_child(expected_from, block_given?? block : nil, 1, opts)
|
44
|
+
else
|
45
|
+
expectation = MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
|
46
|
+
end
|
47
|
+
@expectations << expectation
|
27
48
|
@expectations.last
|
28
49
|
end
|
29
50
|
|
30
51
|
def add_negative_message_expectation(expected_from, sym, &block)
|
31
52
|
__add sym
|
53
|
+
warn_if_nil_class sym
|
32
54
|
@expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
33
55
|
@expectations.last
|
34
56
|
end
|
@@ -50,6 +72,7 @@ module Spec
|
|
50
72
|
clear_stubs
|
51
73
|
reset_proxied_methods
|
52
74
|
clear_proxied_methods
|
75
|
+
reset_nil_expectations_warning
|
53
76
|
end
|
54
77
|
|
55
78
|
def received_message?(sym, *args, &block)
|
@@ -61,13 +84,17 @@ module Spec
|
|
61
84
|
end
|
62
85
|
|
63
86
|
def message_received(sym, *args, &block)
|
64
|
-
|
65
|
-
|
66
|
-
|
87
|
+
expectation = find_matching_expectation(sym, *args)
|
88
|
+
stub = find_matching_method_stub(sym, *args)
|
89
|
+
|
90
|
+
if (stub && expectation && expectation.called_max_times?) ||
|
91
|
+
(stub && !expectation)
|
67
92
|
if expectation = find_almost_matching_expectation(sym, *args)
|
68
93
|
expectation.advise(args, block) unless expectation.expected_messages_received?
|
69
94
|
end
|
70
95
|
stub.invoke([], block)
|
96
|
+
elsif expectation
|
97
|
+
expectation.invoke(args, block)
|
71
98
|
elsif expectation = find_almost_matching_expectation(sym, *args)
|
72
99
|
expectation.advise(args, block) if null_object? unless expectation.expected_messages_received?
|
73
100
|
raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(sym) or null_object?)
|
@@ -91,6 +118,12 @@ module Spec
|
|
91
118
|
define_expected_method(sym)
|
92
119
|
end
|
93
120
|
|
121
|
+
def warn_if_nil_class(sym)
|
122
|
+
if proxy_for_nil_class? && @@warn_about_expectations_on_nil
|
123
|
+
Kernel.warn("An expectation of :#{sym} was set on nil. Called from #{caller[2]}. Use allow_message_expectations_on_nil to disable warnings.")
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
94
127
|
def define_expected_method(sym)
|
95
128
|
visibility_string = "#{visibility(sym)} :#{sym}"
|
96
129
|
if target_responds_to?(sym) && !target_metaclass.method_defined?(munge(sym))
|
@@ -166,6 +199,14 @@ module Spec
|
|
166
199
|
end
|
167
200
|
end
|
168
201
|
end
|
202
|
+
|
203
|
+
def proxy_for_nil_class?
|
204
|
+
@name == "NilClass"
|
205
|
+
end
|
206
|
+
|
207
|
+
def reset_nil_expectations_warning
|
208
|
+
@@warn_about_expectations_on_nil = true if proxy_for_nil_class?
|
209
|
+
end
|
169
210
|
|
170
211
|
def find_matching_expectation(sym, *args)
|
171
212
|
@expectations.find {|expectation| expectation.matches(sym, args)}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spec
|
2
2
|
module Mocks
|
3
3
|
module ExampleMethods
|
4
|
-
include Spec::Mocks::
|
4
|
+
include Spec::Mocks::ArgumentConstraints
|
5
5
|
|
6
6
|
# Shortcut for creating an instance of Spec::Mocks::Mock.
|
7
7
|
#
|
@@ -32,6 +32,14 @@ module Spec
|
|
32
32
|
def stub_everything(name = 'stub')
|
33
33
|
mock(name, :null_object => true)
|
34
34
|
end
|
35
|
+
|
36
|
+
# Disables warning messages about expectations being set on nil.
|
37
|
+
#
|
38
|
+
# By default warning messages are issued when expectations are set on nil. This is to
|
39
|
+
# prevent false-positives and to catch potential bugs early on.
|
40
|
+
def allow_message_expectations_on_nil
|
41
|
+
Proxy.allow_message_expectations_on_nil
|
42
|
+
end
|
35
43
|
|
36
44
|
end
|
37
45
|
end
|
data/lib/spec/rake/spectask.rb
CHANGED
@@ -155,30 +155,23 @@ module Spec
|
|
155
155
|
# ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts]
|
156
156
|
# or
|
157
157
|
# ruby [ruby_opts] -Ilib bin/spec examples [spec_opts]
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
cmd << " "
|
170
|
-
cmd << "-- " if rcov
|
171
|
-
cmd << spec_file_list.collect { |fn| %["#{fn}"] }.join(' ')
|
172
|
-
cmd << " "
|
173
|
-
cmd << spec_option_list
|
158
|
+
cmd_parts = [RUBY]
|
159
|
+
cmd_parts += ruby_opts
|
160
|
+
cmd_parts << %[-I"#{lib_path}"]
|
161
|
+
cmd_parts << "-S rcov" if rcov
|
162
|
+
cmd_parts << "-w" if warning
|
163
|
+
cmd_parts << rcov_option_list
|
164
|
+
cmd_parts << %[-o "#{rcov_dir}"] if rcov
|
165
|
+
cmd_parts << %["#{spec_script}"]
|
166
|
+
cmd_parts << "--" if rcov
|
167
|
+
cmd_parts += spec_file_list.collect { |fn| %["#{fn}"] }
|
168
|
+
cmd_parts << spec_option_list
|
174
169
|
if out
|
175
|
-
|
176
|
-
cmd << %Q| > "#{out}"|
|
170
|
+
cmd_parts << %[> "#{out}"]
|
177
171
|
STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
|
178
172
|
end
|
179
|
-
|
180
|
-
|
181
|
-
end
|
173
|
+
cmd = cmd_parts.join(" ")
|
174
|
+
puts cmd if verbose
|
182
175
|
unless system(cmd)
|
183
176
|
STDERR.puts failure_message if failure_message
|
184
177
|
raise("Command #{cmd} failed") if fail_on_error
|
@@ -232,4 +225,3 @@ module Spec
|
|
232
225
|
end
|
233
226
|
end
|
234
227
|
end
|
235
|
-
|
@@ -35,11 +35,11 @@ module RCov
|
|
35
35
|
def define
|
36
36
|
desc "Verify that rcov coverage is at least #{threshold}%"
|
37
37
|
task @name do
|
38
|
-
total_coverage =
|
38
|
+
total_coverage = 0
|
39
39
|
|
40
40
|
File.open(index_html).each_line do |line|
|
41
|
-
if line =~ /<tt class='coverage_total'
|
42
|
-
total_coverage =
|
41
|
+
if line =~ /<tt class='coverage_total'>\s*(\d+\.\d+)%\s*<\/tt>/
|
42
|
+
total_coverage = $1.to_f
|
43
43
|
break
|
44
44
|
end
|
45
45
|
end
|
data/lib/spec/runner.rb
CHANGED
@@ -185,18 +185,30 @@ module Spec
|
|
185
185
|
end
|
186
186
|
|
187
187
|
def register_at_exit_hook # :nodoc:
|
188
|
-
|
189
|
-
unless
|
188
|
+
@spec_runner_at_exit_hook_registered ||= nil
|
189
|
+
unless @spec_runner_at_exit_hook_registered
|
190
190
|
at_exit do
|
191
|
-
unless $! || Spec.run
|
192
|
-
success = Spec.run
|
193
|
-
exit success if Spec.exit
|
191
|
+
unless $! || Spec.run?
|
192
|
+
success = Spec.run
|
193
|
+
exit success if Spec.exit?
|
194
194
|
end
|
195
195
|
end
|
196
|
-
|
196
|
+
@spec_runner_at_exit_hook_registered = true
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def options # :nodoc:
|
201
|
+
@options ||= begin
|
202
|
+
parser = ::Spec::Runner::OptionParser.new(STDERR, STDOUT)
|
203
|
+
parser.order!(ARGV)
|
204
|
+
parser.options
|
197
205
|
end
|
198
206
|
end
|
199
207
|
|
208
|
+
def use options
|
209
|
+
@options = options
|
210
|
+
end
|
211
|
+
|
200
212
|
end
|
201
213
|
end
|
202
214
|
end
|
@@ -40,15 +40,14 @@ module Spec
|
|
40
40
|
|
41
41
|
def tweak_backtrace(error)
|
42
42
|
return if error.backtrace.nil?
|
43
|
-
error.backtrace.collect! do |
|
44
|
-
clean_up_double_slashes(
|
45
|
-
|
46
|
-
|
47
|
-
line
|
48
|
-
break
|
43
|
+
error.backtrace.collect! do |message|
|
44
|
+
clean_up_double_slashes(message)
|
45
|
+
kept_lines = message.split("\n").select do |line|
|
46
|
+
IGNORE_PATTERNS.each do |ignore|
|
47
|
+
break if line =~ ignore
|
49
48
|
end
|
50
49
|
end
|
51
|
-
|
50
|
+
kept_lines.empty?? nil : kept_lines.join("\n")
|
52
51
|
end
|
53
52
|
error.backtrace.compact!
|
54
53
|
end
|
@@ -2,25 +2,14 @@ require 'spec/runner/option_parser'
|
|
2
2
|
|
3
3
|
module Spec
|
4
4
|
module Runner
|
5
|
-
# Facade to run specs without having to fork a new ruby process (using `spec ...`)
|
6
5
|
class CommandLine
|
7
6
|
class << self
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# unless you know what you are doing!
|
15
|
-
init_rspec_options(instance_rspec_options)
|
16
|
-
orig_rspec_options = rspec_options
|
17
|
-
begin
|
18
|
-
$rspec_options = instance_rspec_options
|
19
|
-
return $rspec_options.run_examples
|
20
|
-
ensure
|
21
|
-
::Spec.run = true
|
22
|
-
$rspec_options = orig_rspec_options
|
23
|
-
end
|
7
|
+
def run(tmp_options=Spec::Runner.options)
|
8
|
+
orig_options = Spec::Runner.options
|
9
|
+
Spec::Runner.use tmp_options
|
10
|
+
tmp_options.run_examples
|
11
|
+
ensure
|
12
|
+
Spec::Runner.use orig_options
|
24
13
|
end
|
25
14
|
end
|
26
15
|
end
|
@@ -9,7 +9,7 @@ module Spec
|
|
9
9
|
def self.run(options)
|
10
10
|
begin
|
11
11
|
DRb.start_service
|
12
|
-
spec_server = DRbObject.new_with_uri("druby://
|
12
|
+
spec_server = DRbObject.new_with_uri("druby://127.0.0.1:8989")
|
13
13
|
spec_server.run(options.argv, options.error_stream, options.output_stream)
|
14
14
|
rescue DRb::DRbConnError => e
|
15
15
|
options.error_stream.puts "No server is running"
|
@@ -45,7 +45,9 @@ module Spec
|
|
45
45
|
# been provided a block), or when an ExamplePendingError is raised.
|
46
46
|
# +message+ is the message from the ExamplePendingError, if it exists, or the
|
47
47
|
# default value of "Not Yet Implemented"
|
48
|
-
|
48
|
+
# +pending_caller+ is the file and line number of the spec which
|
49
|
+
# has called the pending method
|
50
|
+
def example_pending(example, message, pending_caller)
|
49
51
|
end
|
50
52
|
|
51
53
|
# This method is invoked after all of the examples have executed. The next method
|
@@ -15,19 +15,14 @@ module Spec
|
|
15
15
|
super
|
16
16
|
if where.is_a?(String)
|
17
17
|
@output = File.open(where, 'w')
|
18
|
-
elsif where == STDOUT
|
19
|
-
@output = Kernel
|
20
|
-
def @output.flush
|
21
|
-
STDOUT.flush
|
22
|
-
end
|
23
18
|
else
|
24
19
|
@output = where
|
25
20
|
end
|
26
21
|
@pending_examples = []
|
27
22
|
end
|
28
23
|
|
29
|
-
def example_pending(example, message)
|
30
|
-
@pending_examples << [example.__full_description, message]
|
24
|
+
def example_pending(example, message, pending_caller)
|
25
|
+
@pending_examples << [example.__full_description, message, pending_caller]
|
31
26
|
end
|
32
27
|
|
33
28
|
def dump_failure(counter, failure)
|
@@ -75,13 +70,14 @@ module Spec
|
|
75
70
|
@output.puts "Pending:"
|
76
71
|
@pending_examples.each do |pending_example|
|
77
72
|
@output.puts "#{pending_example[0]} (#{pending_example[1]})"
|
73
|
+
@output.puts " Called from #{pending_example[2]}"
|
78
74
|
end
|
79
75
|
end
|
80
76
|
@output.flush
|
81
77
|
end
|
82
78
|
|
83
79
|
def close
|
84
|
-
if IO === @output
|
80
|
+
if IO === @output && @output != STDOUT
|
85
81
|
@output.close
|
86
82
|
end
|
87
83
|
end
|
@@ -112,7 +108,7 @@ module Spec
|
|
112
108
|
|
113
109
|
def output_to_tty?
|
114
110
|
begin
|
115
|
-
@output
|
111
|
+
@output.tty? || ENV.has_key?("AUTOTEST")
|
116
112
|
rescue NoMethodError
|
117
113
|
false
|
118
114
|
end
|
@@ -85,7 +85,7 @@ module Spec
|
|
85
85
|
@output.flush
|
86
86
|
end
|
87
87
|
|
88
|
-
def example_pending(example, message)
|
88
|
+
def example_pending(example, message, pending_caller)
|
89
89
|
@output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>" unless @header_red
|
90
90
|
@output.puts " <script type=\"text/javascript\">makeYellow('example_group_#{example_group_number}');</script>" unless @example_group_red
|
91
91
|
move_progress
|
@@ -8,6 +8,15 @@ module Spec
|
|
8
8
|
class HtmlFormatter < BaseTextFormatter
|
9
9
|
include ERB::Util
|
10
10
|
|
11
|
+
def initialize(options, where)
|
12
|
+
super
|
13
|
+
@previous_type = nil
|
14
|
+
@scenario_text = ""
|
15
|
+
@story_text = ""
|
16
|
+
@scenario_failed = false
|
17
|
+
@story_failed = false
|
18
|
+
end
|
19
|
+
|
11
20
|
def run_started(count)
|
12
21
|
@output.puts <<-EOF
|
13
22
|
<?xml version="1.0" encoding="UTF-8"?>
|
@@ -49,8 +58,8 @@ EOF
|
|
49
58
|
end
|
50
59
|
|
51
60
|
def story_started(title, narrative)
|
52
|
-
@
|
53
|
-
|
61
|
+
@story_failed = false
|
62
|
+
@story_text = <<-EOF
|
54
63
|
<dt>Story: #{h title}</dt>
|
55
64
|
<dd>
|
56
65
|
<p>
|
@@ -59,27 +68,49 @@ EOF
|
|
59
68
|
EOF
|
60
69
|
end
|
61
70
|
|
62
|
-
def story_ended(title, narrative)
|
63
|
-
@
|
71
|
+
def story_ended(title, narrative)
|
72
|
+
if @story_failed
|
73
|
+
@output.puts <<-EOF
|
74
|
+
<dl class="story failed">
|
75
|
+
EOF
|
76
|
+
else
|
77
|
+
@output.puts <<-EOF
|
78
|
+
<dl class="story passed">
|
79
|
+
EOF
|
80
|
+
end
|
81
|
+
@output.puts <<-EOF
|
82
|
+
#{@story_text}
|
64
83
|
</dd>
|
65
84
|
</dl>
|
66
85
|
EOF
|
67
86
|
end
|
68
|
-
|
87
|
+
|
69
88
|
def scenario_started(story_title, scenario_name)
|
70
|
-
@
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
<
|
89
|
+
@previous_type = nil
|
90
|
+
@scenario_failed = false
|
91
|
+
@scenario_text = <<-EOF
|
92
|
+
<dt>Scenario: #{h scenario_name}</dt>
|
93
|
+
<dd>
|
94
|
+
<ul class="steps">
|
75
95
|
EOF
|
76
96
|
end
|
77
97
|
|
78
98
|
def scenario_ended
|
79
|
-
@
|
80
|
-
|
81
|
-
|
82
|
-
|
99
|
+
if @scenario_failed
|
100
|
+
@story_text += <<-EOF
|
101
|
+
<dl class="failed">
|
102
|
+
EOF
|
103
|
+
else
|
104
|
+
@story_text += <<-EOF
|
105
|
+
<dl class="passed">
|
106
|
+
EOF
|
107
|
+
end
|
108
|
+
|
109
|
+
@story_text += <<-EOF
|
110
|
+
#{@scenario_text}
|
111
|
+
</ul>
|
112
|
+
</dd>
|
113
|
+
</dl>
|
83
114
|
EOF
|
84
115
|
end
|
85
116
|
|
@@ -95,6 +126,8 @@ EOF
|
|
95
126
|
end
|
96
127
|
|
97
128
|
def scenario_failed(story_title, scenario_name, err)
|
129
|
+
@scenario_failed = true
|
130
|
+
@story_failed = true
|
98
131
|
scenario_ended
|
99
132
|
end
|
100
133
|
|
@@ -117,9 +150,22 @@ EOF
|
|
117
150
|
spans = args.map { |arg| "<span class=\"param\">#{arg}</span>" }
|
118
151
|
desc_string = description.step_name
|
119
152
|
arg_regexp = description.arg_regexp
|
153
|
+
inner = if(type == @previous_type)
|
154
|
+
"And "
|
155
|
+
else
|
156
|
+
"#{type.to_s.capitalize} "
|
157
|
+
end
|
120
158
|
i = -1
|
121
|
-
inner
|
122
|
-
|
159
|
+
inner += desc_string.gsub(arg_regexp) { |param| spans[i+=1] }
|
160
|
+
|
161
|
+
@scenario_text += " <li class=\"#{klass}\">#{inner}</li>\n"
|
162
|
+
|
163
|
+
if type == :'given scenario'
|
164
|
+
@previous_type = :given
|
165
|
+
else
|
166
|
+
@previous_type = type
|
167
|
+
end
|
168
|
+
|
123
169
|
end
|
124
170
|
end
|
125
171
|
end
|