summaryrefslogtreecommitdiff
path: root/test/rexml/test_listener.rb
blob: 3d5c17e8582cf569bde416570e09a048efb21476 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# coding: binary

require_relative 'rexml_test_utils'

require 'rexml/document'
require 'rexml/streamlistener'

module REXMLTests
class BaseTester < Test::Unit::TestCase
  include REXMLTestUtils
  def test_empty
    return unless defined? @listener
    # Empty.
    t1 = %Q{<string></string>}
    assert_equal( "", @listener.parse( t1 ),
      "Empty" )
  end

  def test_space
    return unless defined? @listener
    # Space.
    t2 = %Q{<string>    </string>}
    assert_equal( "    ", @listener.parse( t2 ),
      "Space" )
  end

  def test_whitespace
    return unless defined? @listener
    # Whitespaces.
    t3 = %Q{<string>RE\n \t \n \t XML</string>}
    assert_equal( "RE\n \t \n \t XML", @listener.parse( t3 ),
      "Whitespaces" )
  end

  def test_leading_trailing_whitespace
    return unless defined? @listener
    # Leading and trailing whitespaces.
    t4 = %Q{<string>    REXML    </string>}
    assert_equal( "    REXML    ", @listener.parse( t4 ),
      "Leading and trailing whitespaces" )
  end

  def test_entity_reference
    return unless defined? @listener
    # Entity reference.
    t5 = %Q{<string>&lt;&gt;&amp;lt;&amp;gt;</string>}
    assert_equal( "<>&lt;&gt;", @listener.parse( t5 ),
      "Entity reference" )
  end

  def test_character_reference
    return unless defined? @listener
    # Character reference.
    t6 = %Q{<string>&#xd;</string>}
    assert_equal( "\r", @listener.parse( t6 ),
      "Character reference." )
  end

  def test_cr
    return unless defined? @listener
    # CR.
    t7 = %Q{<string> \r\n \r \n </string>}
    assert_equal( " \n \n \n ".unpack("C*").inspect,
      @listener.parse( t7 ).unpack("C*").inspect, "CR" )
  end

  # The accent bug, and the code that exhibits the bug, was contributed by
  # Guilhem Vellut
  class AccentListener
    def tag_start(name,attributes)
      #p name
      #p attributes
    end
    def tag_end(name)
      #p "/"+name
    end
    def xmldecl(a,b,c)
      #puts "#{a} #{b} #{c}"
    end
    def text(tx)
      #p tx
    end
  end

  def test_accents
    source = %[<?xml version="1.0" encoding="ISO-8859-1"?>
<g>
<f  a="\xE9" />
</g>]
    doc = REXML::Document.new( source )
    a = doc.elements['/g/f'].attribute('a')
                if a.value.respond_to? :force_encoding
                  a.value.force_encoding('binary')
                end
    assert_equal( "\xC3\xA9", a.value)
    doc = REXML::Document.parse_stream(
      File::new(fixture_path("stream_accents.xml")),
      AccentListener::new
      )
  end
end

class MyREXMLListener
  include REXML::StreamListener

  def initialize
    @text = nil
  end

  def parse( stringOrReadable )
    @text = ""
    REXML::Document.parse_stream( stringOrReadable, self )
    @text
  end

  def text( text )
    @text << text
  end
end

class REXMLTester < BaseTester
  def setup
    @listener = MyREXMLListener.new
  end

  def test_character_reference_2
    t6 = %Q{<string>&#xd;</string>}
    assert_equal( t6.strip, REXML::Document.new(t6).to_s )
  end
end
end