xamplr-pp 1.0.0 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,655 @@
1
+ # xampl-pp : XML pull parser
2
+ # Copyright (C) 2002-2009 Bob Hutchison
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # #Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+ #
18
+ require "Lapidary/TestCase"
19
+ require "xampl-pp"
20
+
21
+ class XppTestParse < Xampl_PP
22
+ def doParseText(delimiter, resolve)
23
+ parseText(delimiter, resolve)
24
+ end
25
+
26
+ def getTextBuffer
27
+ @textBuffer
28
+ end
29
+
30
+ def clearTextBuffer
31
+ @textBuffer = ''
32
+ end
33
+
34
+ def makeStart
35
+ @type = START_ELEMENT
36
+ end
37
+
38
+ def deeper(prefix, name)
39
+ @elementPrefix.push prefix
40
+ @elementName.push name
41
+ @elementQName.push ((nil == prefix) ? name : (prefix + ':' + name))
42
+ @elementNamespace.push prefix
43
+ end
44
+
45
+ def doPeekType
46
+ peekType
47
+ end
48
+ end
49
+
50
+ class TC_Parse < Lapidary::TestCase
51
+ def setup
52
+ @xpp = XppTestParse.new
53
+ end
54
+ #def tearDown
55
+ #end
56
+
57
+ def testParseText
58
+ @xpp.input = "dummy'"
59
+ @xpp.doParseText(?', true) # for vim: '
60
+ assert "dummy" == @xpp.getTextBuffer
61
+
62
+ @xpp.input = "dummy<start>"
63
+ @xpp.doParseText(?<, true)
64
+ assert "dummy" == @xpp.getTextBuffer
65
+
66
+ @xpp.input = "dummy&lt;dummy"
67
+ @xpp.doParseText(?', true) # for vim: '
68
+ assert "dummy<dummy" == @xpp.getTextBuffer
69
+
70
+ @xpp.input = "dummy&lt;dummy'"
71
+ @xpp.doParseText(?', false) # for vim: '
72
+ assert "dummy" == @xpp.getTextBuffer
73
+
74
+ @xpp.input = "dummy&junk;dummy'"
75
+ @xpp.doParseText(?', false) # for vim: '
76
+ assert "dummy" == @xpp.getTextBuffer
77
+
78
+ @xpp.input = "dummy&junk;dummy'"
79
+ assertRaises( RuntimeError ) {
80
+ @xpp.doParseText(?', true) # for vim: '
81
+ }
82
+ end
83
+
84
+ def testEndDocumentPeekType
85
+ @xpp.input = ""
86
+ assert Xampl_PP::END_DOCUMENT == @xpp.doPeekType
87
+ @xpp.input = "\000"
88
+ assert Xampl_PP::END_DOCUMENT == @xpp.doPeekType
89
+ end
90
+
91
+ def testEntityRefPeekType
92
+ @xpp.input = "&lt;"
93
+ assert Xampl_PP::ENTITY_REF == @xpp.doPeekType
94
+ end
95
+
96
+ def testTextPeekType
97
+ @xpp.input = "text"
98
+ assert Xampl_PP::TEXT == @xpp.doPeekType
99
+ end
100
+
101
+ def testEndElementPeekType
102
+ @xpp.input = "</end>"
103
+ assert Xampl_PP::END_ELEMENT == @xpp.doPeekType
104
+ end
105
+
106
+ def testCdataSectionPeekType
107
+ @xpp.input = "<![CDATA[blah]]>"
108
+ assert Xampl_PP::UNDECIDED_TYPE == @xpp.doPeekType
109
+ end
110
+
111
+ def testProcessingPeekType
112
+ @xpp.input = "<?do something?>"
113
+ assert Xampl_PP::UNDECIDED_TYPE == @xpp.doPeekType
114
+ end
115
+
116
+ def testCommentPeekType
117
+ @xpp.input = "<!-- comment -->"
118
+ assert Xampl_PP::UNDECIDED_TYPE == @xpp.doPeekType
119
+ end
120
+
121
+ def testStartElementPeekType
122
+ @xpp.input = "<start>"
123
+ assert Xampl_PP::START_ELEMENT == @xpp.doPeekType
124
+ end
125
+
126
+ def testEndDocumentNextEvent
127
+ @xpp.input = ""
128
+ #@xpp.checkWellFormed = false
129
+ eventType = @xpp.nextEvent
130
+ assert @xpp.endDocument?
131
+
132
+ @xpp.input = "\000"
133
+ eventType = @xpp.nextEvent
134
+ assert @xpp.endDocument?
135
+ end
136
+
137
+ def testEntityRefNextEvent
138
+ @xpp.input = "&lt;"
139
+ #@xpp.checkWellFormed = false
140
+ eventType = @xpp.nextEvent
141
+ assert @xpp.entityRef?
142
+ assert !@xpp.unresolvedEntity
143
+ assert 'lt' == @xpp.name
144
+ assert '<' == @xpp.text
145
+
146
+ @xpp.input = "&blah;"
147
+ assertRaises( RuntimeError ) { eventType = @xpp.nextEvent }
148
+
149
+ @xpp.input = "&#x20;"
150
+ eventType = @xpp.nextEvent
151
+ assert @xpp.entityRef?
152
+ assert !@xpp.unresolvedEntity
153
+ assert '#x20' == @xpp.name
154
+ assert 0x20 == @xpp.text[0]
155
+
156
+ @xpp.input = "&#32;"
157
+ eventType = @xpp.nextEvent
158
+ assert @xpp.entityRef?
159
+ assert !@xpp.unresolvedEntity
160
+ assert '#32' == @xpp.name
161
+ assert 32 == @xpp.text[0]
162
+ end
163
+
164
+ def testEndElementNextEvent
165
+ # no start element...
166
+ @xpp.input = "</end>"
167
+ assertRaises( RuntimeError ) { eventType = @xpp.nextEvent }
168
+
169
+ # fake a start element, illegal name
170
+ @xpp.input = "</*>"
171
+ @xpp.deeper(nil, "*")
172
+ assertRaises( RuntimeError ) { eventType = @xpp.nextEvent }
173
+
174
+ # fake a start element. This should work. make sure that we don't have
175
+ # and unresolved entity stuff nor anything on the element stacks
176
+ @xpp.input = "</end>"
177
+ @xpp.deeper(nil, 'end')
178
+ eventType = @xpp.nextEvent
179
+ assert @xpp.endElement?
180
+ assert !@xpp.unresolvedEntity
181
+ assert 'end' == @xpp.name
182
+ assert 0 == @xpp.elementName.length
183
+ assert 0 == @xpp.elementQName.length
184
+ assert 0 == @xpp.elementNamespace.length
185
+ assert 0 == @xpp.elementPrefix.length
186
+
187
+ # fake a start element, with a namespace
188
+ @xpp.input = "</space:end>"
189
+ @xpp.deeper('space', 'end')
190
+ eventType = @xpp.nextEvent
191
+ assert @xpp.endElement?
192
+ assert !@xpp.unresolvedEntity
193
+ assert 'end' == @xpp.name
194
+
195
+ # fake a start element, different from the end
196
+ @xpp.input = "</end>"
197
+ @xpp.deeper(nil, 'start')
198
+ assertRaises( RuntimeError ) { eventType = @xpp.nextEvent }
199
+ end
200
+
201
+ def testStartElementNextEvent
202
+ @xpp.input = "<start>"
203
+ eventType = @xpp.nextEvent
204
+ assert @xpp.startElement?
205
+ assert !@xpp.unresolvedEntity
206
+ assert 1 == @xpp.elementName.length
207
+ assert 'start' == @xpp.name
208
+ assert !@xpp.emptyElement
209
+ assert 1 == @xpp.elementName.length
210
+ assert 1 == @xpp.elementQName.length
211
+ assert 1 == @xpp.elementNamespace.length
212
+ assert 1 == @xpp.elementPrefix.length
213
+ assert 0 == @xpp.attributeName.length
214
+ assert 0 == @xpp.attributeQName.length
215
+ assert 0 == @xpp.attributeNamespace.length
216
+ assert 0 == @xpp.attributePrefix.length
217
+ assert 0 == @xpp.attributeValue.length
218
+
219
+ assert 'start' == @xpp.elementName[0]
220
+ assert 'start' == @xpp.elementQName[0]
221
+ assert nil == @xpp.elementNamespace[0]
222
+ assert nil == @xpp.elementPrefix[0]
223
+
224
+ @xpp.input = "<start/>"
225
+ eventType = @xpp.nextEvent
226
+ assert @xpp.startElement?
227
+ assert !@xpp.unresolvedEntity
228
+ assert 0 == @xpp.elementName.length
229
+ assert 'start' == @xpp.name
230
+ assert @xpp.emptyElement
231
+ assert 0 == @xpp.elementName.length
232
+ assert 0 == @xpp.elementQName.length
233
+ assert 0 == @xpp.elementNamespace.length
234
+ assert 0 == @xpp.elementPrefix.length
235
+ assert 0 == @xpp.attributeName.length
236
+ assert 0 == @xpp.attributeQName.length
237
+ assert 0 == @xpp.attributeNamespace.length
238
+ assert 0 == @xpp.attributePrefix.length
239
+ assert 0 == @xpp.attributeValue.length
240
+ eventType = @xpp.nextEvent
241
+ assert @xpp.endElement?
242
+
243
+ @xpp.input = "<start"
244
+ assertRaises( RuntimeError ) { eventType = @xpp.nextEvent }
245
+
246
+ @xpp.input = "<start <>"
247
+ assertRaises( RuntimeError ) { eventType = @xpp.nextEvent }
248
+
249
+ @xpp.input = "<start attr='value'/>"
250
+ eventType = @xpp.nextEvent
251
+ assert @xpp.startElement?
252
+ assert !@xpp.unresolvedEntity
253
+ assert 0 == @xpp.elementName.length
254
+ assert 'start' == @xpp.name
255
+ assert @xpp.emptyElement
256
+ assert 0 == @xpp.elementName.length
257
+ assert 0 == @xpp.elementQName.length
258
+ assert 0 == @xpp.elementNamespace.length
259
+ assert 0 == @xpp.elementPrefix.length
260
+ assert 1 == @xpp.attributeName.length
261
+ assert 1 == @xpp.attributeQName.length
262
+ assert 1 == @xpp.attributeNamespace.length
263
+ assert 1 == @xpp.attributePrefix.length
264
+ assert 1 == @xpp.attributeValue.length
265
+ assert 'attr' == @xpp.attributeName[0]
266
+ assert 'attr' == @xpp.attributeQName[0]
267
+ assert nil == @xpp.attributeNamespace[0]
268
+ assert nil == @xpp.attributePrefix[0]
269
+ assert 'value' == @xpp.attributeValue[0]
270
+
271
+ end
272
+
273
+ def testNSAttributeCount
274
+ @xpp.input = "<start attr1='value1'>"
275
+
276
+ eventType = @xpp.nextEvent
277
+ assert @xpp.startElement?
278
+ assert 'start' == @xpp.name
279
+ assert 1 == @xpp.elementName.length
280
+ assert 1 == @xpp.elementQName.length
281
+ assert 1 == @xpp.elementNamespace.length
282
+ assert 1 == @xpp.elementPrefix.length
283
+
284
+ assert 1 == @xpp.attributeName.length
285
+ assert 1 == @xpp.attributeQName.length
286
+ assert 1 == @xpp.attributeNamespace.length
287
+ assert 1 == @xpp.attributePrefix.length
288
+ assert 1 == @xpp.attributeValue.length
289
+
290
+ assert 'start' == @xpp.elementName[0]
291
+ assert 'start' == @xpp.elementQName[0]
292
+ assert nil == @xpp.elementNamespace[0]
293
+ assert nil == @xpp.elementPrefix[0]
294
+
295
+ assert 'attr1' == @xpp.attributeName[0]
296
+ assert 'attr1' == @xpp.attributeQName[0]
297
+ assert nil == @xpp.attributeNamespace[0]
298
+ assert nil == @xpp.attributePrefix[0]
299
+ assert 'value1' == @xpp.attributeValue[0]
300
+
301
+ @xpp.input = "<start attr1='value1' attr2='value2'>"
302
+ #@xpp.checkWellFormed = false
303
+
304
+ eventType = @xpp.nextEvent
305
+ assert @xpp.startElement?
306
+ assert 'start' == @xpp.name
307
+ assert 1 == @xpp.elementName.length
308
+ assert 1 == @xpp.elementQName.length
309
+ assert 1 == @xpp.elementNamespace.length
310
+ assert 1 == @xpp.elementPrefix.length
311
+
312
+ assert 2 == @xpp.attributeName.length
313
+ assert 2 == @xpp.attributeQName.length
314
+ assert 2 == @xpp.attributeNamespace.length
315
+ assert 2 == @xpp.attributePrefix.length
316
+ assert 2 == @xpp.attributeValue.length
317
+
318
+ assert 'start' == @xpp.elementName[0]
319
+ assert 'start' == @xpp.elementQName[0]
320
+ assert nil == @xpp.elementNamespace[0]
321
+ assert nil == @xpp.elementPrefix[0]
322
+
323
+ assert 'attr1' == @xpp.attributeName[0]
324
+ assert 'attr1' == @xpp.attributeQName[0]
325
+ assert nil == @xpp.attributeNamespace[0]
326
+ assert nil == @xpp.attributePrefix[0]
327
+ assert 'value1' == @xpp.attributeValue[0]
328
+
329
+ assert 'attr2' == @xpp.attributeName[1]
330
+ assert 'attr2' == @xpp.attributeQName[1]
331
+ assert nil == @xpp.attributeNamespace[1]
332
+ assert nil == @xpp.attributePrefix[1]
333
+ assert 'value2' == @xpp.attributeValue[1]
334
+ end
335
+
336
+ def testNSStartEnd000
337
+ @xpp.input = "<start></start>"
338
+
339
+ eventType = @xpp.nextEvent
340
+ assert @xpp.startElement?
341
+ eventType = @xpp.nextEvent
342
+ assert @xpp.endElement?
343
+ end
344
+
345
+ def testNSStartEnd001
346
+ @xpp.input = "<start ></start >"
347
+
348
+ eventType = @xpp.nextEvent
349
+ assert @xpp.startElement?
350
+ eventType = @xpp.nextEvent
351
+ assert @xpp.endElement?
352
+ end
353
+
354
+ def testAttributeEncoding
355
+ @xpp.input = "<start attr=' this&#x0d;&#x0a; also gets&#x20; normalized '/>"
356
+
357
+ eventType = @xpp.nextEvent
358
+ assert @xpp.startElement?
359
+
360
+ assert 1 == @xpp.attributeName.length
361
+ assert 1 == @xpp.attributeQName.length
362
+ assert 1 == @xpp.attributeNamespace.length
363
+ assert 1 == @xpp.attributePrefix.length
364
+ assert 1 == @xpp.attributeValue.length
365
+
366
+ assert 'attr' == @xpp.attributeName[0]
367
+ assert 'attr' == @xpp.attributeQName[0]
368
+ assert nil == @xpp.attributeNamespace[0]
369
+ assert nil == @xpp.attributePrefix[0]
370
+ assert " this\x0d\x0a also gets normalized " == @xpp.attributeValue[0]
371
+
372
+ eventType = @xpp.nextEvent
373
+ assert @xpp.endElement?
374
+ end
375
+
376
+ def testNSEmpty
377
+ @xpp.input = "<root><start/><start/><start><start/></start></root>"
378
+
379
+ eventType = @xpp.nextEvent
380
+ assert @xpp.startElement?
381
+
382
+ eventType = @xpp.nextEvent
383
+ assert @xpp.startElement?
384
+ eventType = @xpp.nextEvent
385
+ assert @xpp.endElement?
386
+
387
+ eventType = @xpp.nextEvent
388
+ assert @xpp.startElement?
389
+ eventType = @xpp.nextEvent
390
+ assert @xpp.endElement?
391
+
392
+ eventType = @xpp.nextEvent
393
+ assert @xpp.startElement?
394
+ eventType = @xpp.nextEvent
395
+ assert @xpp.startElement?
396
+ eventType = @xpp.nextEvent
397
+ assert @xpp.endElement?
398
+ eventType = @xpp.nextEvent
399
+ assert @xpp.endElement?
400
+
401
+ eventType = @xpp.nextEvent
402
+ assert @xpp.endElement?
403
+ end
404
+
405
+ def testNSSample
406
+ s = <<END
407
+ <feeds xmlns:auth='http://www.recursive.ca/portal/authorization'
408
+ xmlns='http://www.recursive.ca/feeds'>
409
+ <feed id='generation purpose only'
410
+ userContributionsAllowed='false'
411
+ name='this is not supposed to be used'
412
+ maxCount='15'
413
+ style='news'>
414
+ <auth:excludeRole id='member'/>
415
+ </feed>
416
+ </feeds>
417
+ END
418
+ @xpp.input = s
419
+ type = @xpp.nextEvent
420
+ while not @xpp.endDocument? do
421
+ if @xpp.startElement? then
422
+ elsif @xpp.endElement? then
423
+ end
424
+ type = @xpp.nextEvent
425
+ end
426
+ end
427
+
428
+ def testNSSample
429
+ s = <<END
430
+ <feeds
431
+ xmlns:auth='http://www.recursive.ca/portal/authorization'
432
+ xmlns='http://www.recursive.ca/feeds'
433
+ >
434
+ <feed
435
+ id='generation purpose only'
436
+ userContributionsAllowed='false'
437
+ name='this is not supposed to be used'
438
+ maxCount='15'
439
+ style='news'
440
+ >
441
+ <auth:excludeRole
442
+ id='member'
443
+ />
444
+ </feed
445
+ >
446
+ </feeds
447
+ >
448
+ END
449
+ @xpp.input = s
450
+ type = @xpp.nextEvent
451
+ while not @xpp.endDocument? do
452
+ if @xpp.startElement? then
453
+ elsif @xpp.endElement? then
454
+ end
455
+ type = @xpp.nextEvent
456
+ end
457
+ end
458
+
459
+ def testNSStartEndError000
460
+ @xpp.input = "<start></end>"
461
+ eventType = @xpp.nextEvent
462
+ assert @xpp.startElement?
463
+ assertRaises( RuntimeError ) {
464
+ eventType = @xpp.nextEvent
465
+ }
466
+ end
467
+
468
+ def testNSStartEndError001
469
+ @xpp.input = "<ns:start xmlns:ns='my-namespace'></start>"
470
+ eventType = @xpp.nextEvent
471
+ assert @xpp.startElement?
472
+ assertRaises( RuntimeError ) {
473
+ eventType = @xpp.nextEvent
474
+ }
475
+ end
476
+
477
+ def testNSStartEndError002
478
+ @xpp.input = "<ns:start\n \t xmlns:ns='my-namespace'></start>"
479
+ eventType = @xpp.nextEvent
480
+ assert @xpp.startElement?
481
+ assertRaises( RuntimeError ) {
482
+ eventType = @xpp.nextEvent
483
+ }
484
+ end
485
+
486
+ def testNSStartEndError003
487
+ #@xpp.input = '<ns:start\t \t xmlns:ns=\'my-namespace\'></start>'
488
+ @xpp.input = "<ns:start\n \t xmlns:ns=\"my-namespace\"></start>"
489
+ eventType = @xpp.nextEvent
490
+ assert @xpp.startElement?
491
+ assertRaises( RuntimeError ) {
492
+ eventType = @xpp.nextEvent
493
+ }
494
+ end
495
+
496
+ def testTextNextEvent000
497
+ @xpp.input = "text"
498
+ #@xpp.checkWellFormed = false
499
+ eventType = @xpp.nextEvent
500
+ assert @xpp.text?
501
+
502
+ @xpp.input = "<start>blah</start>"
503
+
504
+ eventType = @xpp.nextEvent
505
+ assert @xpp.startElement?
506
+
507
+ eventType = @xpp.nextEvent
508
+ assert @xpp.text?
509
+ assert 'blah' == @xpp.text
510
+
511
+ eventType = @xpp.nextEvent
512
+ assert @xpp.endElement?
513
+ end
514
+
515
+ def testTextNextEvent001
516
+ @xpp.input = "<start>bl&lt;ah</start>"
517
+
518
+ eventType = @xpp.nextEvent
519
+ assert @xpp.startElement?
520
+
521
+ eventType = @xpp.nextEvent
522
+ assert @xpp.text?
523
+ assert 'bl' == @xpp.text
524
+
525
+ eventType = @xpp.nextEvent
526
+ assert @xpp.entityRef?
527
+ assert '<' == @xpp.text
528
+
529
+ eventType = @xpp.nextEvent
530
+ assert @xpp.text?
531
+ assert 'ah' == @xpp.text
532
+
533
+ eventType = @xpp.nextEvent
534
+ assert @xpp.endElement?
535
+ end
536
+
537
+ def testTextNextEvent002
538
+ @xpp.input = "<start a1='v1'\na2='v2'>blah</start>"
539
+
540
+ eventType = @xpp.nextEvent
541
+ assert @xpp.startElement?
542
+
543
+ eventType = @xpp.nextEvent
544
+ assert @xpp.text?
545
+ assert 'blah' == @xpp.text
546
+
547
+ eventType = @xpp.nextEvent
548
+ assert @xpp.endElement?
549
+ end
550
+
551
+ def testTextNextEvent003
552
+ @xpp.input = "<start><![CDATA[blah]]></start>"
553
+
554
+ eventType = @xpp.nextEvent
555
+ assert @xpp.startElement?
556
+
557
+ eventType = @xpp.nextEvent
558
+ assert @xpp.cdata?
559
+ assert 'blah' == @xpp.text
560
+
561
+ eventType = @xpp.nextEvent
562
+ assert @xpp.endElement?
563
+
564
+ @xpp.input = "<start>aaaa<![CDATA[bbbb]]>cccc</start>"
565
+
566
+ eventType = @xpp.nextEvent
567
+ assert @xpp.startElement?
568
+
569
+ eventType = @xpp.nextEvent
570
+ assert @xpp.text?
571
+ assert 'aaaa' == @xpp.text
572
+
573
+ eventType = @xpp.nextEvent
574
+ assert @xpp.cdata?
575
+ assert 'bbbb' == @xpp.text
576
+
577
+ eventType = @xpp.nextEvent
578
+ assert @xpp.text?
579
+ assert 'cccc' == @xpp.text
580
+
581
+ eventType = @xpp.nextEvent
582
+ assert @xpp.endElement?
583
+
584
+
585
+ end
586
+
587
+
588
+ def testCdataSectionNextEvent
589
+ #@xpp.checkWellFormed = false
590
+ @xpp.input = "<![CDATA[blah]]>"
591
+ eventType = @xpp.nextEvent
592
+ assert @xpp.cdata?
593
+ assert 'blah' == @xpp.text
594
+ end
595
+
596
+ def testProcessingNextEvent
597
+ @xpp.input = "<?do something?>"
598
+ eventType = @xpp.nextEvent
599
+ assert @xpp.processingInstruction?
600
+ assert 'do something' == @xpp.text
601
+ end
602
+
603
+ def testCommentNextEvent
604
+ @xpp.input = "<!-- comment -->"
605
+ eventType = @xpp.nextEvent
606
+ assert @xpp.comment?
607
+ assert ' comment ' == @xpp.text
608
+ end
609
+
610
+ def testDoctype
611
+ @xpp.input = "<!DOCTYPE something 'else'>"
612
+ eventType = @xpp.nextEvent
613
+ assert @xpp.doctype?
614
+ assert " something 'else'" == @xpp.text
615
+
616
+ @xpp.input = '<!DOCTYPE something "else">'
617
+ eventType = @xpp.nextEvent
618
+ assert @xpp.doctype?
619
+ assert ' something "else"' == @xpp.text
620
+
621
+ @xpp.input = "<!DOCTYPE <something 'else'>>"
622
+ eventType = @xpp.nextEvent
623
+ assert @xpp.doctype?
624
+ assert " <something 'else'>" == @xpp.text
625
+
626
+ @xpp.input = "<!DOCTYPE something 'e<lse'>"
627
+ eventType = @xpp.nextEvent
628
+ assert @xpp.doctype?
629
+ assert " something 'e<lse'" == @xpp.text
630
+
631
+ @xpp.input = "<!DOCTYPE something 'e>lse'>"
632
+ eventType = @xpp.nextEvent
633
+ assert @xpp.doctype?
634
+ assert " something 'e>lse'" == @xpp.text
635
+
636
+ @xpp.input = "<!DOCTYPE <!-- quote ' in comment -->something else>"
637
+ eventType = @xpp.nextEvent
638
+ assert @xpp.doctype?
639
+ assert " <!-- quote ' in comment -->something else" == @xpp.text
640
+
641
+ @xpp.input = "<!DOCTYPE <!-- quote ' in comment --><!-- another ' -->something else>"
642
+ eventType = @xpp.nextEvent
643
+ assert @xpp.doctype?
644
+ assert " <!-- quote ' in comment --><!-- another ' -->something else" == @xpp.text
645
+
646
+ @xpp.input = File.new("TC_Parse000.data")
647
+ eventType = @xpp.nextEvent
648
+ assert @xpp.doctype?
649
+ assert "\n<!-- quote ' in comment -->\n<!-- another ' -->\nsomething\nelse\n" == @xpp.text
650
+ assert 6 == @xpp.line
651
+ assert 1 == @xpp.column
652
+
653
+ end
654
+
655
+ end
@@ -0,0 +1,6 @@
1
+ <!DOCTYPE
2
+ <!-- quote ' in comment -->
3
+ <!-- another ' -->
4
+ something
5
+ else
6
+ >
@@ -0,0 +1,45 @@
1
+ # xampl-pp : XML pull parser
2
+ # Copyright (C) 2002-2009 Bob Hutchison
3
+ #
4
+ # This library is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU Lesser General Public
6
+ # License as published by the Free Software Foundation; either
7
+ # version 2.1 of the License, or (at your option) any later version.
8
+ #
9
+ # This library is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ # #Lesser General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU Lesser General Public
15
+ # License along with this library; if not, write to the Free Software
16
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+ #
18
+ require 'Lapidary/TestSuite'
19
+ require 'Lapidary/UI/Console/TestRunner'
20
+
21
+ require 'TC_EventTypes'
22
+ require 'TC_Features'
23
+ require 'TC_Misc'
24
+ require 'TC_Input'
25
+ require 'TC_Parse'
26
+ require 'TC_Namespace'
27
+
28
+ class TS_xpp
29
+ def TS_xpp.suite()
30
+ suite = Lapidary::TestSuite.new()
31
+ suite.add(TC_EventTypes.suite())
32
+ suite.add(TC_Features.suite())
33
+ suite.add(TC_Misc.suite())
34
+ suite.add(TC_Input.suite())
35
+ suite.add(TC_Parse.suite())
36
+ suite.add(TC_Namespace.suite())
37
+ return suite
38
+ end
39
+ end
40
+
41
+ if (__FILE__ == $0)
42
+ Lapidary::UI::Console::TestRunner.run(TS_xpp)
43
+ end
44
+
45
+