module Spec module Runner class Reporter attr_reader :options, :example_groups def initialize(options) @options = options @options.reporter = self clear end def add_example_group(example_group) formatters.each do |f| f.add_example_group(example_group) end example_groups << example_group end def example_started(example) formatters.each{|f| f.example_started(example)} end def example_finished(example, error=nil) @examples << example if error.nil? example_passed(example) elsif Spec::Example::ExamplePendingError === error example_pending(example_groups.last, example, error.message) else example_failed(example, error) end end def failure(example, error) backtrace_tweaker.tweak_backtrace(error) example_name = "#{example_groups.last.description} #{example.description}" failure = Failure.new(example_name, error) @failures << failure formatters.each do |f| f.example_failed(example, @failures.length, failure) end end alias_method :example_failed, :failure def start(number_of_examples) clear @start_time = Time.new formatters.each{|f| f.start(number_of_examples)} end def end @end_time = Time.new end # Dumps the summary and returns the total number of failures def dump formatters.each{|f| f.start_dump} dump_pending dump_failures formatters.each do |f| f.dump_summary(duration, @examples.length, @failures.length, @pending_count) f.close end @failures.length end private def formatters @options.formatters end def backtrace_tweaker @options.backtrace_tweaker end def clear @example_groups = [] @failures = [] @pending_count = 0 @examples = [] @start_time = nil @end_time = nil end def dump_failures return if @failures.empty? @failures.inject(1) do |index, failure| formatters.each{|f| f.dump_failure(index, failure)} index + 1 end end def dump_pending formatters.each{|f| f.dump_pending} end def duration return @end_time - @start_time unless (@end_time.nil? or @start_time.nil?) return "0.0" end def example_passed(example) formatters.each{|f| f.example_passed(example)} end def example_pending(example_group, example, message="Not Yet Implemented") @pending_count += 1 formatters.each do |f| f.example_pending(example_group.description, example, message) end end class Failure attr_reader :exception def initialize(example_name, exception) @example_name = example_name @exception = exception end def header if expectation_not_met? "'#{@example_name}' FAILED" elsif pending_fixed? "'#{@example_name}' FIXED" else "#{@exception.class.name} in '#{@example_name}'" end end def pending_fixed? @exception.is_a?(Spec::Example::PendingExampleFixedError) end def expectation_not_met? @exception.is_a?(Spec::Expectations::ExpectationNotMetError) end end end end end