// // MonoTests.System.Xml.XmlValidatingReaderTests.cs // // Author: // Atsushi Enomoto // // (C)2003 Atsushi Enomoto // using System; using System.IO; using System.Xml; using System.Xml.Schema; using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] public class XmlValidatingReaderTests { public XmlValidatingReaderTests () { } XmlValidatingReader dvr; private XmlValidatingReader PrepareXmlReader (string xml) { XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null); // XmlDocument doc = new XmlDocument (); // doc.LoadXml (xml); // XmlReader reader = new XmlNodeReader (doc); return new XmlValidatingReader (reader); } [Test] public void TestSingleElement () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD try { dvr.Read (); // invalid element. Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + "invalid PCDATA."; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root try { dvr.Read (); // invalid text Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root try { dvr.Read (); // invalid child Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] public void TestElementContent () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD try { dvr.Read (); // root: invalid end Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + "Test."; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root try { dvr.Read (); // invalid end Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root try { dvr.Read (); // invalid element Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] public void TestMixedContent () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // end xml = dtd + "Test."; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // valid PCDATA dvr.Read (); // endelement root xml = dtd + "Test."; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // valid foo dvr.Read (); // valid #PCDATA dvr.Read (); // valid foo dvr.Read (); // valid endElement foo dvr.Read (); // valid endElement root xml = dtd + "Test."; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // valid #PCDATA try { dvr.Read (); // invalid element Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] public void TestSequence () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo dvr.Read (); // bar dvr.Read (); // end root xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo try { dvr.Read (); // invalid end root Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root try { dvr.Read (); // invalid element bar Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] public void TestChoice () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo try { dvr.Read (); // invalid element bar Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo dvr.Read (); // end root xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // bar dvr.Read (); // end root xml = dtd + "text."; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo try { dvr.Read (); // invalid text Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] public void TestAny () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // empty root. dvr.Read (); // end of document. xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo dvr.Read (); // end root xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo dvr.Read (); // foo dvr.Read (); // foo dvr.Read (); // end root xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root try { dvr.Read (); // bar: invalid (undeclared) element Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] [Category ("NotDotNet")] // MS fails to validate nondeterministic content validation. public void TestNonDeterministicContent () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo dvr.Read (); // bar dvr.Read (); // end root xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // foo dvr.Read (); // end root } [Test] [Category ("NotDotNet")] public void TestAttributes () { // simple content and attributes are required string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.ValidationType = ValidationType.DTD; dvr.Read (); // DTD try { dvr.Read (); // missing attributes Assert.Fail ("should be failed."); // MS.NET fails to fail this test. } catch (XmlSchemaException) { } // empty element but attributes are required intSubset = ""; dtd = ""; xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.ValidationType = ValidationType.DTD; dvr.Read (); // DTD try { dvr.Read (); // missing attributes Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // end of document xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // end of document xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD try { dvr.Read (); // undeclared attribute baz Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } [Test] public void TestAttributeDefaultContribution () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.ValidationType = ValidationType.DTD; this.TestAttributeDefaultContributionInternal (dvr); dvr = PrepareXmlReader (xml); dvr.ValidationType = ValidationType.None; this.TestAttributeDefaultContributionInternal (dvr); } private void TestAttributeDefaultContributionInternal (XmlReader dvr) { dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); Assert.AreEqual (2, dvr.AttributeCount); // foo Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual ("foo-def", dvr ["foo"]); Assert.IsNotNull (dvr ["bar"]); Assert.AreEqual ("foo-def", dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual ("foo-def", dvr.Value); // bar Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); Assert.AreEqual ("foo-def", dvr ["foo"]); Assert.IsNotNull (dvr ["bar"]); Assert.AreEqual ("bar-def", dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual ("bar-def", dvr.Value); } [Test] public void TestExpandEntity () { string intSubset = ""; string dtd = ""; string xml = dtd + "&ent;"; dvr = PrepareXmlReader (xml); dvr.EntityHandling = EntityHandling.ExpandEntities; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual ("entity string", dvr.Value); Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); Assert.AreEqual ("internal entity string value", dvr.Value); Assert.AreEqual ("entity string", dvr.ReadString ()); // ValidationType = None dvr = PrepareXmlReader (xml); dvr.EntityHandling = EntityHandling.ExpandEntities; dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual ("entity string", dvr.Value); Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); Assert.AreEqual ("internal entity string value", dvr.Value); Assert.AreEqual ("entity string", dvr.ReadString ()); } [Test] public void TestPreserveEntity () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); // MS BUG: it returns "entity string", however, entity should not be exanded. // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual ("internal ", dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual (" value", dvr.Value); // ValidationType = None dvr = PrepareXmlReader (xml); dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); // foo Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual ("internal ", dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual (" value", dvr.Value); } [Test] // it used to be regarded as MS bug but it was not really. public void TestPreserveEntityNotOnDotNet () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual ("entity string", dvr.Value); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); Assert.AreEqual ("internal entity string value", dvr.Value); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual ("internal ", dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual (" value", dvr.Value); // ValidationType = None dvr = PrepareXmlReader (xml); dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); // foo Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual ("entity string", dvr.Value); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); Assert.AreEqual ("internal entity string value", dvr.Value); // ReadAttributeValue() Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual ("internal ", dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual ("ent", dvr.Name); Assert.AreEqual (String.Empty, dvr.Value); Assert.IsTrue (dvr.ReadAttributeValue ()); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (String.Empty, dvr.Name); Assert.AreEqual (" value", dvr.Value); } [Test] public void TestNormalization () { string intSubset = "" + ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); ((XmlTextReader) dvr.Reader).Normalization = true; dvr.EntityHandling = EntityHandling.ExpandEntities; dvr.Read (); // DTD dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual ("root", dvr.Name); Assert.IsTrue (dvr.MoveToFirstAttribute ()); Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual ("id1", dvr.Value); Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("bar", dvr.Name); Assert.AreEqual ("nameToken", dvr.Value); Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("baz", dvr.Name); Assert.AreEqual ("list of name token", dvr.Value); Assert.IsTrue (dvr.MoveToNextAttribute ()); Assert.AreEqual ("quux", dvr.Name); Assert.AreEqual (" quuux quuux ", dvr.Value); } [Test] public void TestValidationEvent () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; eventFired = false; dvr = PrepareXmlReader (xml); dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound); dvr.ValidationType = ValidationType.DTD; dvr.Read (); // DTD Assert.IsTrue (dvr.Read ()); // invalid foo Assert.IsTrue (eventFired); Assert.AreEqual ("foo", dvr.Name); Assert.IsTrue (dvr.Read ()); // invalid bar Assert.AreEqual ("bar", dvr.Name); Assert.IsTrue (dvr.MoveToFirstAttribute ()); // att Assert.AreEqual ("att", dvr.Name); Assert.IsTrue (dvr.Read ()); // invalid end foo Assert.AreEqual ("foo", dvr.Name); Assert.AreEqual (XmlNodeType.EndElement, dvr.NodeType); Assert.IsTrue (!dvr.Read ()); // When ValidationType is None, event should not be fired, eventFired = false; dvr = PrepareXmlReader (xml); dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound); dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD Assert.IsTrue (dvr.Read ()); // invalid foo Assert.IsTrue (!eventFired); } private bool eventFired; private void OnInvalidityFound (object o, ValidationEventArgs e) { eventFired = true; } [Test] public void TestIdentityConstraints () { string intSubset = ""; string dtd = ""; string xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.ValidationType = ValidationType.DTD; dvr.Read (); // DTD try { dvr.Read (); // root misses attribute foo Assert.Fail (); } catch (XmlSchemaException) { } intSubset = ""; dtd = ""; xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.ValidationType = ValidationType.DTD; dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // c[1] try { dvr.Read (); // c[2] Assert.Fail (); } catch (XmlSchemaException) { } xml = dtd + ""; dvr = PrepareXmlReader (xml); dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // c[1] try { dvr.Read (); // c[2] Assert.Fail (); } catch (XmlSchemaException) { } } // Entity tests are almost copied from XmlNodeReaderTests. [Test] public void ResolveEntity () { string ent1 = ""; string ent2 = "'>]>"; string dtd = "" + ent1 + ent2; string xml = dtd + "&ent;&ent2;"; dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); dvr.ValidationType = ValidationType.None; dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // &ent; Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual (1, dvr.Depth); dvr.ResolveEntity (); // It is still entity reference. Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); dvr.Read (); Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); Assert.AreEqual (2, dvr.Depth); Assert.AreEqual ("entity string", dvr.Value); dvr.Read (); Assert.AreEqual (XmlNodeType.EndEntity, dvr.NodeType); Assert.AreEqual (1, dvr.Depth); Assert.AreEqual (String.Empty, dvr.Value); dvr.Read (); // &ent2; Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); Assert.AreEqual (1, dvr.Depth); dvr.ResolveEntity (); // It is still entity reference. Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); // It now became element node. dvr.Read (); Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); Assert.AreEqual (2, dvr.Depth); } [Test] public void ResolveEntity2 () { string ent1 = ""; string ent2 = "'>]>"; string dtd = "" + ent1 + ent2; string xml = dtd + "&ent3;&ent2;"; dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); dvr.ValidationType = ValidationType.None; dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // &ent3; Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); #if NET_2_0 // under .NET 2.0, an error is raised here. // under .NET 1.1, the error is thrown on the next read. try { dvr.ResolveEntity (); Assert.Fail ("Attempt to resolve undeclared entity should fail."); } catch (XmlException) { } #else // ent3 does not exist in this dtd. dvr.ResolveEntity (); Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); try { dvr.Read (); Assert.Fail ("Attempt to resolve undeclared entity should fail."); } catch (XmlException) { } #endif } [Test] [ExpectedException (typeof (XmlException))] public void ResolveEntityWithoutDTD () { string xml = "&ent;&ent2;"; dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); dvr.Read (); // root dvr.Read (); // &ent; } [Test] public void ResolveEntityReadAttributeValue () { string dtd = "]>"; string xml = dtd + "&ent;"; dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); dvr.Read (); // doctype dvr.Read (); // root dvr.MoveToAttribute (0); // attr Assert.IsTrue (dvr.ReadAttributeValue ()); // Should read expanded text Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); // not EntityReference Assert.AreEqual ("entity string text", dvr.Value); Assert.IsTrue (!dvr.ReadAttributeValue ()); } [Test] public void ResolveEntitySequentialText () { string xml = @" test'> ]> &ref1; test "; string refOut = "test test "; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); XmlValidatingReader r = new XmlValidatingReader (xtr); r.Read (); r.Read (); r.Read (); Assert.AreEqual (refOut, r.ReadOuterXml ()); } [Test] // imported testcase from sys.security which had regression. public void ResolveEntityAndBaseURI () { try { using (TextWriter w = File.CreateText ("world.txt")) { w.WriteLine ("world"); } using (TextWriter w = File.CreateText ("doc.dtd")) { w.WriteLine (""); } string xml = "\n" + "\n" + "\n" + "\n" + "\n" + "]>\n" + "\n" + " &ent1;, &ent2;!\n" + "\n" + "\n" + "\n"; XmlValidatingReader xvr = new XmlValidatingReader ( xml, XmlNodeType.Document, null); xvr.ValidationType = ValidationType.None; xvr.EntityHandling = EntityHandling.ExpandCharEntities; XmlDocument doc = new XmlDocument (); doc.Load (xvr); } finally { if (File.Exists ("world.txt")) File.Delete ("world.txt"); if (File.Exists ("doc.dtd")) File.Delete ("doc.dtd"); } } [Test] //[NotWorking ("default namespace seems null, not String.Empty")] #if NET_2_0 #else // MS.NET 1.x does not consider cases that xmlns* attributes // could be declared as default. [Category ("NotDotNet")] #endif public void DefaultXmlnsAttributeLookup () { string xml = @" ]> text.text."; XmlValidatingReader xvr = new XmlValidatingReader ( xml, XmlNodeType.Document, null); xvr.Read (); // DTD xvr.Read (); // whitespace xvr.Read (); Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#1-1"); Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#1-2"); Assert.AreEqual ("urn:baz", xvr.LookupNamespace ("baz"), "#1-a"); Assert.IsTrue (xvr.MoveToAttribute ("baz:dummy"), "#1-b"); Assert.AreEqual ("urn:baz", xvr.NamespaceURI, "#1-c"); Assert.IsTrue (xvr.MoveToAttribute ("dummy"), "#1-d"); Assert.AreEqual (String.Empty, xvr.NamespaceURI, "#1-e"); xvr.Read (); // first Y, empty element Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#2-1"); Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#2-2"); xvr.Read (); // second Y, start element Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#3-1"); Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#3-2"); xvr.Read (); // inside normal Y. Check inheritance Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#4-1"); Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#4-2"); xvr.Read (); // second Y, end element Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#5-1"); Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#5-2"); xvr.Read (); // third Y, suppresses default namespaces Assert.AreEqual (null, xvr.LookupNamespace (String.Empty), "#6-1"); Assert.AreEqual ("urn:hoge", xvr.LookupNamespace ("bar"), "#6-2"); xvr.Read (); // inside suppressing Y. Check inheritance Assert.AreEqual (null, xvr.LookupNamespace (String.Empty), "#7-1"); Assert.AreEqual ("urn:hoge", xvr.LookupNamespace ("bar"), "#7-2"); xvr.Read (); // end of suppressing element Assert.AreEqual (null, xvr.LookupNamespace (String.Empty), "#8-1"); Assert.AreEqual ("urn:hoge", xvr.LookupNamespace ("bar"), "#8-2"); } #if NET_2_0 [Test] [ExpectedException (typeof (XmlSchemaException))] public void Bug80231 () { string xml = "]>"; XmlReaderSettings settings = new XmlReaderSettings (); settings.ProhibitDtd = false; settings.ValidationType = ValidationType.DTD; XmlReader r = XmlReader.Create (new StringReader (xml), settings); while (!r.EOF) r.Read (); } #endif #if NET_2_0 [Test] public void Bug501814 () { string xsd = @" "; XmlDocument doc = new XmlDocument (); XmlSchema schema = XmlSchema.Read (XmlReader.Create (new StringReader (xsd)), null); doc.LoadXml (@" "); doc.Schemas.Add (schema); doc.Validate (null); } #endif #if NET_2_0 [Test] public void Bug502168 () { string xsd = @" "; XmlDocument doc = new XmlDocument (); XmlSchema schema = XmlSchema.Read (XmlReader.Create (new StringReader (xsd)), null); doc.LoadXml (@""); doc.Schemas.Add(schema); doc.Validate(null); } #endif } }