2 // ExtensionsTest.cs - NUnit Test Cases for Extensions.cs class under
3 // System.Xml.Schema namespace found in System.Xml.Linq assembly
4 // (System.Xml.Linq.dll)
7 // Stefan Prutianu (stefanprutianu@yahoo.com)
14 using NUnit.Framework;
18 using Network = System.Net;
19 using System.Xml.Linq;
20 using System.Xml.Schema;
21 using System.Collections.Generic;
22 using ExtensionsClass = System.Xml.Schema.Extensions;
24 namespace MonoTests.System.Xml.Schema
28 public class ExtensionsTest {
30 public static String xsdString;
31 public static XmlSchemaSet schemaSet;
32 public static String xmlString;
33 public static XDocument xmlDocument;
34 public static bool validationSucceded;
36 // initialize values for tests
41 xsdString = @"<?xml version='1.0'?>
42 <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
43 <xs:element name='note'>
46 <xs:element name='to' type='xs:string'/>
47 <xs:element name='from' type='xs:string'/>
48 <xs:element name='heading' type='xs:string'/>
49 <xs:element name='ps' type='xs:string'
50 maxOccurs='1' minOccurs = '0' default='Bye!'/>
51 <xs:element name='body'>
53 <xs:restriction base='xs:string'>
54 <xs:minLength value='5'/>
55 <xs:maxLength value='30'/>
60 <xs:attribute name='subject' type='xs:string'
62 <xs:attribute name='date' type='xs:date'
67 schemaSet = new XmlSchemaSet ();
68 schemaSet.Add ("", XmlReader.Create (new StringReader (xsdString)));
70 xmlString = @"<?xml version='1.0'?>
71 <note date ='2010-05-26'>
74 <heading>Reminder</heading>
75 <body>Don't forget to call me!</body>
77 xmlDocument = XDocument.Load (new StringReader (xmlString));
78 validationSucceded = false;
82 * Use this method to load the above data from disk
83 * Comment the above code when using this method.
84 * Also the arguments for the folowing tests: XAttributeSuccessValidate
85 * XAttributeFailValidate, XAttributeThrowExceptionValidate, XElementSuccessValidate
86 * XElementFailValidate,XElementThrowExceptionValidate, XAttributeGetSchemaInfo
87 * XElementGetSchemaInfo may need to be changed.
89 //LoadOutsideDocuments ("c:\\note.xsd", "c:\\note.xml");
92 // Use this method to load data from disk
93 public static void LoadOutsideDocuments (String xsdDocumentPath, String xmlDocumentPath)
95 // Create a resolver with default credentials.
96 XmlUrlResolver resolver = new XmlUrlResolver ();
97 resolver.Credentials = Network.CredentialCache.DefaultCredentials;
98 // Set the reader settings object to use the resolver.
99 XmlReaderSettings settings = new XmlReaderSettings ();
100 settings.XmlResolver = resolver;
102 // Create the XmlReader object.
103 XmlReader reader = XmlReader.Create (xsdDocumentPath, settings);
105 schemaSet = new XmlSchemaSet ();
106 schemaSet.Add ("", reader);
108 reader = XmlReader.Create (xmlDocumentPath, settings);
109 xmlDocument = XDocument.Load (reader);
110 validationSucceded = false;
114 // this gets called when a validation error occurs
115 public void TestValidationHandler (object sender, ValidationEventArgs e)
117 validationSucceded = false;
121 public void Cleanup ()
127 validationSucceded = false;
131 // test succesfull validation
133 public void XDocumentSuccessValidate ()
135 validationSucceded = true;
136 ExtensionsClass.Validate (xmlDocument, schemaSet,
137 new ValidationEventHandler (TestValidationHandler));
138 Assert.AreEqual (true, validationSucceded, "XDocumentSuccessValidate");
141 // test failed validation
143 public void XDocumentFailValidate ()
145 String elementName = "AlteringElementName";
146 object elementValue = "AlteringElementValue";
148 // alter XML document to invalidate
149 XElement newElement = new XElement (elementName, elementValue);
150 xmlDocument.Root.Add (newElement);
152 validationSucceded = true;
153 ExtensionsClass.Validate (xmlDocument, schemaSet,
154 new ValidationEventHandler (TestValidationHandler));
155 Assert.AreEqual (false, validationSucceded, "XDocumentFailValidate");
159 * test if exception is thrown when xml document does not
160 * conform to the xml schema
163 [ExpectedException (typeof (XmlSchemaValidationException))]
164 public void XDocumentThrowExceptionValidate ()
166 String elementName = "AlteringElementName";
167 object elementValue = "AlteringElementValue";
169 // alter XML document to invalidate
170 XElement newElement = new XElement (elementName, elementValue);
171 xmlDocument.Root.Add (newElement);
173 ExtensionsClass.Validate (xmlDocument, schemaSet, null);
177 * test xml validation populating the XML tree with
178 * the post-schema-validation infoset (PSVI)
181 public void XDocumentAddSchemaInfoValidate ()
183 // no. of elements before validation
184 IEnumerable<XElement> elements = xmlDocument.Elements ();
185 IEnumerator<XElement> elementsEnumerator = elements.GetEnumerator ();
186 int beforeNoOfElements = 0;
187 int beforeNoOfAttributes = 0;
188 while (elementsEnumerator.MoveNext ()) {
189 beforeNoOfElements++;
190 if (!elementsEnumerator.Current.HasAttributes)
193 IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
194 IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
195 while (attributesEnumerator.MoveNext ())
196 beforeNoOfAttributes++;
200 // populate XML with PSVI
201 validationSucceded = true;
202 ExtensionsClass.Validate (xmlDocument, schemaSet,
203 new ValidationEventHandler (TestValidationHandler), true);
204 Assert.AreEqual (true, validationSucceded);
206 // no. of elements after validation
207 elements = xmlDocument.Elements ();
208 elementsEnumerator = elements.GetEnumerator ();
209 int afterNoOfElements = 0;
210 int afterNoOfAttributes = 0;
211 while (elementsEnumerator.MoveNext ()) {
213 if (!elementsEnumerator.Current.HasAttributes)
216 IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
217 IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
218 while (attributesEnumerator.MoveNext ())
219 afterNoOfAttributes++;
223 Assert.GreaterOrEqual (afterNoOfAttributes, beforeNoOfAttributes, "newAttributes");
224 Assert.GreaterOrEqual (afterNoOfElements, beforeNoOfElements, "newElements");
228 * test xml validation without populating the XML tree with
229 * the post-schema-validation infoset (PSVI).
232 public void XDocumentNoSchemaInfoValidate ()
234 // no. of elements before validation
235 IEnumerable<XElement> elements = xmlDocument.Elements ();
236 IEnumerator<XElement> elementsEnumerator = elements.GetEnumerator ();
237 int beforeNoOfElements = 0;
238 int beforeNoOfAttributes = 0;
239 while (elementsEnumerator.MoveNext ()) {
240 beforeNoOfElements++;
241 if (!elementsEnumerator.Current.HasAttributes)
244 IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
245 IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
246 while (attributesEnumerator.MoveNext ())
247 beforeNoOfAttributes++;
251 // don't populate XML with PSVI
252 validationSucceded = true;
253 ExtensionsClass.Validate (xmlDocument, schemaSet,
254 new ValidationEventHandler (TestValidationHandler), false);
255 Assert.AreEqual (true, validationSucceded);
257 // no. of elements after validation
258 elements = xmlDocument.Elements ();
259 elementsEnumerator = elements.GetEnumerator ();
260 int afterNoOfElements = 0;
261 int afterNoOfAttributes = 0;
262 while (elementsEnumerator.MoveNext ()) {
264 if (!elementsEnumerator.Current.HasAttributes)
267 IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
268 IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
269 while (attributesEnumerator.MoveNext ())
270 afterNoOfAttributes++;
274 Assert.AreEqual (afterNoOfAttributes, beforeNoOfAttributes, "oldAttributes");
275 Assert.AreEqual (afterNoOfElements, beforeNoOfElements, "oldElements");
279 // attribute validation succeeds after change
281 public void XAttributeSuccessValidate ()
283 String elementName = "note";
284 String attributeName = "date";
285 object attributeValue = "2010-05-27";
287 // validate the entire document
288 validationSucceded = true;
289 ExtensionsClass.Validate (xmlDocument, schemaSet,
290 new ValidationEventHandler (TestValidationHandler), true);
291 Assert.AreEqual (true, validationSucceded);
293 // change and re-validate attribute value
294 XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
295 date.SetValue (attributeValue);
296 ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute,schemaSet,
297 new ValidationEventHandler (TestValidationHandler));
298 Assert.AreEqual (true, validationSucceded, "XAttributeSuccessValidate");
301 // attribute validation fails after change
303 public void XAttributeFailValidate ()
305 String elementName = "note";
306 String attributeName = "date";
307 object attributeValue = "2010-12-32";
309 // validate the entire document
310 validationSucceded = true;
311 ExtensionsClass.Validate (xmlDocument, schemaSet,
312 new ValidationEventHandler (TestValidationHandler),true);
313 Assert.AreEqual (true, validationSucceded);
315 // change and re-validate attribute value
316 XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
317 date.SetValue (attributeValue);
318 ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute, schemaSet,
319 new ValidationEventHandler (TestValidationHandler));
320 Assert.AreEqual (false, validationSucceded, "XAttributeFailValidate");
324 * test if exception is thrown when xml document does not
325 * conform to the xml schema after attribute value change
328 [ExpectedException (typeof (XmlSchemaValidationException))]
329 public void XAttributeThrowExceptionValidate ()
331 String elementName = "note";
332 String attributeName = "date";
333 object attributeValue = "2010-12-32";
335 // validate the entire document
336 validationSucceded = true;
337 ExtensionsClass.Validate (xmlDocument, schemaSet,
338 new ValidationEventHandler ( TestValidationHandler),true);
339 Assert.AreEqual (true, validationSucceded);
341 // change and re-validate attribute value
342 XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
343 date.SetValue (attributeValue);
344 ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute, schemaSet, null);
347 // element validation succeeds after change
349 [Category ("NotWorking")]
350 public void XElementSuccessValidate ()
352 String parentElementName = "note";
353 String childElementName = "body";
354 object childElementValue = "Please call me!";
356 // validate the entire document
357 validationSucceded = true;
358 ExtensionsClass.Validate (xmlDocument, schemaSet,
359 new ValidationEventHandler (TestValidationHandler), true);
360 Assert.AreEqual (true, validationSucceded);
363 XElement root = xmlDocument.Element (parentElementName);
364 root.SetElementValue (childElementName, childElementValue);
366 ExtensionsClass.Validate (root, root.GetSchemaInfo ().SchemaElement, schemaSet,
367 new ValidationEventHandler (TestValidationHandler));
368 Assert.AreEqual (true, validationSucceded, "XElementSuccessValidate");
372 // element validation fails after change
374 [Category ("NotWorking")]
375 public void XElementFailValidate ()
377 String parentElementName = "note";
378 String childElementName = "body";
379 object childElementValue = "Don't forget to call me! Please!";
381 // validate the entire document
382 validationSucceded = true;
383 ExtensionsClass.Validate (xmlDocument, schemaSet,
384 new ValidationEventHandler (TestValidationHandler), true);
385 Assert.AreEqual (true, validationSucceded);
388 XElement root = xmlDocument.Element (parentElementName);
389 root.SetElementValue (childElementName, childElementValue);
391 ExtensionsClass.Validate (root, root.GetSchemaInfo ().SchemaElement, schemaSet,
392 new ValidationEventHandler (TestValidationHandler));
393 Assert.AreEqual (false, validationSucceded, "XElementFailValidate");
398 * test if exception is thrown when xml document does not
399 * conform to the xml schema after element value change
402 [ExpectedException (typeof (XmlSchemaValidationException))]
403 [Category ("NotWorking")]
404 public void XElementThrowExceptionValidate ()
406 String parentElementName = "note" ;
407 String childElementName = "body";
408 object childElementValue = "Don't forget to call me! Please!";
410 // validate the entire document
411 validationSucceded = true;
412 ExtensionsClass.Validate (xmlDocument, schemaSet,
413 new ValidationEventHandler (TestValidationHandler), true);
414 Assert.AreEqual (true, validationSucceded);
417 XElement root = xmlDocument.Element (parentElementName);
418 root.SetElementValue (childElementName, childElementValue);
420 ExtensionsClass.Validate (root, root.GetSchemaInfo ().SchemaElement, schemaSet, null);
423 // test attribute schema info
425 [Category ("NotWorking")]
426 public void XAttributeGetSchemaInfo ()
428 String elementName = "note";
429 String attributeName = "date";
431 // validate the entire document
432 validationSucceded = true;
433 ExtensionsClass.Validate (xmlDocument, schemaSet,
434 new ValidationEventHandler (TestValidationHandler), true);
435 Assert.AreEqual (true, validationSucceded);
437 // validate attribute
438 XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
439 ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute, schemaSet,
440 new ValidationEventHandler (TestValidationHandler));
441 Assert.AreEqual (true, validationSucceded);
443 IXmlSchemaInfo schemaInfo = ExtensionsClass.GetSchemaInfo (date);
444 Assert.IsNotNull (schemaInfo, "XAttributeGetSchemaInfo");
447 // test element schema info
449 [Category ("NotWorking")]
450 public void XElementGetSchemaInfo ()
452 String elementName = "body";
454 // validate the entire document
455 validationSucceded = true;
456 ExtensionsClass.Validate (xmlDocument, schemaSet,
457 new ValidationEventHandler (TestValidationHandler), true);
458 Assert.AreEqual (true, validationSucceded);
461 XElement body = xmlDocument.Root.Element (elementName);
462 ExtensionsClass.Validate (body, body.GetSchemaInfo ().SchemaElement, schemaSet,
463 new ValidationEventHandler (TestValidationHandler));
464 Assert.AreEqual (true, validationSucceded);
466 IXmlSchemaInfo schemaInfo = ExtensionsClass.GetSchemaInfo (body);
467 Assert.IsNotNull (schemaInfo, "ElementGetSchemaInfo");