class Test::Unit::Collector::XML::Listener - test-unit: Ruby Standard Library Documentation

# class Test::Unit::Collector::XML::Listener

### Constants

NAME_SPLIT
STATE_TABLE

### Attributes

test_suites[R]

### Public Class Methods

new() click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 37
    def initialize
      @ns_stack = [{"xml" => :xml}]
      @tag_stack = [["", :root]]
      @text_stack = ['']
      @state_stack = [:root]
      @values = {}
      @test_suites = []
    end

### Public Instance Methods

tag_end(name) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 79
    def tag_end(name)
      state = @state_stack.pop
      text = @text_stack.pop
      uri, local = @tag_stack.pop
      no_action_states = [:root, :stream]
      case state
      when *no_action_states
        # do nothing
      when :test_suite
        test_suite_end
      when :complete_test_case
        @test_suites.last << @test_case.suite
      when :test_case
        test_case_end
      when :result
        @result = @values
      when :test
        test_end
      when :pass_assertion
        @n_pass_assertions += 1
      when :backtrace
        @values = @values_backup
        @values["backtrace"] = @backtrace
      when :entry
        file = @values['file']
        line = @values['line']
        info = @values['info']
        @backtrace << "#{file}:#{line}: #{info}"
        @values = {}
      else
        local = normalize_local(local)
        @values[local] = text
      end
      @ns_stack.pop
    end

tag_start(name, attributes) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 46
    def tag_start(name, attributes)
      @text_stack.push('')

      ns = @ns_stack.last.dup
      attrs = {}
      attributes.each do |n, v|
        if /\Axmlns(?:\z|:)/ =~ n
          ns[$POSTMATCH] = v
        else
          attrs[n] = v
        end
      end
      @ns_stack.push(ns)

      _parent_tag = parent_tag
      prefix, local = split_name(name)
      uri = _ns(ns, prefix)
      @tag_stack.push([uri, local])

      state = next_state(@state_stack.last, uri, local)
      @state_stack.push(state)
      @values = {}
      case state
      when :test_suite, :test_case
        # do nothing
      when :test
        @n_pass_assertions = 0 if _parent_tag == "start-test"
      when :backtrace
        @backtrace = []
        @values_backup = @values
      end
    end

text(data) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 115
    def text(data)
      @text_stack.last << data
    end

### Private Instance Methods

_ns(ns, prefix) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 120
    def _ns(ns, prefix)
      ns.fetch(prefix, "")
    end

current_path() click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 189
    def current_path
      locals = @tag_stack.collect do |uri, local|
        local
      end
      ["", *locals].join("/")
    end

next_state(current_state, uri, local) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 176
    def next_state(current_state, uri, local)
      local = normalize_local(local)
      valid_elements = STATE_TABLE[current_state]
      if valid_elements.nil?
        raise "unexpected element: #{current_path}"
      end
      next_state = local.to_sym
      unless valid_elements.include?(next_state)
        raise "unexpected element: #{current_path}"
      end
      next_state
    end

normalize_local(local) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 196
    def normalize_local(local)
      local.gsub(/-/, "_")
    end

parent_tag() click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 200
    def parent_tag
      @tag_stack.last[1]
    end

split_name(name) click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 125
    def split_name(name)
      name =~ NAME_SPLIT
      [$1 || '', $2]
    end

test_case_end() click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 215
    def test_case_end
      return unless parent_tag == "start-test-case"
      name = @values["name"]
      @test_case = Class.new(TestCase) do
        define_method(:name) do
          name
        end
      end
    end

test_end() click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 225
    def test_end
      return unless parent_tag == "complete-test"
      name = @values["name"]
      n_pass_assertions = @n_pass_assertions
      result = @result
      @test_case.module_eval do
        test
        define_method(name) do
          n_pass_assertions.times do
            add_assertion
          end
          case result["status"]
          when "omission"
            add_omission(Omission.new(name,
                                      result["backtrace"],
                                      result["detail"]))
          end
        end
      end
    end

test_suite_end() click to toggle source

    # File test-unit-3.6.7/lib/test/unit/collector/xml.rb, line 204
    def test_suite_end
      return unless parent_tag == "start-test-suite"
      suite = TestSuite.new
      ["start_time", "elapsed_time", "n_tests"].each do |key|
        if @values.has_key?(key)
          suite.instance_variable_set("@#{key}", @values[key])
        end
      end
      @test_suites << suite
    end