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 : Assertion
27 public Stream CreateStream (string xml)
29 return new MemoryStream (Encoding.UTF8.GetBytes (xml));
33 public void DefaultValue ()
35 XmlReaderSettings s = new XmlReaderSettings ();
36 AssertEquals ("CheckCharacters", true, s.CheckCharacters);
37 AssertEquals ("ConformanceLevel", ConformanceLevel.Document,
39 AssertEquals ("ValidationType", ValidationType.None, s.ValidationType);
40 AssertEquals ("IgnoreComments", false, s.IgnoreComments);
41 Assert ("ProcessInlineSchema", 0 == (s.ValidationFlags &
42 ValidationFlags.ProcessInlineSchema));
43 AssertEquals ("IgnorePI", false, s.IgnoreProcessingInstructions);
44 Assert ("ProcessSchemaLocation", 0 == (s.ValidationFlags &
45 ValidationFlags.ProcessSchemaLocation));
46 Assert ("ReportValidationWarnings", 0 == (s.ValidationFlags &
47 ValidationFlags.ReportValidationWarnings));
48 Assert ("ProcessIdentityConstraints", 0 != (s.ValidationFlags &
49 ValidationFlags.ProcessIdentityConstraints));
50 // No one should use this flag BTW if someone wants
51 // code to be conformant to W3C XML Schema standard.
52 Assert ("AllowXmlAttributes", 0 != (s.ValidationFlags &
53 ValidationFlags.AllowXmlAttributes));
54 AssertEquals ("IgnoreWhitespace", false, s.IgnoreWhitespace);
55 AssertEquals ("LineNumberOffset", 0, s.LineNumberOffset);
56 AssertEquals ("LinePositionOffset", 0, s.LinePositionOffset);
57 AssertNull ("NameTable", s.NameTable);
58 AssertEquals ("Schemas.Count", 0, s.Schemas.Count);
62 public void SetSchemas ()
64 XmlReaderSettings s = new XmlReaderSettings ();
65 s.Schemas = new XmlSchemaSet ();
69 public void SetSchemasNull ()
71 XmlReaderSettings s = new XmlReaderSettings ();
76 public void CloseInput ()
78 StringReader sr = new StringReader ("<root/><root/>");
79 XmlReader xtr = XmlReader.Create (sr); // default false
82 // It should without error, unlike usual XmlTextReader.
87 public void CreateAndNormalization ()
89 StringReader sr = new StringReader (
90 "<root attr=' value '>test\rstring</root>");
91 XmlReaderSettings settings = new XmlReaderSettings ();
92 settings.CheckCharacters = false;
93 XmlReader xtr = XmlReader.Create (
96 xtr.MoveToFirstAttribute ();
97 AssertEquals (" value ", xtr.Value);
99 // Text string is normalized
100 AssertEquals ("test\nstring", xtr.Value);
104 public void CheckCharactersAndNormalization ()
106 // It should *not* raise an error (even Normalization
107 // is set by default).
108 StringReader sr = new StringReader (
109 "<root attr='�'>�</root>");
110 XmlReaderSettings settings = new XmlReaderSettings ();
111 settings.CheckCharacters = false;
112 XmlReader xtr = XmlReader.Create (
114 // After creation, changes on source XmlReaderSettings
116 settings.CheckCharacters = false;
118 xtr.MoveToFirstAttribute ();
119 AssertEquals ("\0", xtr.Value);
121 AssertEquals ("\0", xtr.Value);
124 // Hmm, does it really make sense? :-/
126 public void CheckCharactersForNonTextReader ()
128 // It should *not* raise an error (even Normalization
129 // is set by default).
130 StringReader sr = new StringReader (
131 "<root attr='�'>�</root>");
132 XmlReaderSettings settings = new XmlReaderSettings ();
133 settings.CheckCharacters = false;
134 XmlReader xr = XmlReader.Create (
137 // Enable character checking for XmlNodeReader.
138 settings.CheckCharacters = true;
139 XmlDocument doc = new XmlDocument ();
141 xr = XmlReader.Create (new XmlNodeReader (doc), settings);
143 // But it won't work against XmlNodeReader.
145 xr.MoveToFirstAttribute ();
146 AssertEquals ("\0", xr.Value);
148 AssertEquals ("\0", xr.Value);
152 public void CreateAndSettings ()
154 AssertNotNull (XmlReader.Create (CreateStream ("<xml/>")).Settings);
155 AssertNotNull (XmlReader.Create ("Test/XmlFiles/simple.xml").Settings);
159 public void CreateAndNameTable ()
161 // By default NameTable is null, but some of
162 // XmlReader.Create() should not result in null
163 // reference exceptions.
164 XmlReaderSettings s = new XmlReaderSettings ();
165 XmlReader.Create (new StringReader ("<root/>"), s, String.Empty)
167 XmlReader.Create (new StringReader ("<root/>"), s, (XmlParserContext) null)
169 XmlReader.Create (CreateStream ("<root/>"), s, String.Empty)
171 XmlReader.Create (CreateStream ("<root/>"), s, (XmlParserContext) null)
175 #region ConformanceLevel
178 public void InferConformanceLevel ()
180 XmlReader xr = XmlReader.Create (new StringReader ("<foo/><bar/>"));
182 AssertType.AreEqual (ConformanceLevel.Document, xr.Settings.ConformanceLevel);
186 public void InferWrappedReaderConformance ()
188 // Actually this test is weird, since XmlTextReader
189 // instance here does not have XmlReaderSettings.
190 XmlReaderSettings settings = new XmlReaderSettings ();
191 settings.ConformanceLevel = ConformanceLevel.Auto;
192 XmlReader xr = XmlReader.Create (
193 XmlReader.Create (new StringReader ("<foo/><bar/>")),
195 AssertType.AreEqual (ConformanceLevel.Document, xr.Settings.ConformanceLevel);
199 [ExpectedException (typeof (XmlException))]
200 public void CreateConformanceDocument ()
202 XmlReaderSettings s = new XmlReaderSettings ();
203 s.ConformanceLevel = ConformanceLevel.Document;
204 XmlReader xr = XmlReader.Create (new StringReader (
211 public void CreateConformanceFragment ()
213 XmlReaderSettings settings = new XmlReaderSettings ();
214 settings.ConformanceLevel = ConformanceLevel.Fragment;
215 XmlReader xr = XmlReader.Create (new StringReader (
216 "<foo/><bar/>"), settings);
222 [ExpectedException (typeof (InvalidOperationException))]
223 public void CreateConformanceChangeToDocument ()
225 // Actually this test is weird, since XmlTextReader
226 // instance here does not have XmlReaderSettings.
227 XmlReaderSettings settings = new XmlReaderSettings ();
228 settings.ConformanceLevel = ConformanceLevel.Document;
229 XmlReader xr = XmlReader.Create (
230 new XmlTextReader ("<foo/><bar/>", XmlNodeType.Element, null),
237 [ExpectedException (typeof (InvalidOperationException))]
238 public void CreateConformanceChangeToFragment ()
240 // Actually this test is weird, since XmlTextReader
241 // instance here does not have XmlReaderSettings.
242 XmlReaderSettings settings = new XmlReaderSettings ();
243 settings.ConformanceLevel = ConformanceLevel.Fragment;
244 XmlReader xr = XmlReader.Create (
245 new XmlTextReader ("<foo/>", XmlNodeType.Document, null),
252 public void CreateConformanceLevelExplicitAuto ()
254 // Even if we specify ConformanceLevel.Auto explicitly,
255 // XmlTextReader's ConformanceLevel becomes .Document.
256 XmlReaderSettings settings = new XmlReaderSettings ();
257 settings.ConformanceLevel = ConformanceLevel.Auto;
258 XmlReader xr = XmlReader.Create (
259 new XmlTextReader ("<foo/>", XmlNodeType.Document, null),
261 AssertType.AreEqual (ConformanceLevel.Document, xr.Settings.ConformanceLevel);
265 public void CreateKeepConformance ()
267 XmlReaderSettings settings;
270 // Fragment -> Fragment
271 settings = new XmlReaderSettings ();
272 settings.ConformanceLevel = ConformanceLevel.Fragment;
273 xr = XmlReader.Create (
274 XmlReader.Create (new StringReader ("<foo/>"), settings),
279 // Document -> Document
280 settings.ConformanceLevel = ConformanceLevel.Document;
281 xr = XmlReader.Create (
282 XmlReader.Create (new StringReader ("<foo/>"), settings),
291 public void CreateClonesSettings ()
293 XmlReaderSettings settings = new XmlReaderSettings ();
294 XmlReader xr = XmlReader.Create (new StringReader ("<doc/>"), settings);
295 AssertType.IsFalse (Object.ReferenceEquals (settings, xr.Settings));
299 public void CreateValidatorFromNonIXmlNamespaceResolver ()
301 XmlReaderSettings settings = new XmlReaderSettings ();
302 settings.Schemas.Add (null, "Test/XmlFiles/xsd/xml.xsd");
303 settings.ValidationType = ValidationType.Schema;
304 XmlReader xr = XmlReader.Create (new StringReader ("<root/>"));
305 XmlReader dr = new Commons.Xml.XmlDefaultReader (xr);
306 // XmlDefaultReader does not implement IXmlNamespaceResolver
307 // but don't reject because of that fact.
308 XmlReader r = XmlReader.Create (dr, settings);
312 public void NullResolver ()
314 XmlReaderSettings settings = new XmlReaderSettings ();
315 settings.XmlResolver = null;
316 using (XmlReader xr = XmlReader.Create ("Test/XmlFiles/simple.xml", settings)) {
322 class ThrowExceptionResolver : XmlResolver
324 public override ICredentials Credentials {
328 public override object GetEntity (Uri uri, string type, Type expected)
330 throw new ApplicationException ("error");
335 [ExpectedException (typeof (ApplicationException))]
336 public void CustomResolverUsedForXmlStream ()
338 XmlReaderSettings settings = new XmlReaderSettings ();
339 settings.XmlResolver = new ThrowExceptionResolver ();
340 using (XmlReader xr = XmlReader.Create ("Test/XmlFiles/simple.xml", settings)) {
347 [ExpectedException (typeof (ApplicationException))]
348 public void ValidationEventHandler ()
350 XmlReaderSettings settings = new XmlReaderSettings ();
351 settings.Schemas.Add (new XmlSchema ());
352 settings.ValidationType = ValidationType.Schema;
353 settings.ValidationEventHandler += delegate (object o, ValidationEventArgs e) {
354 throw new ApplicationException ();
356 XmlReader r = XmlReader.Create (
357 new StringReader ("<root/>"), settings);
363 [ExpectedException (typeof (XmlSchemaValidationException))]
364 // make sure that Create(string,XmlReaderSettings) returns
365 // validating XmlReader.
366 public void CreateFromUrlWithValidation ()
368 XmlReaderSettings settings = new XmlReaderSettings();
369 XmlSchema xs = new XmlSchema ();
370 settings.Schemas.Add (xs);
371 settings.ValidationType = ValidationType.Schema;
372 using (XmlReader r = XmlReader.Create ("Test/XmlFiles/simple.xml", settings)) {
378 public void ResolveEntities () // bug #81000
380 XmlReaderSettings s = new XmlReaderSettings ();
381 s.ProhibitDtd = false;
382 s.XmlResolver = new XmlResolver81000 ();
384 string xml = "<!DOCTYPE root SYSTEM \"foo.dtd\"><root>α</root>";
385 XmlReader r = XmlReader.Create (new StringReader (xml), s);
389 // not EntityReference but Text
390 AssertEquals ("#1", XmlNodeType.Text, r.NodeType);
392 AssertEquals ("#2", XmlNodeType.EndElement, r.NodeType);
395 public class XmlResolver81000 : XmlResolver
397 public override ICredentials Credentials { set {} }
399 public override object GetEntity (Uri uri, string role, Type type)
401 return new MemoryStream (Encoding.UTF8.GetBytes ("<!ENTITY alpha \"bravo\">"));
406 public void IgnoreComments () // Bug #82062.
408 string xml = "<root><!-- ignore --></root>";
409 XmlReaderSettings s = new XmlReaderSettings ();
410 s.IgnoreComments = true;
411 XmlReader r = XmlReader.Create (new StringReader (xml), s);
414 AssertEquals (String.Empty, r.Value); // should not be at the comment node.
418 public void CreateSetsBaseUri () // bug #392385
420 XmlReader r = XmlReader.Create (new StringReader ("<x/>"), new XmlReaderSettings (), "urn:foo");
421 AssertEquals ("urn:foo", r.BaseURI);