* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.XML / Test / System.Xml / XmlValidatingReaderTests.cs
index 9dbbbcc04c0ec3d3d9e3431e9ea012a9b9e84667..ac89106fed82da0178a82e1d686d64fa478a5c0a 100644 (file)
@@ -7,7 +7,9 @@
 // (C)2003 Atsushi Enomoto\r
 //\r
 using System;\r
+using System.IO;\r
 using System.Xml;\r
+using System.Xml.Schema;\r
 using NUnit.Framework;\r
 \r
 namespace MonoTests.System.Xml\r
@@ -19,56 +21,55 @@ namespace MonoTests.System.Xml
                {\r
                }\r
 \r
-               XmlTextReader xtr;\r
                XmlValidatingReader dvr;\r
 \r
+               private XmlValidatingReader PrepareXmlReader (string xml)\r
+               {\r
+                       XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);\r
+//                     XmlDocument doc = new XmlDocument ();\r
+//                     doc.LoadXml (xml);\r
+//                     XmlReader reader = new XmlNodeReader (doc);\r
+\r
+                       return new XmlValidatingReader (reader);\r
+               }\r
+\r
                [Test]\r
                public void TestSingleElement ()\r
                {\r
                        string intSubset = "<!ELEMENT root EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml1 = dtd + "<root />";\r
-                       xtr = new XmlTextReader (xml1, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       string xml = dtd + "<root />";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();\r
 \r
-                       string xml2 = dtd + "<invalid />";\r
-                       xtr = new XmlTextReader (xml2, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<invalid />";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        try {\r
                                dvr.Read ();    // invalid element.\r
                                Fail ("should be failed.");\r
-                       } catch (XmlException ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid start element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
-                       string xml3 = dtd + "<root>invalid PCDATA.</root>";\r
-                       xtr = new XmlTextReader (xml3, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root>invalid PCDATA.</root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        try {\r
                                dvr.Read ();    // invalid text\r
                                Fail ("should be failed.");\r
-                       } catch (XmlException ex) {\r
-                               if (!ex.Message.StartsWith ("Current element root does not allow"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
-                       string xml4 = dtd + "<root><invalid_child /></root>";\r
-                       xtr = new XmlTextReader (xml4, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><invalid_child /></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        try {\r
                                dvr.Read ();    // invalid child\r
                                Fail ("should be failed.");\r
-                       } catch (XmlException ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid start element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
@@ -77,49 +78,39 @@ namespace MonoTests.System.Xml
                {\r
                        string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml1 = dtd + "<root />";\r
-                       xtr = new XmlTextReader (xml1, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       string xml = dtd + "<root />";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        try {\r
                                dvr.Read ();    // root: invalid end\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid end element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
-                       string xml2 = dtd + "<root>Test.</root>";\r
-                       xtr = new XmlTextReader (xml2, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root>Test.</root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        try {\r
                                dvr.Read ();    // invalid end\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Current element root"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
-                       string xml3 = dtd + "<root><foo /></root>";\r
-                       xtr = new XmlTextReader (xml3, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo /></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
 \r
-                       string xml4 = dtd + "<root><bar /></root>";\r
-                       xtr = new XmlTextReader (xml4, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><bar /></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        try {\r
                                dvr.Read ();    // invalid element\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid start element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
@@ -128,24 +119,21 @@ namespace MonoTests.System.Xml
                {\r
                        string intSubset = "<!ELEMENT root (#PCDATA | foo)*><!ELEMENT foo EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml1 = dtd + "<root />";\r
-                       xtr = new XmlTextReader (xml1, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       string xml = dtd + "<root />";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // end\r
 \r
-                       string xml2 = dtd + "<root>Test.</root>";\r
-                       xtr = new XmlTextReader (xml2, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root>Test.</root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // valid PCDATA\r
                        dvr.Read ();    // endelement root\r
 \r
-                       string xml3 = dtd + "<root><foo/>Test.<foo></foo></root>";\r
-                       xtr = new XmlTextReader (xml3, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo/>Test.<foo></foo></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // valid foo\r
@@ -154,18 +142,15 @@ namespace MonoTests.System.Xml
                        dvr.Read ();    // valid endElement foo\r
                        dvr.Read ();    // valid endElement root\r
 \r
-                       string xml4 = dtd + "<root>Test.<bar /></root>";\r
-                       xtr = new XmlTextReader (xml4, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root>Test.<bar /></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // valid #PCDATA\r
                        try {\r
                                dvr.Read ();    // invalid element\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid start element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
@@ -174,40 +159,33 @@ namespace MonoTests.System.Xml
                {\r
                        string intSubset = "<!ELEMENT root (foo, bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml1 = dtd + "<root><foo/><bar/></root>";\r
-                       xtr = new XmlTextReader (xml1, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       string xml = dtd + "<root><foo/><bar/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
                        dvr.Read ();    // bar\r
                        dvr.Read ();    // end root\r
 \r
-                       string xml2 = dtd + "<root><foo/></root>";\r
-                       xtr = new XmlTextReader (xml2, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
                        try {\r
                                dvr.Read ();    // invalid end root\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid end element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
-                       string xml3 = dtd + "<root><bar/></root>";\r
-                       xtr = new XmlTextReader (xml3, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><bar/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        try {\r
                                dvr.Read ();    // invalid element bar\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid start element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
@@ -216,48 +194,40 @@ namespace MonoTests.System.Xml
                {\r
                        string intSubset = "<!ELEMENT root (foo|bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml1 = dtd + "<root><foo/><bar/></root>";\r
-                       xtr = new XmlTextReader (xml1, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       string xml = dtd + "<root><foo/><bar/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
                        try {\r
                                dvr.Read ();    // invalid element bar\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Invalid start element"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
-                       string xml2 = dtd + "<root><foo/></root>";\r
-                       xtr = new XmlTextReader (xml2, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
                        dvr.Read ();    // end root\r
 \r
-                       string xml3 = dtd + "<root><bar/></root>";\r
-                       xtr = new XmlTextReader (xml3, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><bar/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // bar\r
                        dvr.Read ();    // end root\r
 \r
-                       string xml4 = dtd + "<root><foo/>text.<bar/></root>";\r
-                       xtr = new XmlTextReader (xml4, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo/>text.<bar/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
                        try {\r
                                dvr.Read ();    // invalid text\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Current element root"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
@@ -266,24 +236,21 @@ namespace MonoTests.System.Xml
                {\r
                        string intSubset = "<!ELEMENT root ANY><!ELEMENT foo EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml1 = dtd + "<root />";\r
-                       xtr = new XmlTextReader (xml1, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       string xml = dtd + "<root />";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // empty root.\r
                        dvr.Read ();    // end of document.\r
 \r
-                       string xml2 = dtd + "<root><foo/></root>";\r
-                       xtr = new XmlTextReader (xml2, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
                        dvr.Read ();    // end root\r
 \r
-                       string xml3 = dtd + "<root><foo /><foo></foo><foo/></root>";\r
-                       xtr = new XmlTextReader (xml3, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><foo /><foo></foo><foo/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
@@ -291,28 +258,26 @@ namespace MonoTests.System.Xml
                        dvr.Read ();    // foo\r
                        dvr.Read ();    // end root\r
 \r
-                       string xml4 = dtd + "<root><bar /></root>";\r
-                       xtr = new XmlTextReader (xml4, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       xml = dtd + "<root><bar /></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        try {\r
                                dvr.Read ();    // bar: invalid (undeclared) element\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Element bar is not declared"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
                [Test]\r
+               [Category ("NotDotNet")]\r
+               // MS fails to validate nondeterministic content validation.\r
                public void TestNonDeterministicContent ()\r
                {\r
                        string intSubset = "<!ELEMENT root ((foo, bar)|(foo,baz))><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY><!ELEMENT baz EMPTY>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
                        string xml = dtd + "<root><foo/><bar/></root>";\r
-                       xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
@@ -320,8 +285,7 @@ namespace MonoTests.System.Xml
                        dvr.Read ();    // end root\r
 \r
                        xml = dtd + "<root><foo/><baz/></root>";\r
-                       xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // foo\r
@@ -329,46 +293,54 @@ namespace MonoTests.System.Xml
                }\r
 \r
                [Test]\r
+               [Category ("NotDotNet")]\r
                public void TestAttributes ()\r
                {\r
-                       string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";\r
+                       // simple content and attributes are required\r
+                       string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
-                       string xml = dtd + "<root />";\r
-                       dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);\r
+                       string xml = dtd + "<root><foo/></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.ValidationType = ValidationType.DTD;\r
+                       dvr.Read ();    // DTD\r
+                       try {\r
+                               dvr.Read ();    // missing attributes\r
+                               Fail ("should be failed."); // MS.NET fails to fail this test.\r
+                       } catch (XmlSchemaException) {\r
+                       }\r
+\r
+                       // empty element but attributes are required\r
+                       intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";\r
+                       dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       xml = dtd + "<root />";\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.ValidationType = ValidationType.DTD;\r
                        dvr.Read ();    // DTD\r
                        try {\r
                                dvr.Read ();    // missing attributes\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Required attribute root"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
 \r
                        xml = dtd + "<root foo='value' />";\r
-                       xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // end of document\r
 \r
                        xml = dtd + "<root foo='value' bar='2nd' />";\r
-                       xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();    // root\r
                        dvr.Read ();    // end of document\r
 \r
                        xml = dtd + "<root foo='value' bar='2nd' baz='3rd' />";\r
-                       xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
-                       dvr = new XmlValidatingReader (xtr);\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.Read ();    // DTD\r
                        try {\r
                                dvr.Read ();    // undeclared attribute baz\r
                                Fail ("should be failed.");\r
-                       } catch (Exception ex) {\r
-                               if (!ex.Message.StartsWith ("Attribute baz is not declared"))\r
-                                       throw ex;\r
+                       } catch (XmlSchemaException) {\r
                        }\r
                }\r
 \r
@@ -378,18 +350,575 @@ namespace MonoTests.System.Xml
                        string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";\r
                        string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
                        string xml = dtd + "<root />";\r
-                       dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);\r
+\r
+                       dvr = PrepareXmlReader (xml);\r
                        dvr.ValidationType = ValidationType.DTD;\r
+                       this.TestAttributeDefaultContributionInternal (dvr);\r
+\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       this.TestAttributeDefaultContributionInternal (dvr);\r
+               }\r
+\r
+               private void TestAttributeDefaultContributionInternal (XmlReader dvr)\r
+               {\r
                        dvr.Read ();    // DTD\r
                        dvr.Read ();\r
                        AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
                        AssertEquals ("root", dvr.Name);\r
+                       AssertEquals (2, dvr.AttributeCount);\r
+                       // foo\r
                        Assert (dvr.MoveToFirstAttribute ());\r
                        AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals ("foo-def", dvr ["foo"]);\r
+                       AssertNotNull (dvr ["bar"]);\r
                        AssertEquals ("foo-def", dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals ("foo-def", dvr.Value);\r
+                       // bar\r
                        Assert (dvr.MoveToNextAttribute ());\r
                        AssertEquals ("bar", dvr.Name);\r
+                       AssertEquals ("foo-def", dvr ["foo"]);\r
+                       AssertNotNull (dvr ["bar"]);\r
+                       AssertEquals ("bar-def", dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
                        AssertEquals ("bar-def", dvr.Value);\r
                }\r
+\r
+               [Test]\r
+               public void TestExpandEntity ()\r
+               {\r
+                       string intSubset = "<!ELEMENT root (#PCDATA)><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";\r
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       string xml = dtd + "<root foo='&ent;' bar='internal &ent; value'>&ent;</root>";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.EntityHandling = EntityHandling.ExpandEntities;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals ("entity string", dvr.Value);\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       AssertEquals ("internal entity string value", dvr.Value);\r
+                       AssertEquals ("entity string", dvr.ReadString ());\r
+\r
+                       // ValidationType = None\r
+\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.EntityHandling = EntityHandling.ExpandEntities;\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals ("entity string", dvr.Value);\r
+\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       AssertEquals ("internal entity string value", dvr.Value);\r
+                       AssertEquals ("entity string", dvr.ReadString ());\r
+               }\r
+\r
+               [Test]\r
+               public void TestPreserveEntity ()\r
+               {\r
+                       string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";\r
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       // MS BUG: it returns "entity string", however, entity should not be exanded.\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (!dvr.ReadAttributeValue ());\r
+\r
+                       // bar\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals ("internal ", dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals (" value", dvr.Value);\r
+\r
+                       // ValidationType = None\r
+\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+\r
+                       // foo\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (!dvr.ReadAttributeValue ());\r
+\r
+                       // bar\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals ("internal ", dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals (" value", dvr.Value);\r
+               }\r
+\r
+               [Test]\r
+               // it used to be regarded as MS bug but it was not really.\r
+               public void TestPreserveEntityNotOnDotNet ()\r
+               {\r
+                       string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";\r
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals ("entity string", dvr.Value);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (!dvr.ReadAttributeValue ());\r
+\r
+                       // bar\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       AssertEquals ("internal entity string value", dvr.Value);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals ("internal ", dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals (" value", dvr.Value);\r
+\r
+                       // ValidationType = None\r
+\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+\r
+                       // foo\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals ("entity string", dvr.Value);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (!dvr.ReadAttributeValue ());\r
+\r
+                       // bar\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       AssertEquals ("internal entity string value", dvr.Value);\r
+                       //  ReadAttributeValue()\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals ("internal ", dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals ("ent", dvr.Name);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+                       Assert (dvr.ReadAttributeValue ());\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (String.Empty, dvr.Name);\r
+                       AssertEquals (" value", dvr.Value);\r
+               }\r
+\r
+               [Test]\r
+               public void TestNormalization ()\r
+               {\r
+                       string intSubset = "<!ELEMENT root EMPTY>"\r
+                               + "<!ATTLIST root foo ID #REQUIRED"\r
+                               + " bar NMTOKEN #IMPLIED "\r
+                               + " baz NMTOKENS #IMPLIED "\r
+                               + " quux CDATA #IMPLIED >";\r
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       string xml = dtd + "<root foo=' id1 ' bar='  nameToken  ' baz=' list  of\r\nname token' quux=' quuux\tquuux\t ' />";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       ((XmlTextReader) dvr.Reader).Normalization = true;\r
+                       dvr.EntityHandling = EntityHandling.ExpandEntities;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals ("root", dvr.Name);\r
+                       Assert (dvr.MoveToFirstAttribute ());\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals ("id1", dvr.Value);\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       AssertEquals ("nameToken", dvr.Value);\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("baz", dvr.Name);\r
+                       AssertEquals ("list of name token", dvr.Value);\r
+                       Assert (dvr.MoveToNextAttribute ());\r
+                       AssertEquals ("quux", dvr.Name);\r
+                       AssertEquals (" quuux quuux  ", dvr.Value);\r
+               }\r
+\r
+               [Test]\r
+               public void TestValidationEvent ()\r
+               {\r
+                       string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";\r
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       string xml = dtd + "<foo><bar att='val' /></foo>";\r
+                       eventFired = false;\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound);\r
+                       dvr.ValidationType = ValidationType.DTD;\r
+                       dvr.Read ();    // DTD\r
+                       Assert (dvr.Read ());   // invalid foo\r
+                       Assert (eventFired);\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       Assert (dvr.Read ());   // invalid bar\r
+                       AssertEquals ("bar", dvr.Name);\r
+                       Assert (dvr.MoveToFirstAttribute ());   // att\r
+                       AssertEquals ("att", dvr.Name);\r
+                       Assert (dvr.Read ());   // invalid end foo\r
+                       AssertEquals ("foo", dvr.Name);\r
+                       AssertEquals (XmlNodeType.EndElement, dvr.NodeType);\r
+                       Assert (!dvr.Read ());\r
+\r
+                       // When ValidationType is None, event should not be fired,\r
+                       eventFired = false;\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound);\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       dvr.Read ();    // DTD\r
+                       Assert (dvr.Read ());   // invalid foo\r
+                       Assert (!eventFired);\r
+               }\r
+\r
+               private bool eventFired;\r
+               private void OnInvalidityFound (object o, ValidationEventArgs e)\r
+               {\r
+                       eventFired = true;\r
+               }\r
+\r
+               [Test]\r
+               public void TestIdentityConstraints ()\r
+               {\r
+                       string intSubset = "<!ELEMENT root (c)+><!ELEMENT c EMPTY><!ATTLIST root foo ID #REQUIRED>";\r
+                       string dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       string xml = dtd + "<root><c foo='val' /><c foo='val'></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.ValidationType = ValidationType.DTD;\r
+                       dvr.Read ();    // DTD\r
+                       try {\r
+                               dvr.Read ();    // root misses attribute foo\r
+                               Fail ();\r
+                       } catch (XmlSchemaException) {\r
+                       }\r
+\r
+                       intSubset = "<!ELEMENT root (c)+><!ELEMENT c EMPTY><!ATTLIST c foo ID #REQUIRED bar IDREF #IMPLIED baz IDREFS #IMPLIED>";\r
+                       dtd = "<!DOCTYPE root [" + intSubset + "]>";\r
+                       xml = dtd + "<root><c foo='val' /><c foo='val'></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.ValidationType = ValidationType.DTD;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();    // root\r
+                       dvr.Read ();    // c[1]\r
+                       try {\r
+                               dvr.Read ();    // c[2]\r
+                               Fail ();\r
+                       } catch (XmlSchemaException) {\r
+                       }\r
+\r
+                       xml = dtd + "<root><c foo='val' /><c baz='val val val 1 2 3'></root>";\r
+                       dvr = PrepareXmlReader (xml);\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();    // root\r
+                       dvr.Read ();    // c[1]\r
+                       try {\r
+                               dvr.Read ();    // c[2]\r
+                               Fail ();\r
+                       } catch (XmlSchemaException) {\r
+                       }\r
+               }\r
+\r
+               // Entity tests are almost copied from XmlNodeReaderTests.\r
+               [Test]\r
+               public void ResolveEntity ()\r
+               {\r
+                       string ent1 = "<!ENTITY ent 'entity string'>";\r
+                       string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";\r
+                       string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;\r
+                       string xml = dtd + "<root>&ent;&ent2;</root>";\r
+                       dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();    // root\r
+                       dvr.Read ();    // &ent;\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals (1, dvr.Depth);\r
+                       dvr.ResolveEntity ();\r
+                       // It is still entity reference.\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
+                       AssertEquals (2, dvr.Depth);\r
+                       AssertEquals ("entity string", dvr.Value);\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.EndEntity, dvr.NodeType);\r
+                       AssertEquals (1, dvr.Depth);\r
+                       AssertEquals (String.Empty, dvr.Value);\r
+\r
+                       dvr.Read ();    // &ent2;\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       AssertEquals (1, dvr.Depth);\r
+                       dvr.ResolveEntity ();\r
+                       // It is still entity reference.\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\r
+                       // It now became element node.\r
+                       dvr.Read ();\r
+                       AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
+                       AssertEquals (2, dvr.Depth);\r
+               }\r
+\r
+               [Test]\r
+               public void ResolveEntity2 ()\r
+               {\r
+                       string ent1 = "<!ENTITY ent 'entity string'>";\r
+                       string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";\r
+                       string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;\r
+                       string xml = dtd + "<root>&ent3;&ent2;</root>";\r
+                       dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);\r
+                       dvr.ValidationType = ValidationType.None;\r
+                       dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
+                       dvr.Read ();    // DTD\r
+                       dvr.Read ();    // root\r
+                       dvr.Read ();    // &ent3;\r
+                       AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);\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 ("Attempt to resolve undeclared entity should fail.");\r
+                       } catch (XmlException) {\r
+                       }\r
+#endif\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (XmlException))]\r
+               public void ResolveEntityWithoutDTD ()\r
+               {\r
+                       string xml = "<root>&ent;&ent2;</root>";\r
+                       dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);\r
+                       dvr.Read ();    // root\r
+                       dvr.Read ();    // &ent;\r
+               }\r
+\r
+               [Test]\r
+               public void ResolveEntityReadAttributeValue ()\r
+               {\r
+                       string dtd = "<!DOCTYPE root [<!ELEMENT root (#PCDATA)*><!ATTLIST root attr CDATA #REQUIRED><!ENTITY ent 'entity string'>]>";\r
+                       string xml = dtd + "<root attr='&ent; text'>&ent;</root>";\r
+                       dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);\r
+                       dvr.Read (); // doctype\r
+                       dvr.Read (); // root\r
+                       dvr.MoveToAttribute (0); // attr\r
+                       Assert (dvr.ReadAttributeValue ()); // Should read expanded text\r
+                       AssertEquals (XmlNodeType.Text, dvr.NodeType); // not EntityReference\r
+                       AssertEquals ("entity string text", dvr.Value);\r
+                       Assert (!dvr.ReadAttributeValue ());\r
+               }\r
+\r
+               [Test]\r
+               public void ResolveEntitySequentialText ()\r
+               {\r
+                       string xml = @"<!DOCTYPE doc [\r
+                               <!ELEMENT doc ANY>\r
+                               <!ELEMENT foo  ANY>\r
+                               <!ENTITY ref1 '<![CDATA[cdata]]>test'>\r
+                               ]>\r
+                               <doc><foo>&ref1; test </foo></doc>";\r
+                       string refOut = "<doc><foo><![CDATA[cdata]]>test test </foo></doc>";\r
+\r
+                       XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
+                       XmlValidatingReader r = new XmlValidatingReader (xtr);\r
+                       r.Read ();\r
+                       r.Read ();\r
+                       r.Read ();\r
+                       AssertEquals (refOut, r.ReadOuterXml ());\r
+               }\r
+\r
+               [Test]\r
+               // imported testcase from sys.security which had regression.\r
+               public void ResolveEntityAndBaseURI ()\r
+               {\r
+                       try {\r
+                               using (TextWriter w = File.CreateText ("world.txt")) {\r
+                                       w.WriteLine ("world");\r
+                               }\r
+                               using (TextWriter w = File.CreateText ("doc.dtd")) {\r
+                                       w.WriteLine ("<!-- dummy -->");\r
+                               }\r
+\r
+                               string xml =  "<!DOCTYPE doc SYSTEM \"doc.dtd\" [\n" +\r
+                                       "<!ATTLIST doc attrExtEnt ENTITY #IMPLIED>\n" +\r
+                                       "<!ENTITY ent1 \"Hello\">\n" +\r
+                                       "<!ENTITY ent2 SYSTEM \"world.txt\">\n" +\r
+                                       "<!ENTITY entExt SYSTEM \"earth.gif\" NDATA gif>\n" +\r
+                                       "<!NOTATION gif SYSTEM \"viewgif.exe\">\n" +\r
+                                       "]>\n" +\r
+                                       "<doc attrExtEnt=\"entExt\">\n" +\r
+                                       "   &ent1;, &ent2;!\n" +\r
+                                       "</doc>\n" +\r
+                                       "\n" +\r
+                                       "<!-- Let world.txt contain \"world\" (excluding the quotes) -->\n";\r
+\r
+                               XmlValidatingReader xvr =\r
+                                       new XmlValidatingReader (\r
+                                       xml, XmlNodeType.Document, null);\r
+                               xvr.ValidationType = ValidationType.None;\r
+                               xvr.EntityHandling =\r
+                                       EntityHandling.ExpandCharEntities;\r
+                               XmlDocument doc = new XmlDocument ();\r
+                               doc.Load (xvr);\r
+\r
+                       } finally {\r
+                               if (File.Exists ("world.txt"))\r
+                                       File.Delete ("world.txt");\r
+                               if (File.Exists ("doc.dtd"))\r
+                                       File.Delete ("doc.dtd");\r
+                       }\r
+               }\r
+\r
+               [Test]\r
+               //[NotWorking ("default namespace seems null, not String.Empty")]\r
+#if NET_2_0\r
+#else\r
+               // MS.NET 1.x does not consider cases that xmlns* attributes\r
+               // could be declared as default.\r
+               [Category ("NotDotNet")]\r
+#endif\r
+               public void DefaultXmlnsAttributeLookup ()\r
+               {\r
+                       string xml = @"<!DOCTYPE X [\r
+                       <!ELEMENT X (Y)+>\r
+                       <!ENTITY baz 'urn:baz'>\r
+                       <!ATTLIST X\r
+                               xmlns CDATA 'urn:foo'\r
+                               xmlns:bar CDATA 'urn:bar'\r
+                               xmlns:baz CDATA #IMPLIED\r
+                               dummy CDATA 'dummy'\r
+                               baz:dummy CDATA 'dummy'>\r
+                       <!ELEMENT Y (#PCDATA)*>\r
+                       <!ATTLIST Y\r
+                               xmlns CDATA #IMPLIED\r
+                               xmlns:bar CDATA #IMPLIED>\r
+                       ]>\r
+                       <X xmlns:baz='&baz;'><Y/><Y>text.</Y><Y xmlns='' xmlns:bar='urn:hoge'>text.</Y></X>";\r
+                       XmlValidatingReader xvr = new XmlValidatingReader (\r
+                               xml, XmlNodeType.Document, null);\r
+                       xvr.Read (); // DTD\r
+                       xvr.Read (); // whitespace\r
+                       xvr.Read ();\r
+                       AssertEquals ("#1-1", "urn:foo", xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#1-2", "urn:bar", xvr.LookupNamespace ("bar"));\r
+\r
+                       AssertEquals ("#1-a", "urn:baz", xvr.LookupNamespace ("baz"));\r
+                       Assert ("#1-b", xvr.MoveToAttribute ("baz:dummy"));\r
+                       AssertEquals ("#1-c", "urn:baz", xvr.NamespaceURI);\r
+\r
+                       Assert ("#1-d", xvr.MoveToAttribute ("dummy"));\r
+                       AssertEquals ("#1-e", String.Empty, xvr.NamespaceURI);\r
+\r
+                       xvr.Read (); // first Y, empty element\r
+                       AssertEquals ("#2-1", "urn:foo", xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#2-2", "urn:bar", xvr.LookupNamespace ("bar"));\r
+                       xvr.Read (); // second Y, start element\r
+                       AssertEquals ("#3-1", "urn:foo", xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#3-2", "urn:bar", xvr.LookupNamespace ("bar"));\r
+                       xvr.Read (); // inside normal Y. Check inheritance\r
+                       AssertEquals ("#4-1", "urn:foo", xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#4-2", "urn:bar", xvr.LookupNamespace ("bar"));\r
+                       xvr.Read (); // second Y, end element\r
+                       AssertEquals ("#5-1", "urn:foo", xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#5-2", "urn:bar", xvr.LookupNamespace ("bar"));\r
+                       xvr.Read (); // third Y, suppresses default namespaces\r
+                       AssertEquals ("#6-1", null, xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#6-2", "urn:hoge", xvr.LookupNamespace ("bar"));\r
+                       xvr.Read (); // inside suppressing Y. Check inheritance\r
+                       AssertEquals ("#7-1", null, xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#7-2", "urn:hoge", xvr.LookupNamespace ("bar"));\r
+                       xvr.Read (); // end of suppressing element\r
+                       AssertEquals ("#8-1", null, xvr.LookupNamespace (String.Empty));\r
+                       AssertEquals ("#8-2", "urn:hoge", xvr.LookupNamespace ("bar"));\r
+               }\r
        }\r
 }\r