summaryrefslogtreecommitdiff
path: root/test/rexml/parser/test_sax2.rb
blob: 5ce9db79fd549ea089d7b1d2ad148b62ebd1b737 (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
require "test/unit"
require "rexml/parsers/sax2parser"
require "rexml/sax2listener"

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 TestEntityDecl < 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
  end
end