Modified: xmlbeans/trunk/test/src/xmlobject/checkin/InstanceValidationTests.java URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/xmlobject/checkin/InstanceValidationTests.java?rev=1851656&r1=1851655&r2=1851656&view=diff ============================================================================== --- xmlbeans/trunk/test/src/xmlobject/checkin/InstanceValidationTests.java (original) +++ xmlbeans/trunk/test/src/xmlobject/checkin/InstanceValidationTests.java Fri Jan 18 23:08:44 2019 @@ -15,13 +15,10 @@ package xmlobject.checkin; -import junit.framework.Assert; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; import org.apache.xmlbeans.*; -import org.apache.xmlbeans.xml.stream.XMLInputStream; import org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException; +import org.junit.Test; +import tools.util.JarUtil; import javax.xml.namespace.QName; import java.io.File; @@ -30,38 +27,27 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import tools.util.*; - -public class InstanceValidationTests extends TestCase -{ - public InstanceValidationTests(String name) - { super(name); } - - public static Test suite() - { return new TestSuite(InstanceValidationTests.class); } +import static org.junit.Assert.*; +public class InstanceValidationTests { static String[] _args; static String _test; - - public SchemaTypeLoader makeSchemaTypeLoader(String[] schemas) throws XmlException - { + + private SchemaTypeLoader makeSchemaTypeLoader(String[] schemas) throws XmlException { XmlObject[] schemaDocs = new XmlObject[schemas.length]; - for (int i = 0; i < schemas.length; i++) - { + for (int i = 0; i < schemas.length; i++) { schemaDocs[i] = XmlObject.Factory.parse(schemas[i]); } return XmlBeans.loadXsd(schemaDocs); } - public SchemaTypeLoader makeSchemaTypeLoader(File[] schemas) throws XmlException, IOException - { + private SchemaTypeLoader makeSchemaTypeLoader(File[] schemas) throws XmlException, IOException { XmlObject[] schemaDocs = new XmlObject[schemas.length]; - for (int i = 0; i < schemas.length; i++) - { + for (int i = 0; i < schemas.length; i++) { schemaDocs[i] = XmlObject.Factory.parse(schemas[i], new XmlOptions().setLoadLineNumbers().setLoadMessageDigest()); } @@ -69,31 +55,12 @@ public class InstanceValidationTests ext } - public List performValidation(String[] schemas, QName docType, String instances, - boolean startOnDocument) throws XmlException - { + private List performValidation(String[] schemas, String instances) throws XmlException { SchemaTypeLoader stl = makeSchemaTypeLoader(schemas); XmlOptions options = new XmlOptions(); - if (docType != null) - { - SchemaType docSchema = stl.findDocumentType(docType); - - Assert.assertTrue(docSchema != null); - - options.setDocumentType(docSchema); - } - - XmlObject x = stl.parse( instances, null, options); - - if (!startOnDocument) - { - XmlCursor c = x.newCursor(); - c.toFirstChild(); - x = c.getObject(); - c.dispose(); - } + XmlObject x = stl.parse(instances, null, options); List xel = new ArrayList(); options.setErrorListener(xel); @@ -103,9 +70,8 @@ public class InstanceValidationTests ext return xel; } - - public void testValidationElementError() throws XmlException - { + @Test + public void testValidationElementError() throws XmlException { String bobSchema = "<xs:schema\n" + " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + " xmlns:bob='http://openuri.org/bobschema'\n" + " targetNamespace='http://openuri.org/bobschema'\n" + " elementFormDefault='qualified'>\n" + "\n" + " <xs:complexType name='biff'>\n" + " <xs:complexContent>\n" + " <xs:extension base='bob:foo'>\n" + " <xs:sequence>\n" + " <xs:element name='a' minOccurs='0' maxOccurs='unbounded'/>\n" + " </xs:sequence>\n" + " </xs:extension>\n" + " </xs:complexContent>\n" + " </xs:complexType>\n" + "" + " <xs:complexType name='foo'>\n" + " </xs:complexType>\n" + "" + " <xs:element name='foo' type='bob:foo'>\n" + " </xs:element>\n" + "" + "</xs:schema>\n"; String invalid = "<bob:foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + "xsi:type='bob:biff'><bob:q/></bob:foo>"; @@ -114,299 +80,285 @@ public class InstanceValidationTests ext List errors = null; - errors = performValidation(schemas, null, invalid, true); - Assert.assertTrue(errors != null); - Assert.assertTrue(errors.size()>0); - - for (Iterator it = errors.iterator(); it.hasNext();) - { - XmlValidationError xmlValError = (XmlValidationError) it.next(); - Assert.assertEquals(xmlValError.getErrorType(), XmlValidationError.INCORRECT_ELEMENT); - Assert.assertEquals(xmlValError.getBadSchemaType().getName().getLocalPart(), "biff"); - Assert.assertEquals(xmlValError.getOffendingQName().getLocalPart(), "q"); - Assert.assertEquals(xmlValError.getMessage(), "Expected element 'a@http://openuri.org/bobschema' instead of 'q@http://openuri.org/bobschema' here in element foo@http://openuri.org/bobschema"); + errors = performValidation(schemas, invalid); + assertNotNull(errors); + assertTrue(errors.size() > 0); + + for (Object error : errors) { + XmlValidationError xmlValError = (XmlValidationError) error; + assertEquals(xmlValError.getErrorType(), XmlValidationError.INCORRECT_ELEMENT); + assertEquals(xmlValError.getBadSchemaType().getName().getLocalPart(), "biff"); + assertEquals(xmlValError.getOffendingQName().getLocalPart(), "q"); + assertEquals(xmlValError.getMessage(), "Expected element 'a@http://openuri.org/bobschema' instead of 'q@http://openuri.org/bobschema' here in element foo@http://openuri.org/bobschema"); } } + @Test + public void testValidationAttributeError() throws XmlException { - public void testValidationAttributeError() throws XmlException - { - StringBuffer empSchema = new StringBuffer(); - - empSchema.append("<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n"); - empSchema.append("<xs:element name='age'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:integer'>\n"); - empSchema.append("<xs:minInclusive value='0'/>\n"); - empSchema.append("<xs:maxInclusive value='100'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='empRecords'>\n"); - empSchema.append("<xs:complexType>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='name' type='xs:string'/>\n"); - empSchema.append("<xs:complexType name='personType'>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element ref='name'/>\n"); - empSchema.append("<xs:element ref='age'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("<xs:attribute name='employee' use='required'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:NMTOKEN'>\n"); - empSchema.append("<xs:enumeration value='current'/>\n"); - empSchema.append("<xs:enumeration value='past'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:attribute>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:schema>\n"); - - StringBuffer xmlInstance = new StringBuffer(); - xmlInstance.append("<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >"); - xmlInstance.append("<person employee='past'>"); - xmlInstance.append("<name>joe blow</name>"); - xmlInstance.append("<age>31</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("<person>"); - xmlInstance.append("<name>test user</name>"); - xmlInstance.append("<age>29</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("</empRecords>"); - - String[] schemas = {empSchema.toString()}; + String empSchema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n" + + "<xs:element name='age'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:integer'>\n" + + "<xs:minInclusive value='0'/>\n" + + "<xs:maxInclusive value='100'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:element>\n" + + "<xs:element name='empRecords'>\n" + + "<xs:complexType>\n" + + "<xs:sequence>\n" + + "<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n" + + "</xs:sequence>\n" + + "</xs:complexType>\n" + + "</xs:element>\n" + + "<xs:element name='name' type='xs:string'/>\n" + + "<xs:complexType name='personType'>\n" + + "<xs:sequence>\n" + + "<xs:element ref='name'/>\n" + + "<xs:element ref='age'/>\n" + + "</xs:sequence>\n" + + "<xs:attribute name='employee' use='required'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:NMTOKEN'>\n" + + "<xs:enumeration value='current'/>\n" + + "<xs:enumeration value='past'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:attribute>\n" + + "</xs:complexType>\n" + + "</xs:schema>\n"; + String[] schemas = {empSchema}; List errors = null; - errors = performValidation(schemas, null, xmlInstance.toString(), true); - Assert.assertTrue(errors != null); - Assert.assertTrue(errors.size()>0); - - for (Iterator it = errors.iterator(); it.hasNext();) - { - XmlValidationError xmlValError = (XmlValidationError) it.next(); - Assert.assertEquals(xmlValError.getErrorType(), XmlValidationError.INCORRECT_ATTRIBUTE); - Assert.assertEquals(xmlValError.getBadSchemaType().getName().getLocalPart(), "personType"); - Assert.assertEquals(xmlValError.getOffendingQName().getLocalPart(), "employee"); - Assert.assertEquals(xmlValError.getMessage(), "Expected attribute: employee in element person"); + String xmlInstance = "<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >" + + "<person employee='past'>" + + "<name>joe blow</name>" + + "<age>31</age>" + + "</person>" + + "<person>" + + "<name>test user</name>" + + "<age>29</age>" + + "</person>" + + "</empRecords>"; + errors = performValidation(schemas, xmlInstance); + assertNotNull(errors); + assertTrue(errors.size() > 0); + + for (Object error : errors) { + XmlValidationError xmlValError = (XmlValidationError) error; + assertEquals(xmlValError.getErrorType(), XmlValidationError.INCORRECT_ATTRIBUTE); + assertEquals(xmlValError.getBadSchemaType().getName().getLocalPart(), "personType"); + assertEquals(xmlValError.getOffendingQName().getLocalPart(), "employee"); + assertEquals(xmlValError.getMessage(), "Expected attribute: employee in element person"); } } - public void testValidationIncorrectElementError() throws XmlException - { - StringBuffer empSchema = new StringBuffer(); - - empSchema.append("<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n"); - empSchema.append("<xs:element name='age'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:integer'>\n"); - empSchema.append("<xs:minInclusive value='0'/>\n"); - empSchema.append("<xs:maxInclusive value='100'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='empRecords'>\n"); - empSchema.append("<xs:complexType>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='name' type='xs:string'/>\n"); - empSchema.append("<xs:complexType name='personType'>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element ref='name'/>\n"); - empSchema.append("<xs:element ref='age'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("<xs:attribute name='employee' use='required'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:NMTOKEN'>\n"); - empSchema.append("<xs:enumeration value='current'/>\n"); - empSchema.append("<xs:enumeration value='past'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:attribute>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:schema>\n"); - - StringBuffer xmlInstance = new StringBuffer(); - xmlInstance.append("<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >"); - xmlInstance.append("<person employee='past'>"); - //xmlInstance.append("<name>joe blow</name>"); - xmlInstance.append("<age>31</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("<person employee='current'>"); - xmlInstance.append("<name>test user</name>"); - xmlInstance.append("<age>29</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("</empRecords>"); + @Test + public void testValidationIncorrectElementError() throws XmlException { - String[] schemas = {empSchema.toString()}; + String empSchema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n" + + "<xs:element name='age'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:integer'>\n" + + "<xs:minInclusive value='0'/>\n" + + "<xs:maxInclusive value='100'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:element>\n" + + "<xs:element name='empRecords'>\n" + + "<xs:complexType>\n" + + "<xs:sequence>\n" + + "<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n" + + "</xs:sequence>\n" + + "</xs:complexType>\n" + + "</xs:element>\n" + + "<xs:element name='name' type='xs:string'/>\n" + + "<xs:complexType name='personType'>\n" + + "<xs:sequence>\n" + + "<xs:element ref='name'/>\n" + + "<xs:element ref='age'/>\n" + + "</xs:sequence>\n" + + "<xs:attribute name='employee' use='required'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:NMTOKEN'>\n" + + "<xs:enumeration value='current'/>\n" + + "<xs:enumeration value='past'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:attribute>\n" + + "</xs:complexType>\n" + + "</xs:schema>\n"; + String[] schemas = {empSchema}; List errors = null; - errors = performValidation(schemas, null, xmlInstance.toString(), true); - Assert.assertTrue(errors != null); - Assert.assertTrue(errors.size()>0); + String xmlInstance = + "<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >" + + "<person employee='past'>" + + "<age>31</age>" + + "</person>" + + "<person employee='current'>" + + "<name>test user</name>" + + "<age>29</age>" + + "</person>" + + "</empRecords>"; + + errors = performValidation(schemas, xmlInstance); + assertNotNull(errors); + assertTrue(errors.size() > 0); Iterator it = errors.iterator(); - Assert.assertTrue(it.hasNext()); + assertTrue(it.hasNext()); XmlValidationError xmlValError = (XmlValidationError) it.next(); - Assert.assertEquals(XmlValidationError.INCORRECT_ELEMENT, xmlValError.getErrorType()); - Assert.assertEquals("personType", xmlValError.getBadSchemaType().getName().getLocalPart()); + assertEquals(XmlValidationError.INCORRECT_ELEMENT, xmlValError.getErrorType()); + assertEquals("personType", xmlValError.getBadSchemaType().getName().getLocalPart()); // todo debug this Assert.assertEquals(xmlValError.getOffendingQName().getLocalPart(), "age"); - Assert.assertEquals("Expected element 'name' instead of 'age' here in element person", xmlValError.getMessage()); + assertEquals("Expected element 'name' instead of 'age' here in element person", xmlValError.getMessage()); - Assert.assertTrue(it.hasNext()); + assertTrue(it.hasNext()); xmlValError = (XmlValidationError) it.next(); - Assert.assertEquals(XmlValidationError.INCORRECT_ELEMENT, xmlValError.getErrorType()); - Assert.assertEquals("personType", xmlValError.getBadSchemaType().getName().getLocalPart()); + assertEquals(XmlValidationError.INCORRECT_ELEMENT, xmlValError.getErrorType()); + assertEquals("personType", xmlValError.getBadSchemaType().getName().getLocalPart()); // todo debug this Assert.assertEquals(xmlValError.getOffendingQName().getLocalPart(), "age"); - Assert.assertEquals("Expected element 'name' before the end of the content in element person", xmlValError.getMessage()); + assertEquals("Expected element 'name' before the end of the content in element person", xmlValError.getMessage()); } - public void testValidationElementNotAllowedError() throws XmlException - { - StringBuffer empSchema = new StringBuffer(); - - empSchema.append("<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n"); - empSchema.append("<xs:element name='age'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:integer'>\n"); - empSchema.append("<xs:minInclusive value='0'/>\n"); - empSchema.append("<xs:maxInclusive value='100'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='empRecords'>\n"); - empSchema.append("<xs:complexType>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='name' type='xs:string'/>\n"); - empSchema.append("<xs:complexType name='personType'>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element ref='name'/>\n"); - empSchema.append("<xs:element ref='age'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("<xs:attribute name='employee' use='required'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:NMTOKEN'>\n"); - empSchema.append("<xs:enumeration value='current'/>\n"); - empSchema.append("<xs:enumeration value='past'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:attribute>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:schema>\n"); - - StringBuffer xmlInstance = new StringBuffer(); - xmlInstance.append("<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >"); - xmlInstance.append("<person employee='past'>"); - xmlInstance.append("<name>joe blow</name>"); - xmlInstance.append("<age>31</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("<person employee='current'>"); - xmlInstance.append("<name>test user</name>"); - xmlInstance.append("<age>29</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("</empRecords>"); + @Test + public void testValidationElementNotAllowedError() throws XmlException { - String[] schemas = {empSchema.toString()}; + String empSchema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n" + + "<xs:element name='age'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:integer'>\n" + + "<xs:minInclusive value='0'/>\n" + + "<xs:maxInclusive value='100'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:element>\n" + + "<xs:element name='empRecords'>\n" + + "<xs:complexType>\n" + + "<xs:sequence>\n" + + "<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n" + + "</xs:sequence>\n" + + "</xs:complexType>\n" + + "</xs:element>\n" + + "<xs:element name='name' type='xs:string'/>\n" + + "<xs:complexType name='personType'>\n" + + "<xs:sequence>\n" + + "<xs:element ref='name'/>\n" + + "<xs:element ref='age'/>\n" + + "</xs:sequence>\n" + + "<xs:attribute name='employee' use='required'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:NMTOKEN'>\n" + + "<xs:enumeration value='current'/>\n" + + "<xs:enumeration value='past'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:attribute>\n" + + "</xs:complexType>\n" + + "</xs:schema>\n"; + String[] schemas = {empSchema}; List errors = null; - errors = performValidation(schemas, null, xmlInstance.toString(), true); - Assert.assertTrue(errors != null); + String xmlInstance = + "<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >" + + "<person employee='past'>" + + "<name>joe blow</name>" + + "<age>31</age>" + + "</person>" + + "<person employee='current'>" + + "<name>test user</name>" + + "<age>29</age>" + + "</person>" + + "</empRecords>"; + errors = performValidation(schemas, xmlInstance); + assertNotNull(errors); // todo: enable this assert Assert.assertTrue(errors.size()>0); - for (Iterator it = errors.iterator(); it.hasNext();) - { - XmlValidationError xmlValError = (XmlValidationError) it.next(); - - Assert.assertEquals(xmlValError.getErrorType(), XmlValidationError.ELEMENT_NOT_ALLOWED); - Assert.assertEquals(xmlValError.getBadSchemaType().getName().getLocalPart(), "personType"); - Assert.assertEquals(xmlValError.getMessage(), "Expected element(s)"); + for (Object error : errors) { + XmlValidationError xmlValError = (XmlValidationError) error; + + assertEquals(xmlValError.getErrorType(), XmlValidationError.ELEMENT_NOT_ALLOWED); + assertEquals(xmlValError.getBadSchemaType().getName().getLocalPart(), "personType"); + assertEquals(xmlValError.getMessage(), "Expected element(s)"); } } + @Test + public void testValidationAttributeTypeError() throws XmlException { - public void testValidationAttributeTypeError() throws XmlException - { - StringBuffer empSchema = new StringBuffer(); - - empSchema.append("<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n"); - empSchema.append("<xs:element name='age'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:integer'>\n"); - empSchema.append("<xs:minInclusive value='0'/>\n"); - empSchema.append("<xs:maxInclusive value='100'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='empRecords'>\n"); - empSchema.append("<xs:complexType>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='name' type='xs:string'/>\n"); - empSchema.append("<xs:complexType name='personType'>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element ref='name'/>\n"); - empSchema.append("<xs:element ref='age'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("<xs:attribute name='employee' use='required'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:NMTOKEN'>\n"); - empSchema.append("<xs:enumeration value='current'/>\n"); - empSchema.append("<xs:enumeration value='past'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:attribute>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:schema>\n"); - - StringBuffer xmlInstance = new StringBuffer(); - xmlInstance.append("<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >"); - xmlInstance.append("<person employee='past'>"); - xmlInstance.append("<name>joe blow</name>"); - xmlInstance.append("<age>31</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("<person employee='current'>"); - xmlInstance.append("<name>test user</name>"); - xmlInstance.append("<age>junk</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("</empRecords>"); - - String[] schemas = {empSchema.toString()}; + String empSchema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n" + + "<xs:element name='age'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:integer'>\n" + + "<xs:minInclusive value='0'/>\n" + + "<xs:maxInclusive value='100'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:element>\n" + + "<xs:element name='empRecords'>\n" + + "<xs:complexType>\n" + + "<xs:sequence>\n" + + "<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n" + + "</xs:sequence>\n" + + "</xs:complexType>\n" + + "</xs:element>\n" + + "<xs:element name='name' type='xs:string'/>\n" + + "<xs:complexType name='personType'>\n" + + "<xs:sequence>\n" + + "<xs:element ref='name'/>\n" + + "<xs:element ref='age'/>\n" + + "</xs:sequence>\n" + + "<xs:attribute name='employee' use='required'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:NMTOKEN'>\n" + + "<xs:enumeration value='current'/>\n" + + "<xs:enumeration value='past'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:attribute>\n" + + "</xs:complexType>\n" + + "</xs:schema>\n"; + String[] schemas = {empSchema}; List errors = null; - errors = performValidation(schemas, null, xmlInstance.toString(), true); - Assert.assertTrue(errors != null); - Assert.assertTrue(errors.size()>0); - - for (Iterator it = errors.iterator(); it.hasNext();) - { - XmlValidationError xmlValError = (XmlValidationError) it.next(); - Assert.assertEquals(xmlValError.getErrorType(), XmlValidationError.ATTRIBUTE_TYPE_INVALID); - Assert.assertEquals(xmlValError.getMessage(), "Invalid decimal value: unexpected char '106'"); + String xmlInstance = "<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >" + + "<person employee='past'>" + + "<name>joe blow</name>" + + "<age>31</age>" + + "</person>" + + "<person employee='current'>" + + "<name>test user</name>" + + "<age>junk</age>" + + "</person>" + + "</empRecords>"; + errors = performValidation(schemas, xmlInstance); + assertNotNull(errors); + assertTrue(errors.size() > 0); + + for (Object error : errors) { + XmlValidationError xmlValError = (XmlValidationError) error; + assertEquals(xmlValError.getErrorType(), XmlValidationError.ATTRIBUTE_TYPE_INVALID); + assertEquals(xmlValError.getMessage(), "Invalid decimal value: unexpected char '106'"); } } - public void testElementError() throws XmlException - { - String bobSchema = "<xs:schema\n" + " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + + @Test + public void testElementError() throws XmlException { + String bobSchema = + "<xs:schema\n" + + " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + " xmlns:bob='http://openuri.org/bobschema'\n" + " targetNamespace='http://openuri.org/bobschema'\n" + " elementFormDefault='qualified'>\n" + @@ -427,1465 +379,1419 @@ public class InstanceValidationTests ext "</xs:schema>\n"; String invalid = "<bob:foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " + - "xmlns:bob='http://openuri.org/bobschema' " + - "xsi:type='bob:biff'><bob:q/></bob:foo>"; + "xmlns:bob='http://openuri.org/bobschema' " + + "xsi:type='bob:biff'><bob:q/></bob:foo>"; String[] schemas = {bobSchema}; - List errors = performValidation(schemas, null, invalid, true); - Assert.assertTrue(errors != null); - Assert.assertTrue(errors.size()>0); - - for (Iterator it = errors.iterator(); it.hasNext();) - { - XmlError xmlError = (XmlError) it.next(); - Assert.assertEquals(xmlError.getMessage(), "Expected element 'a@http://openuri.org/bobschema' instead of 'q@http://openuri.org/bobschema' here in element foo@http://openuri.org/bobschema"); + List errors = performValidation(schemas, invalid); + assertNotNull(errors); + assertTrue(errors.size() > 0); + + for (Object error : errors) { + XmlError xmlError = (XmlError) error; + assertEquals(xmlError.getMessage(), "Expected element 'a@http://openuri.org/bobschema' instead of 'q@http://openuri.org/bobschema' here in element foo@http://openuri.org/bobschema"); // todo check XmlValidationError } } - public void testAttributeError() throws XmlException - { - StringBuffer empSchema = new StringBuffer(); - - empSchema.append("<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n"); - empSchema.append("<xs:element name='age'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:integer'>\n"); - empSchema.append("<xs:minInclusive value='0'/>\n"); - empSchema.append("<xs:maxInclusive value='100'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='empRecords'>\n"); - empSchema.append("<xs:complexType>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:element>\n"); - empSchema.append("<xs:element name='name' type='xs:string'/>\n"); - empSchema.append("<xs:complexType name='personType'>\n"); - empSchema.append("<xs:sequence>\n"); - empSchema.append("<xs:element ref='name'/>\n"); - empSchema.append("<xs:element ref='age'/>\n"); - empSchema.append("</xs:sequence>\n"); - empSchema.append("<xs:attribute name='employee' use='required'>\n"); - empSchema.append("<xs:simpleType>\n"); - empSchema.append("<xs:restriction base='xs:NMTOKEN'>\n"); - empSchema.append("<xs:enumeration value='current'/>\n"); - empSchema.append("<xs:enumeration value='past'/>\n"); - empSchema.append("</xs:restriction>\n"); - empSchema.append("</xs:simpleType>\n"); - empSchema.append("</xs:attribute>\n"); - empSchema.append("</xs:complexType>\n"); - empSchema.append("</xs:schema>\n"); - - StringBuffer xmlInstance = new StringBuffer(); - xmlInstance.append("<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >"); - xmlInstance.append("<person employee='past'>"); - xmlInstance.append("<name>joe blow</name>"); - xmlInstance.append("<age>31</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("<person>"); - xmlInstance.append("<name>test user</name>"); - xmlInstance.append("<age>29</age>"); - xmlInstance.append("</person>"); - xmlInstance.append("</empRecords>"); + @Test + public void testAttributeError() throws XmlException { - String[] schemas = {empSchema.toString()}; + String empSchema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' elementFormDefault='qualified'>\n" + + "<xs:element name='age'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:integer'>\n" + + "<xs:minInclusive value='0'/>\n" + + "<xs:maxInclusive value='100'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:element>\n" + + "<xs:element name='empRecords'>\n" + + "<xs:complexType>\n" + + "<xs:sequence>\n" + + "<xs:element name='person' type='personType' maxOccurs='unbounded'/>\n" + + "</xs:sequence>\n" + + "</xs:complexType>\n" + + "</xs:element>\n" + + "<xs:element name='name' type='xs:string'/>\n" + + "<xs:complexType name='personType'>\n" + + "<xs:sequence>\n" + + "<xs:element ref='name'/>\n" + + "<xs:element ref='age'/>\n" + + "</xs:sequence>\n" + + "<xs:attribute name='employee' use='required'>\n" + + "<xs:simpleType>\n" + + "<xs:restriction base='xs:NMTOKEN'>\n" + + "<xs:enumeration value='current'/>\n" + + "<xs:enumeration value='past'/>\n" + + "</xs:restriction>\n" + + "</xs:simpleType>\n" + + "</xs:attribute>\n" + + "</xs:complexType>\n" + + "</xs:schema>\n"; + String[] schemas = {empSchema}; List errors = null; - errors = performValidation(schemas, null, xmlInstance.toString(), true); - Assert.assertTrue(errors != null); - Assert.assertTrue(errors.size()>0); - - for (Iterator it = errors.iterator(); it.hasNext();) - { - XmlError xmlError = (XmlError) it.next(); - Assert.assertEquals(xmlError.getMessage(), "Expected attribute: employee in element person"); + String xmlInstance = + "<empRecords xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' >" + + "<person employee='past'>" + + "<name>joe blow</name>" + + "<age>31</age>" + + "</person>" + + "<person>" + + "<name>test user</name>" + + "<age>29</age>" + + "</person>" + + "</empRecords>"; + errors = performValidation(schemas, xmlInstance); + assertNotNull(errors); + assertTrue(errors.size() > 0); + + for (Object error : errors) { + XmlError xmlError = (XmlError) error; + assertEquals(xmlError.getMessage(), "Expected attribute: employee in element person"); // todo check XmlValidationError } } + @Test + public void testValidate0() throws Exception { + // + // The most basic schema + // + + String schema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + + "</xs:schema>" + + ""; + String[] schemas = {schema}; - public void testValidate0 ( ) - throws Exception - { - // - // The most basic schema - // + SchemaTypeLoader stl = makeSchemaTypeLoader(schemas); - String schema = - "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + - "</xs:schema>" + - ""; + // + // One which uses ##targetNamespace on a wildcard + // - String[] schemas = { schema }; + schema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + + " <xs:complexType name='foo'>\n" + + " <xs:sequence>\n" + + " <xs:any namespace='##targetNamespace'/>\n" + + " </xs:sequence>\n" + + " </xs:complexType>\n" + + "</xs:schema>" + + ""; - SchemaTypeLoader stl = makeSchemaTypeLoader( schemas ); + String[] schemas99 = {schema}; - // - // One which uses ##targetNamespace on a wildcard - // + stl = makeSchemaTypeLoader(schemas99); - schema = - "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + - " <xs:complexType name='foo'>\n" + - " <xs:sequence>\n" + - " <xs:any namespace='##targetNamespace'/>\n" + - " </xs:sequence>\n" + - " </xs:complexType>\n" + - "</xs:schema>" + - ""; + // + // A big, nasty schema :-) + // - String[] schemas99 = { schema }; + File schemeFile = + JarUtil.getResourceFromJarasFile("xbean/xmlobject/store/XMLSchema.xsd"); + File xmlFile = JarUtil.getResourceFromJarasFile("xbean/xmlobject/store/XML.xsd"); - stl = makeSchemaTypeLoader( schemas99 ); + File[] schemasF = {schemeFile, xmlFile}; - // - // A big, nasty schema :-) - // + stl = makeSchemaTypeLoader(schemasF); - File schemeFile = - JarUtil.getResourceFromJarasFile("xbean/xmlobject/store/XMLSchema.xsd" ); - File xmlFile = JarUtil.getResourceFromJarasFile("xbean/xmlobject/store/XML.xsd" ); + SchemaType type = + stl.findDocumentType( + new QName("http://www.w3.org/2001/XMLSchema", "schema")); - File[] schemasF = { schemeFile, xmlFile }; + assertNotNull(type); - stl = makeSchemaTypeLoader( schemasF ); - SchemaType type = - stl.findDocumentType( - new QName( "http://www.w3.org/2001/XMLSchema", "schema" ) ); + // + // A good piece from a J2EE schema + // - Assert.assertTrue( type != null ); + schema = + "<?xml version='1.0' encoding='UTF-8'?>\n" + + "<xsd:schema xmlns='http://www.w3.org/2001/XMLSchema'\n" + + " xmlns:xsd='http://www.w3.org/2001/XMLSchema'\n" + + " elementFormDefault='qualified'\n" + + " attributeFormDefault='unqualified'>\n" + + "<xsd:annotation>\n" + + "<xsd:documentation>\n" + + "@(#)application-client_1_4.xsds 1.7 07/08/02\n" + + "</xsd:documentation>\n" + + "</xsd:annotation>\n" + + "</xsd:schema>\n"; + String[] schemas5 = {schema}; - // - // A good piece from a J2EE schema - // + stl = makeSchemaTypeLoader(schemas5); - schema = - "<?xml version='1.0' encoding='UTF-8'?>\n" + - "<xsd:schema xmlns='http://www.w3.org/2001/XMLSchema'\n" + - " xmlns:xsd='http://www.w3.org/2001/XMLSchema'\n" + - " elementFormDefault='qualified'\n" + - " attributeFormDefault='unqualified'>\n" + - "<xsd:annotation>\n" + - "<xsd:documentation>\n" + - "@(#)application-client_1_4.xsds 1.7 07/08/02\n" + - "</xsd:documentation>\n" + - "</xsd:annotation>\n" + - "</xsd:schema>\n"; + // + // A bad schema + // - String[] schemas5 = { schema }; + schema = "<foo/>"; - stl = makeSchemaTypeLoader( schemas5 ); + String[] schemas2 = {schema}; - // - // A bad schema - // + try { + stl = makeSchemaTypeLoader(schemas2); + fail(); + } catch (Exception e) { + } - schema = "<foo/>"; + // + // A bad schema + // + schema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + + " <foo/>\n" + + "</xs:schema>" + + ""; - String[] schemas2 = { schema }; + String[] schemas3 = {schema}; - try - { - stl = makeSchemaTypeLoader( schemas2 ); - Assert.assertTrue( false ); - } - catch ( Exception e ) - { - } - - // - // A bad schema - // - schema = - "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + - " <foo/>\n" + - "</xs:schema>" + - ""; - - String[] schemas3 = { schema }; - - try - { - makeSchemaTypeLoader( schemas3 ); + try { + makeSchemaTypeLoader(schemas3); - Assert.assertTrue( false ); - } - catch ( XmlException e ) - { - } + fail(); + } catch (XmlException e) { } + } - public void testValidate1 ( ) - throws Exception - { - String ericSchema = - "<xs:schema\n" + - " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + - " xmlns:nw='http://openuri.org/ericschema'\n" + - " targetNamespace='http://openuri.org/ericschema'\n" + - " elementFormDefault='qualified'>\n" + - "\n" + - " <xs:complexType name='foo'>\n" + - " </xs:complexType>\n" + - "\n" + - " <xs:element name='foo' type='nw:foo'>\n" + - " </xs:element>\n" + - "\n" + - " <xs:element name='eric'>\n" + - " <xs:complexType>\n" + - " <xs:sequence>\n" + - " <xs:element name='a' maxOccurs='unbounded'/>\n" + - " <xs:element name='b' />\n" + - " <xs:any namespace='yaya' minOccurs='0' maxOccurs='1' processContents='lax'/>\n" + - " <xs:element name='c' />\n" + - " <xs:any minOccurs='0' maxOccurs='unbounded' processContents='strict'/>\n" + - " </xs:sequence>\n" + - " <xs:attribute name='x' use='optional'/>\n" + - " <xs:attribute name='y' use='required'/>\n" + - " <xs:attribute name='z' use='prohibited'/>\n" + - " </xs:complexType>\n" + - " </xs:element>\n" + - "" + - "</xs:schema>\n"; - - String eric2Schema = - "<xs:schema\n" + - " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + - " xmlns:nw='http://openuri.org/ericschema2'\n" + - " xmlns:eric='http://openuri.org/ericschema'\n" + - " targetNamespace='http://openuri.org/ericschema2'\n" + - " elementFormDefault='qualified'>\n" + - "\n" + - " <xs:complexType name='eric2'>\n" + - " <xs:complexContent>\n" + - " <xs:extension base='eric:foo'>\n" + - " <xs:sequence>\n" + - " <xs:element name='a' maxOccurs='unbounded'/>\n" + - " </xs:sequence>\n" + - " </xs:extension>\n" + - " </xs:complexContent>\n" + - " </xs:complexType>\n" + - "</xs:schema>\n"; - - String eric = "<eric y='Y' xmlns='http://openuri.org/ericschema'>"; - String eric2 = "<eric xmlns='http://openuri.org/ericschema2'>"; - String xsi = "xmlns:eric2='http://openuri.org/ericschema2' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"; - - String[] valid = { - eric + "<a/><b/><c/><foo xsi:type='eric2:eric2' " + - xsi + "><a xmlns=\"http://openuri.org/ericschema2\"/></foo></eric>", - eric + "<a/><b/><boo xmlns='yaya'/><c/></eric>", - eric + "<a/><b/><c/></eric>", - eric + "<a x='y'/><b/><c/></eric>", - "<eric y='Y' x='X' xmlns='http://openuri.org/ericschema'>" + - "<a/><b/><c/></eric>" - }; - - String ericSansY = - "<eric xmlns='http://openuri.org/ericschema'>"; - - String[] invalid = { - "<foo/>", - "<eric><a/><foo/><c/></eric>", - eric + "text<a/><b/><c/></eric>", - eric + "<a/>text<b/><c/></eric>", - eric + "<a/><b/>text<c/></eric>", - eric + "<a/><b/><c/>text</eric>", - eric + "<a x='y'/><b/><c/>text</eric>", - eric + "<a/><b/><boo xmlns='yaya'/><moo xmlns='yaya'/><c/></eric>", - ericSansY + "<a/><b/><c/></eric>", - "<eric y='' z='' xmlns='http://openuri.org/ericschema'>" + - "<a/><b/><c/></eric>" - }; - - String[] schemas = { ericSchema, eric2Schema }; - - doTest( - schemas, - new QName( "http://openuri.org/ericschema", "eric" ), - valid, invalid ); - } + @Test + public void testValidate1() throws Exception { + String ericSchema = + "<xs:schema\n" + + " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + + " xmlns:nw='http://openuri.org/ericschema'\n" + + " targetNamespace='http://openuri.org/ericschema'\n" + + " elementFormDefault='qualified'>\n" + + "\n" + + " <xs:complexType name='foo'>\n" + + " </xs:complexType>\n" + + "\n" + + " <xs:element name='foo' type='nw:foo'>\n" + + " </xs:element>\n" + + "\n" + + " <xs:element name='eric'>\n" + + " <xs:complexType>\n" + + " <xs:sequence>\n" + + " <xs:element name='a' maxOccurs='unbounded'/>\n" + + " <xs:element name='b' />\n" + + " <xs:any namespace='yaya' minOccurs='0' maxOccurs='1' processContents='lax'/>\n" + + " <xs:element name='c' />\n" + + " <xs:any minOccurs='0' maxOccurs='unbounded' processContents='strict'/>\n" + + " </xs:sequence>\n" + + " <xs:attribute name='x' use='optional'/>\n" + + " <xs:attribute name='y' use='required'/>\n" + + " <xs:attribute name='z' use='prohibited'/>\n" + + " </xs:complexType>\n" + + " </xs:element>\n" + + "" + + "</xs:schema>\n"; - public void testValidate2 ( ) - throws Exception - { - String bobSchema = - "<xs:schema\n" + - " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + - " xmlns:bob='http://openuri.org/bobschema'\n" + - " targetNamespace='http://openuri.org/bobschema'\n" + - " elementFormDefault='qualified'>\n" + - "\n" + - " <xs:complexType name='biff'>\n" + - " <xs:complexContent>\n" + - " <xs:extension base='bob:foo'>\n" + - " <xs:sequence>\n" + - " <xs:element name='a' minOccurs='0' maxOccurs='unbounded'/>\n" + - " </xs:sequence>\n" + - " </xs:extension>\n" + - " </xs:complexContent>\n" + - " </xs:complexType>\n" + - "" + - " <xs:complexType name='foo'>\n" + - " </xs:complexType>\n" + - "" + - " <xs:element name='foo' type='bob:foo'>\n" + - " </xs:element>\n" + - "" + - "</xs:schema>\n"; - - String xsiType = "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"; - - String[] valid = { - "<bob:foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + - "xsi:type='bob:biff'><bob:a/><bob:a/><bob:a/></bob:foo>" - }; - - String[] invalid = { - "<bob:foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + - "xsi:type='bob:biff'><bob:q/></bob:foo>", - "<bob:foo a='b' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + - "xsi:type='bob:biff'><bob:a/><bob:a/><bob:a/></bob:foo>" - }; + String eric2Schema = + "<xs:schema\n" + + " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + + " xmlns:nw='http://openuri.org/ericschema2'\n" + + " xmlns:eric='http://openuri.org/ericschema'\n" + + " targetNamespace='http://openuri.org/ericschema2'\n" + + " elementFormDefault='qualified'>\n" + + "\n" + + " <xs:complexType name='eric2'>\n" + + " <xs:complexContent>\n" + + " <xs:extension base='eric:foo'>\n" + + " <xs:sequence>\n" + + " <xs:element name='a' maxOccurs='unbounded'/>\n" + + " </xs:sequence>\n" + + " </xs:extension>\n" + + " </xs:complexContent>\n" + + " </xs:complexType>\n" + + "</xs:schema>\n"; - String[] schemas = { bobSchema }; + String eric = "<eric y='Y' xmlns='http://openuri.org/ericschema'>"; + String eric2 = "<eric xmlns='http://openuri.org/ericschema2'>"; + String xsi = "xmlns:eric2='http://openuri.org/ericschema2' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"; + + String[] valid = { + eric + "<a/><b/><c/><foo xsi:type='eric2:eric2' " + + xsi + "><a xmlns=\"http://openuri.org/ericschema2\"/></foo></eric>", + eric + "<a/><b/><boo xmlns='yaya'/><c/></eric>", + eric + "<a/><b/><c/></eric>", + eric + "<a x='y'/><b/><c/></eric>", + "<eric y='Y' x='X' xmlns='http://openuri.org/ericschema'>" + + "<a/><b/><c/></eric>" + }; + + String ericSansY = + "<eric xmlns='http://openuri.org/ericschema'>"; + + String[] invalid = { + "<foo/>", + "<eric><a/><foo/><c/></eric>", + eric + "text<a/><b/><c/></eric>", + eric + "<a/>text<b/><c/></eric>", + eric + "<a/><b/>text<c/></eric>", + eric + "<a/><b/><c/>text</eric>", + eric + "<a x='y'/><b/><c/>text</eric>", + eric + "<a/><b/><boo xmlns='yaya'/><moo xmlns='yaya'/><c/></eric>", + ericSansY + "<a/><b/><c/></eric>", + "<eric y='' z='' xmlns='http://openuri.org/ericschema'>" + + "<a/><b/><c/></eric>" + }; + + String[] schemas = {ericSchema, eric2Schema}; + + doTest( + schemas, + new QName("http://openuri.org/ericschema", "eric"), + valid, invalid); + } - doTest( schemas, null, valid, invalid ); - } + @Test + public void testValidate2() throws Exception { + String bobSchema = + "<xs:schema\n" + + " xmlns:xs='http://www.w3.org/2001/XMLSchema'\n" + + " xmlns:bob='http://openuri.org/bobschema'\n" + + " targetNamespace='http://openuri.org/bobschema'\n" + + " elementFormDefault='qualified'>\n" + + "\n" + + " <xs:complexType name='biff'>\n" + + " <xs:complexContent>\n" + + " <xs:extension base='bob:foo'>\n" + + " <xs:sequence>\n" + + " <xs:element name='a' minOccurs='0' maxOccurs='unbounded'/>\n" + + " </xs:sequence>\n" + + " </xs:extension>\n" + + " </xs:complexContent>\n" + + " </xs:complexType>\n" + + "" + + " <xs:complexType name='foo'>\n" + + " </xs:complexType>\n" + + "" + + " <xs:element name='foo' type='bob:foo'>\n" + + " </xs:element>\n" + + "" + + "</xs:schema>\n"; - String ns = - "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " + - "xmlns:xs='http://www.w3.org/2001/XMLSchema'"; - - public void testValidate3 ( ) - throws Exception - { - String schema = - "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + - "" + - " <xs:simpleType name='allNNI'>\n" + - " <xs:annotation><xs:documentation>\n" + - " for maxOccurs</xs:documentation></xs:annotation>\n" + - " <xs:union memberTypes='xs:nonNegativeInteger'>\n" + - " <xs:simpleType>\n" + - " <xs:restriction base='xs:NMTOKEN'>\n" + - " <xs:enumeration value='unbounded'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - " </xs:union>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='ericBase64Binary'>\n" + - " <xs:restriction base='xs:base64Binary'>\n" + - " <xs:enumeration value='Eric'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='abcdHexBinary'>\n" + - " <xs:restriction base='xs:hexBinary'>\n" + - " <xs:enumeration value='abcd'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='zeroNumber'>\n" + - " <xs:restriction base='number'>\n" + - " <xs:enumeration value='Zero'/>\n" + - " <xs:enumeration value='0'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='number'>\n" + - " <xs:union>\n" + - " <xs:simpleType>\n" + - " <xs:restriction base='xs:decimal'/>\n" + - " </xs:simpleType>\n" + - " <xs:simpleType>\n" + - " <xs:restriction base='xs:string'>\n" + - " <xs:whiteSpace value='collapse'/>\n" + - " <xs:enumeration value='Zero'/>\n" + - " <xs:enumeration value='One'/>\n" + - " <xs:enumeration value='Two'/>\n" + - " <xs:enumeration value='Three'/>\n" + - " <xs:enumeration value='Many'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - " </xs:union>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='listOfInt'>\n" + - " <xs:list itemType='xs:int'/>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='listOfPrime'>\n" + - " <xs:list itemType='prime'/>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='ericBrother'>\n" + - " <xs:restriction base='xs:string'>\n" + - " <xs:whiteSpace value='collapse'/>\n" + - " <xs:enumeration value='Brian'/>\n" + - " <xs:enumeration value='Kevin'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='ericBrothers'>\n" + - " <xs:list itemType='ericBrother'/>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='weekString'>\n" + - " <xs:restriction base='xs:string'>\n" + - " <xs:whiteSpace value='collapse'/>\n" + - " <xs:enumeration value='Monday'/>\n" + - " <xs:enumeration value='Tuesday'/>\n" + - " <xs:enumeration value='Wednesday'/>\n" + - " <xs:enumeration value='Thursday'/>\n" + - " <xs:enumeration value='Friday'/>\n" + - " <xs:enumeration value='Saturday'/>\n" + - " <xs:enumeration value='Sunday'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='aYear'>\n" + - " <xs:restriction base='xs:duration'>\n" + - " <xs:enumeration value='P1Y'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='ericBDay'>\n" + - " <xs:restriction base='xs:date'>\n" + - " <xs:enumeration value='1965-06-10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='youngerThanEric'>\n" + - " <xs:restriction base='xs:date'>\n" + - " <xs:minExclusive value='1965-06-10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='fiveCharQname'>\n" + - " <xs:restriction base='xs:QName'>\n" + - " <xs:length value='5'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='wackyQname'>\n" + - " <xs:restriction base='xs:QName'>\n" + - " <xs:minLength value='3'/>\n" + - " <xs:maxLength value='10'/>\n" + - " <xs:pattern value='[xs:abcde]*'/>\n" + - " <xs:enumeration value='xs:abc'/>\n" + - " <xs:enumeration value='xs:bcd'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='fiveCharAnyURI'>\n" + - " <xs:restriction base='xs:anyURI'>\n" + - " <xs:length value='5'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='wackyAnyURI'>\n" + - " <xs:restriction base='xs:anyURI'>\n" + - " <xs:minLength value='3'/>\n" + - " <xs:maxLength value='10'/>\n" + - " <xs:enumeration value='foo'/>\n" + - " <xs:enumeration value='bar'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='bit'>\n" + - " <xs:restriction base='xs:boolean'>\n" + - " <xs:pattern value='1|0'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='evenInteger'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:pattern value='[0-9]*[02468]'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='prime'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:pattern value='[0-9]*[13579]'/>\n" + - " <xs:enumeration value='3'/>\n" + - " <xs:enumeration value='5'/>\n" + - " <xs:enumeration value='7'/>\n" + - " <xs:enumeration value='11'/>\n" + - " <xs:enumeration value='13'/>\n" + - " <xs:enumeration value='17'/>\n" + - " <xs:enumeration value='19'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='fourCharString'>\n" + - " <xs:restriction base='xs:string'>\n" + - " <xs:length value='4'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='threeOrMoreCharString'>\n" + - " <xs:restriction base='xs:string'>\n" + - " <xs:minLength value='3'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='fiveOrLessCharString'>\n" + - " <xs:restriction base='xs:string'>\n" + - " <xs:maxLength value='5'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='fiveTotalDigits'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:totalDigits value='5'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='threeFractionDigits'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:fractionDigits value='3'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMinExclusive'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:minExclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMaxExclusive'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:maxExclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMaxInclusive'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:maxInclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMinInclusive'>\n" + - " <xs:restriction base='xs:decimal'>\n" + - " <xs:minInclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMinExclusiveFloat'>\n" + - " <xs:restriction base='xs:float'>\n" + - " <xs:minExclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMaxExclusiveFloat'>\n" + - " <xs:restriction base='xs:float'>\n" + - " <xs:maxExclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMaxInclusiveFloat'>\n" + - " <xs:restriction base='xs:float'>\n" + - " <xs:maxInclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMinInclusiveFloat'>\n" + - " <xs:restriction base='xs:float'>\n" + - " <xs:minInclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "\n" + - " <xs:simpleType name='tenMinExclusiveDouble'>\n" + - " <xs:restriction base='xs:double'>\n" + - " <xs:minExclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMaxExclusiveDouble'>\n" + - " <xs:restriction base='xs:double'>\n" + - " <xs:maxExclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMaxInclusiveDouble'>\n" + - " <xs:restriction base='xs:double'>\n" + - " <xs:maxInclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "" + - " <xs:simpleType name='tenMinInclusiveDouble'>\n" + - " <xs:restriction base='xs:double'>\n" + - " <xs:minInclusive value='10'/>\n" + - " </xs:restriction>\n" + - " </xs:simpleType>\n" + - "\n" + - " <xs:element name='any'>\n" + - " </xs:element>\n" + - "" + - " <xs:element name='default_12345' default='12345'>\n" + - " </xs:element>\n" + - "" + - " <xs:element name='default_1234' default='1234'>\n" + - " </xs:element>\n" + - "" + - " <xs:element name='default_eric' default='eric'>\n" + - " </xs:element>\n" + - "" + - "</xs:schema>\n"; - - String[] valid = { - "<any " + ns + " xsi:type='threeFractionDigits'>.1</any>", - "<any " + ns + " xsi:type='threeFractionDigits'>.12</any>", - "<any " + ns + " xsi:type='threeFractionDigits'>.123</any>", - - "<any " + ns + " xsi:type='allNNI'>unbounded</any>", - "<any " + ns + " xsi:type='allNNI'>0</any>", - "<any " + ns + " xsi:type='allNNI'>1</any>", - - "<any " + ns + " xsi:type='xs:base64Binary'>CAFEBABE</any>", - "<any " + ns + " xsi:type='abcdHexBinary'>abcd</any>", - - "<any " + ns + " xsi:type='xs:base64Binary'>abcdefgh</any>", - "<any " + ns + " xsi:type='ericBase64Binary'>Eric</any>", - - "<any " + ns + " xsi:type='zeroNumber'> Zero</any>", - "<any " + ns + " xsi:type='zeroNumber'>Zero</any>", - "<any " + ns + " xsi:type='zeroNumber'>0</any>", - - "<any " + ns + " xsi:type='number'>1</any>", - "<any " + ns + " xsi:type='number'> 1 </any>", - "<any " + ns + " xsi:type='number'>Two</any>", - "<any " + ns + " xsi:type='number'> Three </any>", - - "<any " + ns + " xsi:type='ericBrothers'></any>", - "<any " + ns + " xsi:type='ericBrothers'>Brian</any>", - "<any " + ns + " xsi:type='ericBrothers'>Kevin</any>", - "<any " + ns + " xsi:type='ericBrothers'>Kevin Brian</any>", - "<any " + ns + " xsi:type='ericBrothers'>Brian Kevin</any>", - - "<any " + ns + " xsi:type='listOfInt'> 1 22 333 4444 </any>", - "<any " + ns + " xsi:type='listOfInt'></any>", - "<any " + ns + " xsi:type='listOfInt'>5999</any>", - - "<any " + ns + " xsi:type='aYear'>P1Y</any>", - - "<any " + ns + " xsi:type='fiveCharAnyURI'>abcde</any>", - "<any " + ns + " xsi:type='fiveCharQname'>xs:abc</any>", - "<any " + ns + " xsi:type='xs:anyURI'>foo</any>", - "<any " + ns + " xsi:type='wackyAnyURI'>foo</any>", - - "<any " + ns + " xsi:type='youngerThanEric'>1965-06-11</any>", - "<any " + ns + " xsi:type='ericBDay'>1965-06-10</any>", - "<any " + ns + " xsi:type='xs:dateTime'>1999-05-31T13:20:00-05:00</any>", - "<any " + ns + " xsi:type='xs:time'>00:00:00</any>", - "<any " + ns + " xsi:type='xs:time'>13:20:00-05:00</any>", - - "<any " + ns + " xsi:type='wackyQname'>xs:abc</any>", - "<any " + ns + " xsi:type='fiveCharQname'>abcde</any>", - "<any " + ns + " xsi:type='fiveCharQname'>xs:ab</any>", - "<any " + ns + " xsi:type='prime'>3</any>", - "<any " + ns + " xsi:type='prime'>11</any>", - "<any " + ns + " xsi:type='xs:integer'>+45</any>", - "<any " + ns + " xsi:type='xs:integer'>1</any>", - "<any " + ns + " xsi:type='xs:integer'>0</any>", - "<any " + ns + " xsi:type='xs:integer'>-1</any>", - "<any " + ns + " xsi:type='xs:integer'>-1</any>", - "<any " + ns + " xsi:type='xs:integer'>489743579837589743434</any>", - "<any " + ns + " xsi:type='xs:boolean'>1</any>", - "<default_1234 " + ns + " xsi:type='evenInteger'></default_1234>", - "<any " + ns + " xsi:type='evenInteger'>12</any>", - "<any " + ns + " xsi:type='bit'>1</any>", - "<any " + ns + " xsi:type='bit'>0</any>", - "<any " + ns + " xsi:type='xs:boolean'>false</any>", - "<any " + ns + " xsi:type='evenInteger'>0</any>", - "<any " + ns + " xsi:type='weekString'>Monday</any>", - "<any " + ns + " xsi:type='weekString'>Sunday</any>", - "<any " + ns + " xsi:type='weekString'> Thursday </any>", - - "<any " + ns + " xsi:type='tenMinExclusive'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxExclusive'>9.9</any>", - "<any " + ns + " xsi:type='tenMinInclusive'>10</any>", - "<any " + ns + " xsi:type='tenMinInclusive'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxInclusive'>10</any>", - "<any " + ns + " xsi:type='tenMaxInclusive'>9.9</any>", - - "<any " + ns + " xsi:type='tenMinExclusiveFloat'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxExclusiveFloat'>9.9</any>", - "<any " + ns + " xsi:type='tenMinInclusiveFloat'>10</any>", - "<any " + ns + " xsi:type='tenMinInclusiveFloat'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxInclusiveFloat'>10</any>", - "<any " + ns + " xsi:type='tenMaxInclusiveFloat'>9.9</any>", - - "<any " + ns + " xsi:type='tenMinExclusiveDouble'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxExclusiveDouble'>9.9</any>", - "<any " + ns + " xsi:type='tenMinInclusiveDouble'>10</any>", - "<any " + ns + " xsi:type='tenMinInclusiveDouble'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxInclusiveDouble'>10</any>", - "<any " + ns + " xsi:type='tenMaxInclusiveDouble'>9.9</any>", - - "<any " + ns + " xsi:type='fourCharString'>eric</any>", - "<any " + ns + " xsi:type='threeOrMoreCharString'>12345</any>", - "<any " + ns + " xsi:type='fiveOrLessCharString'>1234</any>", - "<any " + ns + " xsi:type='fiveTotalDigits'>12345</any>", - "<any " + ns + " xsi:type='fiveTotalDigits'>1234</any>", - "<default_1234 " + ns + " xsi:type='evenInteger'>\n\n</default_1234>" - }; - - String[] invalid = { - "<any " + ns + " xsi:type='allNNI'>foo</any>", - "<any " + ns + " xsi:type='xs:hexBinary'>P</any>", - "<any " + ns + " xsi:type='xs:hexBinary'>CAFEBABP</any>", - "<any " + ns + " xsi:type='abcdHexBinary'>abce</any>", - - "<any " + ns + " xsi:type='xs:base64Binary'>abcde</any>", - "<any " + ns + " xsi:type='ericBase64Binary'>Erik</any>", - - "<any " + ns + " xsi:type='zeroNumber'>One</any>", - "<any " + ns + " xsi:type='zeroNumber'>Twenty</any>", - - "<any " + ns + " xsi:type='number'>Seven</any>", - "<any " + ns + " xsi:type='number'>Bob</any>", - "<any " + ns + " xsi:type='number'></any>", - - "<any " + ns + " xsi:type='ericBrothers'>1</any>", - "<any " + ns + " xsi:type='ericBrothers'>Bob</any>", - "<any " + ns + " xsi:type='ericBrothers'>Ralph Frank</any>", - - "<any " + ns + " xsi:type='listOfInt'> 1 22 333 Eric </any>", - "<any " + ns + " xsi:type='listOfInt'>Eric</any>", - "<any " + ns + " xsi:type='listOfInt'>-</any>", - - "<any " + ns + " xsi:type='aYear'>P2Y</any>", - - "<any " + ns + " xsi:type='youngerThanEric'>1965-06-10</any>", - "<any " + ns + " xsi:type='ericBDay'>1985-06-10</any>", - "<any " + ns + " xsi:type='xs:dateTime'>xx1999-05-31T13:20:00-05:00</any>", - "<any " + ns + " xsi:type='xs:dateTime'>eric</any>", - "<any " + ns + " xsi:type='xs:time'>99:99:00</any>", - "<any " + ns + " xsi:type='xs:time'>13:20:00-99:00</any>", - - "<any " + ns + " xsi:type='wackyAnyURI'>moo</any>", - "<any " + ns + " xsi:type='fiveCharAnyURI'>ab</any>", - - "<any " + ns + " xsi:type='wackyQname'>xs:abcdefghijk</any>", - "<any " + ns + " xsi:type='wackyQname'>xs:pqr</any>", - "<any " + ns + " xsi:type='xs:QName'>foo:bar</any>", - "<any " + ns + " xsi:type='prime'>12</any>", - "<any " + ns + " xsi:type='prime'>6</any>", - "<any " + ns + " xsi:type='xs:integer'>foo</any>", - "<any " + ns + " xsi:type='xs:integer'>.1</any>", - "<any " + ns + " xsi:type='evenInteger'>1</any>", - "<any " + ns + " xsi:type='bit'>true</any>", - "<any " + ns + " xsi:type='bit'>false</any>", - "<any " + ns + " xsi:type='bit'>nibble</any>", - "<any " + ns + " xsi:type='bit'>2</any>", - "<any " + ns + " xsi:type='xs:boolean'>blurf</any>", - "<any " + ns + " xsi:type='xs:boolean'></any>", - "<any " + ns + " xsi:type='evenInteger'></any>", - "<any " + ns + " xsi:type='weekString'>Monday Sucks</any>", - - "<any " + ns + " xsi:type='tenMaxExclusive'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxExclusive'>10</any>", - "<any " + ns + " xsi:type='tenMinExclusive'>10</any>", - "<any " + ns + " xsi:type='tenMinExclusive'>9.9</any>", - "<any " + ns + " xsi:type='tenMinInclusive'>9.9</any>", - "<any " + ns + " xsi:type='tenMaxInclusive'>10.1</any>", - - "<any " + ns + " xsi:type='tenMaxExclusiveFloat'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxExclusiveFloat'>10</any>", - "<any " + ns + " xsi:type='tenMinExclusiveFloat'>10</any>", - "<any " + ns + " xsi:type='tenMinExclusiveFloat'>9.9</any>", - "<any " + ns + " xsi:type='tenMinInclusiveFloat'>9.9</any>", - "<any " + ns + " xsi:type='tenMaxInclusiveFloat'>10.1</any>", - - "<any " + ns + " xsi:type='tenMaxExclusiveDouble'>10.1</any>", - "<any " + ns + " xsi:type='tenMaxExclusiveDouble'>10</any>", - "<any " + ns + " xsi:type='tenMinExclusiveDouble'>10</any>", - "<any " + ns + " xsi:type='tenMinExclusiveDouble'>9.9</any>", - "<any " + ns + " xsi:type='tenMinInclusiveDouble'>9.9</any>", - "<any " + ns + " xsi:type='tenMaxInclusiveDouble'>10.1</any>", - - "<any " + ns + " xsi:type='fiveOrLessCharString'> 1234 </any>", - "<any " + ns + " xsi:type='fiveTotalDigits'>123456</any>", - "<any " + ns + " xsi:type='fourCharString'>vasilik</any>", - "<any " + ns + " xsi:type='threeOrMoreCharString'>1</any>", - "<any " + ns + " xsi:type='fiveOrLessCharString'>1234567</any>", - "<any " + ns + " xsi:type='threeFractionDigits'>.1234</any>", - "<any " + ns + " xsi:type='fourCharString'> eric </any>", - - "<default_12345 " + ns + " xsi:type='evenInteger'></default_12345>", - "<default_12345 " + ns + " xsi:type='evenInteger'>\n\n</default_12345>" - }; + String[] valid = { + "<bob:foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + + "xsi:type='bob:biff'><bob:a/><bob:a/><bob:a/></bob:foo>" + }; + + String[] invalid = { + "<bob:foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + + "xsi:type='bob:biff'><bob:q/></bob:foo>", + "<bob:foo a='b' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:bob='http://openuri.org/bobschema' " + + "xsi:type='bob:biff'><bob:a/><bob:a/><bob:a/></bob:foo>" + }; - String[] schemas = { schema }; + String[] schemas = {bobSchema}; - doTest( schemas, null, valid, invalid ); - } + doTest(schemas, null, valid, invalid); + } + @Test + public void testValidate3() throws Exception { + String schema = + "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" + + "" + + " <xs:simpleType name='allNNI'>\n" + + " <xs:annotation><xs:documentation>\n" + + " for maxOccurs</xs:documentation></xs:annotation>\n" + + " <xs:union memberTypes='xs:nonNegativeInteger'>\n" + + " <xs:simpleType>\n" + + " <xs:restriction base='xs:NMTOKEN'>\n" + + " <xs:enumeration value='unbounded'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + " </xs:union>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='ericBase64Binary'>\n" + + " <xs:restriction base='xs:base64Binary'>\n" + + " <xs:enumeration value='Eric'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='abcdHexBinary'>\n" + + " <xs:restriction base='xs:hexBinary'>\n" + + " <xs:enumeration value='abcd'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='zeroNumber'>\n" + + " <xs:restriction base='number'>\n" + + " <xs:enumeration value='Zero'/>\n" + + " <xs:enumeration value='0'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='number'>\n" + + " <xs:union>\n" + + " <xs:simpleType>\n" + + " <xs:restriction base='xs:decimal'/>\n" + + " </xs:simpleType>\n" + + " <xs:simpleType>\n" + + " <xs:restriction base='xs:string'>\n" + + " <xs:whiteSpace value='collapse'/>\n" + + " <xs:enumeration value='Zero'/>\n" + + " <xs:enumeration value='One'/>\n" + + " <xs:enumeration value='Two'/>\n" + + " <xs:enumeration value='Three'/>\n" + + " <xs:enumeration value='Many'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + " </xs:union>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='listOfInt'>\n" + + " <xs:list itemType='xs:int'/>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='listOfPrime'>\n" + + " <xs:list itemType='prime'/>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='ericBrother'>\n" + + " <xs:restriction base='xs:string'>\n" + + " <xs:whiteSpace value='collapse'/>\n" + + " <xs:enumeration value='Brian'/>\n" + + " <xs:enumeration value='Kevin'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='ericBrothers'>\n" + + " <xs:list itemType='ericBrother'/>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='weekString'>\n" + + " <xs:restriction base='xs:string'>\n" + + " <xs:whiteSpace value='collapse'/>\n" + + " <xs:enumeration value='Monday'/>\n" + + " <xs:enumeration value='Tuesday'/>\n" + + " <xs:enumeration value='Wednesday'/>\n" + + " <xs:enumeration value='Thursday'/>\n" + + " <xs:enumeration value='Friday'/>\n" + + " <xs:enumeration value='Saturday'/>\n" + + " <xs:enumeration value='Sunday'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='aYear'>\n" + + " <xs:restriction base='xs:duration'>\n" + + " <xs:enumeration value='P1Y'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='ericBDay'>\n" + + " <xs:restriction base='xs:date'>\n" + + " <xs:enumeration value='1965-06-10'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='youngerThanEric'>\n" + + " <xs:restriction base='xs:date'>\n" + + " <xs:minExclusive value='1965-06-10'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='fiveCharQname'>\n" + + " <xs:restriction base='xs:QName'>\n" + + " <xs:length value='5'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='wackyQname'>\n" + + " <xs:restriction base='xs:QName'>\n" + + " <xs:minLength value='3'/>\n" + + " <xs:maxLength value='10'/>\n" + + " <xs:pattern value='[xs:abcde]*'/>\n" + + " <xs:enumeration value='xs:abc'/>\n" + + " <xs:enumeration value='xs:bcd'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='fiveCharAnyURI'>\n" + + " <xs:restriction base='xs:anyURI'>\n" + + " <xs:length value='5'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='wackyAnyURI'>\n" + + " <xs:restriction base='xs:anyURI'>\n" + + " <xs:minLength value='3'/>\n" + + " <xs:maxLength value='10'/>\n" + + " <xs:enumeration value='foo'/>\n" + + " <xs:enumeration value='bar'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='bit'>\n" + + " <xs:restriction base='xs:boolean'>\n" + + " <xs:pattern value='1|0'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='evenInteger'>\n" + + " <xs:restriction base='xs:decimal'>\n" + + " <xs:pattern value='[0-9]*[02468]'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='prime'>\n" + + " <xs:restriction base='xs:decimal'>\n" + + " <xs:pattern value='[0-9]*[13579]'/>\n" + + " <xs:enumeration value='3'/>\n" + + " <xs:enumeration value='5'/>\n" + + " <xs:enumeration value='7'/>\n" + + " <xs:enumeration value='11'/>\n" + + " <xs:enumeration value='13'/>\n" + + " <xs:enumeration value='17'/>\n" + + " <xs:enumeration value='19'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='fourCharString'>\n" + + " <xs:restriction base='xs:string'>\n" + + " <xs:length value='4'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='threeOrMoreCharString'>\n" + + " <xs:restriction base='xs:string'>\n" + + " <xs:minLength value='3'/>\n" + + " </xs:restriction>\n" + + " </xs:simpleType>\n" + + "" + + " <xs:simpleType name='fiveOrLessCharString'>\n" +
[... 1723 lines stripped ...] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
