/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package test.sdo21.tests.xsd; import java.util.List; import java.io.IOException; import commonj.sdo.Type; import commonj.sdo.Property; import commonj.sdo.DataObject; import org.junit.Test; import static org.junit.Assert.*; public class XSDComplexTypeTest extends XSDBaseTestCase { /** * containing other elements. * * @throws Exception */ @Test public void testTC128ComplexTypeWithElement() throws Exception { // parse the schema List types = define("/complexType/cT_01.xsd"); Type type = (Type) types.get(0); assertFalse(type.isSequenced()); assertFalse(type.isOpen()); assertFalse(type.isDataType()); assertFalse(type.isAbstract()); assertEquals("cT_01", type.getName()); assertPropertyExists(type, "id", "Int", false, false); assertPropertyExists(type, "name", "String", false, false); } /** * with abstract="true". * * @throws Exception */ @Test public void testTC129ComplexTypeAbstractTrue() throws Exception { List types = define("/complexType/cT_02.xsd"); Type type = (Type) types.get(0); assertFalse(type.isSequenced()); assertEquals("cT_02", type.getName()); assertTrue(type.isAbstract()); assertPropertyExists(type, "id", "Int", false, false); assertFalse(type.getProperty("id").isReadOnly() ); assertPropertyExists(type, "name", "String", false, false); assertFalse(type.getProperty("name").isReadOnly() ); } /** * extending another . * * @throws Exception */ @Test public void testTC130ComplexTypeExtendingComplexType() throws Exception { List types = define("/complexType/cT_03.xsd"); assertTrue(types.size() >= 2); // parent Type parentType = getType(types, "cT_03_parent"); List properties = parentType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p1 = (Property) properties.get(0); assertEquals("id", p1.getName()); assertEquals("Int", p1.getType().getName()); // child Type childType = getType(types, "cT_03_child"); List baseTypes = childType.getBaseTypes(); assertEquals(1, baseTypes.size()); Type baseType = (Type) baseTypes.get(0); assertEquals("cT_03_parent", baseType.getName()); properties = childType.getProperties(); assertEquals(2, properties.size()); assertEquals(1, childType.getDeclaredProperties().size() ); //verify name and type of Properties // base properties appear first, derived properties are appended Property childTypeProp1 = (Property) properties.get(0); assertEquals("id", childTypeProp1.getName()); assertEquals("Int", childTypeProp1.getType().getName()); Property childTypeProp2 = (Property) properties.get(1); assertEquals("name", childTypeProp2.getName()); assertEquals("String", childTypeProp2.getType().getName()); } /** * derived from with block="#all" (should not affect SDO Types generated). * * @throws Exception */ @Test public void testTC131ComplexTypeBlockAll() throws Exception { List types = define("/complexType/cT_04.xsd"); assertTrue(types.size() >= 2); // parent Type parentType = getType(types, "cT_04_parent"); List properties = parentType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p1 = (Property) properties.get(0); assertEquals("id", p1.getName()); assertEquals("Int", p1.getType().getName()); // child Type childType = getType(types, "cT_04_child"); List baseTypes = childType.getBaseTypes(); assertEquals(1, baseTypes.size()); Type baseType = (Type) baseTypes.get(0); assertEquals("cT_04_parent", baseType.getName()); properties = childType.getProperties(); assertEquals(2, properties.size()); assertEquals(1, childType.getDeclaredProperties().size() ); //verify name and type of Properties // base properties appear first, derived properties are appended Property childTypeProp1 = (Property) properties.get(0); assertEquals("id", childTypeProp1.getName()); assertEquals("Int", childTypeProp1.getType().getName()); Property childTypeProp2 = (Property) properties.get(1); assertEquals("name", childTypeProp2.getName()); assertEquals("String", childTypeProp2.getType().getName()); } /** * containing containing . * * @throws Exception */ @Test public void testTC132ComplexTypeGroupWithSequence() throws Exception { List types = define("/complexType/cT_05.xsd"); Type type = (Type) types.get(0); assertEquals("cT_05", type.getName()); assertFalse(type.isAbstract()); assertPropertyExists(type, "id", "Int", false, false); assertFalse(type.getProperty("id").isReadOnly()); assertPropertyExists(type, "name", "String", false, false); assertFalse(type.getProperty("name").isReadOnly()); } /** * name="cT_06" containing anonymous . * * @throws Exception */ @Test public void testTC133ComplexTypeAnonymous() throws Exception { List types = define("/complexType/cT_06.xsd"); // The spec maps the name of anonymous types to the name // of their enclosing element. This is a broken method however, // as it can conflict with same named types and other same // named elements with anonymous types. So currently we are // intentially non-compliant. using unique names for // anonymous types Property property = typeHelper.getOpenContentProperty( "http://www.example.com/xsd/6/", "cT_06" ); Type type = property.getType(); assertFalse(type.isAbstract()); assertFalse(type.isSequenced()); assertPropertyExists(type, "id", "Int", false, false); assertFalse(type.getProperty("id").isReadOnly()); assertPropertyExists(type, "name", "String", false, false); assertFalse(type.getProperty("name").isReadOnly()); } /** * with name. * * @throws Exception */ @Test public void testTC134ComplexTypeNamed() throws Exception { List types = define("/complexType/cT_07.xsd"); Type type = (Type) types.get(0); assertEquals("cT_07", type.getName()); assertFalse(type.isAbstract()); assertFalse(type.isSequenced()); assertPropertyExists(type, "id", "Int", false, false); assertFalse(type.getProperty("id").isReadOnly()); assertPropertyExists(type, "name", "String", false, false); assertFalse(type.getProperty("name").isReadOnly()); } /** * with final="true" containing containing of a with abstract="true". * * @throws Exception */ @Test public void testTC136ComplexTypeExtendAbstractTrue() throws Exception { List types = define("/complexType/cT_09.xsd"); assertTrue(types.size() >= 2); // parent Type parentType = typeHelper.getType("http://www.example.com/xsd/9/", "cT_09_parent"); List properties = parentType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p1 = (Property) properties.get(0); assertEquals("id", p1.getName()); assertEquals("Int", p1.getType().getName()); // child Type childType = typeHelper.getType("http://www.example.com/xsd/9/", "cT_09_child"); List baseTypes = childType.getBaseTypes(); assertEquals(1, baseTypes.size()); Type baseType = (Type) baseTypes.get(0); assertEquals("cT_09_parent", baseType.getName()); properties = childType.getDeclaredProperties(); assertEquals(1, properties.size()); assertEquals(2, childType.getProperties().size() ); Property p2 = (Property) properties.get(0); assertEquals("name", p2.getName()); assertEquals("String", p2.getType().getName()); } /** * containing containing of a with abstract="true". * * @throws Exception */ @Test public void testTC137ComplexTypeExtendWithRestriction() throws Exception { List types = define("/complexType/cT_10.xsd"); assertTrue(types.size() >= 2); // parent Type parentType = getType(types, "cT_10_parent"); List properties = parentType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p1 = (Property) properties.get(0); assertEquals("id", p1.getName()); assertEquals("Int", p1.getType().getName()); // child Type childType = getType(types, "cT_10_child"); List baseTypes = childType.getBaseTypes(); assertEquals(1, baseTypes.size()); Type baseType = (Type) baseTypes.get(0); assertEquals("cT_10_parent", baseType.getName()); properties = childType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p2 = (Property) properties.get(0); assertEquals("name", p2.getName()); assertEquals("String", p2.getType().getName()); } /** * containing containing of a with abstract="true". * * @throws Exception */ @Test public void testTC138ComplexTypeExtend() throws Exception { List types = define("/complexType/cT_11.xsd"); assertTrue(types.size() >= 2); // parent Type parentType = getType(types, "cT_11_parent"); List properties = parentType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p1 = (Property) properties.get(0); assertEquals("id", p1.getName()); assertEquals("Int", p1.getType().getName()); // child Type childType = getType(types, "cT_11_child"); List baseTypes = childType.getBaseTypes(); assertEquals(1, baseTypes.size()); Type baseType = (Type) baseTypes.get(0); assertEquals("cT_11_parent", baseType.getName()); properties = childType.getDeclaredProperties(); assertEquals(1, properties.size()); Property p2 = (Property) properties.get(0); assertEquals("name", p2.getName()); assertEquals("String", p2.getType().getName()); } /** * containing containing . * * @throws Exception */ @Test public void testTC143ComplexTypeSimpleContent() throws Exception { List types = define("/complexType/cT_18.xsd"); Type type = typeHelper.getType("http://www.example.com/xsd/18/", "cT_18"); // 10.8. Corner cases // ... // 5. In some cases it is not possible to maintain an SDO base // relationship when one exists in schema. This can happen for // example when complex types extend simple types // // So a complexType extending a simple type doesn't have an SDO // base type set List baseTypes = type.getBaseTypes(); assertEquals(0, baseTypes.size()); // however complex types with simple content get a special // property named "value" to represent their content // p100, box 3 of the latest C++ 2.1 draft // Complex Type extending a SimpleType // // // // // // // Type name=[NAME] // uri=[URI] // Property: // name="value" type=[BASE] // Properties are created for attribute // declarations. Property valueProperty = type.getProperty("value"); Type valueType = valueProperty.getType(); assertEquals("String", valueType.getName()); assertEquals("commonj.sdo", valueType.getURI()); } /** * containing containing containing . * * @throws Exception */ @Test public void test_cT_19() throws Exception { List types = define("/complexType/cT_19.xsd"); // parent Type type = getType(types, "cT_19"); // 10.8. Corner cases // ... // 5. In some cases it is not possible to maintain an SDO base // relationship when one exists in schema. This can happen for // example when complex types extend simple types // // So a complexType extending a simple type doesn't have an SDO // base type set List baseTypes = type.getBaseTypes(); assertEquals(0, baseTypes.size()); List properties = type.getDeclaredProperties(); assertEquals(2, properties.size()); Property p1 = type.getProperty( "lang" ); assertEquals("String", p1.getType().getName()); // however complex types with simple content get a special // property named "value" to represent their content // p100, box 3 of the latest C++ 2.1 draft // Complex Type extending a SimpleType // // // // // // // Type name=[NAME] // uri=[URI] // Property: // name="value" type=[BASE] // Properties are created for attribute // declarations. Property valueProperty = type.getProperty("value"); Type valueType = valueProperty.getType(); assertEquals("String", valueType.getName()); assertEquals("commonj.sdo", valueType.getURI()); } /** * containing containing containing . * * @throws Exception */ @Test public void test_cT_22() throws Exception { List types = define("/complexType/cT_22.xsd"); Type type = getType(types, "cT_22"); assertFalse(type.isSequenced()); // 10.8. Corner cases // ... // 5. In some cases it is not possible to maintain an SDO base // relationship when one exists in schema. This can happen for // example when complex types extend simple types // // So a complexType extending a simple type doesn't have an SDO // base type set List baseTypes = type.getBaseTypes(); assertEquals(0, baseTypes.size()); List properties = type.getDeclaredProperties(); assertEquals(2, properties.size()); Property p1 = type.getProperty( "lang" ); assertEquals("String", p1.getType().getName()); // however complex types with simple content get a special // property named "value" to represent their content // p100, box 3 of the latest C++ 2.1 draft // Complex Type extending a SimpleType // // // // // // // Type name=[NAME] // uri=[URI] // Property: // name="value" type=[BASE] // Properties are created for attribute // declarations. Property valueProperty = type.getProperty("value"); Type valueType = valueProperty.getType(); assertEquals("String", valueType.getName()); assertEquals("commonj.sdo", valueType.getURI()); } /** * containing containing containing * containing containing . * * @throws Exception */ @Test public void test_cT_23() throws Exception { List types = define("/complexType/cT_23.xsd"); // two types are output the one for the complex type // and the simple type assertTrue(types.size() >= 2); Type type = getType(types, "cT_23"); assertFalse(type.isSequenced()); // 10.8. Corner cases // ... // 5. In some cases it is not possible to maintain an SDO base // relationship when one exists in schema. This can happen for // example when complex types extend simple types // // So a complexType extending a simple type doesn't have an SDO // base type set List baseTypes = type.getBaseTypes(); assertEquals(0, baseTypes.size()); List properties = type.getDeclaredProperties(); assertEquals(2, properties.size()); Property p1 = type.getProperty( "lang" ); assertNotNull( p1 ); // the actual type here for the lang attribute will be // the anonymous simple type, which as it's base will // be commonj.sdo#String Type langBaseType = (Type)p1.getType().getBaseTypes().get(0); assertEquals("String", langBaseType.getName()); // however complex types with simple content get a special // property named "value" to represent their content // p100, box 3 of the latest C++ 2.1 draft // Complex Type extending a SimpleType // // // // // // // Type name=[NAME] // uri=[URI] // Property: // name="value" type=[BASE] // Properties are created for attribute // declarations. Property valueProperty = type.getProperty("value"); Type valueType = valueProperty.getType(); assertEquals("String", valueType.getName()); assertEquals("commonj.sdo", valueType.getURI()); } /** * containing containing with minOccurs="1", maxOccurs="1". * * @throws Exception */ @Test public void testTC300ComplexTypeContainingAllGroupWithElements() throws Exception { List types = define("/complexType/cT_24.xsd"); Type type = getType(types, "cT_24"); assertPropertyExists(type, "p1", "String", false, false); } /** * containing containing with minOccurs="1", maxOccurs="1". * * @throws Exception */ @Test public void test_cT_25() throws Exception { List types = define("/complexType/cT_25.xsd"); Type type = getType(types, "cT_25"); assertPropertyExists(type, "p1", "String", false, false); } /** * containing containing with minOccurs="0", maxOccurs="unbounded". * * @throws Exception */ @Test public void test_cT_26() throws Exception { List types = define("/complexType/cT_26.xsd"); Type type = getType(types, "cT_26"); assertPropertyExists(type, "p1", "String", false, true); } /** * containing containing with minOccurs="1", maxOccurs="unbounded". * * @throws Exception */ @Test public void testTC299ComplexTypeContainingUnboundedElement() throws Exception { List types = define("/complexType/cT_27.xsd"); Type type = typeHelper.getType("http://www.example.com/xsd/27/", "cT_27"); assertPropertyExists(type, "p1", "String", false, true); } /** * containing an for each XSD type supported by SDO. * * @throws Exception */ @Test public void testTC297ComplexTypeContainingElementsOfAllTypes() throws Exception { List types = define("/complexType/cT_28.xsd"); Type type = getType(types, "cT_28"); assertFalse(type.isSequenced()); assertEquals( 44, type.getProperties().size() ); assertPropertyExists(type, "type_date", "YearMonthDay", false, false); assertPropertyExists(type, "type_dateTime", "DateTime", false, false); assertPropertyExists(type, "type_decimal", "Decimal", false, false); assertPropertyExists(type, "type_double", "Double", false, false); assertPropertyExists(type, "type_duration", "Duration", false, false); assertPropertyExists(type, "type_float", "Float", false, false); assertPropertyExists(type, "type_gDay", "Day", false, false); assertPropertyExists(type, "type_gMonth", "Month", false, false); assertPropertyExists(type, "type_gMonthDay", "MonthDay", false, false); assertPropertyExists(type, "type_gYear", "Year", false, false); assertPropertyExists(type, "type_gYearMonth", "YearMonth", false, false); assertPropertyExists(type, "type_int", "Int", false, false); assertPropertyExists(type, "type_integer", "Integer", false, false); assertPropertyExists(type, "type_long", "Long", false, false); assertPropertyExists(type, "type_negativeInteger", "Integer", false, false); assertPropertyExists(type, "type_nonNegativeInteger", "Integer", false, false); assertPropertyExists(type, "type_nonPositiveInteger", "Integer", false, false); assertPropertyExists(type, "type_positiveInteger", "Integer", false, false); assertPropertyExists(type, "type_short", "Short", false, false); assertPropertyExists(type, "type_string", "String", false, false); assertPropertyExists(type, "type_time", "Time", false, false); assertPropertyExists(type, "type_unsignedByte", "Short", false, false); assertPropertyExists(type, "type_unsignedInt", "Long", false, false); assertPropertyExists(type, "type_unsignedLong", "Integer", false, false); assertPropertyExists(type, "type_unsignedShort", "Int", false, false); assertPropertyExists(type, "type_anyType", "DataObject", true, false); assertPropertyExists(type, "type_anyURI", "URI", false, false); assertPropertyExists(type, "type_base64Binary", "Bytes", false, false); assertPropertyExists(type, "type_byte", "Byte", false, false); assertPropertyExists(type, "type_ENTITY", "String", false, false); assertPropertyExists(type, "type_hexBinary", "Bytes", false, false); assertPropertyExists(type, "type_ID", "String", false, false); assertPropertyExists(type, "type_IDREF", "String", false, false); assertPropertyExists(type, "type_language", "String", false, false); assertPropertyExists(type, "type_Name", "String", false, false); assertPropertyExists(type, "type_NCName", "String", false, false); assertPropertyExists(type, "type_QName", "URI", false, false); assertPropertyExists(type, "type_token", "String", false, false); assertPropertyExists(type, "type_NMTOKEN", "String", false, false); assertPropertyExists(type, "type_NMTOKENS", "Strings", false, false); assertPropertyExists(type, "type_IDREFS", "Strings", false, false); assertPropertyExists(type, "type_ENTITIES", "Strings", false, false); assertPropertyExists(type, "type_anySimpleType", "Object", false, false); } /** * containing an for each XSD type supported by SDO. * * @throws Exception */ @Test public void test_cT_29() throws Exception { List types = define("/complexType/cT_29.xsd"); Type type = getType(types, "cT_29"); assertFalse(type.isSequenced()); assertPropertyExists(type, "type_date", "YearMonthDay", false, false); assertPropertyExists(type, "type_dateTime", "DateTime", false, false); assertPropertyExists(type, "type_decimal", "Decimal", false, false); assertPropertyExists(type, "type_double", "Double", false, false); assertPropertyExists(type, "type_duration", "Duration", false, false); assertPropertyExists(type, "type_float", "Float", false, false); assertPropertyExists(type, "type_gDay", "Day", false, false); assertPropertyExists(type, "type_gMonth", "Month", false, false); assertPropertyExists(type, "type_gMonthDay", "MonthDay", false, false); assertPropertyExists(type, "type_gYear", "Year", false, false); assertPropertyExists(type, "type_gYearMonth", "YearMonth", false, false); assertPropertyExists(type, "type_int", "Int", false, false); assertPropertyExists(type, "type_integer", "Integer", false, false); assertPropertyExists(type, "type_long", "Long", false, false); assertPropertyExists(type, "type_negativeInteger", "Integer", false, false); assertPropertyExists(type, "type_nonNegativeInteger", "Integer", false, false); assertPropertyExists(type, "type_nonPositiveInteger", "Integer", false, false); assertPropertyExists(type, "type_positiveInteger", "Integer", false, false); assertPropertyExists(type, "type_short", "Short", false, false); assertPropertyExists(type, "type_string", "String", false, false); assertPropertyExists(type, "type_time", "Time", false, false); assertPropertyExists(type, "type_unsignedByte", "Short", false, false); assertPropertyExists(type, "type_unsignedInt", "Long", false, false); assertPropertyExists(type, "type_unsignedLong", "Integer", false, false); assertPropertyExists(type, "type_unsignedShort", "Int", false, false); assertPropertyExists(type, "type_anyURI", "URI", false, false); assertPropertyExists(type, "type_base64Binary", "Bytes", false, false); assertPropertyExists(type, "type_byte", "Byte", false, false); assertPropertyExists(type, "type_ENTITIES", "Strings", false, false); assertPropertyExists(type, "type_ENTITY", "String", false, false); assertPropertyExists(type, "type_hexBinary", "Bytes", false, false); assertPropertyExists(type, "type_ID", "String", false, false); assertPropertyExists(type, "type_IDREF", "String", false, false); assertPropertyExists(type, "type_IDREFS", "Strings", false, false); assertPropertyExists(type, "type_language", "String", false, false); assertPropertyExists(type, "type_Name", "String", false, false); assertPropertyExists(type, "type_NMTOKEN", "String", false, false); assertPropertyExists(type, "type_NMTOKENS", "Strings", false, false); assertPropertyExists(type, "type_QName", "URI", false, false); assertPropertyExists(type, "type_token", "String", false, false); assertPropertyExists(type, "type_NCName", "String", false, false); assertPropertyExists(type, "type_anySimpleType", "Object", false, false); } /** * containing a which contains a reference and an . The * also contains a . * * @throws Exception */ @Test public void test_cT_30() throws Exception { List types = define("/complexType/cT_30.xsd"); Type type = getType(types, "cT_30"); assertFalse(type.isSequenced()); assertPropertyExists(type, "p1", "String", false, false); assertPropertyExists(type, "p2", "String", false, false); assertPropertyExists(type, "p3", "Int", false, false); } /** * using to extend another . The derived * references a which contains a . * * @throws Exception */ @Test public void test_cT_31() throws Exception { List types = define("/complexType/cT_31.xsd"); assertTrue(types.size() >= 2); Type type = getType(types, "cT_31"); assertFalse(type.isSequenced()); assertPropertyExists(type, "p1", "String", false, false); assertPropertyExists(type, "p2", "String", false, false); assertPropertyExists(type, "p3", "Int", false, false); assertPropertyExists(type, "p4", "String", false, false); assertPropertyExists(type, "p5", "String", false, false); } /** * with mixed="true". Must create SDO Type with sequenced="true". * * @throws Exception */ @Test public void test_cT_42() throws Exception { List types = define("/complexType/cT_42.xsd"); Type type = getType(types, "cT_42"); assertTrue(type.isSequenced()); assertPropertyExists(type, "id", "Int", false, false); assertPropertyExists(type, "name", "String", false, false); } /** * containing with maxOccurs="unbounded". Should map to SDO Type with * sequenced="true" and no declared properties. * * @throws Exception */ @Test public void test_cT_43() throws Exception { List types = define("/complexType/cT_43.xsd"); Type type = getType(types, "cT_43"); assertTrue(type.isOpen()); assertEquals(0, type.getProperties().size()); } /** * containing with maxOccurs="1". Should map to SDO Type with * sequenced="false" and no declared properties. * * @throws Exception */ @Test public void test_cT_44() throws Exception { List types = define("/complexType/cT_44.xsd"); Type type = getType(types, "cT_44"); assertTrue(type.isOpen()); assertFalse(type.isSequenced()); assertEquals(0, type.getProperties().size()); } /** * containing . Should map to SDO Type with * no declared properties. * * @throws Exception */ @Test public void test_cT_45() throws Exception { List types = define("/complexType/cT_45.xsd"); Type type = getType(types, "cT_45"); assertTrue(type.isOpen()); assertFalse(type.isSequenced()); assertEquals(0, type.getProperties().size()); } /** * containing element with nillable="true" * * @throws Exception */ @Test public void test_cT_46() throws Exception { List types = define("/complexType/cT_46.xsd"); Type type = (Type) types.get(0); assertFalse(type.isSequenced()); assertFalse(type.isOpen()); assertFalse(type.isDataType()); assertFalse(type.isAbstract()); assertEquals("cT_46", type.getName()); assertPropertyExists(type, "id", "Int", false, false); assertPropertyExists(type, "name", "String", false, false); assertEquals( false, type.getProperty("id").isNullable() ); assertEquals( true, type.getProperty("name").isNullable() ); } /** * containing an anySimpletype element * * @throws Exception */ @Test public void testTC298ComplexTypeSetAnySimpleTypeWithStringValue() throws Exception { List types = define("/complexType/cT_47.xsd"); DataObject dobj = getScope().getDataFactory().create( "http://www.example.com/xsd/47/", "cT_47" ); Property p = dobj.getProperty( "type_anySimpleType" ); assertNotNull( p ); assertEquals( "commonj.sdo", p.getType().getURI() ); assertEquals( "Object", p.getType().getName() ); dobj.set( "type_anySimpleType", "foo" ); assertEquals( "foo", dobj.get( "type_anySimpleType") ); } @Test public void test_cT_48() throws IOException { List types = define("/complexType/cT_48.xsd"); assertTrue(types.size() >= 4); Type t1 = getType(types, "complextype1"); Property p1 = t1.getProperty("person"); assertNotNull(p1); Type t2 = getType(types, "complextype2"); Property p2 = t2.getProperty("person"); assertNotNull(p2); // although the 2.1 spec says that the name of the anonymous types should be the same as the name of the // enclosing element or attribute, this would result in a name clash so we need to ensure that the type // names are not the same String typeName1 = p1.getType().getName(); String typeName2 = p2.getType().getName(); assertFalse( typeName1.equals(typeName2) ); } }