pike.git / lib / modules / Parser.pmod / XML.pmod / testsuite.in

version» Context lines:

pike.git/lib/modules/Parser.pmod/XML.pmod/testsuite.in:1: + START_MARKER    -  + // DOM +  + // Tree +  + define(test_tree_eq,[[ +  test_eq(Parser.XML.Tree.parse_input $1 ,$2) +  test_eq(Parser.XML.Tree.simple_parse_input $1 ,$2) +  test_eq(Parser.XML.Tree.RootNode $1 ,$2) +  test_eq(Parser.XML.Tree.SimpleRootNode $1 ,$2) + ]]) +  + test_eval_error([[ Parser.XML.Tree.parse_input("<foo>", 0, 0, 0, 1); ]]) + test_tree_eq([[ ("<a>foo &gt; hej &x.y; hopp &lt; bar</a>")->render_xml() ]], + [[ "<a>foo &gt; hej &amp;x.y; hopp &lt; bar</a>" ]]) + test_tree_eq([[ ("<a>foo &gt; hej &x.y; hopp &lt; bar</a>")->render_xml(1); ]], + [[ "<a>foo &gt; hej &x.y; hopp &lt; bar</a>" ]]) + test_tree_eq([[ ("<a>hej &x.y; hopp</a>")->render_xml(); ]], + [[ "<a>hej &amp;x.y; hopp</a>" ]]) + test_tree_eq([[ ("<a>hej &x.y; hopp</a>")->render_xml(1); ]], + [[ "<a>hej &x.y; hopp</a>" ]]) + test_eq([[ (string)Parser.XML.Tree.parse_input("<a><b> <c/> </b></a>") ]], + [[ "<a><b> <c/> </b></a>" ]]) + test_tree_eq([[ ("<p>a<![CDATA[b]""]>c</p>")[0][0]->get_text() ]], + [[ "abc" ]]) + test_tree_eq([[ ("<?xml version=\"1.0\"?><!DOCTYPE greeting SYSTEM \"hello.dtd\"><!-- comment -- --><x/>")->render_xml() ]], + [[ "<?xml version='1.0' encoding='utf-8'?><!DOCTYPE greeting SYSTEM \"hello.dtd\"><!-- comment -- --><x/>" ]]) +  + // Check that any xml and/or doctype header survives the parsing. + // Check also that the headers are rendered properly. + test_tree_eq([[ ("<?xml version='1.0' encoding='iso-8859-1'?><!DOCTYPE foo [ <!ELEMENT foo (foo)*> ]><foo><foo/><foo/></foo>")->render_xml() ]], +  [[ "<?xml version='1.0' encoding='iso-8859-1'?><!DOCTYPE foo [ <!ELEMENT foo (foo)*> ]><foo><foo/><foo/></foo>" ]]) + test_tree_eq([[ ("<?xml version='1.0' encoding='utf-8'?><!DOCTYPE foo PUBLIC \"-//EN\" \"foo.dtd\" ><foo><foo/><foo/></foo>")->render_xml() ]], +  [[ "<?xml version='1.0' encoding='utf-8'?><!DOCTYPE foo PUBLIC \"-//EN\" \"foo.dtd\"><foo><foo/><foo/></foo>" ]]) +  + test_any([[ +  + class A { +  inherit Parser.XML.Tree.RootNode; +  public array(Parser.XML.Tree.AbstractSimpleNode) mChildren = ({}); + }; +  + return sizeof(A("<!-- --><!-- --><x/>")->mChildren); + ]], 3) +  + // Tests of namespace handling in normal-mode. + test_any([[ +  // InfoKOM 731715 +  object root = Parser.XML.Tree.simple_parse_input("<root/>"); +  object sub = +  Parser.XML.Tree.SimpleNode(Parser.XML.Tree.XML_ELEMENT, "sub", +  ([ "foo" : "bar" ]), ""); +  root->get_elements("root")[0]->add_child(sub); +  return root->render_xml(); + ]], "<root><sub foo='bar'/></root>") +  + test_any([[ +  // InfoKOM 731484 +  return Parser.XML.Tree.simple_parse_input( +  "<feed xmlns='http://www.w3.org/2005/Atom'\n" +  " xmlns:example='http://www.example.com/example'>\n" +  " <entry>\n" +  " <category example:test='yes' label='Test' example:test='yes' term='test' />\n" +  " </entry>\n" +  "</feed>")->render_xml(); + ]], "<feed xmlns='http://www.w3.org/2005/Atom'" +  " xmlns:example='http://www.example.com/example'>\n" +  " <entry>\n" +  " <category example:test='yes' label='Test' term='test'/>\n" +  " </entry>\n" +  "</feed>") +  + test_do([[ +  add_constant("xmlblob", + #"<?xml version='1.0' encoding='utf-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:A='http://example.com/dtd'> +  <generator>Grubba</generator> +  <id>urn:uuid:4baeaeb4-7125-463a-9b68-a7005a7548bb</id> +  <title>Namespace Test</title> +  <updated>2012-09-28T16:02:16+02:00</updated> +  <entry> +  <title>Namespace Test</title> +  <id>urn:uuid:e73d603c-c287-47c8-b17c-c9e35981d64a</id> +  <link href='urn:uuid:e73d603c-c287-47c8-b17c-c9e35981d64a' rel='self'/> +  <updated>2012-09-28T16:02:16+02:00</updated> +  <author> +  <name>Grubba</name> +  </author> +  <A:user user-name='grubba'>Grubba</A:user> +  <category A:example='yes' A:priority='300' scheme='http://example.com/dtd' term='example'/> +  <A:a> +  <A:b date='2010-10-01'> +  <A:c yes='no'/> +  </A:b> +  </A:a> +  <content type='xhtml'> +  <div xmlns='http://www.w3.org/1999/xhtml'> +  <div A:id='1' class='text' id='e73ab900-f76d-41f7-8576-6be10519e31b' name='text'> +  <h1 class='headline'>Namespace Test</h1> +  <p class='normal'>This is a test of whether namespaces work in Parser.XML.Tree.</p> +  </div> +  <div class='image' id='68788699-d986-418a-8ca2-2a058ab86625' name='image'> +  <img class='image' src='/some/path/to/an/image.jpg'/> +  </div> +  </div> +  </content> +  </entry> + </feed>"); + ]]) +  + test_eq([[Parser.XML.Tree.simple_parse_input(xmlblob)->render_xml()]], xmlblob) + test_eq([[Parser.XML.Tree.simple_parse_input(xmlblob, UNDEFINED, +  Parser.XML.Tree.PARSE_ENABLE_NAMESPACES)->render_xml()]], xmlblob) +  + test_do([[add_constant("xmlblob");]]) +  + // NSTree +  + // XML NS section 2 +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#" + <x> +  <!-- No namespace here. --> + </x>"); + x=x[0]; + array r = ({}); + r += ({ x->get_any_name() }); + r += ({ x->get_default_ns() }); + r += ({ x->get_ns() }); + r += ({ x->get_defined_nss()->edi }); + return r; + ]], ({ "x", 0, 0, 0 }) ) +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#" + <x xmlns:edi='http://ecommerce.org/schema'> +  <!-- the 'edi' prefix is bound to http://ecommerce.org/schema +  for the 'x' element and contents --> + </x>"); + x=x[0]; + array r = ({}); + r += ({ x->get_any_name() }); + r += ({ x->get_default_ns() }); + r += ({ x->get_ns() }); + r += ({ x->get_defined_nss()->edi }); +  + r += ({ x[0]->get_default_ns() }); + r += ({ x[0]->get_ns() }); + r += ({ x[0]->get_defined_nss()->edi }); + return r; + ]], ({ "x", 0, 0, "http://ecommerce.org/schema", +  0, 0, "http://ecommerce.org/schema" }) ) +  + // XML NS section 4 +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#" + <x xmlns:edi='http://ecommerce.org/schema'> +  <!-- the 'price' element's namespace is http://ecommerce.org/schema --> +  <edi:price units='Euro'>32.18</edi:price> + </x>"); + x=x[0]; + array r = ({}); + r += ({ x[3]->get_any_name() }); + r += ({ x[3]->get_ns() }); + r += ({ x[3]->get_attributes()->units }); + r += ({ x[3][0]->get_ns() }); + return r; + ]], ({ "price", "http://ecommerce.org/schema", "Euro", 0 }) ); +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#" + <x xmlns:edi='http://ecommerce.org/schema'> +  <!-- the 'taxClass' attribute's namespace is http://ecommerce.org/schema --> +  <lineItem edi:taxClass=\"exempt\">Baby food</lineItem> + </x>"); + x=x[0]; + array r = ({}); + r += ({ x[3]->get_ns() }); + r += ({ x[3]->get_attributes() }); + r += ({ x[3]->get_ns_attributes() }); + return r; + ]], ({ 0, ([]), ([ "http://ecommerce.org/schema": +  ([ "taxClass":"exempt" ]) ]) }) ) +  + // XML NS section 5.1 +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#"<?xml version=\"1.0\"?> + <!-- all elements here are explicitly in the HTML namespace --> + <html:html xmlns:html='http://www.w3.org/TR/REC-html40'> +  <html:head><html:title>Frobnostication</html:title></html:head> +  <html:body><html:p>Moved to +  <html:a href='http://frob.com'>here.</html:a></html:p></html:body> + </html:html>"); + x=x[2]; + array r = ({}); + r += ({ x->get_ns() }); + r += ({ x->get_default_ns() }); + r += ({ x[0]->get_ns() }); + r += ({ x[0]->get_default_ns() }); + r += ({ x[3][0][1]->get_attributes()->href }); + return r; + ]], ({ "http://www.w3.org/TR/REC-html40", 0, 0, 0, +  "http://frob.com" }) ) +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#"<?xml version=\"1.0\"?> + <!-- both namespace prefixes are available throughout --> + <bk:book xmlns:bk='urn:loc.gov:books' +  xmlns:isbn='urn:ISBN:0-395-36341-6'> +  <bk:title>Cheaper by the Dozen</bk:title> +  <isbn:number>1568491379</isbn:number> + </bk:book>"); + x=x[2]; + array r = ({}); + r += ({ x->get_ns() }); + r += ({ x->get_defined_nss() }); + r += ({ x[1]->get_ns() }); + r += ({ x[3]->get_ns() }); + return r; + ]], ({ "urn:loc.gov:books", ([ "bk":"urn:loc.gov:books", +  "isbn":"urn:ISBN:0-395-36341-6" ]), +  "urn:loc.gov:books", "urn:ISBN:0-395-36341-6" }) ) +  + // XML NS section 5.2 +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#"<?xml version=\"1.0\"?> + <!-- initially, the default namespace is \"books\" --> + <book xmlns='urn:loc.gov:books' +  xmlns:isbn='urn:ISBN:0-395-36341-6'> +  <title>Cheaper by the Dozen</title> +  <isbn:number>1568491379</isbn:number> +  <notes> +  <!-- make HTML the default namespace for some commentary --> +  <p xmlns='urn:w3-org-ns:HTML'> +  This is a <i>funny</i> book! +  </p> +  </notes> + </book>"); + x=x[2]; + array r = ({}); + r += ({ x->get_ns() }); + r += ({ x->get_default_ns() }); + r += ({ x->get_defined_nss() }); + r += ({ x[1]->get_ns() }); + r += ({ x[3]->get_ns() }); + x=x[5]; + r += ({ x[3]->get_ns() }); + r += ({ x[3][1]->get_ns() }); + r += ({ x[3][1]->get_default_ns() }); + return r; + ]], ({ "urn:loc.gov:books", "urn:loc.gov:books", +  ([ "isbn":"urn:ISBN:0-395-36341-6" ]), +  "urn:loc.gov:books", "urn:ISBN:0-395-36341-6", +  "urn:w3-org-ns:HTML", "urn:w3-org-ns:HTML", +  "urn:w3-org-ns:HTML" }) ) +  + // We don't test the case with empty namespace, since it + // it is unclear how we should behave. +  + // XML Section 5.3 +  + test_any_equal([[ + object x=Parser.XML.NSTree.parse_input(#" + <!-- http://www.w3.org is bound to n1 and is the default --> + <x xmlns:n1=\"http://www.w3.org\" +  xmlns=\"http://www.w3.org\" > +  <good a=\"1\" n1:a=\"2\" /> + </x>"); + x=x[1][1]; + array r = ({}); + r += ({ x->get_ns() }); + r += ({ x->get_ns_attributes()[x->get_ns()] }); + r += ({ x->get_attributes() }); + return r; + ]], ({ "http://www.w3.org", (["a":"2"]), (["a":"1"]) }) ) +  + // End of XML NS spec tests +  + test_do([[ + array args = ({ +  "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'", +  "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'", +  "xmlns:xsd='http://www.w3.org/2001/XMLSchema'", +  "xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'", +  "soap:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'" }); + for(int i; i<120; i++) +  Parser.XML.NSTree.parse_input("<soap:Envelope "+Array.permute(args,i)*" "+"/>"); + ]]) +  +  + // Simple +  + test_do([[Parser.XML.Simple()->parse("<!DOCTYPE root [\n<!NOTATION JPGformat>\n]>\n", lambda(mixed ...args){} )]]) + test_do([[Parser.XML.Simple()->parse_dtd("%hej;\n", lambda(mixed ... args){}, 1, 2, 3)]]) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse("<a></a><foo/>", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "There can not be more than one element on the top level.") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.2"); +  o->parse("<a></a><foo/>", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse (" <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse (" <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  int got_header; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml ?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  if (type == "<?xml") got_header = 1; +  }); +  return error || got_header; + ]], "Required version attribute missing in XML header.") + test_any([[ +  string error; +  int got_header; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml ?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  if (type == "<?xml") got_header = 1; +  }); +  return error || got_header; + ]], 1) +  + cond(0, + [[ +  // The following tests are currently not valid. +  test_any([[ +  string error; +  int got_header; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse (" <?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  if (type == "<?xml") got_header = 1; +  }); +  return error || got_header; +  ]], "XML header must be at the first byte in the document.") +  test_any([[ +  string error; +  int got_header; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse (" <?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  if (type == "<?xml") got_header = 1; +  }); +  return error || got_header; +  ]], "XML header must be at the first byte in the document.") +  +  test_any([[ +  string error; +  int got_header; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse (" <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  if (type == "<?xml") got_header = 1; +  }); +  return error || got_header; +  ]], "XML header must be at the first byte in the document.") +  test_any([[ +  string error; +  int got_header; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse (" <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  if (type == "<?xml") got_header = 1; +  }); +  return error || got_header; +  ]], "XML header must be at the first byte in the document.") + ]]) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "Multiple DOCTYPE declarations are not allowed.") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "DOCTYPE must occur before the root element.") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.2"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo/> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo><!DOCTYPE foo SYSTEM 'blurk.dtd'></foo> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "DOCTYPE must occur before the root element.") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo><!DOCTYPE foo SYSTEM 'blurk.dtd'></foo> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "Root element missing.") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<!DOCTYPE foo SYSTEM 'blurk.dtd'> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> " +  "<![CDATA[gnork]""]> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "All data must be inside tags") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> " +  "<![CDATA[gnork]""]> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "All data must be inside tags") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.2"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> " +  "<![CDATA[gnork]""]> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<![CDATA[gnork]""]> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "All data must be inside tags") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<![CDATA[gnork]""]> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.2"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<![CDATA[gnork]""]> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], 0) +  + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors (0); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> " +  "gnork <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "All data must be inside tags") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.6"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> " +  "gnork <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "All data must be inside tags") + test_any([[ +  string error; +  object o = Parser.XML.Simple(); +  o->compat_allow_errors ("7.2"); +  o->parse ("<?xml version='1.0'?> <?herk?> <!-- herk --> " +  "<foo>mupp</foo> <?herk?> <!-- herk --> " +  "gnork <?herk?> <!-- herk --> ", +  lambda (string type, string name, mapping attrs, string data) { +  if (type == "error") error = data; +  }); +  return error; + ]], "All data must be inside tags") +  + // Validating + END_MARKER   Newline at end of file added.