rspec 1.1.3 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|