Xamarin Public Jenkins (auto-signing) 4a084bd265 Imported Upstream version 5.16.0.117
Former-commit-id: 44f8fd0c4b66c828855b08eefcc53d59832c25a6
2018-08-21 08:34:26 +00:00

472 lines
15 KiB
C#

//
// ExtensionsTest.cs - NUnit Test Cases for Extensions.cs class under
// System.Xml.Schema namespace found in System.Xml.Linq assembly
// (System.Xml.Linq.dll)
//
// Author:
// Stefan Prutianu (stefanprutianu@yahoo.com)
//
// (C) Stefan Prutianu
//
#if !MOBILE
using NUnit.Framework;
using System;
using System.Xml;
using System.IO;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Collections.Generic;
using ExtensionsClass = System.Xml.Schema.Extensions;
namespace MonoTests.System.Xml.Schema
{
[TestFixture]
public class ExtensionsTest {
public static String xsdString;
public static XmlSchemaSet schemaSet;
public static String xmlString;
public static XDocument xmlDocument;
public static bool validationSucceded;
// initialize values for tests
[SetUp]
public void Init ()
{
xsdString = @"<?xml version='1.0'?>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name='note'>
<xs:complexType>
<xs:sequence>
<xs:element name='to' type='xs:string'/>
<xs:element name='from' type='xs:string'/>
<xs:element name='heading' type='xs:string'/>
<xs:element name='ps' type='xs:string'
maxOccurs='1' minOccurs = '0' default='Bye!'/>
<xs:element name='body'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:minLength value='5'/>
<xs:maxLength value='30'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name='subject' type='xs:string'
default='mono'/>
<xs:attribute name='date' type='xs:date'
use='required'/>
</xs:complexType>
</xs:element>
</xs:schema>";
schemaSet = new XmlSchemaSet ();
schemaSet.Add ("", XmlReader.Create (new StringReader (xsdString)));
xmlString = @"<?xml version='1.0'?>
<note date ='2010-05-26'>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget to call me!</body>
</note>";
xmlDocument = XDocument.Load (new StringReader (xmlString));
validationSucceded = false;
/*
* Use this method to load the above data from disk
* Comment the above code when using this method.
* Also the arguments for the folowing tests: XAttributeSuccessValidate
* XAttributeFailValidate, XAttributeThrowExceptionValidate, XElementSuccessValidate
* XElementFailValidate,XElementThrowExceptionValidate, XAttributeGetSchemaInfo
* XElementGetSchemaInfo may need to be changed.
*/
//LoadOutsideDocuments ("c:\\note.xsd", "c:\\note.xml");
}
// Use this method to load data from disk
public static void LoadOutsideDocuments (String xsdDocumentPath, String xmlDocumentPath)
{
// Create a resolver with default credentials.
XmlUrlResolver resolver = new XmlUrlResolver ();
resolver.Credentials = global::System.Net.CredentialCache.DefaultCredentials;
// Set the reader settings object to use the resolver.
XmlReaderSettings settings = new XmlReaderSettings ();
settings.XmlResolver = resolver;
// Create the XmlReader object.
XmlReader reader = XmlReader.Create (xsdDocumentPath, settings);
schemaSet = new XmlSchemaSet ();
schemaSet.Add ("", reader);
reader = XmlReader.Create (xmlDocumentPath, settings);
xmlDocument = XDocument.Load (reader);
validationSucceded = false;
}
// this gets called when a validation error occurs
public void TestValidationHandler (object sender, ValidationEventArgs e)
{
validationSucceded = false;
}
[TearDown]
public void Cleanup ()
{
xsdString = null;
schemaSet = null;
xmlString = null;
xmlDocument = null;
validationSucceded = false;
}
// test succesfull validation
[Test]
public void XDocumentSuccessValidate ()
{
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (true, validationSucceded, "XDocumentSuccessValidate");
}
// test failed validation
[Test]
public void XDocumentFailValidate ()
{
String elementName = "AlteringElementName";
object elementValue = "AlteringElementValue";
// alter XML document to invalidate
XElement newElement = new XElement (elementName, elementValue);
xmlDocument.Root.Add (newElement);
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (false, validationSucceded, "XDocumentFailValidate");
}
/*
* test if exception is thrown when xml document does not
* conform to the xml schema
*/
[Test]
[ExpectedException (typeof (XmlSchemaValidationException))]
public void XDocumentThrowExceptionValidate ()
{
String elementName = "AlteringElementName";
object elementValue = "AlteringElementValue";
// alter XML document to invalidate
XElement newElement = new XElement (elementName, elementValue);
xmlDocument.Root.Add (newElement);
ExtensionsClass.Validate (xmlDocument, schemaSet, null);
}
/*
* test xml validation populating the XML tree with
* the post-schema-validation infoset (PSVI)
*/
[Test]
public void XDocumentAddSchemaInfoValidate ()
{
// no. of elements before validation
IEnumerable<XElement> elements = xmlDocument.Elements ();
IEnumerator<XElement> elementsEnumerator = elements.GetEnumerator ();
int beforeNoOfElements = 0;
int beforeNoOfAttributes = 0;
while (elementsEnumerator.MoveNext ()) {
beforeNoOfElements++;
if (!elementsEnumerator.Current.HasAttributes)
continue;
else {
IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
while (attributesEnumerator.MoveNext ())
beforeNoOfAttributes++;
}
}
// populate XML with PSVI
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// no. of elements after validation
elements = xmlDocument.Elements ();
elementsEnumerator = elements.GetEnumerator ();
int afterNoOfElements = 0;
int afterNoOfAttributes = 0;
while (elementsEnumerator.MoveNext ()) {
afterNoOfElements++;
if (!elementsEnumerator.Current.HasAttributes)
continue;
else {
IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
while (attributesEnumerator.MoveNext ())
afterNoOfAttributes++;
}
}
AssertHelper.GreaterOrEqual (afterNoOfAttributes, beforeNoOfAttributes, "newAttributes");
AssertHelper.GreaterOrEqual (afterNoOfElements, beforeNoOfElements, "newElements");
}
/*
* test xml validation without populating the XML tree with
* the post-schema-validation infoset (PSVI).
*/
[Test]
public void XDocumentNoSchemaInfoValidate ()
{
// no. of elements before validation
IEnumerable<XElement> elements = xmlDocument.Elements ();
IEnumerator<XElement> elementsEnumerator = elements.GetEnumerator ();
int beforeNoOfElements = 0;
int beforeNoOfAttributes = 0;
while (elementsEnumerator.MoveNext ()) {
beforeNoOfElements++;
if (!elementsEnumerator.Current.HasAttributes)
continue;
else {
IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
while (attributesEnumerator.MoveNext ())
beforeNoOfAttributes++;
}
}
// don't populate XML with PSVI
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), false);
Assert.AreEqual (true, validationSucceded);
// no. of elements after validation
elements = xmlDocument.Elements ();
elementsEnumerator = elements.GetEnumerator ();
int afterNoOfElements = 0;
int afterNoOfAttributes = 0;
while (elementsEnumerator.MoveNext ()) {
afterNoOfElements++;
if (!elementsEnumerator.Current.HasAttributes)
continue;
else {
IEnumerable<XAttribute> attributes = elementsEnumerator.Current.Attributes ();
IEnumerator<XAttribute> attributesEnumerator = attributes.GetEnumerator ();
while (attributesEnumerator.MoveNext ())
afterNoOfAttributes++;
}
}
Assert.AreEqual (afterNoOfAttributes, beforeNoOfAttributes, "oldAttributes");
Assert.AreEqual (afterNoOfElements, beforeNoOfElements, "oldElements");
}
// attribute validation succeeds after change
[Test]
public void XAttributeSuccessValidate ()
{
String elementName = "note";
String attributeName = "date";
object attributeValue = "2010-05-27";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// change and re-validate attribute value
XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
date.SetValue (attributeValue);
ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute,schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (true, validationSucceded, "XAttributeSuccessValidate");
}
// attribute validation fails after change
[Test]
public void XAttributeFailValidate ()
{
String elementName = "note";
String attributeName = "date";
object attributeValue = "2010-12-32";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler),true);
Assert.AreEqual (true, validationSucceded);
// change and re-validate attribute value
XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
date.SetValue (attributeValue);
ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (false, validationSucceded, "XAttributeFailValidate");
}
/*
* test if exception is thrown when xml document does not
* conform to the xml schema after attribute value change
*/
[Test]
[ExpectedException (typeof (XmlSchemaValidationException))]
public void XAttributeThrowExceptionValidate ()
{
String elementName = "note";
String attributeName = "date";
object attributeValue = "2010-12-32";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler ( TestValidationHandler),true);
Assert.AreEqual (true, validationSucceded);
// change and re-validate attribute value
XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
date.SetValue (attributeValue);
ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute, schemaSet, null);
}
// element validation succeeds after change
[Test]
[Category ("NotWorking")]
public void XElementSuccessValidate ()
{
String parentElementName = "note";
String childElementName = "body";
object childElementValue = "Please call me!";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// alter element
XElement root = xmlDocument.Element (parentElementName);
root.SetElementValue (childElementName, childElementValue);
ExtensionsClass.Validate (root, root.GetSchemaInfo ().SchemaElement, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (true, validationSucceded, "XElementSuccessValidate");
}
// element validation fails after change
[Test]
[Category ("NotWorking")]
public void XElementFailValidate ()
{
String parentElementName = "note";
String childElementName = "body";
object childElementValue = "Don't forget to call me! Please!";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// alter element
XElement root = xmlDocument.Element (parentElementName);
root.SetElementValue (childElementName, childElementValue);
ExtensionsClass.Validate (root, root.GetSchemaInfo ().SchemaElement, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (false, validationSucceded, "XElementFailValidate");
}
/*
* test if exception is thrown when xml document does not
* conform to the xml schema after element value change
*/
[Test]
[ExpectedException (typeof (XmlSchemaValidationException))]
[Category ("NotWorking")]
public void XElementThrowExceptionValidate ()
{
String parentElementName = "note" ;
String childElementName = "body";
object childElementValue = "Don't forget to call me! Please!";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// alter element
XElement root = xmlDocument.Element (parentElementName);
root.SetElementValue (childElementName, childElementValue);
ExtensionsClass.Validate (root, root.GetSchemaInfo ().SchemaElement, schemaSet, null);
}
// test attribute schema info
[Test]
[Category ("NotWorking")]
public void XAttributeGetSchemaInfo ()
{
String elementName = "note";
String attributeName = "date";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// validate attribute
XAttribute date = xmlDocument.Element (elementName).Attribute (attributeName);
ExtensionsClass.Validate (date, date.GetSchemaInfo ().SchemaAttribute, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (true, validationSucceded);
IXmlSchemaInfo schemaInfo = ExtensionsClass.GetSchemaInfo (date);
Assert.IsNotNull (schemaInfo, "XAttributeGetSchemaInfo");
}
// test element schema info
[Test]
[Category ("NotWorking")]
public void XElementGetSchemaInfo ()
{
String elementName = "body";
// validate the entire document
validationSucceded = true;
ExtensionsClass.Validate (xmlDocument, schemaSet,
new ValidationEventHandler (TestValidationHandler), true);
Assert.AreEqual (true, validationSucceded);
// validate element
XElement body = xmlDocument.Root.Element (elementName);
ExtensionsClass.Validate (body, body.GetSchemaInfo ().SchemaElement, schemaSet,
new ValidationEventHandler (TestValidationHandler));
Assert.AreEqual (true, validationSucceded);
IXmlSchemaInfo schemaInfo = ExtensionsClass.GetSchemaInfo (body);
Assert.IsNotNull (schemaInfo, "ElementGetSchemaInfo");
}
}
}
#endif