summaryrefslogtreecommitdiff
path: root/test/rexml/parser/test_sax2.rb
blob: 91d135f5f73b633f2ab2750f06617f5b2f124abb (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# frozen_string_literal: false
require "test/unit"
require "rexml/parsers/sax2parser"
require "rexml/sax2listener"

module REXMLTests
class TestSAX2Parser < Test::Unit::TestCase
  class TestDocumentTypeDeclaration < self
    private
    def xml(internal_subset)
      <<-XML
<!DOCTYPE r SYSTEM "urn:x-henrikmartensson:test" [
#{internal_subset}
]>
<r/>
      XML
    end

    class TestEntityDeclaration < self
      class Listener
        include REXML::SAX2Listener
        attr_reader :entity_declarations
        def initialize
          @entity_declarations = []
        end

        def entitydecl(declaration)
          super
          @entity_declarations << declaration
        end
      end

      private
      def parse(internal_subset)
        listener = Listener.new
        parser = REXML::Parsers::SAX2Parser.new(xml(internal_subset))
        parser.listen(listener)
        parser.parse
        listener.entity_declarations
      end

      class TestGeneralEntity < self
        class TestValue < self
          def test_double_quote
            assert_equal([["name", "value"]], parse(<<-INTERNAL_SUBSET))
<!ENTITY name "value">
            INTERNAL_SUBSET
          end

          def test_single_quote
            assert_equal([["name", "value"]], parse(<<-INTERNAL_SUBSET))
<!ENTITY name 'value'>
            INTERNAL_SUBSET
          end
        end

        class TestExternlID < self
          class TestSystem < self
            def test_with_ndata
              declaration = [
                "name",
                "SYSTEM", "system-literal",
                "NDATA", "ndata-name",
              ]
              assert_equal([declaration],
                           parse(<<-INTERNAL_SUBSET))
<!ENTITY name SYSTEM "system-literal" NDATA ndata-name>
              INTERNAL_SUBSET
            end

            def test_without_ndata
              declaration = [
                "name",
                "SYSTEM", "system-literal",
              ]
              assert_equal([declaration],
                           parse(<<-INTERNAL_SUBSET))
<!ENTITY name SYSTEM "system-literal">
              INTERNAL_SUBSET
            end
          end

          class TestPublic < self
            def test_with_ndata
              declaration = [
                "name",
                "PUBLIC", "public-literal", "system-literal",
                "NDATA", "ndata-name",
              ]
              assert_equal([declaration],
                           parse(<<-INTERNAL_SUBSET))
<!ENTITY name PUBLIC "public-literal" "system-literal" NDATA ndata-name>
              INTERNAL_SUBSET
            end

            def test_without_ndata
              declaration = [
                "name",
                "PUBLIC", "public-literal", "system-literal",
              ]
              assert_equal([declaration], parse(<<-INTERNAL_SUBSET))
<!ENTITY name PUBLIC "public-literal" "system-literal">
              INTERNAL_SUBSET
            end
          end
        end
      end

      class TestParameterEntity < self
        class TestValue < self
          def test_double_quote
            assert_equal([["%", "name", "value"]], parse(<<-INTERNAL_SUBSET))
<!ENTITY % name "value">
            INTERNAL_SUBSET
          end

          def test_single_quote
            assert_equal([["%", "name", "value"]], parse(<<-INTERNAL_SUBSET))
<!ENTITY % name 'value'>
            INTERNAL_SUBSET
          end
        end

        class TestExternlID < self
          def test_system
            declaration = [
              "%",
              "name",
              "SYSTEM", "system-literal",
            ]
            assert_equal([declaration],
                           parse(<<-INTERNAL_SUBSET))
<!ENTITY % name SYSTEM "system-literal">
            INTERNAL_SUBSET
          end

          def test_public
            declaration = [
              "%",
              "name",
              "PUBLIC", "public-literal", "system-literal",
            ]
            assert_equal([declaration], parse(<<-INTERNAL_SUBSET))
<!ENTITY % name PUBLIC "public-literal" "system-literal">
            INTERNAL_SUBSET
          end
        end
      end
    end

    class TestNotationDeclaration < self
      class Listener
        include REXML::SAX2Listener
        attr_reader :notation_declarations
        def initialize
          @notation_declarations = []
        end

        def notationdecl(*declaration)
          super
          @notation_declarations << declaration
        end
      end

      private
      def parse(internal_subset)
        listener = Listener.new
        parser = REXML::Parsers::SAX2Parser.new(xml(internal_subset))
        parser.listen(listener)
        parser.parse
        listener.notation_declarations
      end

      class TestExternlID < self
        def test_system
          declaration = ["name", "SYSTEM", nil, "system-literal"]
          assert_equal([declaration],
                       parse(<<-INTERNAL_SUBSET))
<!NOTATION name SYSTEM "system-literal">
          INTERNAL_SUBSET
        end

        def test_public
          declaration = ["name", "PUBLIC", "public-literal", "system-literal"]
          assert_equal([declaration], parse(<<-INTERNAL_SUBSET))
<!NOTATION name PUBLIC "public-literal" "system-literal">
          INTERNAL_SUBSET
        end
      end

      class TestPublicID < self
        def test_literal
          declaration = ["name", "PUBLIC", "public-literal", nil]
          assert_equal([declaration],
                       parse(<<-INTERNAL_SUBSET))
<!NOTATION name PUBLIC "public-literal">
          INTERNAL_SUBSET
        end
      end
    end
  end
end
end