rspec 1.2.2 → 1.2.3

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.
Files changed (138) hide show
  1. data/History.rdoc +31 -1
  2. data/Manifest.txt +14 -12
  3. data/Rakefile +1 -1
  4. data/Upgrade.rdoc +43 -3
  5. data/examples/failing/failing_implicit_docstrings_example.rb +5 -5
  6. data/examples/passing/implicit_docstrings_example.rb +3 -3
  7. data/features/before_and_after_blocks/before_and_after_blocks.feature +20 -21
  8. data/features/example_groups/example_group_with_should_methods.feature +20 -8
  9. data/features/example_groups/implicit_docstrings.feature +36 -20
  10. data/features/example_groups/nested_groups.feature +25 -10
  11. data/features/extensions/custom_example_group.feature +19 -0
  12. data/features/formatters/custom_formatter.feature +30 -0
  13. data/features/heckle/heckle.feature +7 -7
  14. data/features/interop/examples_and_tests_together.feature +63 -14
  15. data/features/interop/rspec_output.feature +25 -0
  16. data/features/interop/test_but_not_test_unit.feature +19 -7
  17. data/features/interop/test_case_with_should_methods.feature +37 -8
  18. data/features/matchers/{create_matcher.feature → define_matcher.feature} +54 -30
  19. data/features/matchers/{create_matcher_outside_rspec.feature → define_matcher_outside_rspec.feature} +7 -7
  20. data/features/mock_framework_integration/use_flexmock.feature +3 -3
  21. data/features/mock_framework_integration/use_mocha.feature +3 -3
  22. data/features/mock_framework_integration/use_rr.feature +3 -3
  23. data/features/mocks/mix_stubs_and_mocks.feature +4 -4
  24. data/features/pending/pending_examples.feature +18 -18
  25. data/features/runner/specify_line_number.feature +32 -0
  26. data/features/step_definitions/running_rspec_steps.rb +41 -0
  27. data/features/subject/explicit_subject.feature +4 -4
  28. data/features/subject/implicit_subject.feature +4 -4
  29. data/features/support/env.rb +64 -11
  30. data/features/support/matchers/smart_match.rb +10 -35
  31. data/lib/spec.rb +1 -0
  32. data/lib/spec/deprecation.rb +40 -0
  33. data/lib/spec/dsl/main.rb +10 -5
  34. data/lib/spec/example.rb +1 -27
  35. data/lib/spec/example/args_and_options.rb +27 -0
  36. data/lib/spec/example/before_and_after_hooks.rb +30 -21
  37. data/lib/spec/example/errors.rb +8 -18
  38. data/lib/spec/example/example_group_factory.rb +0 -4
  39. data/lib/spec/example/example_group_methods.rb +27 -41
  40. data/lib/spec/example/example_group_proxy.rb +12 -22
  41. data/lib/spec/example/example_methods.rb +8 -18
  42. data/lib/spec/example/example_proxy.rb +4 -4
  43. data/lib/spec/example/pending.rb +3 -4
  44. data/lib/spec/example/predicate_matchers.rb +1 -1
  45. data/lib/spec/example/subject.rb +2 -0
  46. data/lib/spec/expectations.rb +1 -26
  47. data/lib/spec/expectations/extensions.rb +1 -1
  48. data/lib/spec/expectations/extensions/kernel.rb +52 -0
  49. data/lib/spec/expectations/handler.rb +21 -10
  50. data/lib/spec/matchers/be.rb +3 -3
  51. data/lib/spec/matchers/be_close.rb +17 -21
  52. data/lib/spec/matchers/be_instance_of.rb +7 -26
  53. data/lib/spec/matchers/be_kind_of.rb +7 -26
  54. data/lib/spec/matchers/dsl.rb +9 -4
  55. data/lib/spec/matchers/eql.rb +24 -25
  56. data/lib/spec/matchers/equal.rb +25 -25
  57. data/lib/spec/matchers/exist.rb +5 -21
  58. data/lib/spec/matchers/include.rb +22 -44
  59. data/lib/spec/matchers/match.rb +5 -25
  60. data/lib/spec/matchers/match_array.rb +8 -4
  61. data/lib/spec/matchers/matcher.rb +13 -2
  62. data/lib/spec/matchers/pretty.rb +1 -0
  63. data/lib/spec/matchers/simple_matcher.rb +2 -2
  64. data/lib/spec/mocks/mock.rb +10 -10
  65. data/lib/spec/mocks/spec_methods.rb +1 -1
  66. data/lib/spec/runner/configuration.rb +53 -42
  67. data/lib/spec/{expectations → runner}/differs/default.rb +0 -0
  68. data/lib/spec/{expectations → runner}/differs/load-diff-lcs.rb +0 -0
  69. data/lib/spec/runner/drb_command_line.rb +1 -1
  70. data/lib/spec/runner/example_group_runner.rb +0 -12
  71. data/lib/spec/runner/formatter/base_formatter.rb +77 -30
  72. data/lib/spec/runner/formatter/base_text_formatter.rb +19 -24
  73. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +1 -1
  74. data/lib/spec/runner/formatter/html_formatter.rb +4 -6
  75. data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
  76. data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
  77. data/lib/spec/runner/formatter/profile_formatter.rb +0 -4
  78. data/lib/spec/runner/formatter/progress_bar_formatter.rb +4 -5
  79. data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
  80. data/lib/spec/runner/formatter/specdoc_formatter.rb +2 -2
  81. data/lib/spec/runner/option_parser.rb +14 -7
  82. data/lib/spec/runner/options.rb +17 -7
  83. data/lib/spec/runner/reporter.rb +69 -64
  84. data/lib/spec/version.rb +1 -1
  85. data/spec/spec/dsl/main_spec.rb +7 -0
  86. data/spec/spec/example/example_group_methods_spec.rb +16 -32
  87. data/spec/spec/example/example_group_proxy_spec.rb +25 -5
  88. data/spec/spec/example/example_group_spec.rb +2 -2
  89. data/spec/spec/example/example_methods_spec.rb +19 -24
  90. data/spec/spec/example/example_proxy_spec.rb +11 -1
  91. data/spec/spec/example/pending_module_spec.rb +2 -108
  92. data/spec/spec/example/predicate_matcher_spec.rb +23 -3
  93. data/spec/spec/expectations/extensions/object_spec.rb +9 -9
  94. data/spec/spec/expectations/fail_with_spec.rb +13 -13
  95. data/spec/spec/expectations/handler_spec.rb +44 -15
  96. data/spec/spec/matchers/be_close_spec.rb +9 -0
  97. data/spec/spec/matchers/be_instance_of_spec.rb +6 -4
  98. data/spec/spec/matchers/be_kind_of_spec.rb +5 -3
  99. data/spec/spec/matchers/be_spec.rb +1 -5
  100. data/spec/spec/matchers/compatibility_spec.rb +1 -1
  101. data/spec/spec/matchers/dsl_spec.rb +10 -1
  102. data/spec/spec/matchers/eql_spec.rb +8 -4
  103. data/spec/spec/matchers/equal_spec.rb +8 -4
  104. data/spec/spec/matchers/exist_spec.rb +1 -1
  105. data/spec/spec/matchers/include_spec.rb +1 -1
  106. data/spec/spec/matchers/match_array_spec.rb +26 -1
  107. data/spec/spec/matchers/match_spec.rb +2 -2
  108. data/spec/spec/matchers/matcher_methods_spec.rb +0 -3
  109. data/spec/spec/matchers/matcher_spec.rb +53 -0
  110. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  111. data/spec/spec/mocks/mock_spec.rb +6 -0
  112. data/spec/spec/runner/configuration_spec.rb +11 -1
  113. data/spec/spec/runner/drb_command_line_spec.rb +13 -1
  114. data/spec/spec/runner/example_group_runner_spec.rb +0 -7
  115. data/spec/spec/runner/formatter/base_formatter_spec.rb +19 -12
  116. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +2 -2
  117. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +4 -4
  118. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +2 -2
  119. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +31 -34
  120. data/spec/spec/runner/formatter/html_formatter_spec.rb +20 -0
  121. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +20 -20
  122. data/spec/spec/runner/formatter/profile_formatter_spec.rb +22 -3
  123. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +24 -3
  124. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +6 -6
  125. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +25 -28
  126. data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +2 -2
  127. data/spec/spec/runner/option_parser_spec.rb +108 -40
  128. data/spec/spec/runner/reporter_spec.rb +16 -17
  129. data/spec/spec_helper.rb +4 -1
  130. metadata +20 -18
  131. data/features/example_groups/output.feature +0 -20
  132. data/features/step_definitions/running_rspec.rb +0 -69
  133. data/lib/spec/expectations/extensions/object.rb +0 -63
  134. data/resources/spec/example_group_with_should_methods.rb +0 -12
  135. data/resources/spec/simple_spec.rb +0 -8
  136. data/resources/test/spec_and_test_together.rb +0 -56
  137. data/resources/test/spec_including_test_but_not_unit.rb +0 -11
  138. data/resources/test/test_case_with_should_methods.rb +0 -29
@@ -9,7 +9,7 @@ module Spec
9
9
  @last_nested_descriptions = []
10
10
  end
11
11
 
12
- def add_example_group(example_group)
12
+ def example_group_started(example_group)
13
13
  super
14
14
 
15
15
  example_group.nested_descriptions.each_with_index do |nested_description, i|
@@ -32,7 +32,7 @@ module Spec
32
32
  output.flush
33
33
  end
34
34
 
35
- def example_pending(example, message, pending_caller)
35
+ def example_pending(example, message, deprecated_pending_location=nil)
36
36
  super
37
37
  output.puts yellow("#{current_indentation}#{example.description} (PENDING: #{message})")
38
38
  output.flush
@@ -0,0 +1,21 @@
1
+ module Spec
2
+ module Runner
3
+ module Formatter
4
+ module NOOPMethodMissing
5
+ def respond_to?(message, include_private = false)
6
+ if include_private
7
+ true
8
+ else
9
+ !private_methods.include?(message.to_s)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def method_missing(sym, *args)
16
+ # a no-op
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -41,10 +41,6 @@ module Spec
41
41
  end
42
42
  @output.flush
43
43
  end
44
-
45
- def method_missing(sym, *args)
46
- # ignore
47
- end
48
44
  end
49
45
  end
50
46
  end
@@ -1,9 +1,12 @@
1
1
  require 'spec/runner/formatter/base_text_formatter'
2
+ require 'spec/runner/formatter/no_op_method_missing'
2
3
 
3
4
  module Spec
4
5
  module Runner
5
6
  module Formatter
6
7
  class ProgressBarFormatter < BaseTextFormatter
8
+ include NOOPMethodMissing
9
+
7
10
  def example_failed(example, counter, failure)
8
11
  @output.print colorize_failure('F', failure)
9
12
  @output.flush
@@ -14,7 +17,7 @@ module Spec
14
17
  @output.flush
15
18
  end
16
19
 
17
- def example_pending(example, message, pending_caller)
20
+ def example_pending(example, message, deprecated_pending_location=nil)
18
21
  super
19
22
  @output.print yellow('*')
20
23
  @output.flush
@@ -24,10 +27,6 @@ module Spec
24
27
  @output.puts
25
28
  @output.flush
26
29
  end
27
-
28
- def method_missing(sym, *args)
29
- # ignore
30
- end
31
30
  end
32
31
  end
33
32
  end
@@ -0,0 +1,10 @@
1
+ require 'spec/runner/formatter/base_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class SilentFormatter < BaseFormatter
7
+ end
8
+ end
9
+ end
10
+ end
@@ -4,7 +4,7 @@ module Spec
4
4
  module Runner
5
5
  module Formatter
6
6
  class SpecdocFormatter < BaseTextFormatter
7
- def add_example_group(example_group)
7
+ def example_group_started(example_group)
8
8
  super
9
9
  output.puts
10
10
  output.puts example_group.description
@@ -22,7 +22,7 @@ module Spec
22
22
  output.flush
23
23
  end
24
24
 
25
- def example_pending(example, message, pending_caller)
25
+ def example_pending(example, message, deprecated_pending_location=nil)
26
26
  super
27
27
  output.puts yellow("- #{example.description} (PENDING: #{message})")
28
28
  output.flush
@@ -31,7 +31,7 @@ module Spec
31
31
  :example => ["-e", "--example [NAME|FILE_NAME]", "Execute example(s) with matching name(s). If the argument is",
32
32
  "the path to an existing file (typically generated by a previous",
33
33
  "run using --format failing_examples:file.txt), then the examples",
34
- "on each line of thatfile will be executed. If the file is empty,",
34
+ "on each line of that file will be executed. If the file is empty,",
35
35
  "all examples will be run (as if --example was not specified).",
36
36
  " ",
37
37
  "If the argument is not an existing file, then it is treated as",
@@ -92,7 +92,7 @@ module Spec
92
92
 
93
93
  @file_factory = File
94
94
 
95
- self.banner = "Usage: spec (FILE|DIRECTORY|GLOB)+ [options]"
95
+ self.banner = "Usage: spec (FILE(:LINE)?|DIRECTORY|GLOB)+ [options]"
96
96
  self.separator ""
97
97
  on(*OPTIONS[:pattern]) {|pattern| @options.filename_pattern = pattern}
98
98
  on(*OPTIONS[:diff]) {|diff| @options.parse_diff(diff)}
@@ -130,6 +130,11 @@ module Spec
130
130
  return if parse_drb
131
131
 
132
132
  super(@argv) do |file|
133
+ if file =~ /^(.+):(\d+)$/
134
+ file = $1
135
+ @options.line_number = $2.to_i
136
+ end
137
+
133
138
  @options.files << file
134
139
  blk.call(file) if blk
135
140
  end
@@ -185,11 +190,13 @@ module Spec
185
190
  is_drb ||= argv.delete(OPTIONS[:drb][0])
186
191
  is_drb ||= argv.delete(OPTIONS[:drb][1])
187
192
  return false unless is_drb
188
- @options.examples_should_not_be_run
189
- DrbCommandLine.run(
190
- self.class.parse(argv, @error_stream, @out_stream)
191
- )
192
- true
193
+ if DrbCommandLine.run(self.class.parse(argv, @error_stream, @out_stream))
194
+ @options.examples_should_not_be_run
195
+ true
196
+ else
197
+ @error_stream.puts "Running specs locally:"
198
+ false
199
+ end
193
200
  end
194
201
 
195
202
  def parse_version
@@ -1,3 +1,5 @@
1
+ require 'ostruct'
2
+
1
3
  module Spec
2
4
  module Runner
3
5
  class Options
@@ -6,8 +8,8 @@ module Spec
6
8
  }
7
9
 
8
10
  EXAMPLE_FORMATTERS = { # Load these lazily for better speed
9
- 'silent' => ['spec/runner/formatter/base_formatter', 'Formatter::BaseFormatter'],
10
- 'l' => ['spec/runner/formatter/base_formatter', 'Formatter::BaseFormatter'],
11
+ 'silent' => ['spec/runner/formatter/silent_formatter', 'Formatter::SilentFormatter'],
12
+ 'l' => ['spec/runner/formatter/silent_formatter', 'Formatter::SilentFormatter'],
11
13
  'specdoc' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'],
12
14
  's' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'],
13
15
  'nested' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'],
@@ -208,9 +210,17 @@ module Spec
208
210
  else
209
211
  load_class(format, 'formatter', '--format')
210
212
  end
211
- formatter_type.new(self, where)
213
+ formatter_type.new(formatter_options, where)
212
214
  end
213
215
  end
216
+
217
+ def formatter_options
218
+ @formatter_options ||= OpenStruct.new(
219
+ :colour => colour,
220
+ :autospec => autospec,
221
+ :dry_run => dry_run
222
+ )
223
+ end
214
224
 
215
225
  def load_heckle_runner(heckle)
216
226
  @format_options ||= [['silent', @output_stream]]
@@ -319,7 +329,7 @@ module Spec
319
329
  end
320
330
 
321
331
  def default_differ
322
- require 'spec/expectations/differs/default'
332
+ require 'spec/runner/differs/default'
323
333
  self.differ_class = ::Spec::Expectations::Differs::Default
324
334
  end
325
335
 
@@ -327,18 +337,18 @@ module Spec
327
337
  if examples.empty?
328
338
  if files.length == 1
329
339
  if File.directory?(files[0])
330
- error_stream.puts "You must specify one file, not a directory when using the --line option"
340
+ error_stream.puts "You must specify one file, not a directory when providing a line number"
331
341
  exit(1) if stderr?
332
342
  else
333
343
  example = SpecParser.new(self).spec_name_for(files[0], line_number)
334
344
  @examples = [example]
335
345
  end
336
346
  else
337
- error_stream.puts "Only one file can be specified when using the --line option: #{files.inspect}"
347
+ error_stream.puts "Only one file can be specified when providing a line number: #{files.inspect}"
338
348
  exit(3) if stderr?
339
349
  end
340
350
  else
341
- error_stream.puts "You cannot use both --line and --example"
351
+ error_stream.puts "You cannot use --example and specify a line number"
342
352
  exit(4) if stderr?
343
353
  end
344
354
  end
@@ -1,19 +1,23 @@
1
1
  module Spec
2
2
  module Runner
3
3
  class Reporter
4
- attr_reader :options, :example_groups
4
+ attr_reader :options
5
5
 
6
6
  def initialize(options)
7
7
  @options = options
8
8
  @options.reporter = self
9
- clear
9
+ @failures = []
10
+ @pending_count = 0
11
+ @example_count = 0
12
+ @start_time = nil
13
+ @end_time = nil
10
14
  end
11
15
 
12
- def add_example_group(example_group)
16
+ def example_group_started(example_group)
17
+ @example_group = example_group
13
18
  formatters.each do |f|
14
- f.add_example_group(example_group)
19
+ f.example_group_started(example_group)
15
20
  end
16
- example_groups << example_group
17
21
  end
18
22
 
19
23
  def example_started(example)
@@ -21,12 +25,12 @@ module Spec
21
25
  end
22
26
 
23
27
  def example_finished(example, error=nil)
24
- @examples << example
28
+ @example_count += 1
25
29
 
26
30
  if error.nil?
27
31
  example_passed(example)
28
32
  elsif Spec::Example::ExamplePendingError === error
29
- example_pending(example, error.pending_caller, error.message)
33
+ example_pending(example, example.location, error.message)
30
34
  else
31
35
  example_failed(example, error)
32
36
  end
@@ -34,7 +38,7 @@ module Spec
34
38
 
35
39
  def example_failed(example, error)
36
40
  backtrace_tweaker.tweak_backtrace(error)
37
- failure = Failure.new(example_groups.empty? ? "" : example_groups.last.description, example, error)
41
+ failure = Failure.new(@example_group.description, example.description, error)
38
42
  @failures << failure
39
43
  formatters.each do |f|
40
44
  f.example_failed(example, @failures.length, failure)
@@ -42,7 +46,6 @@ module Spec
42
46
  end
43
47
 
44
48
  def start(number_of_examples)
45
- clear
46
49
  @start_time = Time.new
47
50
  formatters.each{|f| f.start(number_of_examples)}
48
51
  end
@@ -57,12 +60,51 @@ module Spec
57
60
  dump_pending
58
61
  dump_failures
59
62
  formatters.each do |f|
60
- f.dump_summary(duration, @examples.length, @failures.length, @pending_count)
63
+ f.dump_summary(duration, @example_count, @failures.length, @pending_count)
61
64
  f.close
62
65
  end
63
66
  @failures.length
64
67
  end
65
68
 
69
+ class Failure
70
+ def initialize(group_description, example_description, exception) # :nodoc:
71
+ @example_name = "#{group_description} #{example_description}"
72
+ @exception = exception
73
+ end
74
+
75
+ # The Exception object raised
76
+ attr_reader :exception
77
+
78
+ # Header messsage for reporting this failure, including the name of the
79
+ # example and an indicator of the type of failure. FAILED indicates a
80
+ # failed expectation. FIXED indicates a pending example that passes, and
81
+ # no longer needs to be pending. RuntimeError indicates that a
82
+ # RuntimeError occured.
83
+ #
84
+ # == Examples
85
+ #
86
+ # 'A new account should have a zero balance' FAILED
87
+ # 'A new account should have a zero balance' FIXED
88
+ # RuntimeError in 'A new account should have a zero balance'
89
+ def header
90
+ if expectation_not_met?
91
+ "'#{@example_name}' FAILED"
92
+ elsif pending_fixed?
93
+ "'#{@example_name}' FIXED"
94
+ else
95
+ "#{@exception.class.name} in '#{@example_name}'"
96
+ end
97
+ end
98
+
99
+ def pending_fixed? # :nodoc:
100
+ @exception.is_a?(Spec::Example::PendingExampleFixedError)
101
+ end
102
+
103
+ def expectation_not_met? # :nodoc:
104
+ @exception.is_a?(Spec::Expectations::ExpectationNotMetError)
105
+ end
106
+ end
107
+
66
108
  private
67
109
 
68
110
  def formatters
@@ -73,15 +115,6 @@ module Spec
73
115
  @options.backtrace_tweaker
74
116
  end
75
117
 
76
- def clear
77
- @example_groups = []
78
- @failures = []
79
- @pending_count = 0
80
- @examples = []
81
- @start_time = nil
82
- @end_time = nil
83
- end
84
-
85
118
  def dump_failures
86
119
  return if @failures.empty?
87
120
  @failures.inject(1) do |index, failure|
@@ -104,63 +137,35 @@ module Spec
104
137
  end
105
138
 
106
139
  EXAMPLE_PENDING_DEPRECATION_WARNING = <<-WARNING
107
- DEPRECATION NOTICE: RSpec's formatters have changed example_pending
108
- to accept three arguments instead of just two. Please see the rdoc
109
- for Spec::Runner::Formatter::BaseFormatter#example_pending
110
- for more information.
111
-
112
- Please update any custom formatters to accept the third argument
113
- to example_pending. Support for example_pending with two arguments
114
- and this warning message will be removed after the RSpec 1.1.5 release.
115
- WARNING
140
+
141
+ *********************************************************************
142
+ DEPRECATION WARNING: RSpec's formatters have changed example_pending
143
+ to accept two arguments instead of three. Please see the rdoc
144
+ for Spec::Runner::Formatter::BaseFormatter#example_pending
145
+ for more information.
146
+
147
+ Please update any custom formatters to accept only two arguments
148
+ to example_pending. Support for example_pending with two arguments
149
+ and this warning message will be removed after the RSpec 2.0 release.
150
+ *********************************************************************
151
+ WARNING
116
152
 
117
- def example_pending(example, pending_caller, message="Not Yet Implemented")
153
+ def example_pending(example, ignore, message="Not Yet Implemented")
118
154
  @pending_count += 1
119
155
  formatters.each do |formatter|
120
156
  if formatter_uses_deprecated_example_pending_method?(formatter)
121
- Kernel.warn EXAMPLE_PENDING_DEPRECATION_WARNING
122
- formatter.example_pending(example, message)
157
+ Spec.warn EXAMPLE_PENDING_DEPRECATION_WARNING
158
+ formatter.example_pending(example, message, example.location)
123
159
  else
124
- formatter.example_pending(example, message, pending_caller)
160
+ formatter.example_pending(example, message)
125
161
  end
126
162
  end
127
163
  end
128
164
 
129
165
  def formatter_uses_deprecated_example_pending_method?(formatter)
130
- formatter.method(:example_pending).arity == 2
166
+ formatter.method(:example_pending).arity == 3
131
167
  end
132
168
 
133
- class Failure
134
- attr_reader :example, :exception
135
-
136
- def initialize(group, example, exception)
137
- @group, @example, @exception = group, example, exception
138
- end
139
-
140
- def header
141
- if expectation_not_met?
142
- "'#{example_name}' FAILED"
143
- elsif pending_fixed?
144
- "'#{example_name}' FIXED"
145
- else
146
- "#{@exception.class.name} in '#{example_name}'"
147
- end
148
- end
149
-
150
- def pending_fixed?
151
- @exception.is_a?(Spec::Example::PendingExampleFixedError)
152
- end
153
-
154
- def expectation_not_met?
155
- @exception.is_a?(Spec::Expectations::ExpectationNotMetError)
156
- end
157
-
158
- protected
159
-
160
- def example_name
161
- "#{@group} #{@example.description}"
162
- end
163
- end
164
169
  end
165
170
  end
166
171
  end
@@ -3,7 +3,7 @@ module Spec # :nodoc:
3
3
  unless defined? MAJOR
4
4
  MAJOR = 1
5
5
  MINOR = 2
6
- TINY = 2
6
+ TINY = 3
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
9
9
 
@@ -16,6 +16,13 @@ module Spec
16
16
  )
17
17
  @main.__send__ method, "The ExampleGroup", &block
18
18
  end
19
+
20
+ it "raises with no description" do
21
+ block = lambda {|a,b|}
22
+ lambda do
23
+ @main.__send__ method, &block
24
+ end.should raise_error(ArgumentError, /No description supplied for example group declared on #{__FILE__}:#{__LINE__ - 1}/)
25
+ end
19
26
  end
20
27
  end
21
28