2004-11-08 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Mon, 8 Nov 2004 06:51:03 +0000 (06:51 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Mon, 8 Nov 2004 06:51:03 +0000 (06:51 -0000)
* XmlTextReaderTests.cs : added tests for 2.0 entity handling.
* XmlValidatingReaderTests.cs : modified tests for entity handling
  that are changed in 2.0.

svn path=/trunk/mcs/; revision=35813

mcs/class/System.XML/Test/System.Xml/ChangeLog
mcs/class/System.XML/Test/System.Xml/XmlTextReaderTests.cs
mcs/class/System.XML/Test/System.Xml/XmlValidatingReaderTests.cs

index dc2ab8755cdb0028dd49600f5d5cc24b64edce86..44ad2f5080c1afb2aacb80ce8de2e5c17b7c07b9 100644 (file)
@@ -1,3 +1,9 @@
+2004-11-08  Atsushi Enomoto <atsushi@ximian.com>
+
+       * XmlTextReaderTests.cs : added tests for 2.0 entity handling.
+       * XmlValidatingReaderTests.cs : modified tests for entity handling
+         that are changed in 2.0.
+
 2004-10-29  Atsushi Enomoto <atsushi@ximian.com>
 
        * XmlReaderCommonTests.cs : ReadAsObject() is removed.
index cfe1bcef0c23c7e8e17f85171497267b985bdab3..3aa7759157e3beaf9c88cc5bb5dcad06be942969 100644 (file)
@@ -917,6 +917,156 @@ namespace MonoTests.System.Xml
                        XmlTextReader xtr = new XmlTextReader ("<root/>", XmlNodeType.Document, null);
                        AssertNull (xtr.Settings);
                }
+
+               // Copied from XmlValidatingReaderTests.cs
+               [Test]
+               public void ExpandEntity ()
+               {
+                       string intSubset = "<!ELEMENT root (#PCDATA)><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";
+                       string xml = dtd + "<root foo='&ent;' bar='internal &ent; value'>&ent;</root>";
+                       XmlTextReader dvr = new XmlTextReader (xml, XmlNodeType.Document, null);
+                       dvr.EntityHandling = EntityHandling.ExpandEntities;
+                       dvr.Read ();    // DTD
+                       dvr.Read ();
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);
+                       AssertEquals ("root", dvr.Name);
+                       Assert (dvr.MoveToFirstAttribute ());
+                       AssertEquals ("foo", dvr.Name);
+                       AssertEquals ("entity string", dvr.Value);
+                       Assert (dvr.MoveToNextAttribute ());
+                       AssertEquals ("bar", dvr.Name);
+                       AssertEquals ("internal entity string value", dvr.Value);
+                       AssertEquals ("entity string", dvr.ReadString ());
+               }
+
+               [Test]
+               public void PreserveEntity ()
+               {
+                       string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";
+                       string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";
+                       XmlTextReader dvr = new XmlTextReader (xml, XmlNodeType.Document, null);
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;
+                       dvr.Read ();    // DTD
+                       dvr.Read ();
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);
+                       AssertEquals ("root", dvr.Name);
+                       Assert (dvr.MoveToFirstAttribute ());
+                       AssertEquals ("foo", dvr.Name);
+                       // MS BUG: it returns "entity string", however, entity should not be exanded.
+                       AssertEquals ("&ent;", dvr.Value);
+                       //  ReadAttributeValue()
+                       Assert (dvr.ReadAttributeValue ());
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       AssertEquals ("ent", dvr.Name);
+                       AssertEquals ("", dvr.Value);
+                       Assert (!dvr.ReadAttributeValue ());
+
+                       // bar
+                       Assert (dvr.MoveToNextAttribute ());
+                       AssertEquals ("bar", dvr.Name);
+                       AssertEquals ("internal &ent; value", dvr.Value);
+                       //  ReadAttributeValue()
+                       Assert (dvr.ReadAttributeValue ());
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);
+                       AssertEquals ("", dvr.Name);
+                       AssertEquals ("internal ", dvr.Value);
+                       Assert (dvr.ReadAttributeValue ());
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       AssertEquals ("ent", dvr.Name);
+                       AssertEquals ("", dvr.Value);
+                       Assert (dvr.ReadAttributeValue ());
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);
+                       AssertEquals ("", dvr.Name);
+                       AssertEquals (" value", dvr.Value);
+
+               }
+
+               [Test]
+               [ExpectedException (typeof (XmlException))]
+               public void ExpandEntityRejectsUndeclaredEntityAttr ()
+               {
+                       XmlTextReader xtr = new XmlTextReader ("<!DOCTYPE root SYSTEM 'foo.dtd'><root attr='&rnt;'>&rnt;</root>", XmlNodeType.Document, null);
+                       xtr.EntityHandling = EntityHandling.ExpandEntities;
+                       xtr.XmlResolver = null;
+                       xtr.Read ();
+                       xtr.Read (); // attribute entity 'rnt' is undeclared
+               }
+
+               [Test]
+               [ExpectedException (typeof (XmlException))]
+               public void ExpandEntityRejectsUndeclaredEntityContent ()
+               {
+                       XmlTextReader xtr = new XmlTextReader ("<!DOCTYPE root SYSTEM 'foo.dtd'><root>&rnt;</root>", XmlNodeType.Document, null);
+                       xtr.EntityHandling = EntityHandling.ExpandEntities;
+                       xtr.XmlResolver = null;
+                       xtr.Read ();
+                       xtr.Read ();
+                       xtr.Read (); // content entity 'rnt' is undeclared
+               }
+
+               // mostly copied from XmlValidatingReaderTests.
+               [Test]
+               public void ResolveEntity ()
+               {
+                       string ent1 = "<!ENTITY ent 'entity string'>";
+                       string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
+                       string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
+                       string xml = dtd + "<root>&ent;&ent2;</root>";
+                       XmlTextReader dvr = new XmlTextReader (xml, XmlNodeType.Document, null);
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;
+                       dvr.Read ();    // DTD
+                       dvr.Read ();    // root
+                       dvr.Read ();    // &ent;
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       AssertEquals (1, dvr.Depth);
+                       dvr.ResolveEntity ();
+                       // It is still entity reference.
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       dvr.Read ();
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);
+                       AssertEquals (2, dvr.Depth);
+                       AssertEquals ("entity string", dvr.Value);
+                       dvr.Read ();
+                       AssertEquals (XmlNodeType.EndEntity, dvr.NodeType);
+                       AssertEquals (1, dvr.Depth);
+                       AssertEquals ("", dvr.Value);
+
+                       dvr.Read ();    // &ent2;
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       AssertEquals (1, dvr.Depth);
+                       dvr.ResolveEntity ();
+                       // It is still entity reference.
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       // It now became element node.
+                       dvr.Read ();
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);
+                       AssertEquals (2, dvr.Depth);
+               }
+
+               // mostly copied from XmlValidatingReaderTests.
+               [Test]
+               public void ResolveEntity2 ()
+               {
+                       string ent1 = "<!ENTITY ent 'entity string'>";
+                       string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
+                       string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
+                       string xml = dtd + "<root>&ent3;&ent2;</root>";
+                       XmlTextReader dvr = new XmlTextReader (xml, XmlNodeType.Document, null);
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;
+                       dvr.Read ();    // DTD
+                       dvr.Read ();    // root
+                       dvr.Read ();    // &ent3;
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       // ent3 does not exists in this dtd.
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
+                       try {
+                               dvr.ResolveEntity ();
+                               Fail ("Attempt to resolve undeclared entity should fail.");
+                       } catch (XmlException) {
+                       }
+               }
 #endif
        }
 }
index cdd6555f09e347c2187834e4f586a88b00d4313b..3e85b4681e6c06e050bb6167805088687922e54c 100644 (file)
@@ -671,14 +671,24 @@ namespace MonoTests.System.Xml
                        dvr.Read ();    // root\r
                        dvr.Read ();    // &ent3;\r
                        AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
-                       // ent3 does not exists in this dtd.\r
+#if NET_2_0\r
+                       // under .NET 2.0, an error is raised here.\r
+                       // under .NET 1.1, the error is thrown on the next read.\r
+                       try {\r
+                               dvr.ResolveEntity ();\r
+                               Fail ("Attempt to resolve undeclared entity should fail.");\r
+                       } catch (XmlException) {\r
+                       }\r
+#else\r
+                       // ent3 does not exist in this dtd.\r
                        dvr.ResolveEntity ();\r
                        AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
                        try {\r
                                dvr.Read ();\r
-                               Fail ("Undeclared entity resolution should be failed.");\r
+                               Fail ("Attempt to resolve undeclared entity should fail.");\r
                        } catch (XmlException) {\r
                        }\r
+#endif\r
                }\r
 \r
                [Test]\r