rspec 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
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