]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/gems/rspec-1.1.2/lib/spec/runner/reporter.rb
added RSpec and RSpec on Rails
[rails.git] / vendor / gems / rspec-1.1.2 / lib / spec / runner / reporter.rb
diff --git a/vendor/gems/rspec-1.1.2/lib/spec/runner/reporter.rb b/vendor/gems/rspec-1.1.2/lib/spec/runner/reporter.rb
new file mode 100644 (file)
index 0000000..cfc511b
--- /dev/null
@@ -0,0 +1,143 @@
+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