rspec 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +35 -0
- data/MIT-LICENSE +1 -1
- data/README +9 -44
- data/Rakefile +34 -51
- data/TODO +0 -1
- data/UPGRADE +0 -24
- data/bin/spec +0 -0
- data/bin/spec_translator +0 -0
- data/examples/pure/behave_as_example.rb +0 -0
- data/examples/pure/partial_mock_example.rb +1 -0
- data/examples/stories/calculator.rb +1 -1
- data/lib/autotest/rspec.rb +7 -9
- data/lib/spec/example.rb +1 -1
- data/lib/spec/example/configuration.rb +30 -16
- data/lib/spec/example/example_group.rb +2 -1
- data/lib/spec/example/example_group_factory.rb +23 -21
- data/lib/spec/example/example_group_methods.rb +18 -5
- data/lib/spec/example/example_matcher.rb +0 -0
- data/lib/spec/example/example_methods.rb +6 -0
- data/lib/spec/example/module_inclusion_warnings.rb +37 -0
- data/lib/spec/expectations/differs/default.rb +1 -1
- data/lib/spec/expectations/extensions/object.rb +4 -12
- data/lib/spec/expectations/handler.rb +8 -0
- data/lib/spec/extensions.rb +1 -0
- data/lib/spec/extensions/metaclass.rb +7 -0
- data/lib/spec/extensions/object.rb +0 -4
- data/lib/spec/matchers/change.rb +1 -1
- data/lib/spec/matchers/has.rb +1 -11
- data/lib/spec/matchers/operator_matcher.rb +0 -0
- data/lib/spec/matchers/raise_error.rb +53 -30
- data/lib/spec/mocks.rb +1 -1
- data/lib/spec/mocks/argument_constraint_matchers.rb +5 -1
- data/lib/spec/mocks/argument_expectation.rb +26 -0
- data/lib/spec/mocks/extensions.rb +1 -0
- data/lib/spec/mocks/framework.rb +15 -0
- data/lib/spec/mocks/message_expectation.rb +29 -5
- data/lib/spec/mocks/mock.rb +9 -7
- data/lib/spec/mocks/proxy.rb +26 -12
- data/lib/spec/rake/spectask.rb +5 -5
- data/lib/spec/runner/backtrace_tweaker.rb +1 -1
- data/lib/spec/runner/formatter/base_formatter.rb +2 -3
- data/lib/spec/runner/formatter/base_text_formatter.rb +2 -2
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +4 -8
- data/lib/spec/runner/formatter/html_formatter.rb +18 -14
- data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
- data/lib/spec/runner/formatter/profile_formatter.rb +4 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +5 -1
- data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -1
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +18 -7
- data/lib/spec/runner/option_parser.rb +17 -15
- data/lib/spec/runner/options.rb +37 -14
- data/lib/spec/runner/reporter.rb +15 -11
- data/lib/spec/story/extensions/regexp.rb +2 -2
- data/lib/spec/story/extensions/string.rb +2 -2
- data/lib/spec/story/runner.rb +9 -5
- data/lib/spec/story/runner/plain_text_story_runner.rb +2 -2
- data/lib/spec/story/runner/scenario_runner.rb +8 -0
- data/lib/spec/story/runner/story_mediator.rb +1 -1
- data/lib/spec/story/runner/story_runner.rb +3 -1
- data/lib/spec/story/step.rb +4 -4
- data/lib/spec/story/story.rb +8 -11
- data/lib/spec/story/world.rb +0 -1
- data/lib/spec/version.rb +2 -2
- data/plugins/mock_frameworks/rspec.rb +2 -0
- data/spec/autotest/rspec_spec.rb +12 -10
- data/spec/spec/example/configuration_spec.rb +0 -0
- data/spec/spec/example/example_group/described_module_spec.rb +20 -0
- data/spec/spec/example/example_group/warning_messages_spec.rb +76 -0
- data/spec/spec/example/example_group_factory_spec.rb +117 -102
- data/spec/spec/example/example_group_methods_spec.rb +51 -17
- data/spec/spec/example/example_group_spec.rb +13 -1
- data/spec/spec/example/example_methods_spec.rb +28 -6
- data/spec/spec/example/nested_example_group_spec.rb +12 -0
- data/spec/spec/example/predicate_matcher_spec.rb +0 -0
- data/spec/spec/expectations/differs/default_spec.rb +27 -9
- data/spec/spec/matchers/be_spec.rb +24 -0
- data/spec/spec/matchers/has_spec.rb +16 -0
- data/spec/spec/matchers/raise_error_spec.rb +124 -0
- data/spec/spec/mocks/{bug_report_10263.rb → bug_report_10263_spec.rb} +0 -0
- data/spec/spec/mocks/bug_report_11545_spec.rb +2 -0
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +8 -0
- data/spec/spec/mocks/hash_including_matcher_spec.rb +32 -0
- data/spec/spec/mocks/mock_spec.rb +56 -37
- data/spec/spec/mocks/partial_mock_spec.rb +41 -5
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
- data/spec/spec/runner/execution_context_spec.rb +7 -1
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +3 -2
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +30 -25
- data/spec/spec/runner/formatter/html_formatter_spec.rb +0 -3
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +333 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +12 -2
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +2 -2
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +110 -78
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +105 -1
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +33 -28
- data/spec/spec/runner/option_parser_spec.rb +65 -49
- data/spec/spec/runner/options_spec.rb +103 -17
- data/spec/spec/runner/reporter_spec.rb +10 -7
- data/spec/spec/runner/spec_drb.opts +1 -0
- data/spec/spec/runner/spec_parser_spec.rb +10 -4
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +14 -13
- data/spec/spec/story/runner/scenario_runner_spec.rb +124 -52
- data/spec/spec/story/runner/story_mediator_spec.rb +2 -2
- data/spec/spec/story/runner/story_runner_spec.rb +40 -2
- data/spec/spec/story/runner_spec.rb +59 -72
- data/spec/spec/story/step_spec.rb +20 -1
- data/spec/spec/story/story_spec.rb +2 -2
- data/stories/all.rb +1 -1
- data/stories/example_groups/stories.rb +4 -3
- data/stories/mock_framework_integration/stories.rb +7 -0
- data/stories/mock_framework_integration/use_flexmock.story +9 -0
- data/stories/resources/spec/spec_with_flexmock.rb +18 -0
- metadata +21 -18
- data/pre_commit/lib/pre_commit.rb +0 -4
- data/pre_commit/lib/pre_commit/core.rb +0 -50
- data/pre_commit/lib/pre_commit/pre_commit.rb +0 -54
- data/pre_commit/lib/pre_commit/rspec.rb +0 -111
- data/pre_commit/lib/pre_commit/rspec_on_rails.rb +0 -313
- data/pre_commit/spec/pre_commit/pre_commit_spec.rb +0 -15
- data/pre_commit/spec/pre_commit/rspec_on_rails_spec.rb +0 -36
- data/pre_commit/spec/spec_helper.rb +0 -3
- data/pre_commit/spec/spec_suite.rb +0 -11
data/lib/spec/mocks.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'spec/mocks/framework'
|
1
2
|
require 'spec/mocks/methods'
|
2
3
|
require 'spec/mocks/argument_constraint_matchers'
|
3
4
|
require 'spec/mocks/spec_methods'
|
@@ -11,7 +12,6 @@ require 'spec/mocks/error_generator'
|
|
11
12
|
require 'spec/mocks/extensions/object'
|
12
13
|
require 'spec/mocks/space'
|
13
14
|
|
14
|
-
|
15
15
|
module Spec
|
16
16
|
# == Mocks and Stubs
|
17
17
|
#
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spec
|
2
2
|
module Mocks
|
3
3
|
module ArgumentConstraintMatchers
|
4
|
-
|
4
|
+
|
5
5
|
# Shortcut for creating an instance of Spec::Mocks::DuckTypeArgConstraint
|
6
6
|
def duck_type(*args)
|
7
7
|
DuckTypeArgConstraint.new(*args)
|
@@ -19,6 +19,10 @@ module Spec
|
|
19
19
|
BooleanArgConstraint.new(nil)
|
20
20
|
end
|
21
21
|
|
22
|
+
def hash_including(expected={})
|
23
|
+
HashIncludingConstraint.new(expected)
|
24
|
+
end
|
25
|
+
|
22
26
|
def no_args
|
23
27
|
NoArgsConstraint.new
|
24
28
|
end
|
@@ -108,6 +108,32 @@ module Spec
|
|
108
108
|
"duck_type"
|
109
109
|
end
|
110
110
|
end
|
111
|
+
|
112
|
+
class HashIncludingConstraint
|
113
|
+
def initialize(expected)
|
114
|
+
@expected = expected
|
115
|
+
end
|
116
|
+
|
117
|
+
def ==(actual)
|
118
|
+
@expected.each do | key, value |
|
119
|
+
# check key for case that value evaluates to nil
|
120
|
+
return false unless actual.has_key?(key) && actual[key] == value
|
121
|
+
end
|
122
|
+
true
|
123
|
+
rescue NoMethodError => ex
|
124
|
+
return false
|
125
|
+
end
|
126
|
+
|
127
|
+
def matches?(value)
|
128
|
+
self == value
|
129
|
+
end
|
130
|
+
|
131
|
+
def description
|
132
|
+
"hash_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
111
137
|
|
112
138
|
class ArgumentExpectation
|
113
139
|
attr_reader :args
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spec/mocks/extensions/object'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Require everything except the global extensions of class and object. This
|
2
|
+
# supports wrapping rspec's mocking functionality without invading every
|
3
|
+
# object in the system.
|
4
|
+
|
5
|
+
require 'spec/mocks/methods'
|
6
|
+
require 'spec/mocks/argument_constraint_matchers'
|
7
|
+
require 'spec/mocks/spec_methods'
|
8
|
+
require 'spec/mocks/proxy'
|
9
|
+
require 'spec/mocks/mock'
|
10
|
+
require 'spec/mocks/argument_expectation'
|
11
|
+
require 'spec/mocks/message_expectation'
|
12
|
+
require 'spec/mocks/order_group'
|
13
|
+
require 'spec/mocks/errors'
|
14
|
+
require 'spec/mocks/error_generator'
|
15
|
+
require 'spec/mocks/space'
|
@@ -72,12 +72,18 @@ module Spec
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def invoke(args, block)
|
75
|
+
if @expected_received_count == 0
|
76
|
+
@actual_received_count += 1
|
77
|
+
@error_generator.raise_expectation_error @sym, @expected_received_count, @actual_received_count, *args
|
78
|
+
end
|
79
|
+
|
75
80
|
@order_group.handle_order_constraint self
|
76
81
|
|
77
82
|
begin
|
78
83
|
Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
|
79
84
|
Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
|
80
85
|
|
86
|
+
|
81
87
|
if !@method_block.nil?
|
82
88
|
default_return_val = invoke_method_block(args)
|
83
89
|
elsif @args_to_yield.size > 0
|
@@ -112,12 +118,14 @@ module Spec
|
|
112
118
|
if block.nil?
|
113
119
|
@error_generator.raise_missing_block_error @args_to_yield
|
114
120
|
end
|
121
|
+
value = nil
|
115
122
|
@args_to_yield.each do |args_to_yield_this_time|
|
116
123
|
if block.arity > -1 && args_to_yield_this_time.length != block.arity
|
117
124
|
@error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
|
118
125
|
end
|
119
|
-
block.call(*args_to_yield_this_time)
|
126
|
+
value = block.call(*args_to_yield_this_time)
|
120
127
|
end
|
128
|
+
value
|
121
129
|
end
|
122
130
|
|
123
131
|
def invoke_consecutive_return_block(args, block)
|
@@ -147,9 +155,8 @@ module Spec
|
|
147
155
|
@sym == sym and not @args_expectation.check_args(args)
|
148
156
|
end
|
149
157
|
|
150
|
-
def verify_messages_received
|
151
|
-
return if
|
152
|
-
matches_at_least_count? || matches_at_most_count?
|
158
|
+
def verify_messages_received
|
159
|
+
return if expected_messages_received?
|
153
160
|
|
154
161
|
generate_error
|
155
162
|
rescue Spec::Mocks::MockExpectationError => error
|
@@ -157,6 +164,11 @@ module Spec
|
|
157
164
|
Kernel::raise error
|
158
165
|
end
|
159
166
|
|
167
|
+
def expected_messages_received?
|
168
|
+
ignoring_args? || matches_exact_count? ||
|
169
|
+
matches_at_least_count? || matches_at_most_count?
|
170
|
+
end
|
171
|
+
|
160
172
|
def ignoring_args?
|
161
173
|
@expected_received_count == :any
|
162
174
|
end
|
@@ -173,8 +185,20 @@ module Spec
|
|
173
185
|
@expected_received_count == @actual_received_count
|
174
186
|
end
|
175
187
|
|
188
|
+
def similar_messages
|
189
|
+
@similar_messages ||= []
|
190
|
+
end
|
191
|
+
|
192
|
+
def advise(args, block)
|
193
|
+
similar_messages << args
|
194
|
+
end
|
195
|
+
|
176
196
|
def generate_error
|
177
|
-
|
197
|
+
if similar_messages.empty?
|
198
|
+
@error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
|
199
|
+
else
|
200
|
+
@error_generator.raise_unexpected_message_args_error(self, *@similar_messages.first)
|
201
|
+
end
|
178
202
|
end
|
179
203
|
|
180
204
|
def with(*args, &block)
|
data/lib/spec/mocks/mock.rb
CHANGED
@@ -3,19 +3,21 @@ module Spec
|
|
3
3
|
class Mock
|
4
4
|
include Methods
|
5
5
|
|
6
|
-
# Creates a new mock with a +name+ (that will be used in error messages
|
7
|
-
# == Options:
|
8
|
-
# * <tt>:null_object</tt> - if true, the mock object acts as a forgiving
|
6
|
+
# Creates a new mock with a +name+ (that will be used in error messages
|
7
|
+
# only) == Options:
|
8
|
+
# * <tt>:null_object</tt> - if true, the mock object acts as a forgiving
|
9
|
+
# null object allowing any message to be sent to it.
|
9
10
|
def initialize(name, stubs_and_options={})
|
10
11
|
@name = name
|
11
12
|
@options = parse_options(stubs_and_options)
|
12
13
|
assign_stubs(stubs_and_options)
|
13
14
|
end
|
14
15
|
|
15
|
-
# This allows for comparing the mock to other objects that proxy
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# This is an unfortunate side effect from ActiveRecord, but this should
|
16
|
+
# This allows for comparing the mock to other objects that proxy such as
|
17
|
+
# ActiveRecords belongs_to proxy objects By making the other object run
|
18
|
+
# the comparison, we're sure the call gets delegated to the proxy target
|
19
|
+
# This is an unfortunate side effect from ActiveRecord, but this should
|
20
|
+
# be safe unless the RHS redefines == in a nonsensical manner
|
19
21
|
def ==(other)
|
20
22
|
other == __mock_proxy
|
21
23
|
end
|
data/lib/spec/mocks/proxy.rb
CHANGED
@@ -63,10 +63,14 @@ module Spec
|
|
63
63
|
def message_received(sym, *args, &block)
|
64
64
|
if expectation = find_matching_expectation(sym, *args)
|
65
65
|
expectation.invoke(args, block)
|
66
|
-
elsif stub = find_matching_method_stub(sym, *args)
|
66
|
+
elsif (stub = find_matching_method_stub(sym, *args))
|
67
|
+
if expectation = find_almost_matching_expectation(sym, *args)
|
68
|
+
expectation.advise(args, block) unless expectation.expected_messages_received?
|
69
|
+
end
|
67
70
|
stub.invoke([], block)
|
68
71
|
elsif expectation = find_almost_matching_expectation(sym, *args)
|
69
|
-
|
72
|
+
expectation.advise(args, block) if null_object? unless expectation.expected_messages_received?
|
73
|
+
raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(sym) or null_object?)
|
70
74
|
else
|
71
75
|
@target.send :method_missing, sym, *args, &block
|
72
76
|
end
|
@@ -88,18 +92,20 @@ module Spec
|
|
88
92
|
end
|
89
93
|
|
90
94
|
def define_expected_method(sym)
|
91
|
-
|
95
|
+
visibility_string = "#{visibility(sym)} :#{sym}"
|
96
|
+
if target_responds_to?(sym) && !target_metaclass.method_defined?(munge(sym))
|
92
97
|
munged_sym = munge(sym)
|
93
|
-
|
98
|
+
target_metaclass.instance_eval do
|
94
99
|
alias_method munged_sym, sym if method_defined?(sym.to_s)
|
95
100
|
end
|
96
101
|
@proxied_methods << sym
|
97
102
|
end
|
98
103
|
|
99
|
-
|
104
|
+
target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__)
|
100
105
|
def #{sym}(*args, &block)
|
101
106
|
__mock_proxy.message_received :#{sym}, *args, &block
|
102
107
|
end
|
108
|
+
#{visibility_string}
|
103
109
|
EOF
|
104
110
|
end
|
105
111
|
|
@@ -109,6 +115,18 @@ module Spec
|
|
109
115
|
return @target.respond_to?(sym)
|
110
116
|
end
|
111
117
|
|
118
|
+
def visibility(sym)
|
119
|
+
if Mock === @target
|
120
|
+
'public'
|
121
|
+
elsif target_metaclass.private_method_defined?(sym)
|
122
|
+
'private'
|
123
|
+
elsif target_metaclass.protected_method_defined?(sym)
|
124
|
+
'protected'
|
125
|
+
else
|
126
|
+
'public'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
112
130
|
def munge(sym)
|
113
131
|
"proxied_by_rspec__#{sym.to_s}".to_sym
|
114
132
|
end
|
@@ -125,12 +143,8 @@ module Spec
|
|
125
143
|
@proxied_methods.clear
|
126
144
|
end
|
127
145
|
|
128
|
-
def
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
def metaclass
|
133
|
-
(class << @target; self; end)
|
146
|
+
def target_metaclass
|
147
|
+
class << @target; self; end
|
134
148
|
end
|
135
149
|
|
136
150
|
def verify_expectations
|
@@ -142,7 +156,7 @@ module Spec
|
|
142
156
|
def reset_proxied_methods
|
143
157
|
@proxied_methods.each do |sym|
|
144
158
|
munged_sym = munge(sym)
|
145
|
-
|
159
|
+
target_metaclass.instance_eval do
|
146
160
|
if method_defined?(munged_sym.to_s)
|
147
161
|
alias_method sym, munged_sym
|
148
162
|
undef_method munged_sym
|
data/lib/spec/rake/spectask.rb
CHANGED
@@ -11,7 +11,7 @@ module Spec
|
|
11
11
|
# A Rake task that runs a set of specs.
|
12
12
|
#
|
13
13
|
# Example:
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# Spec::Rake::SpecTask.new do |t|
|
16
16
|
# t.warning = true
|
17
17
|
# t.rcov = true
|
@@ -87,7 +87,7 @@ module Spec
|
|
87
87
|
# Whether or not to use RCov (default is false)
|
88
88
|
# See http://eigenclass.org/hiki.rb?rcov
|
89
89
|
attr_accessor :rcov
|
90
|
-
|
90
|
+
|
91
91
|
# Array of commandline options to pass to RCov. Defaults to ['--exclude', 'lib\/spec,bin\/spec'].
|
92
92
|
# Ignored if rcov=false
|
93
93
|
# Setting the RCOV_OPTS environment variable overrides this.
|
@@ -117,7 +117,7 @@ module Spec
|
|
117
117
|
# used, then the list of spec files is the union of the two.
|
118
118
|
# Setting the SPEC environment variable overrides this.
|
119
119
|
attr_accessor :spec_files
|
120
|
-
|
120
|
+
|
121
121
|
# Use verbose output. If this is set to true, the task will print
|
122
122
|
# the executed spec command to stdout. Defaults to false.
|
123
123
|
attr_accessor :verbose
|
@@ -155,7 +155,7 @@ 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
|
-
cmd = "
|
158
|
+
cmd = "#{File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])} "
|
159
159
|
|
160
160
|
rb_opts = ruby_opts.clone
|
161
161
|
rb_opts << "-I\"#{lib_path}\""
|
@@ -210,7 +210,7 @@ module Spec
|
|
210
210
|
STDERR.puts "RSPECOPTS is DEPRECATED and will be removed in a future version. Use SPEC_OPTS instead." if ENV['RSPECOPTS']
|
211
211
|
ENV['SPEC_OPTS'] || ENV['RSPECOPTS'] || spec_opts.join(" ") || ""
|
212
212
|
end
|
213
|
-
|
213
|
+
|
214
214
|
def evaluate(o) # :nodoc:
|
215
215
|
case o
|
216
216
|
when Proc then o.call
|
@@ -19,8 +19,7 @@ module Spec
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# This method is invoked at the beginning of the execution of each example_group.
|
22
|
-
# +
|
23
|
-
# first example_group - otherwise it's false.
|
22
|
+
# +example_group+ is the example_group.
|
24
23
|
#
|
25
24
|
# The next method to be invoked after this is #example_failed or #example_finished
|
26
25
|
def add_example_group(example_group)
|
@@ -46,7 +45,7 @@ module Spec
|
|
46
45
|
# been provided a block), or when an ExamplePendingError is raised.
|
47
46
|
# +message+ is the message from the ExamplePendingError, if it exists, or the
|
48
47
|
# default value of "Not Yet Implemented"
|
49
|
-
def example_pending(
|
48
|
+
def example_pending(example, message)
|
50
49
|
end
|
51
50
|
|
52
51
|
# This method is invoked after all of the examples have executed. The next method
|
@@ -26,8 +26,8 @@ module Spec
|
|
26
26
|
@pending_examples = []
|
27
27
|
end
|
28
28
|
|
29
|
-
def example_pending(
|
30
|
-
@pending_examples << [
|
29
|
+
def example_pending(example, message)
|
30
|
+
@pending_examples << [example.__full_description, message]
|
31
31
|
end
|
32
32
|
|
33
33
|
def dump_failure(counter, failure)
|
@@ -4,19 +4,15 @@ module Spec
|
|
4
4
|
module Runner
|
5
5
|
module Formatter
|
6
6
|
class FailingExampleGroupsFormatter < BaseTextFormatter
|
7
|
-
def add_example_group(example_group)
|
8
|
-
super
|
9
|
-
@example_group_description_parts = example_group.description_parts
|
10
|
-
end
|
11
|
-
|
12
7
|
def example_failed(example, counter, failure)
|
13
|
-
if @
|
14
|
-
description_parts = @
|
8
|
+
if @example_group
|
9
|
+
description_parts = @example_group.description_parts.collect do |description|
|
15
10
|
description =~ /(.*) \(druby.*\)$/ ? $1 : description
|
16
11
|
end
|
17
12
|
@output.puts ::Spec::Example::ExampleGroupMethods.description_text(*description_parts)
|
13
|
+
|
18
14
|
@output.flush
|
19
|
-
@
|
15
|
+
@example_group = nil
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
@@ -9,18 +9,22 @@ module Spec
|
|
9
9
|
|
10
10
|
def initialize(options, output)
|
11
11
|
super
|
12
|
-
@
|
13
|
-
@
|
12
|
+
@example_group_number = 0
|
13
|
+
@example_number = 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(sym, *args)
|
17
|
+
# no-op
|
14
18
|
end
|
15
19
|
|
16
20
|
# The number of the currently running example_group
|
17
|
-
def
|
18
|
-
@
|
21
|
+
def example_group_number
|
22
|
+
@example_group_number
|
19
23
|
end
|
20
24
|
|
21
25
|
# The number of the currently running example (a global counter)
|
22
|
-
def
|
23
|
-
@
|
26
|
+
def example_number
|
27
|
+
@example_number
|
24
28
|
end
|
25
29
|
|
26
30
|
def start(example_count)
|
@@ -35,14 +39,14 @@ module Spec
|
|
35
39
|
super
|
36
40
|
@example_group_red = false
|
37
41
|
@example_group_red = false
|
38
|
-
@
|
39
|
-
unless
|
42
|
+
@example_group_number += 1
|
43
|
+
unless example_group_number == 1
|
40
44
|
@output.puts " </dl>"
|
41
45
|
@output.puts "</div>"
|
42
46
|
end
|
43
47
|
@output.puts "<div class=\"example_group\">"
|
44
48
|
@output.puts " <dl>"
|
45
|
-
@output.puts " <dt id=\"example_group_#{
|
49
|
+
@output.puts " <dt id=\"example_group_#{example_group_number}\">#{h(example_group.description)}</dt>"
|
46
50
|
@output.flush
|
47
51
|
end
|
48
52
|
|
@@ -53,7 +57,7 @@ module Spec
|
|
53
57
|
end
|
54
58
|
|
55
59
|
def example_started(example)
|
56
|
-
@
|
60
|
+
@example_number += 1
|
57
61
|
end
|
58
62
|
|
59
63
|
def example_passed(example)
|
@@ -67,7 +71,7 @@ module Spec
|
|
67
71
|
failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
|
68
72
|
@output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>" unless @header_red
|
69
73
|
@header_red = true
|
70
|
-
@output.puts " <script type=\"text/javascript\">makeRed('example_group_#{
|
74
|
+
@output.puts " <script type=\"text/javascript\">makeRed('example_group_#{example_group_number}');</script>" unless @example_group_red
|
71
75
|
@example_group_red = true
|
72
76
|
move_progress
|
73
77
|
@output.puts " <dd class=\"spec #{failure_style}\">"
|
@@ -81,9 +85,9 @@ module Spec
|
|
81
85
|
@output.flush
|
82
86
|
end
|
83
87
|
|
84
|
-
def example_pending(
|
88
|
+
def example_pending(example, message)
|
85
89
|
@output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>" unless @header_red
|
86
|
-
@output.puts " <script type=\"text/javascript\">makeYellow('example_group_#{
|
90
|
+
@output.puts " <script type=\"text/javascript\">makeYellow('example_group_#{example_group_number}');</script>" unless @example_group_red
|
87
91
|
move_progress
|
88
92
|
@output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{h(example.description)} (PENDING: #{h(message)})</span></dd>"
|
89
93
|
@output.flush
|
@@ -106,7 +110,7 @@ module Spec
|
|
106
110
|
def percent_done
|
107
111
|
result = 100.0
|
108
112
|
if @example_count != 0
|
109
|
-
result = ((
|
113
|
+
result = ((example_number).to_f / @example_count.to_f * 1000).to_i / 10.0
|
110
114
|
end
|
111
115
|
result
|
112
116
|
end
|