// it used to be regarded as MS bug but it was not really.
public void TestPreserveEntityNotOnDotNet ()
{
string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
string dtd = "<!DOCTYPE root [" + intSubset + "]>";
string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";
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);
}