rgen 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/CHANGELOG +20 -1
  2. data/MIT-LICENSE +1 -1
  3. data/README +12 -9
  4. data/lib/instantiators/ea_instantiator.rb +36 -0
  5. data/lib/metamodels/uml13_metamodel.rb +559 -0
  6. data/lib/metamodels/uml13_metamodel_ext.rb +26 -0
  7. data/lib/mmgen/metamodel_generator.rb +5 -5
  8. data/lib/mmgen/mm_ext/ecore_ext.rb +95 -0
  9. data/lib/mmgen/mmgen.rb +6 -4
  10. data/lib/mmgen/templates/annotations.tpl +37 -0
  11. data/lib/mmgen/templates/metamodel_generator.tpl +171 -0
  12. data/lib/rgen/ecore/ecore.rb +190 -0
  13. data/lib/rgen/ecore/ecore_instantiator.rb +25 -0
  14. data/lib/rgen/ecore/ecore_transformer.rb +85 -0
  15. data/lib/rgen/environment.rb +9 -24
  16. data/lib/rgen/find_helper.rb +68 -0
  17. data/lib/rgen/{instantiator.rb → instantiator/abstract_instantiator.rb} +6 -2
  18. data/lib/rgen/instantiator/abstract_xml_instantiator.rb +59 -0
  19. data/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
  20. data/lib/rgen/instantiator/ecore_xml_instantiator.rb +144 -0
  21. data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +157 -0
  22. data/lib/rgen/instantiator/xmi11_instantiator.rb +164 -0
  23. data/lib/rgen/metamodel_builder.rb +103 -9
  24. data/lib/rgen/metamodel_builder/build_helper.rb +26 -4
  25. data/lib/rgen/metamodel_builder/builder_extensions.rb +285 -88
  26. data/lib/rgen/metamodel_builder/builder_runtime.rb +7 -1
  27. data/lib/rgen/metamodel_builder/data_types.rb +67 -0
  28. data/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
  29. data/lib/rgen/metamodel_builder/metamodel_description.rb +232 -0
  30. data/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
  31. data/lib/rgen/metamodel_builder/module_extension.rb +33 -0
  32. data/lib/rgen/model_comparator.rb +56 -0
  33. data/lib/rgen/model_dumper.rb +5 -5
  34. data/lib/rgen/name_helper.rb +17 -1
  35. data/lib/rgen/template_language.rb +148 -28
  36. data/lib/rgen/template_language/directory_template_container.rb +56 -38
  37. data/lib/rgen/template_language/output_handler.rb +93 -77
  38. data/lib/rgen/template_language/template_container.rb +186 -143
  39. data/lib/rgen/transformer.rb +19 -14
  40. data/lib/transformers/uml13_to_ecore.rb +75 -0
  41. data/redist/xmlscan/ChangeLog +1301 -0
  42. data/redist/xmlscan/README +34 -0
  43. data/redist/xmlscan/THANKS +11 -0
  44. data/redist/xmlscan/doc/changes.html +74 -0
  45. data/redist/xmlscan/doc/changes.rd +80 -0
  46. data/redist/xmlscan/doc/en/conformance.html +136 -0
  47. data/redist/xmlscan/doc/en/conformance.rd +152 -0
  48. data/redist/xmlscan/doc/en/manual.html +356 -0
  49. data/redist/xmlscan/doc/en/manual.rd +402 -0
  50. data/redist/xmlscan/doc/ja/conformance.ja.html +118 -0
  51. data/redist/xmlscan/doc/ja/conformance.ja.rd +134 -0
  52. data/redist/xmlscan/doc/ja/manual.ja.html +325 -0
  53. data/redist/xmlscan/doc/ja/manual.ja.rd +370 -0
  54. data/redist/xmlscan/doc/src/Makefile +41 -0
  55. data/redist/xmlscan/doc/src/conformance.rd.src +256 -0
  56. data/redist/xmlscan/doc/src/langsplit.rb +110 -0
  57. data/redist/xmlscan/doc/src/manual.rd.src +614 -0
  58. data/redist/xmlscan/install.rb +41 -0
  59. data/redist/xmlscan/lib/xmlscan/encoding.rb +311 -0
  60. data/redist/xmlscan/lib/xmlscan/htmlscan.rb +289 -0
  61. data/redist/xmlscan/lib/xmlscan/namespace.rb +352 -0
  62. data/redist/xmlscan/lib/xmlscan/parser.rb +299 -0
  63. data/redist/xmlscan/lib/xmlscan/scanner.rb +1109 -0
  64. data/redist/xmlscan/lib/xmlscan/version.rb +22 -0
  65. data/redist/xmlscan/lib/xmlscan/visitor.rb +158 -0
  66. data/redist/xmlscan/lib/xmlscan/xmlchar.rb +441 -0
  67. data/redist/xmlscan/memo/CONFORMANCE +1249 -0
  68. data/redist/xmlscan/memo/PRODUCTIONS +195 -0
  69. data/redist/xmlscan/memo/contentspec.ry +335 -0
  70. data/redist/xmlscan/samples/chibixml.rb +105 -0
  71. data/redist/xmlscan/samples/getxmlchar.rb +122 -0
  72. data/redist/xmlscan/samples/rexml.rb +159 -0
  73. data/redist/xmlscan/samples/xmlbench.rb +88 -0
  74. data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +22 -0
  75. data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +29 -0
  76. data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +62 -0
  77. data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +22 -0
  78. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +62 -0
  79. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +22 -0
  80. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +22 -0
  81. data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +99 -0
  82. data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +116 -0
  83. data/redist/xmlscan/samples/xmlconftest.rb +200 -0
  84. data/redist/xmlscan/test.rb +7 -0
  85. data/redist/xmlscan/tests/deftestcase.rb +73 -0
  86. data/redist/xmlscan/tests/runtest.rb +47 -0
  87. data/redist/xmlscan/tests/testall.rb +14 -0
  88. data/redist/xmlscan/tests/testencoding.rb +438 -0
  89. data/redist/xmlscan/tests/testhtmlscan.rb +752 -0
  90. data/redist/xmlscan/tests/testnamespace.rb +457 -0
  91. data/redist/xmlscan/tests/testparser.rb +591 -0
  92. data/redist/xmlscan/tests/testscanner.rb +1749 -0
  93. data/redist/xmlscan/tests/testxmlchar.rb +143 -0
  94. data/redist/xmlscan/tests/visitor.rb +34 -0
  95. data/test/array_extensions_test.rb +2 -2
  96. data/test/ea_instantiator_test.rb +41 -0
  97. data/test/ecore_self_test.rb +53 -0
  98. data/test/environment_test.rb +11 -6
  99. data/test/metamodel_builder_test.rb +404 -245
  100. data/test/metamodel_roundtrip_test.rb +52 -0
  101. data/test/metamodel_roundtrip_test/TestModel.rb +65 -0
  102. data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +64 -0
  103. data/test/metamodel_roundtrip_test/houseMetamodel.ecore +32 -0
  104. data/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +39 -0
  105. data/test/rgen_test.rb +3 -3
  106. data/test/template_language_test.rb +65 -39
  107. data/test/template_language_test/expected_result.txt +24 -3
  108. data/test/template_language_test/templates/code/array.tpl +11 -0
  109. data/test/template_language_test/templates/content/author.tpl +7 -0
  110. data/test/template_language_test/templates/content/chapter.tpl +1 -1
  111. data/test/template_language_test/templates/root.tpl +17 -8
  112. data/test/template_language_test/testout.txt +24 -3
  113. data/test/testmodel/class_model_checker.rb +119 -0
  114. data/test/{xmi_instantiator_test/testmodel.eap → testmodel/ea_testmodel.eap} +0 -0
  115. data/test/{xmi_instantiator_test/testmodel.xml → testmodel/ea_testmodel.xml} +81 -14
  116. data/test/testmodel/ea_testmodel_partial.xml +317 -0
  117. data/test/testmodel/ecore_model_checker.rb +101 -0
  118. data/test/testmodel/manual_testmodel.xml +22 -0
  119. data/test/testmodel/object_model_checker.rb +67 -0
  120. data/test/transformer_test.rb +18 -10
  121. data/test/xml_instantiator_test.rb +81 -8
  122. data/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
  123. data/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
  124. data/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
  125. data/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
  126. metadata +126 -28
  127. data/lib/ea/xmi_class_instantiator.rb +0 -46
  128. data/lib/ea/xmi_helper.rb +0 -26
  129. data/lib/ea/xmi_metamodel.rb +0 -34
  130. data/lib/ea/xmi_object_instantiator.rb +0 -46
  131. data/lib/ea/xmi_to_classmodel.rb +0 -78
  132. data/lib/ea/xmi_to_objectmodel.rb +0 -92
  133. data/lib/mmgen/mm_ext/uml_classmodel_ext.rb +0 -71
  134. data/lib/mmgen/templates/uml_classmodel.tpl +0 -63
  135. data/lib/rgen/xml_instantiator.rb +0 -132
  136. data/lib/uml/objectmodel_instantiator.rb +0 -53
  137. data/lib/uml/uml_classmodel.rb +0 -92
  138. data/lib/uml/uml_objectmodel.rb +0 -65
  139. data/test/metamodel_generator_test.rb +0 -44
  140. data/test/metamodel_generator_test/TestModel.rb +0 -40
  141. data/test/metamodel_generator_test/expected_result.txt +0 -40
  142. data/test/xmi_class_instantiator_test.rb +0 -24
  143. data/test/xmi_instantiator_test/class_model_checker.rb +0 -97
  144. data/test/xmi_object_instantiator_test.rb +0 -65
  145. data/test/xml_instantiator_test/testmodel.xml +0 -7
@@ -0,0 +1,591 @@
1
+ #
2
+ # tests/testparser.rb
3
+ #
4
+ # Copyright (C) UENO Katsuhiro 2002
5
+ #
6
+ # $Id: testparser.rb,v 1.16 2003/02/28 12:31:07 katsu Exp $
7
+ #
8
+
9
+ require 'test/unit'
10
+ require 'deftestcase'
11
+ require 'xmlscan/parser'
12
+ require 'visitor'
13
+
14
+
15
+ class TestXMLParser < Test::Unit::TestCase
16
+
17
+ include DefTestCase
18
+
19
+ Visitor = RecordingVisitor.new_class(XMLScan::Visitor)
20
+
21
+
22
+ private
23
+
24
+ def setup
25
+ @v = Visitor.new
26
+ @s = XMLScan::XMLParser.new(@v)
27
+ end
28
+
29
+ def parse(src)
30
+ @s.parse src
31
+ @v.result
32
+ end
33
+
34
+
35
+ public
36
+
37
+ deftestcase 'xmldecl', <<-'TESTCASEEND'
38
+
39
+ '<?xml version="1.0" ?><hoge/>'
40
+ [ :on_xmldecl ]
41
+ [ :on_xmldecl_version, '1.0' ]
42
+ [ :on_xmldecl_end ]
43
+ [ :on_stag, 'hoge' ]
44
+ [ :on_stag_end_empty, 'hoge' ]
45
+
46
+ '<?xml version="1.01" ?><hoge/>'
47
+ [ :on_xmldecl ]
48
+ [ :warning, "unsupported XML version `1.01'" ]
49
+ [ :on_xmldecl_version, '1.01' ]
50
+ [ :on_xmldecl_end ]
51
+ [ :on_stag, 'hoge' ]
52
+ [ :on_stag_end_empty, 'hoge' ]
53
+
54
+ '<?xml version="1.0" standalone="yes" ?><hoge/>'
55
+ [ :on_xmldecl ]
56
+ [ :on_xmldecl_version, '1.0' ]
57
+ [ :on_xmldecl_standalone, 'yes' ]
58
+ [ :on_xmldecl_end ]
59
+ [ :on_stag, 'hoge' ]
60
+ [ :on_stag_end_empty, 'hoge' ]
61
+
62
+ '<?xml version="1.0" standalone="no" ?><hoge/>'
63
+ [ :on_xmldecl ]
64
+ [ :on_xmldecl_version, '1.0' ]
65
+ [ :on_xmldecl_standalone, 'no' ]
66
+ [ :on_xmldecl_end ]
67
+ [ :on_stag, 'hoge' ]
68
+ [ :on_stag_end_empty, 'hoge' ]
69
+
70
+ '<?xml version="1.0" standalone="hoge" ?><hoge/>'
71
+ [ :on_xmldecl ]
72
+ [ :on_xmldecl_version, '1.0' ]
73
+ [ :parse_error, "standalone declaration must be either `yes' or `no'" ]
74
+ [ :on_xmldecl_standalone, 'hoge' ]
75
+ [ :on_xmldecl_end ]
76
+ [ :on_stag, 'hoge' ]
77
+ [ :on_stag_end_empty, 'hoge' ]
78
+
79
+ '<?xml version="1.0" standalone="YES" ?><hoge/>'
80
+ [ :on_xmldecl ]
81
+ [ :on_xmldecl_version, '1.0' ]
82
+ [ :parse_error, "standalone declaration must be either `yes' or `no'" ]
83
+ [ :on_xmldecl_standalone, 'YES' ]
84
+ [ :on_xmldecl_end ]
85
+ [ :on_stag, 'hoge' ]
86
+ [ :on_stag_end_empty, 'hoge' ]
87
+
88
+ TESTCASEEND
89
+
90
+
91
+
92
+ deftestcase 'doctype', <<-'TESTCASEEND'
93
+
94
+ '<!DOCTYPE hoge PUBLIC "foo" "bar"><hoge/>'
95
+ [ :on_doctype, 'hoge', 'foo', 'bar' ]
96
+ [ :on_stag, 'hoge' ]
97
+ [ :on_stag_end_empty, 'hoge' ]
98
+
99
+ '<!DOCTYPE hoge PUBLIC "foo"><hoge/>'
100
+ [ :parse_error, "public external ID must have both public ID and system ID" ]
101
+ [ :on_doctype, 'hoge', 'foo', nil ]
102
+ [ :on_stag, 'hoge' ]
103
+ [ :on_stag_end_empty, 'hoge' ]
104
+
105
+ '<!DOCTYPE hoge SYSTEM "foo"><hoge/>'
106
+ [ :on_doctype, 'hoge', nil, 'foo' ]
107
+ [ :on_stag, 'hoge' ]
108
+ [ :on_stag_end_empty, 'hoge' ]
109
+
110
+ TESTCASEEND
111
+
112
+
113
+
114
+ deftestcase 'ignore_space', <<-'TESTCASEEND'
115
+
116
+ '<?xml version="1.0"?> <!DOCTYPE hoge> <hoge/>'
117
+ [ :on_xmldecl ]
118
+ [ :on_xmldecl_version, '1.0' ]
119
+ [ :on_xmldecl_end ]
120
+ [ :on_doctype, 'hoge', nil, nil ]
121
+ [ :on_stag, 'hoge' ]
122
+ [ :on_stag_end_empty, 'hoge' ]
123
+
124
+ '<?xml version="1.0"?> <!DOCTYPE hoge> <hoge/> '
125
+ [ :on_xmldecl ]
126
+ [ :on_xmldecl_version, '1.0' ]
127
+ [ :on_xmldecl_end ]
128
+ [ :on_doctype, 'hoge', nil, nil ]
129
+ [ :on_stag, 'hoge' ]
130
+ [ :on_stag_end_empty, 'hoge' ]
131
+
132
+ ' <!DOCTYPE hoge> <hoge> </hoge> '
133
+ [ :on_doctype, 'hoge', nil, nil ]
134
+ [ :on_stag, 'hoge' ]
135
+ [ :on_stag_end, 'hoge' ]
136
+ [ :on_chardata, ' ' ]
137
+ [ :on_etag, 'hoge' ]
138
+
139
+ TESTCASEEND
140
+
141
+
142
+
143
+ deftestcase 'pi', <<-'TESTCASEEND'
144
+
145
+ ' <?xml ?><hoge/>'
146
+ [ :parse_error, "reserved PI target `xml'" ]
147
+ [ :on_pi, 'xml', '' ]
148
+ [ :on_stag, 'hoge' ]
149
+ [ :on_stag_end_empty, 'hoge' ]
150
+
151
+ ' <?Xml ?><hoge/>'
152
+ [ :parse_error, "reserved PI target `Xml'" ]
153
+ [ :on_pi, 'Xml', '' ]
154
+ [ :on_stag, 'hoge' ]
155
+ [ :on_stag_end_empty, 'hoge' ]
156
+
157
+ ' <?XML ?><hoge/>'
158
+ [ :parse_error, "reserved PI target `XML'" ]
159
+ [ :on_pi, 'XML', '' ]
160
+ [ :on_stag, 'hoge' ]
161
+ [ :on_stag_end_empty, 'hoge' ]
162
+
163
+ TESTCASEEND
164
+
165
+
166
+
167
+
168
+ deftestcase 'element_nesting', <<-'TESTCASEEND'
169
+
170
+ '<hoge></hoge>'
171
+ [ :on_stag, 'hoge' ]
172
+ [ :on_stag_end, 'hoge' ]
173
+ [ :on_etag, 'hoge' ]
174
+
175
+ '<hoge><fuga></fuga></hoge>'
176
+ [ :on_stag, 'hoge' ]
177
+ [ :on_stag_end, 'hoge' ]
178
+ [ :on_stag, 'fuga' ]
179
+ [ :on_stag_end, 'fuga' ]
180
+ [ :on_etag, 'fuga' ]
181
+ [ :on_etag, 'hoge' ]
182
+
183
+ '<hoge><fuga/></hoge>'
184
+ [ :on_stag, 'hoge' ]
185
+ [ :on_stag_end, 'hoge' ]
186
+ [ :on_stag, 'fuga' ]
187
+ [ :on_stag_end_empty, 'fuga' ]
188
+ [ :on_etag, 'hoge' ]
189
+
190
+ '<hoge/>'
191
+ [ :on_stag, 'hoge' ]
192
+ [ :on_stag_end_empty, 'hoge' ]
193
+
194
+ '<hoge><fuga>'
195
+ [ :on_stag, 'hoge' ]
196
+ [ :on_stag_end, 'hoge' ]
197
+ [ :on_stag, 'fuga' ]
198
+ [ :on_stag_end, 'fuga' ]
199
+ [ :parse_error, "unclosed element `fuga' meets EOF" ]
200
+ [ :on_etag, 'fuga' ]
201
+ [ :parse_error, "unclosed element `hoge' meets EOF" ]
202
+ [ :on_etag, 'hoge' ]
203
+
204
+ '<hoge><fuga></fuga>'
205
+ [ :on_stag, 'hoge' ]
206
+ [ :on_stag_end, 'hoge' ]
207
+ [ :on_stag, 'fuga' ]
208
+ [ :on_stag_end, 'fuga' ]
209
+ [ :on_etag, 'fuga' ]
210
+ [ :parse_error, "unclosed element `hoge' meets EOF" ]
211
+ [ :on_etag, 'hoge' ]
212
+
213
+ '<hoge><fuga></hoge></fuga>'
214
+ [ :on_stag, 'hoge' ]
215
+ [ :on_stag_end, 'hoge' ]
216
+ [ :on_stag, 'fuga' ]
217
+ [ :on_stag_end, 'fuga' ]
218
+ [ :wellformed_error, "element type `hoge' is not matched" ]
219
+ [ :on_etag, 'fuga' ]
220
+ [ :wellformed_error, "element type `fuga' is not matched" ]
221
+ [ :on_etag, 'hoge' ]
222
+
223
+ '<hoge></fuga>'
224
+ [ :on_stag, 'hoge' ]
225
+ [ :on_stag_end, 'hoge' ]
226
+ [ :wellformed_error, "element type `fuga' is not matched" ]
227
+ [ :on_etag, 'hoge' ]
228
+
229
+ '</hoge>'
230
+ [ :parse_error, "end tag `hoge' appears alone" ]
231
+ [ :parse_error, "no root element was found" ]
232
+
233
+ '<hoge></hoge><fuga>'
234
+ [ :on_stag, 'hoge' ]
235
+ [ :on_stag_end, 'hoge' ]
236
+ [ :on_etag, 'hoge' ]
237
+ [ :parse_error, "another root element is found" ]
238
+ [ :on_stag, 'fuga' ]
239
+ [ :on_stag_end, 'fuga' ]
240
+ [ :parse_error, "unclosed element `fuga' meets EOF" ]
241
+ [ :on_etag, 'fuga' ]
242
+
243
+ '<hoge></hoge></fuga>'
244
+ [ :on_stag, 'hoge' ]
245
+ [ :on_stag_end, 'hoge' ]
246
+ [ :on_etag, 'hoge' ]
247
+ [ :parse_error, "end tag `fuga' appears alone" ]
248
+
249
+ '<hoge/><fuga/>'
250
+ [ :on_stag, 'hoge' ]
251
+ [ :on_stag_end_empty, 'hoge' ]
252
+ [ :parse_error, "another root element is found" ]
253
+ [ :on_stag, 'fuga' ]
254
+ [ :on_stag_end_empty, 'fuga' ]
255
+
256
+ TESTCASEEND
257
+
258
+
259
+
260
+ deftestcase 'outside', <<-'TESTCASEEND'
261
+
262
+ '<hoge>fuga</hoge>'
263
+ [ :on_stag, 'hoge' ]
264
+ [ :on_stag_end, 'hoge' ]
265
+ [ :on_chardata, 'fuga' ]
266
+ [ :on_etag, 'hoge' ]
267
+
268
+ ' <hoge>fuga</hoge> '
269
+ [ :on_stag, 'hoge' ]
270
+ [ :on_stag_end, 'hoge' ]
271
+ [ :on_chardata, 'fuga' ]
272
+ [ :on_etag, 'hoge' ]
273
+
274
+ '<hoge><![CDATA[fuga]]></hoge>'
275
+ [ :on_stag, 'hoge' ]
276
+ [ :on_stag_end, 'hoge' ]
277
+ [ :on_cdata, 'fuga' ]
278
+ [ :on_etag, 'hoge' ]
279
+
280
+ 'fuga<hoge></hoge>'
281
+ [ :parse_error, "content of element is found outside of root element" ]
282
+ [ :on_chardata, 'fuga' ]
283
+ [ :on_stag, 'hoge' ]
284
+ [ :on_stag_end, 'hoge' ]
285
+ [ :on_etag, 'hoge' ]
286
+
287
+ '<![CDATA[fuga]]><hoge></hoge>'
288
+ [ :parse_error, "CDATA section is found outside of root element" ]
289
+ [ :on_cdata, 'fuga' ]
290
+ [ :on_stag, 'hoge' ]
291
+ [ :on_stag_end, 'hoge' ]
292
+ [ :on_etag, 'hoge' ]
293
+
294
+ '<hoge></hoge>fuga'
295
+ [ :on_stag, 'hoge' ]
296
+ [ :on_stag_end, 'hoge' ]
297
+ [ :on_etag, 'hoge' ]
298
+ [ :parse_error, "content of element is found outside of root element" ]
299
+ [ :on_chardata, 'fuga' ]
300
+
301
+ '<hoge></hoge><![CDATA[fuga]]>'
302
+ [ :on_stag, 'hoge' ]
303
+ [ :on_stag_end, 'hoge' ]
304
+ [ :on_etag, 'hoge' ]
305
+ [ :parse_error, "CDATA section is found outside of root element" ]
306
+ [ :on_cdata, 'fuga' ]
307
+
308
+ '<hoge></hoge><fuga>foo</fuga>'
309
+ [ :on_stag, 'hoge' ]
310
+ [ :on_stag_end, 'hoge' ]
311
+ [ :on_etag, 'hoge' ]
312
+ [ :parse_error, "another root element is found" ]
313
+ [ :on_stag, 'fuga' ]
314
+ [ :on_stag_end, 'fuga' ]
315
+ [ :on_chardata, 'foo' ]
316
+ [ :on_etag, 'fuga' ]
317
+
318
+ '<hoge></hoge><fuga><![CDATA[fuga]]></fuga>'
319
+ [ :on_stag, 'hoge' ]
320
+ [ :on_stag_end, 'hoge' ]
321
+ [ :on_etag, 'hoge' ]
322
+ [ :parse_error, "another root element is found" ]
323
+ [ :on_stag, 'fuga' ]
324
+ [ :on_stag_end, 'fuga' ]
325
+ [ :on_cdata, 'fuga' ]
326
+ [ :on_etag, 'fuga' ]
327
+
328
+ TESTCASEEND
329
+
330
+
331
+
332
+ deftestcase 'entityref', <<-'TESTCASEEND'
333
+
334
+ '<hoge>foo&lt;bar</hoge>'
335
+ [ :on_stag, 'hoge' ]
336
+ [ :on_stag_end, 'hoge' ]
337
+ [ :on_chardata, 'foo' ]
338
+ [ :on_entityref, 'lt' ]
339
+ [ :on_chardata, 'bar' ]
340
+ [ :on_etag, 'hoge' ]
341
+
342
+ '<hoge>foo&gt;bar</hoge>'
343
+ [ :on_stag, 'hoge' ]
344
+ [ :on_stag_end, 'hoge' ]
345
+ [ :on_chardata, 'foo' ]
346
+ [ :on_entityref, 'gt' ]
347
+ [ :on_chardata, 'bar' ]
348
+ [ :on_etag, 'hoge' ]
349
+
350
+ '<hoge>foo&amp;bar</hoge>'
351
+ [ :on_stag, 'hoge' ]
352
+ [ :on_stag_end, 'hoge' ]
353
+ [ :on_chardata, 'foo' ]
354
+ [ :on_entityref, 'amp' ]
355
+ [ :on_chardata, 'bar' ]
356
+ [ :on_etag, 'hoge' ]
357
+
358
+ '<hoge>foo&quot;bar</hoge>'
359
+ [ :on_stag, 'hoge' ]
360
+ [ :on_stag_end, 'hoge' ]
361
+ [ :on_chardata, 'foo' ]
362
+ [ :on_entityref, 'quot' ]
363
+ [ :on_chardata, 'bar' ]
364
+ [ :on_etag, 'hoge' ]
365
+
366
+ '<hoge>foo&apos;bar</hoge>'
367
+ [ :on_stag, 'hoge' ]
368
+ [ :on_stag_end, 'hoge' ]
369
+ [ :on_chardata, 'foo' ]
370
+ [ :on_entityref, 'apos' ]
371
+ [ :on_chardata, 'bar' ]
372
+ [ :on_etag, 'hoge' ]
373
+
374
+ '<hoge>foo&fuga;bar</hoge>'
375
+ [ :on_stag, 'hoge' ]
376
+ [ :on_stag_end, 'hoge' ]
377
+ [ :on_chardata, 'foo' ]
378
+ [ :on_entityref, 'fuga' ]
379
+ [ :on_chardata, 'bar' ]
380
+ [ :on_etag, 'hoge' ]
381
+
382
+ TESTCASEEND
383
+
384
+
385
+
386
+ deftestcase 'charref', <<-'TESTCASEEND'
387
+
388
+ '<hoge>fu&#103;a</hoge>'
389
+ [ :on_stag, 'hoge' ]
390
+ [ :on_stag_end, 'hoge' ]
391
+ [ :on_chardata, 'fu' ]
392
+ [ :on_charref, 103 ]
393
+ [ :on_chardata, 'a' ]
394
+ [ :on_etag, 'hoge' ]
395
+
396
+ '<hoge>fu&#x67;a</hoge>'
397
+ [ :on_stag, 'hoge' ]
398
+ [ :on_stag_end, 'hoge' ]
399
+ [ :on_chardata, 'fu' ]
400
+ [ :on_charref_hex, 103 ]
401
+ [ :on_chardata, 'a' ]
402
+ [ :on_etag, 'hoge' ]
403
+
404
+ TESTCASEEND
405
+
406
+
407
+
408
+ deftestcase 'attr_entityref', <<-'TESTCASEEND'
409
+
410
+ '<hoge fuga="foo&lt;bar"></hoge>'
411
+ [ :on_stag, 'hoge' ]
412
+ [ :on_attribute, 'fuga' ]
413
+ [ :on_attr_value, 'foo' ]
414
+ [ :on_attr_entityref, 'lt' ]
415
+ [ :on_attr_value, 'bar' ]
416
+ [ :on_attribute_end, 'fuga' ]
417
+ [ :on_stag_end, 'hoge' ]
418
+ [ :on_etag, 'hoge' ]
419
+
420
+ '<hoge fuga="foo&gt;bar"></hoge>'
421
+ [ :on_stag, 'hoge' ]
422
+ [ :on_attribute, 'fuga' ]
423
+ [ :on_attr_value, 'foo' ]
424
+ [ :on_attr_entityref, 'gt' ]
425
+ [ :on_attr_value, 'bar' ]
426
+ [ :on_attribute_end, 'fuga' ]
427
+ [ :on_stag_end, 'hoge' ]
428
+ [ :on_etag, 'hoge' ]
429
+
430
+ '<hoge fuga="foo&amp;bar"></hoge>'
431
+ [ :on_stag, 'hoge' ]
432
+ [ :on_attribute, 'fuga' ]
433
+ [ :on_attr_value, 'foo' ]
434
+ [ :on_attr_entityref, 'amp' ]
435
+ [ :on_attr_value, 'bar' ]
436
+ [ :on_attribute_end, 'fuga' ]
437
+ [ :on_stag_end, 'hoge' ]
438
+ [ :on_etag, 'hoge' ]
439
+
440
+ '<hoge fuga="foo&quot;bar"></hoge>'
441
+ [ :on_stag, 'hoge' ]
442
+ [ :on_attribute, 'fuga' ]
443
+ [ :on_attr_value, 'foo' ]
444
+ [ :on_attr_entityref, 'quot' ]
445
+ [ :on_attr_value, 'bar' ]
446
+ [ :on_attribute_end, 'fuga' ]
447
+ [ :on_stag_end, 'hoge' ]
448
+ [ :on_etag, 'hoge' ]
449
+
450
+ '<hoge fuga="foo&apos;bar"></hoge>'
451
+ [ :on_stag, 'hoge' ]
452
+ [ :on_attribute, 'fuga' ]
453
+ [ :on_attr_value, 'foo' ]
454
+ [ :on_attr_entityref, 'apos' ]
455
+ [ :on_attr_value, 'bar' ]
456
+ [ :on_attribute_end, 'fuga' ]
457
+ [ :on_stag_end, 'hoge' ]
458
+ [ :on_etag, 'hoge' ]
459
+
460
+ '<hoge fuga="foo&HOGE;bar"></hoge>'
461
+ [ :on_stag, 'hoge' ]
462
+ [ :on_attribute, 'fuga' ]
463
+ [ :on_attr_value, 'foo' ]
464
+ [ :on_attr_entityref, 'HOGE' ]
465
+ [ :on_attr_value, 'bar' ]
466
+ [ :on_attribute_end, 'fuga' ]
467
+ [ :on_stag_end, 'hoge' ]
468
+ [ :on_etag, 'hoge' ]
469
+
470
+ TESTCASEEND
471
+
472
+
473
+
474
+ deftestcase 'attr_charref', <<-'TESTCASEEND'
475
+
476
+ '<hoge foo="fu&#103;a"/>'
477
+ [ :on_stag, 'hoge' ]
478
+ [ :on_attribute, 'foo' ]
479
+ [ :on_attr_value, 'fu' ]
480
+ [ :on_attr_charref, 103 ]
481
+ [ :on_attr_value, 'a' ]
482
+ [ :on_attribute_end, 'foo' ]
483
+ [ :on_stag_end_empty, 'hoge' ]
484
+
485
+ '<hoge foo="fu&#x67;a"/>'
486
+ [ :on_stag, 'hoge' ]
487
+ [ :on_attribute, 'foo' ]
488
+ [ :on_attr_value, 'fu' ]
489
+ [ :on_attr_charref_hex, 103 ]
490
+ [ :on_attr_value, 'a' ]
491
+ [ :on_attribute_end, 'foo' ]
492
+ [ :on_stag_end_empty, 'hoge' ]
493
+
494
+ TESTCASEEND
495
+
496
+
497
+
498
+ deftestcase 'normalize', <<-'TESTCASEEND'
499
+
500
+ "<hoge fuga=' foo bar '></hoge>"
501
+ [ :on_stag, 'hoge' ]
502
+ [ :on_attribute, 'fuga' ]
503
+ [ :on_attr_value, ' foo bar ' ]
504
+ [ :on_attribute_end, 'fuga' ]
505
+ [ :on_stag_end, 'hoge' ]
506
+ [ :on_etag, 'hoge' ]
507
+
508
+ "<hoge fuga='\tfoo\nbar\t'></hoge>"
509
+ [ :on_stag, 'hoge' ]
510
+ [ :on_attribute, 'fuga' ]
511
+ [ :on_attr_value, ' foo bar ' ]
512
+ [ :on_attribute_end, 'fuga' ]
513
+ [ :on_stag_end, 'hoge' ]
514
+ [ :on_etag, 'hoge' ]
515
+
516
+ "<hoge fuga='\tfoo\r\nbar\t'></hoge>"
517
+ [ :on_stag, 'hoge' ]
518
+ [ :on_attribute, 'fuga' ]
519
+ [ :on_attr_value, ' foo bar ' ]
520
+ [ :on_attribute_end, 'fuga' ]
521
+ [ :on_stag_end, 'hoge' ]
522
+ [ :on_etag, 'hoge' ]
523
+
524
+ "<hoge fuga='\tfoo\r\nbar\t'></hoge>"
525
+ [ :on_stag, 'hoge' ]
526
+ [ :on_attribute, 'fuga' ]
527
+ [ :on_attr_value, ' foo bar ' ]
528
+ [ :on_attribute_end, 'fuga' ]
529
+ [ :on_stag_end, 'hoge' ]
530
+ [ :on_etag, 'hoge' ]
531
+
532
+ "<hoge fuga='\tfoo&#9;bar\t'></hoge>"
533
+ [ :on_stag, 'hoge' ]
534
+ [ :on_attribute, 'fuga' ]
535
+ [ :on_attr_value, ' foo' ]
536
+ [ :on_attr_charref, 9 ]
537
+ [ :on_attr_value, 'bar ' ]
538
+ [ :on_attribute_end, 'fuga' ]
539
+ [ :on_stag_end, 'hoge' ]
540
+ [ :on_etag, 'hoge' ]
541
+
542
+ TESTCASEEND
543
+
544
+
545
+
546
+ deftestcase 'attribute', <<-'TESTCASEEND'
547
+
548
+ '<hoge foo="bar" bar="fuga"/>'
549
+ [ :on_stag, 'hoge' ]
550
+ [ :on_attribute, 'foo' ]
551
+ [ :on_attr_value, 'bar' ]
552
+ [ :on_attribute_end, 'foo' ]
553
+ [ :on_attribute, 'bar' ]
554
+ [ :on_attr_value, 'fuga' ]
555
+ [ :on_attribute_end, 'bar' ]
556
+ [ :on_stag_end_empty, 'hoge' ]
557
+
558
+ '<hoge foo="bar" foo="fuga"/>'
559
+ [ :on_stag, 'hoge' ]
560
+ [ :on_attribute, 'foo' ]
561
+ [ :on_attr_value, 'bar' ]
562
+ [ :on_attribute_end, 'foo' ]
563
+ [ :wellformed_error, "doubled attribute `foo'" ]
564
+ [ :on_attribute, 'foo' ]
565
+ [ :on_attr_value, 'fuga' ]
566
+ [ :on_attribute_end, 'foo' ]
567
+ [ :on_stag_end_empty, 'hoge' ]
568
+
569
+ '<hoge foo="bar" foo="fuga" foo="hoge"/>'
570
+ [ :on_stag, 'hoge' ]
571
+ [ :on_attribute, 'foo' ]
572
+ [ :on_attr_value, 'bar' ]
573
+ [ :on_attribute_end, 'foo' ]
574
+ [ :wellformed_error, "doubled attribute `foo'" ]
575
+ [ :on_attribute, 'foo' ]
576
+ [ :on_attr_value, 'fuga' ]
577
+ [ :on_attribute_end, 'foo' ]
578
+ [ :wellformed_error, "doubled attribute `foo'" ]
579
+ [ :on_attribute, 'foo' ]
580
+ [ :on_attr_value, 'hoge' ]
581
+ [ :on_attribute_end, 'foo' ]
582
+ [ :on_stag_end_empty, 'hoge' ]
583
+
584
+ TESTCASEEND
585
+
586
+ end
587
+
588
+
589
+
590
+
591
+ load "#{File.dirname($0)}/runtest.rb" if __FILE__ == $0