// // XmlTextReaderTests.cs // // Authors: // Jason Diamond (jason@injektilo.org) // Martin Willemoes Hansen (mwh@sysrq.dk) // // (C) 2001, 2002 Jason Diamond http://injektilo.org/ // using System; using System.IO; using System.Xml; using System.Text; using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] public class XmlTextReaderTests : Assertion { private void AssertStartDocument (XmlReader xmlReader) { Assert (xmlReader.ReadState == ReadState.Initial); Assert (xmlReader.NodeType == XmlNodeType.None); Assert (xmlReader.Depth == 0); Assert (!xmlReader.EOF); } private void AssertNode ( XmlReader xmlReader, XmlNodeType nodeType, int depth, bool isEmptyElement, string name, string prefix, string localName, string namespaceURI, string value, int attributeCount) { Assert ("#Read", xmlReader.Read ()); Assert ("#ReadState", xmlReader.ReadState == ReadState.Interactive); Assert (!xmlReader.EOF); AssertNodeValues (xmlReader, nodeType, depth, isEmptyElement, name, prefix, localName, namespaceURI, value, attributeCount); } private void AssertNodeValues ( XmlReader xmlReader, XmlNodeType nodeType, int depth, bool isEmptyElement, string name, string prefix, string localName, string namespaceURI, string value, int attributeCount) { AssertEquals ("NodeType", nodeType, xmlReader.NodeType); AssertEquals ("Depth", depth, xmlReader.Depth); AssertEquals ("IsEmptyElement", isEmptyElement, xmlReader.IsEmptyElement); AssertEquals ("name", name, xmlReader.Name); AssertEquals ("prefix", prefix, xmlReader.Prefix); AssertEquals ("localName", localName, xmlReader.LocalName); AssertEquals ("namespaceURI", namespaceURI, xmlReader.NamespaceURI); AssertEquals ("hasValue", (value != String.Empty), xmlReader.HasValue); AssertEquals ("Value", value, xmlReader.Value); AssertEquals ("hasAttributes", attributeCount > 0, xmlReader.HasAttributes); AssertEquals ("attributeCount", attributeCount, xmlReader.AttributeCount); } private void AssertAttribute ( XmlReader xmlReader, string name, string prefix, string localName, string namespaceURI, string value) { AssertEquals ("value.Indexer", value, xmlReader [name]); AssertEquals ("value.GetAttribute", value, xmlReader.GetAttribute (name)); if (namespaceURI != String.Empty) { Assert (xmlReader[localName, namespaceURI] == value); Assert (xmlReader.GetAttribute (localName, namespaceURI) == value); } } private void AssertEndDocument (XmlReader xmlReader) { Assert ("could read", !xmlReader.Read ()); AssertEquals ("NodeType is not XmlNodeType.None", XmlNodeType.None, xmlReader.NodeType); AssertEquals ("Depth is not 0", 0, xmlReader.Depth); AssertEquals ("ReadState is not ReadState.EndOfFile", ReadState.EndOfFile, xmlReader.ReadState); Assert ("not EOF", xmlReader.EOF); xmlReader.Close (); AssertEquals ("ReadState is not ReadState.Cosed", ReadState.Closed, xmlReader.ReadState); } [Test] public void StartAndEndTagWithAttribute () { string xml = @""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertStartDocument (xmlReader); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 1 // attributeCount ); AssertAttribute ( xmlReader, // xmlReader "bar", // name String.Empty, // prefix "bar", // localName String.Empty, // namespaceURI "baz" // value ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EndElement, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertEndDocument (xmlReader); } // expecting parser error [Test] public void EmptyElementWithBadName () { string xml = "<1foo/>"; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); bool caughtXmlException = false; try { xmlReader.Read(); } catch (XmlException) { caughtXmlException = true; } Assert(caughtXmlException); } [Test] public void EmptyElementWithStartAndEndTag () { string xml = ""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertStartDocument (xmlReader); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EndElement, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertEndDocument (xmlReader); } // checking parser [Test] public void EmptyElementWithStartAndEndTagWithWhitespace () { string xml = ""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertStartDocument (xmlReader); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EndElement, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertEndDocument (xmlReader); } [Test] public void EmptyElementWithAttribute () { string xml = @""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertStartDocument (xmlReader); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth true, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 1 // attributeCount ); AssertAttribute ( xmlReader, // xmlReader "bar", // name String.Empty, // prefix "bar", // localName String.Empty, // namespaceURI "baz" // value ); AssertEndDocument (xmlReader); } [Test] public void EmptyElementInNamespace () { string xml = @""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertStartDocument (xmlReader); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, // depth true, // isEmptyElement "foo:bar", // name "foo", // prefix "bar", // localName "http://foo/", // namespaceURI String.Empty, // value 1 // attributeCount ); AssertAttribute ( xmlReader, // xmlReader "xmlns:foo", // name "xmlns", // prefix "foo", // localName "http://www.w3.org/2000/xmlns/", // namespaceURI "http://foo/" // value ); AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); AssertEndDocument (xmlReader); } [Test] public void EntityReferenceInAttribute () { string xml = ""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertStartDocument (xmlReader); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth true, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 1 // attributeCount ); AssertAttribute ( xmlReader, // xmlReader "bar", // name String.Empty, // prefix "bar", // localName String.Empty, // namespaceURI "&baz;" // value ); AssertEndDocument (xmlReader); } [Test] public void IsName () { Assert (XmlReader.IsName ("foo")); Assert (!XmlReader.IsName ("1foo")); Assert (!XmlReader.IsName (" foo")); } [Test] public void IsNameToken () { Assert (XmlReader.IsNameToken ("foo")); Assert (XmlReader.IsNameToken ("1foo")); Assert (!XmlReader.IsNameToken (" foo")); } [Test] public void FragmentConstructor() { XmlDocument doc = new XmlDocument(); // doc.LoadXml(""); string xml = @"TEXT NODE"; MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(xml)); XmlParserContext ctx = new XmlParserContext(doc.NameTable, new XmlNamespaceManager(doc.NameTable), "", "", "", "", doc.BaseURI, "", XmlSpace.Default, Encoding.Default); XmlTextReader xmlReader = new XmlTextReader(ms, XmlNodeType.Element, ctx); AssertNode(xmlReader, XmlNodeType.Element, 0, false, "foo", "", "foo", "", "", 0); AssertNode(xmlReader, XmlNodeType.Element, 1, false, "bar", "", "bar", "NSURI", "", 1); AssertNode(xmlReader, XmlNodeType.Text, 2, false, "", "", "", "", "TEXT NODE", 0); AssertNode(xmlReader, XmlNodeType.EndElement, 1, false, "bar", "", "bar", "NSURI", "", 0); AssertNode(xmlReader, XmlNodeType.EndElement, 0, false, "foo", "", "foo", "", "", 0); AssertEndDocument (xmlReader); } [Test] public void AttributeWithCharacterReference () { string xml = @""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); xmlReader.Read (); AssertEquals ("hello & world", xmlReader ["value"]); } [Test] public void AttributeWithEntityReference () { string xml = @""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); xmlReader.Read (); xmlReader.MoveToFirstAttribute (); xmlReader.ReadAttributeValue (); AssertEquals ("hello ", xmlReader.Value); Assert (xmlReader.ReadAttributeValue ()); AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType); AssertEquals ("ent", xmlReader.Name); AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType); Assert (xmlReader.ReadAttributeValue ()); AssertEquals (" world", xmlReader.Value); AssertEquals (XmlNodeType.Text, xmlReader.NodeType); Assert (!xmlReader.ReadAttributeValue ()); AssertEquals (" world", xmlReader.Value); // remains AssertEquals (XmlNodeType.Text, xmlReader.NodeType); xmlReader.ReadAttributeValue (); AssertEquals (XmlNodeType.Text, xmlReader.NodeType); } [Test] public void QuoteChar () { string xml = @""; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); xmlReader.Read (); xmlReader.MoveToFirstAttribute (); AssertEquals ("First", '\'', xmlReader.QuoteChar); xmlReader.MoveToNextAttribute (); AssertEquals ("Next", '"', xmlReader.QuoteChar); xmlReader.MoveToFirstAttribute (); AssertEquals ("First.Again", '\'', xmlReader.QuoteChar); } [Test] public void ReadInnerXmlWrongInit () { // This behavior is different from XmlNodeReader. XmlReader reader = new XmlTextReader (new StringReader ("test of mixed string.")); reader.ReadInnerXml (); AssertEquals ("initial.ReadState", ReadState.Initial, reader.ReadState); AssertEquals ("initial.EOF", false, reader.EOF); AssertEquals ("initial.NodeType", XmlNodeType.None, reader.NodeType); } [Test] public void EntityReference () { string xml = "&bar;"; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EntityReference, // nodeType 1, //depth false, // isEmptyElement "bar", // name String.Empty, // prefix "bar", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EndElement, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertEndDocument (xmlReader); } [Test] public void EntityReferenceInsideText () { string xml = "bar&baz;quux"; XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); AssertNode ( xmlReader, // xmlReader XmlNodeType.Element, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.Text, // nodeType 1, //depth false, // isEmptyElement String.Empty, // name String.Empty, // prefix String.Empty, // localName String.Empty, // namespaceURI "bar", // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EntityReference, // nodeType 1, //depth false, // isEmptyElement "baz", // name String.Empty, // prefix "baz", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.Text, // nodeType 1, //depth false, // isEmptyElement String.Empty, // name String.Empty, // prefix String.Empty, // localName String.Empty, // namespaceURI "quux", // value 0 // attributeCount ); AssertNode ( xmlReader, // xmlReader XmlNodeType.EndElement, // nodeType 0, //depth false, // isEmptyElement "foo", // name String.Empty, // prefix "foo", // localName String.Empty, // namespaceURI String.Empty, // value 0 // attributeCount ); AssertEndDocument (xmlReader); } [Test] [ExpectedException (typeof (XmlException))] public void XmlDeclAfterWhitespace () { XmlTextReader xtr = new XmlTextReader ( " ", XmlNodeType.Document, null); xtr.Read (); // ws xtr.Read (); // not-wf xmldecl xtr.Close (); } [Test] [ExpectedException (typeof (XmlException))] public void XmlDeclAfterComment () { XmlTextReader xtr = new XmlTextReader ( "", XmlNodeType.Document, null); xtr.Read (); // comment xtr.Read (); // not-wf xmldecl xtr.Close (); } [Test] [ExpectedException (typeof (XmlException))] public void XmlDeclAfterProcessingInstruction () { XmlTextReader xtr = new XmlTextReader ( "", XmlNodeType.Document, null); xtr.Read (); // PI xtr.Read (); // not-wf xmldecl xtr.Close (); } [Test] [ExpectedException (typeof (XmlException))] public void StartsFromEndElement () { XmlTextReader xtr = new XmlTextReader ( "", XmlNodeType.Document, null); xtr.Read (); xtr.Close (); } [Test] public void ReadAsElementContent () { XmlTextReader xtr = new XmlTextReader ( "", XmlNodeType.Element, null); xtr.Read (); xtr.Close (); } [Test] public void ReadAsAttributeContent () { XmlTextReader xtr = new XmlTextReader ( "test", XmlNodeType.Attribute, null); xtr.Read (); xtr.Close (); } [Test] public void ExternalDocument () { XmlDocument doc = new XmlDocument (); doc.Load ("Test/XmlFiles/nested-dtd-test.xml"); } [Test] [ExpectedException (typeof (XmlException))] public void NotAllowedCharRef () { string xml = ""; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Normalization = true; xtr.Read (); xtr.Read (); xtr.Close (); } [Test] public void NotAllowedCharRefButPassNormalizationFalse () { string xml = ""; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Read (); xtr.Read (); xtr.Close (); } [Test] [ExpectedException (typeof (XmlException))] [Ignore ("MS.NET 1.0 fails this test. The related spec is XML rec. 4.1")] public void UndeclaredEntityInIntSubsetOnlyXml () { string ent2 = "'>]>"; string dtd = "" + ent2; string xml = dtd + "&ent;&ent2;"; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); while (!xtr.EOF) xtr.Read (); xtr.Close (); } [Test] [ExpectedException (typeof (XmlException))] [Ignore ("MS.NET 1.0 fails this test. The related spec is XML rec. 4.1")] public void UndeclaredEntityInStandaloneXml () { string ent2 = "'>]>"; string dtd = "" + ent2; string xml = "" + dtd + "&ent;"; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); while (!xtr.EOF) xtr.Read (); xtr.Close (); } [Test] public void ExpandParameterEntity () { string ent = ""; string pe = ""; string eldecl = ""; string dtd = ""; string xml = dtd + ""; XmlDocument doc = new XmlDocument (); doc.LoadXml (xml); XmlEntity foo = doc.DocumentType.Entities.GetNamedItem ("foo") as XmlEntity; AssertNotNull (foo); AssertEquals ("foo-def", foo.InnerText); } [Test] public void IfNamespacesThenProhibitedAttributes () { string xml = @""; XmlDocument doc = new XmlDocument (); doc.LoadXml (xml); } [Test] public void ReadBase64 () { byte [] bytes = new byte [] {4,14,54,114,134,184,254,255}; string base64 = "BA42coa44"; XmlTextReader xtr = new XmlTextReader (base64, XmlNodeType.Document, null); byte [] bytes2 = new byte [10]; xtr.Read (); // root xtr.Read (); // foo this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty, "foo", String.Empty, String.Empty, 0); AssertEquals (6, xtr.ReadBase64 (bytes2, 0, 10)); this.AssertNodeValues (xtr, XmlNodeType.EndElement, 0, false, "root", String.Empty, "root", String.Empty, String.Empty, 0); Assert (!xtr.Read ()); AssertEquals (4, bytes2 [0]); AssertEquals (14, bytes2 [1]); AssertEquals (54, bytes2 [2]); AssertEquals (114, bytes2 [3]); AssertEquals (134, bytes2 [4]); AssertEquals (184, bytes2 [5]); AssertEquals (0, bytes2 [6]); xtr.Close (); xtr = new XmlTextReader (base64, XmlNodeType.Document, null); bytes2 = new byte [10]; xtr.Read (); // root xtr.Read (); // foo this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty, "foo", String.Empty, String.Empty, 0); // Read less than 4 (i.e. one Base64 block) AssertEquals (1, xtr.ReadBase64 (bytes2, 0, 1)); this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty, "foo", String.Empty, String.Empty, 0); AssertEquals (4, bytes2 [0]); AssertEquals (5, xtr.ReadBase64 (bytes2, 0, 10)); this.AssertNodeValues (xtr, XmlNodeType.EndElement, 0, false, "root", String.Empty, "root", String.Empty, String.Empty, 0); Assert (!xtr.Read ()); AssertEquals (14, bytes2 [0]); AssertEquals (54, bytes2 [1]); AssertEquals (114, bytes2 [2]); AssertEquals (134, bytes2 [3]); AssertEquals (184, bytes2 [4]); AssertEquals (0, bytes2 [5]); while (!xtr.EOF) xtr.Read (); xtr.Close (); } [Test] public void ReadBase64Test2 () { string xml = ""; XmlTextReader xtr = new XmlTextReader (new StringReader (xml)); xtr.Read (); byte [] data = new byte [1]; xtr.ReadBase64 (data, 0, 1); while (!xtr.EOF) xtr.Read (); xml = ""; xtr = new XmlTextReader (new StringReader (xml)); xtr.Read (); xtr.ReadBase64 (data, 0, 1); while (!xtr.EOF) xtr.Read (); } [Test] [ExpectedException (typeof (XmlException))] public void CheckNamespaceValidity1 () { string xml = ""; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Read (); } [Test] [ExpectedException (typeof (XmlException))] public void CheckNamespaceValidity2 () { string xml = ""; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Read (); } [Test] public void NamespaceFalse () { string xml = ""; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Namespaces = false; xtr.Read (); } [Test] public void NormalizationLineEnd () { string s = "One\rtwo\nthree\r\nfour"; string t = ""; XmlTextReader r = new XmlTextReader (new StringReader (t)); r.WhitespaceHandling = WhitespaceHandling.Significant; r.Normalization = true; s = r.ReadElementString ("hi"); AssertEquals ("One\ntwo\nthree\nfour", s); } [Test] public void NormalizationAttributes () { // does not normalize attribute values. StringReader sr = new StringReader ("]>"); XmlTextReader xtr = new XmlTextReader (sr); xtr.Normalization = true; xtr.Read (); xtr.Read (); xtr.MoveToFirstAttribute (); AssertEquals (" value ", xtr.Value); } [Test] public void CloseIsNotAlwaysEOF () { // See bug #63505 XmlTextReader xtr = new XmlTextReader ( new StringReader ("")); xtr.Close (); Assert (!xtr.EOF); // Close() != EOF } [Test] public void CloseIsNotAlwaysEOF2 () { XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/simple.xml"); xtr.Close (); Assert (!xtr.EOF); // Close() != EOF } [Test] public void IXmlLineInfo () { // See bug #63507 XmlTextReader aux = new XmlTextReader ( new StringReader ("")); AssertEquals (0, aux.LineNumber); AssertEquals (0, aux.LinePosition); aux.MoveToContent(); AssertEquals (1, aux.LineNumber); AssertEquals (2, aux.LinePosition); aux.Read(); AssertEquals (1, aux.LineNumber); AssertEquals (7, aux.LinePosition); aux.ReadOuterXml(); AssertEquals (1, aux.LineNumber); AssertEquals (22, aux.LinePosition); aux.ReadInnerXml(); AssertEquals (1, aux.LineNumber); AssertEquals (34, aux.LinePosition); aux.Read(); AssertEquals (1, aux.LineNumber); AssertEquals (38, aux.LinePosition); aux.Close(); AssertEquals (0, aux.LineNumber); AssertEquals (0, aux.LinePosition); } [Test] public void AttributeNormalizationWrapped () { // When XmlValidatingReader there used to be a problem. string xml = ""; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Normalization = true; XmlValidatingReader xvr = new XmlValidatingReader (xtr); xvr.Read (); xvr.MoveToFirstAttribute (); AssertEquals (" value string", xvr.Value); } #if NET_2_0 [Test] [ExpectedException (typeof (XmlException))] public void ProhibitDtd () { XmlTextReader xtr = new XmlTextReader ("", XmlNodeType.Document, null); xtr.ProhibitDtd = true; while (!xtr.EOF) xtr.Read (); } [Test] public void Settings () { XmlTextReader xtr = new XmlTextReader ("", XmlNodeType.Document, null); AssertNull (xtr.Settings); } // Copied from XmlValidatingReaderTests.cs [Test] public void ExpandEntity () { string intSubset = ""; string dtd = ""; string xml = dtd + "&ent;"; 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 = ""; string dtd = ""; string xml = dtd + ""; 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 ("&rnt;", 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 ("&rnt;", 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 = ""; string ent2 = "'>]>"; string dtd = "" + ent1 + ent2; string xml = dtd + "&ent;&ent2;"; 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 = ""; string ent2 = "'>]>"; string dtd = "" + ent1 + ent2; string xml = dtd + "&ent3;&ent2;"; 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 [Test] public void SurrogatePair () { string xml = @" '> %a; ]> &ref;"; XmlValidatingReader r = new XmlValidatingReader (xml, XmlNodeType.Document, null); r.Read (); r.Read (); r.Read (); r.Read (); AssertEquals ("#1", 0xf090, (int) r.Value [0]); AssertEquals ("#1", 0x8080, (int) r.Value [1]); } [Test] [ExpectedException (typeof (XmlException))] public void EntityDeclarationNotWF () { string xml = @" '> ]> &e; "; XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); xtr.Read (); } [Test] // bug #76102 public void SurrogateAtReaderByteCache () { XmlTextReader xtr = null; try { xtr = new XmlTextReader (File.OpenText ("Test/XmlFiles/76102.xml")); while (!xtr.EOF) xtr.Read (); } finally { if (xtr != null) xtr.Close (); } } [Test] // bug #76247 public void SurrogateRoundtrip () { byte [] data = new byte [] {0x3c, 0x61, 0x3e, 0xf0, 0xa8, 0xa7, 0x80, 0x3c, 0x2f, 0x61, 0x3e}; XmlTextReader xtr = new XmlTextReader ( new MemoryStream (data)); xtr.Read (); string line = xtr.ReadString (); int [] arr = new int [line.Length]; for (int i = 0; i < line.Length; i++) arr [i] = (int) line [i]; AssertEquals (new int [] {0xd862, 0xddc0}, arr); } [Test] [ExpectedException (typeof (XmlException))] public void RejectEmptyNamespaceWithNonEmptyPrefix () { XmlTextReader xtr = new XmlTextReader ("", XmlNodeType.Document, null); xtr.Read (); } [Test] public void EncodingProperty () { string xml = "\n\n\nvalue\n\n"; XmlTextReader xr = new XmlTextReader (xml, XmlNodeType.Document, null); AssertNull ("#1", xr.Encoding); xr.Read (); AssertEquals ("#2", Encoding.Unicode, xr.Encoding); } [Test] public void WhitespaceHandlingSignificant () { XmlTextReader xtr = new XmlTextReader (" ", XmlNodeType.Document, null); xtr.WhitespaceHandling = WhitespaceHandling.Significant; xtr.Read (); // root xtr.Read (); // child. skip whitespaces AssertEquals ("#1", XmlNodeType.Element, xtr.NodeType); xtr.Read (); // significant whitespaces AssertEquals ("#2", XmlNodeType.SignificantWhitespace, xtr.NodeType); xtr.Read (); AssertEquals ("#3", "descendant", xtr.LocalName); xtr.Read (); // end of descendant. skip whitespaces AssertEquals ("#4", XmlNodeType.EndElement, xtr.NodeType); xtr.Read (); // significant whitespaces AssertEquals ("#5", XmlNodeType.SignificantWhitespace, xtr.NodeType); xtr.Read (); // end of child xtr.Read (); // child xtr.Read (); // end of child. skip whitespaces AssertEquals ("#6", XmlNodeType.EndElement, xtr.NodeType); xtr.Read (); // end of root. skip whitespaces AssertEquals ("#7", XmlNodeType.EndElement, xtr.NodeType); } [Test] public void WhitespaceHandlingNone () { XmlTextReader xtr = new XmlTextReader (" ", XmlNodeType.Document, null); xtr.WhitespaceHandling = WhitespaceHandling.None; xtr.Read (); // root xtr.Read (); // child. skip whitespaces AssertEquals ("#1", XmlNodeType.Element, xtr.NodeType); xtr.Read (); // descendant. skip significant whitespaces AssertEquals ("#2", "descendant", xtr.LocalName); xtr.Read (); // end of descendant. skip whitespaces AssertEquals ("#3", XmlNodeType.EndElement, xtr.NodeType); xtr.Read (); // end of child. skip significant whitespaces xtr.Read (); // child xtr.Read (); // end of child. skip whitespaces AssertEquals ("#6", XmlNodeType.EndElement, xtr.NodeType); xtr.Read (); // end of root. skip whitespaces AssertEquals ("#7", XmlNodeType.EndElement, xtr.NodeType); } } }