rspec 1.0.5 → 1.0.6

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 (87) hide show
  1. data/CHANGES +78 -1
  2. data/EXAMPLES.rd +8 -5
  3. data/README +1 -0
  4. data/Rakefile +1 -1
  5. data/examples/pending_example.rb +20 -0
  6. data/lib/autotest/rspec.rb +46 -18
  7. data/lib/spec/dsl.rb +1 -0
  8. data/lib/spec/dsl/behaviour.rb +37 -27
  9. data/lib/spec/dsl/behaviour_callbacks.rb +4 -0
  10. data/lib/spec/dsl/behaviour_eval.rb +27 -16
  11. data/lib/spec/dsl/behaviour_factory.rb +2 -2
  12. data/lib/spec/dsl/composite_proc_builder.rb +9 -4
  13. data/lib/spec/dsl/configuration.rb +20 -4
  14. data/lib/spec/dsl/description.rb +7 -0
  15. data/lib/spec/dsl/errors.rb +9 -0
  16. data/lib/spec/dsl/example.rb +18 -10
  17. data/lib/spec/matchers/have.rb +10 -13
  18. data/lib/spec/matchers/operator_matcher.rb +3 -3
  19. data/lib/spec/matchers/raise_error.rb +8 -3
  20. data/lib/spec/mocks/error_generator.rb +1 -1
  21. data/lib/spec/mocks/message_expectation.rb +11 -0
  22. data/lib/spec/mocks/methods.rb +9 -5
  23. data/lib/spec/mocks/proxy.rb +13 -9
  24. data/lib/spec/rake/spectask.rb +80 -38
  25. data/lib/spec/runner/backtrace_tweaker.rb +2 -1
  26. data/lib/spec/runner/behaviour_runner.rb +37 -16
  27. data/lib/spec/runner/formatter/base_formatter.rb +23 -15
  28. data/lib/spec/runner/formatter/base_text_formatter.rb +39 -11
  29. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +7 -3
  30. data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -3
  31. data/lib/spec/runner/formatter/html_formatter.rb +32 -25
  32. data/lib/spec/runner/formatter/progress_bar_formatter.rb +6 -5
  33. data/lib/spec/runner/formatter/rdoc_formatter.rb +6 -6
  34. data/lib/spec/runner/formatter/specdoc_formatter.rb +7 -6
  35. data/lib/spec/runner/option_parser.rb +6 -5
  36. data/lib/spec/runner/options.rb +60 -43
  37. data/lib/spec/runner/reporter.rb +17 -6
  38. data/lib/spec/runner/spec_parser.rb +1 -1
  39. data/lib/spec/translator.rb +8 -0
  40. data/lib/spec/version.rb +3 -3
  41. data/plugins/mock_frameworks/flexmock.rb +14 -18
  42. data/plugins/mock_frameworks/mocha.rb +0 -2
  43. data/plugins/mock_frameworks/rr.rb +21 -0
  44. data/spec/autotest/discover_spec.rb +19 -0
  45. data/spec/autotest/rspec_spec.rb +257 -0
  46. data/spec/autotest_helper.rb +4 -0
  47. data/spec/spec/dsl/behaviour_eval_spec.rb +30 -0
  48. data/spec/spec/dsl/behaviour_factory_spec.rb +18 -0
  49. data/spec/spec/dsl/behaviour_spec.rb +95 -58
  50. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -13
  51. data/spec/spec/dsl/configuration_spec.rb +6 -1
  52. data/spec/spec/dsl/description_spec.rb +9 -1
  53. data/spec/spec/dsl/example_class_spec.rb +3 -3
  54. data/spec/spec/dsl/example_instance_spec.rb +26 -28
  55. data/spec/spec/dsl/example_matcher_spec.rb +91 -0
  56. data/spec/spec/dsl/shared_behaviour_spec.rb +24 -0
  57. data/spec/spec/expectations/extensions/object_spec.rb +2 -2
  58. data/spec/spec/expectations/fail_with_spec.rb +2 -2
  59. data/spec/spec/matchers/have_spec.rb +1 -1
  60. data/spec/spec/matchers/operator_matcher_spec.rb +10 -10
  61. data/spec/spec/matchers/raise_error_spec.rb +38 -0
  62. data/spec/spec/mocks/argument_expectation_spec.rb +18 -14
  63. data/spec/spec/mocks/at_most_spec.rb +1 -1
  64. data/spec/spec/mocks/bug_report_11545_spec.rb +31 -0
  65. data/spec/spec/mocks/partial_mock_spec.rb +33 -1
  66. data/spec/spec/runner/behaviour_runner_spec.rb +72 -49
  67. data/spec/spec/runner/command_line_spec.rb +1 -1
  68. data/spec/spec/runner/context_matching_spec.rb +10 -10
  69. data/spec/spec/runner/drb_command_line_spec.rb +62 -59
  70. data/spec/spec/runner/extensions/bug_report_10577_spec.rb +35 -0
  71. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +15 -2
  72. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
  73. data/spec/spec/runner/formatter/html_formatter_spec.rb +1 -1
  74. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +14 -15
  75. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +1 -1
  76. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +42 -9
  77. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +40 -40
  78. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +55 -49
  79. data/spec/spec/runner/option_parser_spec.rb +16 -15
  80. data/spec/spec/runner/options_spec.rb +64 -31
  81. data/spec/spec/runner/reporter_spec.rb +67 -15
  82. data/spec/spec/spec_classes.rb +9 -1
  83. data/spec/spec/translator_spec.rb +48 -0
  84. data/spec/spec_helper.rb +5 -2
  85. metadata +13 -6
  86. data/examples/not_yet_implemented_spec.rb +0 -12
  87. data/spec/spec/runner/example_matcher_spec.rb +0 -127
@@ -33,7 +33,8 @@ module Spec
33
33
  /Ruby\.tmbundle\/Support\/tmruby.rb:/,
34
34
  /RSpec\.tmbundle\/Support\/lib/,
35
35
  /temp_textmate\./,
36
- /mock_frameworks\/rspec/
36
+ /mock_frameworks\/rspec/,
37
+ /spec_server/
37
38
  ]
38
39
  end
39
40
 
@@ -2,34 +2,28 @@ module Spec
2
2
  module Runner
3
3
  class BehaviourRunner
4
4
 
5
- def initialize(options)
5
+ def initialize(options, arg=nil)
6
6
  @behaviours = []
7
7
  @options = options
8
8
  end
9
9
 
10
10
  def add_behaviour(behaviour)
11
- if !specified_examples.nil? && !specified_examples.empty? #&& behaviour.matches?(specified_examples)
12
- behaviour.retain_examples_matching!(specified_examples) #if behaviour.matches?(specified_examples)
11
+ if !specified_examples.nil? && !specified_examples.empty?
12
+ behaviour.retain_examples_matching!(specified_examples)
13
13
  end
14
14
  @behaviours << behaviour if behaviour.number_of_examples != 0 && !behaviour.shared?
15
15
  end
16
16
 
17
- # Runs all contexts and returns the number of failures.
17
+ # Runs all behaviours and returns the number of failures.
18
18
  def run(paths, exit_when_done)
19
- unless paths.nil? # It's nil when running single specs with ruby
20
- paths = find_paths(paths)
21
- sorted_paths = sort_paths(paths)
22
- load_specs(sorted_paths)
23
- end
24
- @options.reporter.start(number_of_examples)
25
- behaviours = @options.reverse ? @behaviours.reverse : @behaviours
19
+ prepare!(paths)
26
20
  begin
27
- run_behaviours(behaviours)
21
+ run_behaviours
28
22
  rescue Interrupt
29
23
  ensure
30
- @options.reporter.end
24
+ report_end
31
25
  end
32
- failure_count = @options.reporter.dump
26
+ failure_count = report_dump
33
27
 
34
28
  heckle if(failure_count == 0 && !@options.heckle_runner.nil?)
35
29
 
@@ -39,9 +33,28 @@ module Spec
39
33
  end
40
34
  failure_count
41
35
  end
36
+
37
+ def report_end
38
+ @options.reporter.end
39
+ end
40
+
41
+ def report_dump
42
+ @options.reporter.dump
43
+ end
44
+
45
+ def prepare!(paths)
46
+ unless paths.nil? # It's nil when running single specs with ruby
47
+ paths = find_paths(paths)
48
+ sorted_paths = sort_paths(paths)
49
+ load_specs(sorted_paths) # This will populate @behaviours via callbacks to add_behaviour
50
+ end
51
+ @options.reporter.start(number_of_examples)
52
+ @behaviours.reverse! if @options.reverse
53
+ set_sequence_numbers
54
+ end
42
55
 
43
- def run_behaviours(behaviours)
44
- behaviours.each do |behaviour|
56
+ def run_behaviours
57
+ @behaviours.each do |behaviour|
45
58
  behaviour.run(@options.reporter, @options.dry_run, @options.reverse, @options.timeout)
46
59
  end
47
60
  end
@@ -66,6 +79,14 @@ module Spec
66
79
 
67
80
  private
68
81
 
82
+ # Sets the #number on each Example
83
+ def set_sequence_numbers
84
+ number = 0
85
+ @behaviours.each do |behaviour|
86
+ number = behaviour.set_sequence_numbers(number, @options.reverse)
87
+ end
88
+ end
89
+
69
90
  def find_paths(paths)
70
91
  result = []
71
92
  paths.each do |path|
@@ -24,26 +24,27 @@ module Spec
24
24
  def add_behaviour(name)
25
25
  end
26
26
 
27
- # This method is invoked when an example starts. +name+ is the name of the
28
- # example.
29
- def example_started(name)
27
+ # This method is invoked when an +example+ starts.
28
+ def example_started(example)
30
29
  end
31
30
 
32
- # This method is invoked when an example passes. +name+ is the name of the
33
- # example.
34
- def example_passed(name)
31
+ # This method is invoked when an +example+ passes.
32
+ def example_passed(example)
35
33
  end
36
34
 
37
- # This method is invoked when an example fails, i.e. an exception occurred
38
- # inside it (such as a failed should or other exception). +name+ is the name
39
- # of the example. +counter+ is the sequence number of the failure
40
- # (starting at 1) and +failure+ is the associated Failure object.
41
- def example_failed(name, counter, failure)
35
+ # This method is invoked when an +example+ fails, i.e. an exception occurred
36
+ # inside it (such as a failed should or other exception). +counter+ is the
37
+ # sequence number of the failure (starting at 1) and +failure+ is the associated
38
+ # Failure object.
39
+ def example_failed(example, counter, failure)
42
40
  end
43
41
 
44
- # This method is invoked when an example is not yet implemented (i.e. has not been provided a block).
42
+ # This method is invoked when an example is not yet implemented (i.e. has not
43
+ # been provided a block), or when an ExamplePendingError is raised.
45
44
  # +name+ is the name of the example.
46
- def example_not_implemented(name)
45
+ # +message+ is the message from the ExamplePendingError, if it exists, or the
46
+ # default value of "Not Yet Implemented"
47
+ def example_pending(behaviour_name, example_name, message)
47
48
  end
48
49
 
49
50
  # This method is invoked after all of the examples have executed. The next method
@@ -58,10 +59,17 @@ module Spec
58
59
  def dump_failure(counter, failure)
59
60
  end
60
61
 
61
- # This method is invoked at the very end.
62
- def dump_summary(duration, example_count, failure_count, not_implemented_count)
62
+ # This method is invoked after the dumping of examples and failures.
63
+ def dump_summary(duration, example_count, failure_count, pending_count)
64
+ end
65
+
66
+ # This gets invoked after the summary if option is set to do so.
67
+ def dump_pending
63
68
  end
64
69
 
70
+ # This method is invoked at the very end. Allows the formatter to clean up, like closing open streams.
71
+ def close
72
+ end
65
73
  end
66
74
  end
67
75
  end
@@ -25,38 +25,47 @@ module Spec
25
25
  @colour = false
26
26
  @dry_run = false
27
27
  @snippet_extractor = SnippetExtractor.new
28
+ @pending_examples = []
29
+ end
30
+
31
+ def example_pending(behaviour_name, example_name, message)
32
+ @pending_examples << ["#{behaviour_name} #{example_name}", message]
28
33
  end
29
34
 
30
35
  def colour=(colour)
31
36
  @colour = colour
32
37
  begin ; require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/ ; rescue LoadError ; raise "You must gem install win32console to use colour on Windows" ; end
33
- end
38
+ end
34
39
 
35
40
  def dump_failure(counter, failure)
36
41
  @output.puts
37
42
  @output.puts "#{counter.to_s})"
43
+ @output.puts colourise("#{failure.header}\n#{failure.exception.message}", failure)
44
+ @output.puts format_backtrace(failure.exception.backtrace)
45
+ @output.flush
46
+ end
47
+
48
+ def colourise(s, failure)
38
49
  if(failure.expectation_not_met?)
39
- @output.puts red(failure.header)
40
- @output.puts red(failure.exception.message)
50
+ red(s)
51
+ elsif(failure.pending_fixed?)
52
+ blue(s)
41
53
  else
42
- @output.puts magenta(failure.header)
43
- @output.puts magenta(failure.exception.message)
54
+ magenta(s)
44
55
  end
45
- @output.puts format_backtrace(failure.exception.backtrace)
46
- @output.flush
47
56
  end
48
57
 
49
- def dump_summary(duration, example_count, failure_count, not_implemented_count)
58
+ def dump_summary(duration, example_count, failure_count, pending_count)
50
59
  return if @dry_run
51
60
  @output.puts
52
61
  @output.puts "Finished in #{duration} seconds"
53
62
  @output.puts
54
63
 
55
64
  summary = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
56
- summary << ", #{not_implemented_count} not implemented" if not_implemented_count > 0
65
+ summary << ", #{pending_count} pending" if pending_count > 0
57
66
 
58
67
  if failure_count == 0
59
- if not_implemented_count > 0
68
+ if pending_count > 0
60
69
  @output.puts yellow(summary)
61
70
  else
62
71
  @output.puts green(summary)
@@ -65,8 +74,26 @@ module Spec
65
74
  @output.puts red(summary)
66
75
  end
67
76
  @output.flush
77
+ dump_pending
68
78
  end
69
79
 
80
+ def dump_pending
81
+ unless @pending_examples.empty?
82
+ @output.puts
83
+ @output.puts "Pending:"
84
+ @pending_examples.each do |pending_example|
85
+ @output.puts "#{pending_example[0]} (#{pending_example[1]})"
86
+ end
87
+ end
88
+ @output.flush
89
+ end
90
+
91
+ def close
92
+ if IO === @output
93
+ @output.close
94
+ end
95
+ end
96
+
70
97
  def format_backtrace(backtrace)
71
98
  return "" if backtrace.nil?
72
99
  backtrace.map { |line| backtrace_line(line) }.join("\n")
@@ -91,10 +118,11 @@ module Spec
91
118
  end
92
119
  end
93
120
 
94
- def red(text); colour(text, "\e[31m"); end
95
121
  def green(text); colour(text, "\e[32m"); end
122
+ def red(text); colour(text, "\e[31m"); end
96
123
  def magenta(text); colour(text, "\e[35m"); end
97
124
  def yellow(text); colour(text, "\e[33m"); end
125
+ def blue(text); colour(text, "\e[34m"); end
98
126
 
99
127
  end
100
128
  end
@@ -3,10 +3,14 @@ module Spec
3
3
  module Formatter
4
4
  class FailingBehavioursFormatter < BaseTextFormatter
5
5
  def add_behaviour(behaviour_name)
6
- @behaviour_name = behaviour_name
6
+ if behaviour_name =~ /(.*) \(druby.*\)$/
7
+ @behaviour_name = $1
8
+ else
9
+ @behaviour_name = behaviour_name
10
+ end
7
11
  end
8
12
 
9
- def example_failed(name, counter, failure)
13
+ def example_failed(example, counter, failure)
10
14
  unless @behaviour_name.nil?
11
15
  @output.puts @behaviour_name
12
16
  @behaviour_name = nil
@@ -17,7 +21,7 @@ module Spec
17
21
  def dump_failure(counter, failure)
18
22
  end
19
23
 
20
- def dump_summary(duration, example_count, failure_count, not_implemented_count)
24
+ def dump_summary(duration, example_count, failure_count, pending_count)
21
25
  end
22
26
  end
23
27
  end
@@ -6,15 +6,15 @@ module Spec
6
6
  @behaviour_name = behaviour_name
7
7
  end
8
8
 
9
- def example_failed(name, counter, failure)
10
- @output.puts "#{@behaviour_name} #{name}"
9
+ def example_failed(example, counter, failure)
10
+ @output.puts "#{@behaviour_name} #{example.description}"
11
11
  @output.flush
12
12
  end
13
13
 
14
14
  def dump_failure(counter, failure)
15
15
  end
16
16
 
17
- def dump_summary(duration, example_count, failure_count, not_implemented_count)
17
+ def dump_summary(duration, example_count, failure_count, pending_count)
18
18
  end
19
19
  end
20
20
  end
@@ -1,7 +1,10 @@
1
+ require 'erb'
2
+
1
3
  module Spec
2
4
  module Runner
3
5
  module Formatter
4
6
  class HtmlFormatter < BaseTextFormatter
7
+ include ERB::Util # for the #h method
5
8
 
6
9
  def initialize(output)
7
10
  super
@@ -14,7 +17,7 @@ module Spec
14
17
  @current_behaviour_number
15
18
  end
16
19
 
17
- # The number of the currently running example
20
+ # The number of the currently running example (a global counter)
18
21
  def current_example_number
19
22
  @current_example_number
20
23
  end
@@ -37,7 +40,7 @@ module Spec
37
40
  end
38
41
  @output.puts "<div class=\"behaviour\">"
39
42
  @output.puts " <dl>"
40
- @output.puts " <dt id=\"behaviour_#{current_behaviour_number}\">#{escape(name)}</dt>"
43
+ @output.puts " <dt id=\"behaviour_#{current_behaviour_number}\">#{h(name)}</dt>"
41
44
  @output.flush
42
45
  end
43
46
 
@@ -47,26 +50,28 @@ module Spec
47
50
  @output.flush
48
51
  end
49
52
 
50
- def example_passed(name)
51
- @current_example_number += 1
53
+ def example_started(example)
54
+ @current_example_number = example.number
55
+ end
56
+
57
+ def example_passed(example)
52
58
  move_progress
53
- @output.puts " <dd class=\"spec passed\"><span class=\"passed_spec_name\">#{escape(name)}</span></dd>"
59
+ @output.puts " <dd class=\"spec passed\"><span class=\"passed_spec_name\">#{h(example.description)}</span></dd>"
54
60
  @output.flush
55
61
  end
56
62
 
57
- def example_failed(name, counter, failure)
63
+ def example_failed(example, counter, failure)
58
64
  extra = extra_failure_content(failure)
59
-
60
- @current_example_number += 1
65
+ failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
61
66
  @output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>" unless @header_red
62
67
  @header_red = true
63
68
  @output.puts " <script type=\"text/javascript\">makeRed('behaviour_#{current_behaviour_number}');</script>" unless @behaviour_red
64
69
  @behaviour_red = true
65
70
  move_progress
66
- @output.puts " <dd class=\"spec failed\">"
67
- @output.puts " <span class=\"failed_spec_name\">#{escape(name)}</span>"
71
+ @output.puts " <dd class=\"spec #{failure_style}\">"
72
+ @output.puts " <span class=\"failed_spec_name\">#{h(example.description)}</span>"
68
73
  @output.puts " <div class=\"failure\" id=\"failure_#{counter}\">"
69
- @output.puts " <div class=\"message\"><pre>#{escape(failure.exception.message)}</pre></div>" unless failure.exception.nil?
74
+ @output.puts " <div class=\"message\"><pre>#{h(failure.exception.message)}</pre></div>" unless failure.exception.nil?
70
75
  @output.puts " <div class=\"backtrace\"><pre>#{format_backtrace(failure.exception.backtrace)}</pre></div>" unless failure.exception.nil?
71
76
  @output.puts extra unless extra == ""
72
77
  @output.puts " </div>"
@@ -74,14 +79,14 @@ module Spec
74
79
  @output.flush
75
80
  end
76
81
 
77
- def example_not_implemented(name)
78
- @current_example_number += 1
82
+ def example_pending(behaviour_name, example_name, message)
79
83
  @output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>" unless @header_red
80
84
  @output.puts " <script type=\"text/javascript\">makeYellow('behaviour_#{current_behaviour_number}');</script>" unless @behaviour_red
81
85
  move_progress
82
- @output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{escape(name)}</span></dd>"
86
+ @output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{h(example_name)}</span></dd>"
83
87
  @output.flush
84
88
  end
89
+
85
90
  # Override this method if you wish to output extra HTML for a failed spec. For example, you
86
91
  # could output links to images or other files produced during the specs.
87
92
  #
@@ -90,24 +95,20 @@ module Spec
90
95
  end
91
96
 
92
97
  def move_progress
93
- percent_done = @example_count == 0 ? 100.0 : (current_example_number.to_f / @example_count.to_f * 1000).to_i / 10.0
98
+ percent_done = @example_count == 0 ? 100.0 : ((current_example_number + 1).to_f / @example_count.to_f * 1000).to_i / 10.0
94
99
  @output.puts " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
95
100
  @output.flush
96
101
  end
97
-
98
- def escape(string)
99
- string.gsub(/&/n, '&amp;').gsub(/\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
100
- end
101
102
 
102
103
  def dump_failure(counter, failure)
103
104
  end
104
105
 
105
- def dump_summary(duration, example_count, failure_count, not_implemented_count)
106
+ def dump_summary(duration, example_count, failure_count, pending_count)
106
107
  if @dry_run
107
108
  totals = "This was a dry-run"
108
109
  else
109
110
  totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
110
- totals << ", #{not_implemented_count} not implemented" if not_implemented_count > 0
111
+ totals << ", #{pending_count} pending" if pending_count > 0
111
112
  end
112
113
  @output.puts "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{duration} seconds</strong>\";</script>"
113
114
  @output.puts "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{totals}\";</script>"
@@ -264,6 +265,12 @@ dd.spec.not_implemented {
264
265
  background: #FCFB98; color: #131313;
265
266
  }
266
267
 
268
+ dd.spec.pending_fixed {
269
+ border-left: 5px solid #0000C2;
270
+ border-bottom: 1px solid #0000C2;
271
+ color: #0000C2; background: #D3FBFF;
272
+ }
273
+
267
274
  .backtrace {
268
275
  color: #000;
269
276
  font-size: 12px;
@@ -303,10 +310,10 @@ a {
303
310
 
304
311
  .ruby .offending { background-color: gray; }
305
312
  .ruby .linenum {
306
- width: 75px;
307
- padding: 0.1em 1em 0.2em 0;
308
- color: #000000;
309
- background-color: #FFFBD3;
313
+ width: 75px;
314
+ padding: 0.1em 1em 0.2em 0;
315
+ color: #000000;
316
+ background-color: #FFFBD3;
310
317
  }
311
318
  EOF
312
319
  end
@@ -5,18 +5,19 @@ module Spec
5
5
  def add_behaviour(name)
6
6
  end
7
7
 
8
- def example_failed(name, counter, failure)
9
- @output.print failure.expectation_not_met? ? red('F') : magenta('F')
8
+ def example_failed(example, counter, failure)
9
+ @output.print colourise('F', failure)
10
10
  @output.flush
11
11
  end
12
12
 
13
- def example_passed(name)
13
+ def example_passed(example)
14
14
  @output.print green('.')
15
15
  @output.flush
16
16
  end
17
17
 
18
- def example_not_implemented(name)
19
- @output.print yellow('*')
18
+ def example_pending(behaviour_name, example_name, message)
19
+ super
20
+ @output.print yellow('P')
20
21
  @output.flush
21
22
  end
22
23