| [ Index ] |
PHP Cross Reference of Web Application Component Toolkit |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * @package WACT_TESTS 4 * @version $Id: htmlparser.test.php,v 1.14 2004/11/20 19:01:53 jeffmoore Exp $ 5 */ 6 require_once WACT_ROOT . 'template/compiler/htmlparser.inc.php'; 7 8 class ListenerInterface { 9 function ListenerInterface() { } 10 function startElement($name, $attrs) { } 11 function endElement($name) { } 12 function emptyElement($name, $attrs) { } 13 function characters($data) { } 14 function cdata($data) { } 15 function processingInstruction($target, $data) { } 16 function escape($data) { } 17 function comment($data) { } 18 function doctype($data) { } 19 function jasp($data) { } 20 function unexpectedEOF($data) { } 21 function invalidEntitySyntax($data) { } 22 function invalidAttributeSyntax() { } 23 function setDocumentLocator(&$locator) { } 24 } 25 Mock::generate('ListenerInterface', 'MockListener'); 26 27 /** 28 * @package WACT_TESTS 29 */ 30 class HtmlParserTestCase extends UnitTestCase { 31 var $parser; 32 var $listener; 33 34 function HtmlParserTestCase($name = 'HtmlParserTestCase') { 35 $this->UnitTestCase($name); 36 } 37 function setUp() { 38 $this->listener =& new MockListener($this); 39 $this->parser =& new HTMLParser($this->listener); 40 } 41 function tearDown() { 42 $this->listener->tally(); 43 } 44 45 function testEmpty() { 46 $this->listener->expectNever('jasp'); 47 $this->listener->expectNever('processingInstruction'); 48 $this->listener->expectNever('escape'); 49 $this->listener->expectNever('characters'); 50 $this->listener->expectNever('startElement'); 51 $this->listener->expectNever('endElement'); 52 $this->parser->parse(''); 53 } 54 55 function testSimpledata() { 56 $this->listener->expectOnce('characters', array('stuff')); 57 $this->parser->parse('stuff'); 58 } 59 60 function testPreservingWhiteSpace() { 61 $this->listener->expectOnce('characters', array(" stuff\t\r\n ")); 62 $this->parser->parse(" stuff\t\r\n "); 63 } 64 65 function testEmptyElement() { 66 $this->listener->expectOnce('startElement', array('tag', array())); 67 $this->listener->expectOnce('endElement', array('tag')); 68 $this->listener->expectNever('invalidAttributeSyntax'); 69 $this->parser->parse('<tag></tag>'); 70 } 71 72 function testEmptyElementSelfClose() { 73 $this->listener->expectOnce('emptyElement', array('br', array())); 74 $this->listener->expectNever('startElement'); 75 $this->listener->expectNever('endElement'); 76 $this->parser->parse('<br/>'); 77 } 78 79 function testElementWithContent() { 80 $this->listener->expectOnce('startElement', array('tag', array())); 81 $this->listener->expectOnce('characters', array('stuff')); 82 $this->listener->expectOnce('endElement', array('tag')); 83 $this->listener->expectNever('invalidAttributeSyntax'); 84 $this->parser->parse('<tag>stuff</tag>'); 85 } 86 87 function testEmptyComment() { 88 $this->listener->expectOnce('comment', array('')); 89 $this->listener->expectNever('characters'); 90 $this->parser->parse('<!---->'); 91 } 92 93 function testElementNestedSingleQuote() { 94 $this->listener->expectOnce('startElement', array('tag', array('attribute' => '\''))); 95 $this->listener->expectNever('characters'); 96 $this->listener->expectNever('endElement'); 97 $this->listener->expectNever('invalidAttributeSyntax'); 98 $this->parser->parse('<tag attribute="\'">'); 99 } 100 101 function testElementNestedDoubleQuote() { 102 $this->listener->expectOnce('startElement', array('tag', array('attribute' => '"'))); 103 $this->listener->expectNever('characters'); 104 $this->listener->expectNever('endElement'); 105 $this->listener->expectNever('invalidAttributeSyntax'); 106 $this->parser->parse('<tag attribute=\'"\'>'); 107 } 108 109 function testEmptyDocType() { 110 $this->listener->expectOnce('doctype', array('DOCTYPE')); 111 $this->listener->expectNever('characters'); 112 $this->listener->expectNever('escape'); 113 $this->parser->parse('<!DOCTYPE>'); 114 } 115 116 function testEmptyClose() { 117 $this->listener->expectOnce('endElement', array('')); 118 $this->listener->expectNever('characters'); 119 $this->parser->parse('</>'); 120 } 121 122 function testEmptyJasp() { 123 $this->listener->expectOnce('jasp', array('')); 124 $this->listener->expectNever('characters'); 125 $this->parser->parse('<%%>'); 126 } 127 128 function testTargetOnlyProcessingInstruction() { 129 $this->listener->expectOnce('processingInstruction', array('php', '')); 130 $this->listener->expectNever('characters'); 131 $this->parser->parse('<?php ?>'); 132 } 133 134 function testElementWithPreContent() { 135 $this->listener->expectOnce('characters', array('stuff')); 136 $this->listener->expectOnce('startElement', array('br', array())); 137 $this->listener->expectNever('invalidAttributeSyntax'); 138 $this->parser->parse('stuff<br>'); 139 } 140 141 function testElementWithPostContent() { 142 $this->listener->expectOnce('startElement', array('br', array())); 143 $this->listener->expectOnce('characters', array('stuff')); 144 $this->listener->expectNever('invalidAttributeSyntax'); 145 $this->parser->parse('<br>stuff'); 146 } 147 148 function testMismatchedElements() { 149 $this->listener->expectArgumentsAt(0, 'startElement', array('b', array())); 150 $this->listener->expectArgumentsAt(1, 'startElement', array('i', array())); 151 $this->listener->expectArgumentsAt(0, 'endElement', array('b')); 152 $this->listener->expectArgumentsAt(1, 'endElement', array('i')); 153 $this->listener->expectCallCount('startElement', 2); 154 $this->listener->expectCallCount('endElement', 2); 155 $this->listener->expectNever('invalidAttributeSyntax'); 156 $this->parser->parse('<b><i>stuff</b></i>'); 157 } 158 159 function testAttributes() { 160 $this->listener->expectOnce( 161 'startElement', 162 array('tag', array("a" => "A", "b" => "B", "c" => "C"))); 163 $this->listener->expectNever('invalidAttributeSyntax'); 164 $this->parser->parse('<tag a="A" b=\'B\' c = "C">'); 165 } 166 167 function testEmptyAttributes() { 168 $this->listener->expectOnce( 169 'startElement', 170 array('tag', array("a" => NULL, "b" => NULL, "c" => NULL))); 171 $this->listener->expectNever('invalidAttributeSyntax'); 172 $this->parser->parse('<tag a b c>'); 173 } 174 175 function testNastyAttributes() { 176 $this->listener->expectOnce( 177 'startElement', 178 array('tag', array("a" => "&%$'?<>", "b" => "\r\n\t\"", "c" => ""))); 179 $this->listener->expectNever('invalidAttributeSyntax'); 180 $this->parser->parse("<tag a=\"&%$'?<>\" b='\r\n\t\"' c = ''>"); 181 } 182 183 function testAttributesPadding() { 184 $this->listener->expectOnce( 185 'startElement', 186 array('tag', array("a" => "A", "b" => "B", "c" => "C"))); 187 $this->listener->expectNever('invalidAttributeSyntax'); 188 $this->parser->parse("<tag\ta=\"A\"\rb='B'\nc = \"C\"\n>"); 189 } 190 191 function testAllprocessingInstruction() { 192 $this->listener->expectOnce('processingInstruction', array('php', 'print "Hello"; ')); 193 $this->listener->expectNever('characters'); 194 $this->listener->expectNever('startElement'); 195 $this->listener->expectNever('endElement'); 196 $this->parser->parse('<?php print "Hello"; ?>'); 197 } 198 199 function testNestedprocessingInstruction() { 200 $this->listener->expectOnce('processingInstruction', array('php', 'print "Hello"; ')); 201 $this->listener->expectArgumentsAt(0, 'characters', array('a')); 202 $this->listener->expectArgumentsAt(1, 'characters', array('b')); 203 $this->listener->expectCallCount('characters', 2); 204 $this->listener->expectNever('startElement'); 205 $this->listener->expectNever('endElement'); 206 $this->parser->parse('a<?php print "Hello"; ?>b'); 207 } 208 209 210 function testEscapeDocTypeHandler() { 211 $this->listener->expectOnce( 212 'doctype', 213 array('doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"')); 214 $this->parser->parse('<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">'); 215 } 216 217 function testNestedDoctypeHandler() { 218 $this->listener->expectOnce( 219 'doctype', 220 array('doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"')); 221 $this->listener->expectArgumentsAt(0, 'characters', array('a')); 222 $this->listener->expectArgumentsAt(1, 'characters', array('b')); 223 $this->listener->expectCallCount('characters', 2); 224 $this->parser->parse('a<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">b'); 225 } 226 227 function testEscapeCData() { 228 $this->listener->expectOnce( 229 'cdata', 230 array('string = \'A CDATA block\';')); 231 $this->parser->parse('<![CDATA[string = \'A CDATA block\';]]>'); 232 } 233 234 function testSimpleComment() { 235 $this->listener->expectOnce('comment', array(' A comment ')); 236 $this->parser->parse('<!-- A comment -->'); 237 } 238 239 function testNastyComment() { 240 $this->listener->expectOnce( 241 'comment', 242 array(' <tag></tag><?php ?><' . '% %> ')); 243 $this->parser->parse('<tag><!-- <tag></tag><?php ?><' . '% %> --></tag>'); 244 } 245 246 function testSimpleJasp() { 247 $this->listener->expectOnce( 248 'jasp', 249 array(' document.write("Hello World");')); 250 $this->listener->expectNever('processingInstruction'); 251 $this->listener->expectNever('comment'); 252 $this->listener->expectNever('escape'); 253 $this->listener->expectNever('characters'); 254 $this->listener->expectNever('startElement'); 255 $this->listener->expectNever('endElement'); 256 $this->parser->parse('<' . '% document.write("Hello World");%>'); 257 } 258 259 function testNastyJasp() { 260 $this->listener->expectOnce( 261 'jasp', 262 array(' <tag a="A"><?php ?></tag><!-- comment --> ')); 263 $this->listener->expectNever('processingInstruction'); 264 $this->listener->expectNever('comment'); 265 $this->listener->expectNever('escape'); 266 $this->listener->expectNever('characters'); 267 $this->listener->expectNever('startElement'); 268 $this->listener->expectNever('endElement'); 269 $this->parser->parse('<' . '% <tag a="A"><?php ?></tag><!-- comment --> %>'); 270 } 271 272 function testJaspInTag() { 273 $this->listener->expectOnce( 274 'jasp', 275 array(' document.write("Hello World");')); 276 $this->listener->expectNever('processingInstruction'); 277 $this->listener->expectNever('escape'); 278 $this->listener->expectNever('characters'); 279 $this->listener->expectOnce('startElement'); 280 $this->listener->expectOnce('endElement'); 281 $this->parser->parse('<tag><' . '% document.write("Hello World");%></tag>'); 282 } 283 284 /* 285 removed due to bug #1000806 286 see http://www.w3.org/TR/REC-html40/appendix/notes.html#notes-specifying-data 287 function testScriptElement() { 288 $this->listener->expectOnce('startElement', array('script', array('language'=>'Javascript'))); 289 $this->listener->expectOnce('endElement', array('script')); 290 $this->listener->expectOnce('characters', array("document.write('<B>Test<\/B>');")); 291 $this->listener->expectNever('invalidAttributeSyntax'); 292 $this->parser->parse('<script language="Javascript">document.write(\'<B>Test<\/B>\');</script>'); 293 } 294 295 function testScriptElementEmbedComment() { 296 $this->listener->expectOnce('startElement', array('script', array('language'=>'Javascript'))); 297 $this->listener->expectOnce('endElement', array('script')); 298 $this->listener->expectOnce('characters', array("<!-- document.write('<B>Test<\/B>'); -->")); 299 $this->listener->expectNever('invalidAttributeSyntax'); 300 $this->parser->parse('<script language="Javascript"><!-- document.write(\'<B>Test<\/B>\'); --></script>'); 301 } 302 */ 303 } 304 305 class HtmlParserTruncatedTestCase extends UnitTestCase { 306 var $parser; 307 var $listener; 308 309 function HtmlParserTruncatedTestCase($name = 'HtmlParserTruncatedTestCase') { 310 $this->UnitTestCase($name); 311 } 312 function setUp() { 313 $this->listener =& new MockListener($this); 314 $this->parser =& new HTMLParser($this->listener); 315 } 316 function tearDown() { 317 $this->listener->tally(); 318 } 319 320 function testTruncatedOpen() { 321 $this->listener->expectOnce('characters', array('stuff')); 322 $this->listener->expectOnce('unexpectedEOF', array('<')); 323 $this->listener->expectNever('startElement'); 324 $this->parser->parse('stuff<'); 325 } 326 327 function testTruncatedEmptyClose() { 328 $this->listener->expectOnce('characters', array('stuff')); 329 $this->listener->expectOnce('unexpectedEOF', array('</')); 330 $this->listener->expectNever('endElement'); 331 $this->parser->parse('stuff</'); 332 } 333 334 function testTruncatedClose() { 335 $this->listener->expectOnce('characters', array('stuff')); 336 $this->listener->expectOnce('unexpectedEOF', array('</a')); 337 $this->parser->parse('stuff</a'); 338 $this->listener->expectNever('endElement'); 339 } 340 341 function testTruncatedProcessingInstruction() { 342 $this->listener->expectOnce('characters', array('stuff')); 343 $this->listener->expectOnce('unexpectedEOF', array('<?')); 344 $this->listener->expectNever('startElement'); 345 $this->parser->parse('stuff<?'); 346 } 347 348 function testTruncatedProcessingInstructionTarget() { 349 $this->listener->expectOnce('characters', array('stuff')); 350 $this->listener->expectOnce('unexpectedEOF', array('<?php')); 351 $this->listener->expectNever('processingInstruction'); 352 $this->parser->parse('stuff<?php'); 353 } 354 355 function testTruncatedProcessingInstructionNoClose() { 356 $this->listener->expectOnce('characters', array('stuff')); 357 $this->listener->expectOnce('unexpectedEOF', array('<?php ')); 358 $this->listener->expectNever('processingInstruction'); 359 $this->parser->parse('stuff<?php '); 360 } 361 362 function testTruncatedJasp() { 363 $this->listener->expectOnce('characters', array('stuff')); 364 $this->listener->expectOnce('unexpectedEOF', array('<%')); 365 $this->listener->expectNever('jasp'); 366 $this->parser->parse('stuff<%'); 367 } 368 369 function testTruncatedJaspNoClose() { 370 $this->listener->expectOnce('characters', array('stuff')); 371 $this->listener->expectOnce('unexpectedEOF', array('<% more stuff')); 372 $this->listener->expectNever('jasp'); 373 $this->parser->parse('stuff<% more stuff'); 374 } 375 376 function testTruncatedComment() { 377 $this->listener->expectOnce('characters', array('stuff')); 378 $this->listener->expectOnce('unexpectedEOF', array('<!--')); 379 $this->listener->expectNever('escape'); 380 $this->listener->expectNever('comment'); 381 $this->parser->parse('stuff<!--'); 382 } 383 384 function testTruncatedCommentNoClose() { 385 $this->listener->expectOnce('characters', array('stuff')); 386 $this->listener->expectOnce('unexpectedEOF', array('<!-- blah')); 387 $this->listener->expectNever('escape'); 388 $this->listener->expectNever('comment'); 389 $this->parser->parse('stuff<!-- blah'); 390 } 391 392 function testTruncatedDocType() { 393 $this->listener->expectOnce('characters', array('stuff')); 394 $this->listener->expectOnce('unexpectedEOF', array('<!doctype')); 395 $this->listener->expectNever('escape'); 396 $this->parser->parse('stuff<!doctype'); 397 } 398 399 function testTruncatedDocTypetNoClose() { 400 $this->listener->expectOnce('characters', array('stuff')); 401 $this->listener->expectOnce('unexpectedEOF', array('<!doctype blah')); 402 $this->listener->expectNever('escape'); 403 $this->parser->parse('stuff<!doctype blah'); 404 } 405 406 function testTruncatedOpenElementChar() { 407 $this->listener->expectOnce('characters', array('stuff')); 408 $this->listener->expectOnce('unexpectedEOF', array('<a')); 409 $this->listener->expectNever('startElement'); 410 $this->parser->parse('stuff<a'); 411 } 412 413 function testTruncatedOpenElement() { 414 $this->listener->expectOnce('characters', array('stuff')); 415 $this->listener->expectOnce('unexpectedEOF', array('<tag')); 416 $this->listener->expectNever('startElement'); 417 $this->parser->parse('stuff<tag'); 418 } 419 420 function testTruncatedOpenElementSpace() { 421 $this->listener->expectOnce('characters', array('stuff')); 422 $this->listener->expectOnce('unexpectedEOF', array('<tag ')); 423 $this->listener->expectNever('startElement'); 424 $this->parser->parse('stuff<tag '); 425 } 426 427 function testTruncatedOpenElementMinimizedAttribute() { 428 $this->listener->expectOnce('characters', array('stuff')); 429 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute')); 430 $this->listener->expectNever('startElement'); 431 $this->parser->parse('stuff<tag attribute'); 432 } 433 434 function testTruncatedOpenElementMinimizedAttributeSpace() { 435 $this->listener->expectOnce('characters', array('stuff')); 436 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute ')); 437 $this->listener->expectNever('startElement'); 438 $this->parser->parse('stuff<tag attribute '); 439 } 440 441 function testTruncatedOpenElementAttribute() { 442 $this->listener->expectOnce('characters', array('stuff')); 443 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute=')); 444 $this->listener->expectNever('startElement'); 445 $this->parser->parse('stuff<tag attribute='); 446 } 447 448 function testTruncatedOpenElementAttributeSpace() { 449 $this->listener->expectOnce('characters', array('stuff')); 450 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute= ')); 451 $this->listener->expectNever('startElement'); 452 $this->parser->parse('stuff<tag attribute= '); 453 } 454 455 function testTruncatedOpenElementAttributeNoQuote() { 456 $this->listener->expectOnce('characters', array('stuff')); 457 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute=value')); 458 $this->listener->expectNever('startElement'); 459 $this->parser->parse('stuff<tag attribute=value'); 460 } 461 462 function testTruncatedOpenElementAttributeDoubleQuote() { 463 $this->listener->expectOnce('characters', array('stuff')); 464 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute="')); 465 $this->listener->expectNever('startElement'); 466 $this->parser->parse('stuff<tag attribute="'); 467 } 468 469 function testTruncatedOpenElementAttributeDoubleQuoteNoClose() { 470 $this->listener->expectOnce('characters', array('stuff')); 471 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute="value')); 472 $this->listener->expectNever('startElement'); 473 $this->parser->parse('stuff<tag attribute="value'); 474 } 475 476 function testTruncatedOpenElementAttributeDoubleQuoteValue() { 477 $this->listener->expectOnce('characters', array('stuff')); 478 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute="value"')); 479 $this->listener->expectNever('startElement'); 480 $this->parser->parse('stuff<tag attribute="value"'); 481 } 482 483 function testTruncatedOpenElementAttributeSingleQuote() { 484 $this->listener->expectOnce('characters', array('stuff')); 485 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute=\'')); 486 $this->listener->expectNever('startElement'); 487 $this->parser->parse('stuff<tag attribute=\''); 488 } 489 490 function testTruncatedOpenElementAttributeSingleQuoteNoClose() { 491 $this->listener->expectOnce('characters', array('stuff')); 492 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute=\'value')); 493 $this->listener->expectNever('startElement'); 494 $this->parser->parse('stuff<tag attribute=\'value'); 495 } 496 497 function testTruncatedOpenElementAttributeSingleQuoteValue() { 498 $this->listener->expectOnce('characters', array('stuff')); 499 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute=\'value\'')); 500 $this->listener->expectNever('startElement'); 501 $this->parser->parse('stuff<tag attribute=\'value\''); 502 } 503 504 function testTruncatedOpenElementClose() { 505 $this->listener->expectOnce('characters', array('stuff')); 506 $this->listener->expectOnce('unexpectedEOF', array('<tag attribute=\'value\'/')); 507 $this->listener->expectNever('startElement'); 508 $this->parser->parse('stuff<tag attribute=\'value\'/'); 509 } 510 511 } 512 513 class HtmlParserMalformedTestCase extends UnitTestCase { 514 var $parser; 515 var $listener; 516 517 function HtmlParserMalformedTestCase($name = 'HtmlParserMalformedTestCase') { 518 $this->UnitTestCase($name); 519 } 520 function setUp() { 521 $this->listener =& new MockListener($this); 522 $this->parser =& new HTMLParser($this->listener); 523 } 524 function tearDown() { 525 $this->listener->tally(); 526 } 527 function testMalformedJasp() { 528 $this->listener->expectOnce('characters', array('stuff')); 529 $this->listener->expectOnce('unexpectedEOF', array('<%>')); 530 $this->listener->expectNever('jasp'); 531 $this->parser->parse('stuff<%>'); 532 } 533 534 function testMalformedProcessingInstruction() { 535 $this->listener->expectOnce('characters', array('stuff')); 536 $this->listener->expectOnce('unexpectedEOF', array('<?>')); 537 $this->listener->expectNever('processingInstruction'); 538 $this->parser->parse('stuff<?>'); 539 } 540 541 function testMalformedProcessingInstruction2() { 542 $this->listener->expectOnce('unexpectedEOF', array('<??>')); 543 $this->listener->expectNever('processingInstruction'); 544 $this->listener->expectNever('characters'); 545 $this->parser->parse('<??>'); 546 } 547 548 function testMalformedComment() { 549 $this->listener->expectOnce('unexpectedEOF', array('<!--x->')); 550 $this->listener->expectNever('escape'); 551 $this->listener->expectNever('comment'); 552 $this->listener->expectNever('characters'); 553 $this->parser->parse('<!--x->'); 554 } 555 556 function testOpenElementMalformedClose() { 557 $this->listener->expectOnce('characters', array('stuff')); 558 $this->listener->expectOnce('invalidEntitySyntax', array('<tag attribute=\'value\'/morestuff')); 559 $this->listener->expectNever('startElement'); 560 $this->parser->parse('stuff<tag attribute=\'value\'/morestuff'); 561 } 562 563 function testOpenElementMalformedClose2() { 564 $this->listener->expectOnce('characters', array('stuff')); 565 $this->listener->expectOnce('invalidEntitySyntax', array('<tag attribute=\'value\'/morestuff>')); 566 $this->listener->expectNever('startElement'); 567 $this->parser->parse('stuff<tag attribute=\'value\'/morestuff>'); 568 } 569 570 function testElementNestedSingleQuote() { 571 $this->listener->expectOnce('startElement', array('tag', array('attribute' => '', "'" => NULL))); 572 $this->listener->expectOnce('invalidAttributeSyntax'); 573 $this->listener->expectNever('characters'); 574 $this->listener->expectNever('endElement'); 575 $this->parser->parse('<tag attribute=\'\'\'>'); 576 } 577 578 function testElementNestedDoubleQuote() { 579 $this->listener->expectOnce('startElement', array('tag', array('attribute' => '', '"' => NULL))); 580 $this->listener->expectOnce('invalidAttributeSyntax'); 581 $this->listener->expectNever('characters'); 582 $this->listener->expectNever('endElement'); 583 $this->parser->parse('<tag attribute=""">'); 584 } 585 586 function testElementMalformedAttribute() { 587 $this->listener->expectOnce('startElement', array('tag', array('attribute' => 'test', 'extra' => NULL))); 588 $this->listener->expectOnce('invalidAttributeSyntax'); 589 $this->listener->expectNever('characters'); 590 $this->listener->expectNever('endElement'); 591 $this->parser->parse('<tag attribute="test"extra>'); 592 } 593 594 } 595 596 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Sun Nov 28 19:36:09 2004 | Cross-referenced by PHPXref 0.5 |