2 // System.Xml.XmlReaderSettingsTests.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
16 using System.Xml.Schema;
17 using NUnit.Framework;
19 using ValidationFlags = System.Xml.Schema.XmlSchemaValidationFlags;
20 using AssertType = NUnit.Framework.Assert;
22 namespace MonoTests.System.Xml
25 public class XmlReaderSettingsTests
27 public Stream CreateStream (string xml)
29 return new MemoryStream (Encoding.UTF8.GetBytes (xml));
33 public void DefaultValue ()
35 XmlReaderSettings s = new XmlReaderSettings ();
36 Assert.AreEqual (true, s.CheckCharacters, "CheckCharacters");
37 Assert.AreEqual (ConformanceLevel.Document, s.ConformanceLevel, "ConformanceLevel");
38 Assert.AreEqual (ValidationType.None, s.ValidationType, "ValidationType");
39 Assert.AreEqual (false, s.IgnoreComments, "IgnoreComments");
40 Assert.IsTrue (0 == (s.ValidationFlags &
41 ValidationFlags.ProcessInlineSchema), "ProcessInlineSchema");
42 Assert.AreEqual (false, s.IgnoreProcessingInstructions, "IgnorePI");
43 Assert.IsTrue (0 == (s.ValidationFlags &
44 ValidationFlags.ProcessSchemaLocation), "ProcessSchemaLocation");
45 Assert.IsTrue (0 == (s.ValidationFlags &
46 ValidationFlags.ReportValidationWarnings), "ReportValidationWarnings");
47 Assert.IsTrue (0 != (s.ValidationFlags &
48 ValidationFlags.ProcessIdentityConstraints), "ProcessIdentityConstraints");
49 // No one should use this flag BTW if someone wants
50 // code to be conformant to W3C XML Schema standard.
51 Assert.IsTrue (0 != (s.ValidationFlags &
52 ValidationFlags.AllowXmlAttributes), "AllowXmlAttributes");
53 Assert.AreEqual (false, s.IgnoreWhitespace, "IgnoreWhitespace");
54 Assert.AreEqual (0, s.LineNumberOffset, "LineNumberOffset");
55 Assert.AreEqual (0, s.LinePositionOffset, "LinePositionOffset");
56 Assert.IsNull (s.NameTable, "NameTable");
57 Assert.AreEqual (0, s.Schemas.Count, "Schemas.Count");
61 public void SetSchemas ()
63 XmlReaderSettings s = new XmlReaderSettings ();
64 s.Schemas = new XmlSchemaSet ();
68 public void SetSchemasNull ()
70 XmlReaderSettings s = new XmlReaderSettings ();
75 public void CloseInput ()
77 StringReader sr = new StringReader ("<root/><root/>");
78 XmlReader xtr = XmlReader.Create (sr); // default false
81 // It should without error, unlike usual XmlTextReader.
86 public void CreateAndNormalization ()
88 StringReader sr = new StringReader (
89 "<root attr=' value '>test\rstring</root>");
90 XmlReaderSettings settings = new XmlReaderSettings ();
91 settings.CheckCharacters = false;
92 XmlReader xtr = XmlReader.Create (
95 xtr.MoveToFirstAttribute ();
96 Assert.AreEqual (" value ", xtr.Value);
98 // Text string is normalized
99 Assert.AreEqual ("test\nstring", xtr.Value);
103 public void CheckCharactersAndNormalization ()
105 // It should *not* raise an error (even Normalization
106 // is set by default).
107 StringReader sr = new StringReader (
108 "<root attr='�'>�</root>");
109 XmlReaderSettings settings = new XmlReaderSettings ();
110 settings.CheckCharacters = false;
111 XmlReader xtr = XmlReader.Create (
113 // After creation, changes on source XmlReaderSettings
115 settings.CheckCharacters = false;
117 xtr.MoveToFirstAttribute ();
118 Assert.AreEqual ("\0", xtr.Value);
120 Assert.AreEqual ("\0", xtr.Value);
123 // Hmm, does it really make sense? :-/
125 public void CheckCharactersForNonTextReader ()
127 // It should *not* raise an error (even Normalization
128 // is set by default).
129 StringReader sr = new StringReader (
130 "<root attr='�'>�</root>");
131 XmlReaderSettings settings = new XmlReaderSettings ();
132 settings.CheckCharacters = false;
133 XmlReader xr = XmlReader.Create (
136 // Enable character checking for XmlNodeReader.
137 settings.CheckCharacters = true;
138 XmlDocument doc = new XmlDocument ();
140 xr = XmlReader.Create (new XmlNodeReader (doc), settings);
142 // But it won't work against XmlNodeReader.
144 xr.MoveToFirstAttribute ();
145 Assert.AreEqual ("\0", xr.Value);
147 Assert.AreEqual ("\0", xr.Value);
151 public void CreateAndSettings ()
153 Assert.IsNotNull (XmlReader.Create (CreateStream ("<xml/>")).Settings);
154 Assert.IsNotNull (XmlReader.Create ("Test/XmlFiles/simple.xml").Settings);
158 public void CreateAndNameTable ()
160 // By default NameTable is null, but some of
161 // XmlReader.Create() should not result in null
162 // reference exceptions.
163 XmlReaderSettings s = new XmlReaderSettings ();
164 XmlReader.Create (new StringReader ("<root/>"), s, String.Empty)
166 XmlReader.Create (new StringReader ("<root/>"), s, (XmlParserContext) null)
168 XmlReader.Create (CreateStream ("<root/>"), s, String.Empty)
170 XmlReader.Create (CreateStream ("<root/>"), s, (XmlParserContext) null)
174 #region ConformanceLevel
177 public void InferConformanceLevel ()
179 XmlReader xr = XmlReader.Create (new StringReader ("<foo/><bar/>"));
181 AssertType.AreEqual (ConformanceLevel.Document, xr.Settings.ConformanceLevel);
185 public void InferWrappedReaderConformance ()
187 // Actually this test is weird, since XmlTextReader
188 // instance here does not have XmlReaderSettings.
189 XmlReaderSettings settings = new XmlReaderSettings ();
190 settings.ConformanceLevel = ConformanceLevel.Auto;
191 XmlReader xr = XmlReader.Create (
192 XmlReader.Create (new StringReader ("<foo/><bar/>")),
194 AssertType.AreEqual (ConformanceLevel.Document, xr.Settings.ConformanceLevel);
198 [ExpectedException (typeof (XmlException))]
199 public void CreateConformanceDocument ()
201 XmlReaderSettings s = new XmlReaderSettings ();
202 s.ConformanceLevel = ConformanceLevel.Document;
203 XmlReader xr = XmlReader.Create (new StringReader (
210 public void CreateConformanceFragment ()
212 XmlReaderSettings settings = new XmlReaderSettings ();
213 settings.ConformanceLevel = ConformanceLevel.Fragment;
214 XmlReader xr = XmlReader.Create (new StringReader (
215 "<foo/><bar/>"), settings);
221 [ExpectedException (typeof (InvalidOperationException))]
222 public void CreateConformanceChangeToDocument ()
224 // Actually this test is weird, since XmlTextReader
225 // instance here does not have XmlReaderSettings.
226 XmlReaderSettings settings = new XmlReaderSettings ();
227 settings.ConformanceLevel = ConformanceLevel.Document;
228 XmlReader xr = XmlReader.Create (
229 new XmlTextReader ("<foo/><bar/>", XmlNodeType.Element, null),
236 [ExpectedException (typeof (InvalidOperationException))]
237 public void CreateConformanceChangeToFragment ()
239 // Actually this test is weird, since XmlTextReader
240 // instance here does not have XmlReaderSettings.
241 XmlReaderSettings settings = new XmlReaderSettings ();
242 settings.ConformanceLevel = ConformanceLevel.Fragment;
243 XmlReader xr = XmlReader.Create (
244 new XmlTextReader ("<foo/>", XmlNodeType.Document, null),
251 public void CreateConformanceLevelExplicitAuto ()
253 // Even if we specify ConformanceLevel.Auto explicitly,
254 // XmlTextReader's ConformanceLevel becomes .Document.
255 XmlReaderSettings settings = new XmlReaderSettings ();
256 settings.ConformanceLevel = ConformanceLevel.Auto;
257 XmlReader xr = XmlReader.Create (
258 new XmlTextReader ("<foo/>", XmlNodeType.Document, null),
260 AssertType.AreEqual (ConformanceLevel.Document, xr.Settings.ConformanceLevel);
264 public void CreateKeepConformance ()
266 XmlReaderSettings settings;
269 // Fragment -> Fragment
270 settings = new XmlReaderSettings ();
271 settings.ConformanceLevel = ConformanceLevel.Fragment;
272 xr = XmlReader.Create (
273 XmlReader.Create (new StringReader ("<foo/>"), settings),
278 // Document -> Document
279 settings.ConformanceLevel = ConformanceLevel.Document;
280 xr = XmlReader.Create (
281 XmlReader.Create (new StringReader ("<foo/>"), settings),
290 public void CreateClonesSettings ()
292 XmlReaderSettings settings = new XmlReaderSettings ();
293 XmlReader xr = XmlReader.Create (new StringReader ("<doc/>"), settings);
294 AssertType.IsFalse (Object.ReferenceEquals (settings, xr.Settings));
298 public void CreateValidatorFromNonIXmlNamespaceResolver ()
300 XmlReaderSettings settings = new XmlReaderSettings ();
301 settings.Schemas.Add (null, "Test/XmlFiles/xsd/xml.xsd");
302 settings.ValidationType = ValidationType.Schema;
303 XmlReader xr = XmlReader.Create (new StringReader ("<root/>"));
304 XmlReader dr = new Commons.Xml.XmlDefaultReader (xr);
305 // XmlDefaultReader does not implement IXmlNamespaceResolver
306 // but don't reject because of that fact.
307 XmlReader r = XmlReader.Create (dr, settings);
311 public void NullResolver ()
313 XmlReaderSettings settings = new XmlReaderSettings ();
314 settings.XmlResolver = null;
315 using (XmlReader xr = XmlReader.Create ("Test/XmlFiles/simple.xml", settings)) {
321 class ThrowExceptionResolver : XmlResolver
323 public override ICredentials Credentials {
327 public override object GetEntity (Uri uri, string type, Type expected)
329 throw new ApplicationException ("error");
334 [ExpectedException (typeof (ApplicationException))]
335 public void CustomResolverUsedForXmlStream ()
337 XmlReaderSettings settings = new XmlReaderSettings ();
338 settings.XmlResolver = new ThrowExceptionResolver ();
339 using (XmlReader xr = XmlReader.Create ("Test/XmlFiles/simple.xml", settings)) {
346 [ExpectedException (typeof (ApplicationException))]
347 public void ValidationEventHandler ()
349 XmlReaderSettings settings = new XmlReaderSettings ();
350 settings.Schemas.Add (new XmlSchema ());
351 settings.ValidationType = ValidationType.Schema;
352 settings.ValidationEventHandler += delegate (object o, ValidationEventArgs e) {
353 throw new ApplicationException ();
355 XmlReader r = XmlReader.Create (
356 new StringReader ("<root/>"), settings);
362 [ExpectedException (typeof (XmlSchemaValidationException))]
363 // make sure that Create(string,XmlReaderSettings) returns
364 // validating XmlReader.
365 public void CreateFromUrlWithValidation ()
367 XmlReaderSettings settings = new XmlReaderSettings();
368 XmlSchema xs = new XmlSchema ();
369 settings.Schemas.Add (xs);
370 settings.ValidationType = ValidationType.Schema;
371 using (XmlReader r = XmlReader.Create ("Test/XmlFiles/simple.xml", settings)) {
377 public void ResolveEntities () // bug #81000
379 XmlReaderSettings s = new XmlReaderSettings ();
380 s.ProhibitDtd = false;
381 s.XmlResolver = new XmlResolver81000 ();
383 string xml = "<!DOCTYPE root SYSTEM \"foo.dtd\"><root>α</root>";
384 XmlReader r = XmlReader.Create (new StringReader (xml), s);
388 // not EntityReference but Text
389 Assert.AreEqual (XmlNodeType.Text, r.NodeType, "#1");
391 Assert.AreEqual (XmlNodeType.EndElement, r.NodeType, "#2");
394 public class XmlResolver81000 : XmlResolver
396 public override ICredentials Credentials { set {} }
398 public override object GetEntity (Uri uri, string role, Type type)
400 return new MemoryStream (Encoding.UTF8.GetBytes ("<!ENTITY alpha \"bravo\">"));
405 public void IgnoreComments () // Bug #82062.
407 string xml = "<root><!-- ignore --></root>";
408 XmlReaderSettings s = new XmlReaderSettings ();
409 s.IgnoreComments = true;
410 XmlReader r = XmlReader.Create (new StringReader (xml), s);
413 Assert.AreEqual (String.Empty, r.Value); // should not be at the comment node.
417 public void CreateSetsBaseUri () // bug #392385
419 XmlReader r = XmlReader.Create (new StringReader ("<x/>"), new XmlReaderSettings (), "urn:foo");
420 Assert.AreEqual ("urn:foo", r.BaseURI);
425 [ExpectedException (typeof (InvalidOperationException))]
426 public void ReadonlyAsync ()
428 var s = new XmlReaderSettings ();
429 var r = XmlReader.Create (new StringReader ("<root/>"), s);
430 r.Settings.Async = true;
434 public void AsyncPropagation ()
436 var s = new XmlReaderSettings ();
438 var r = XmlReader.Create (new StringReader ("<root/>"), s);
441 Assert.IsTrue (c.Async);
443 Assert.IsFalse (c.Async);
445 var r2 = XmlReader.Create (r, c);
446 Assert.IsTrue (r2.Settings.Async);