/******************************************************************************
* Copyright (c) 2016 Oracle
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Konstantin Komissarchik - initial implementation and ongoing maintenance
******************************************************************************/
package org.eclipse.sapphire.tests.modeling.xml.xsd.t0004;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.util.List;
import javax.xml.namespace.QName;
import org.eclipse.sapphire.modeling.ByteArrayResourceStore;
import org.eclipse.sapphire.modeling.xml.RootXmlResource;
import org.eclipse.sapphire.modeling.xml.XmlResourceStore;
import org.eclipse.sapphire.modeling.xml.schema.XmlContentModel;
import org.eclipse.sapphire.modeling.xml.schema.XmlContentModelReference;
import org.eclipse.sapphire.modeling.xml.schema.XmlDocumentSchema;
import org.eclipse.sapphire.modeling.xml.schema.XmlDocumentSchemasCache;
import org.eclipse.sapphire.modeling.xml.schema.XmlElementDefinition;
import org.eclipse.sapphire.modeling.xml.schema.XmlGroupContentModel;
import org.eclipse.sapphire.modeling.xml.schema.XmlSequenceGroup;
import org.eclipse.sapphire.tests.SapphireTestCase;
import org.junit.Test;
/**
* Tests treatment of namespaces when including a schema. This variant covers the case where included schema
* does not define target namespace.
*
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/
public final class TestXmlXsd0004 extends SapphireTestCase
{
private static final String NAMESPACE = "http://www.eclipse.org/sapphire/tests/xml/xsd/0004/workbook";
@Test
public void testSchemaParsing() throws Exception
{
final XmlDocumentSchema schema = XmlDocumentSchemasCache.getSchema( NAMESPACE );
final XmlElementDefinition workbookElementDef = schema.getElement( "workbook" );
final XmlSequenceGroup workbookContentModel = (XmlSequenceGroup) workbookElementDef.getContentModel();
final List<XmlContentModel> workbookNestedContent = workbookContentModel.getNestedContent();
assertEquals( 1, workbookNestedContent.size() );
final XmlContentModelReference shapesGroupRef = (XmlContentModelReference) workbookNestedContent.get( 0 );
final XmlGroupContentModel shapesGroup = (XmlGroupContentModel) shapesGroupRef.getContentModel();
final List<XmlContentModel> shapesGroupNestedContent = shapesGroup.getNestedContent();
assertEquals( 2, shapesGroupNestedContent.size() );
final XmlElementDefinition circleElementDef = (XmlElementDefinition) shapesGroupNestedContent.get( 0 );
final XmlSequenceGroup circleContentModel = (XmlSequenceGroup) circleElementDef.getContentModel();
final List<XmlContentModel> circleNestedContent = circleContentModel.getNestedContent();
assertEquals( "circle", circleElementDef.getName().getLocalPart() );
assertEquals( 3, circleNestedContent.size() );
assertEquals( "x", ( (XmlElementDefinition) circleNestedContent.get( 0 ) ).getName().getLocalPart() );
assertEquals( "y", ( (XmlElementDefinition) circleNestedContent.get( 1 ) ).getName().getLocalPart() );
assertEquals( "radius", ( (XmlElementDefinition) circleNestedContent.get( 2 ) ).getName().getLocalPart() );
final XmlElementDefinition rectangleElementDef = (XmlElementDefinition) shapesGroupNestedContent.get( 1 );
final XmlSequenceGroup rectangleContentModel = (XmlSequenceGroup) rectangleElementDef.getContentModel();
final List<XmlContentModel> rectangleNestedContent = rectangleContentModel.getNestedContent();
assertEquals( "rectangle", rectangleElementDef.getName().getLocalPart() );
assertEquals( 4, rectangleNestedContent.size() );
assertEquals( "x", ( (XmlElementDefinition) rectangleNestedContent.get( 0 ) ).getName().getLocalPart() );
assertEquals( "y", ( (XmlElementDefinition) rectangleNestedContent.get( 1 ) ).getName().getLocalPart() );
assertEquals( "width", ( (XmlElementDefinition) rectangleNestedContent.get( 2 ) ).getName().getLocalPart() );
assertEquals( "height", ( (XmlElementDefinition) rectangleNestedContent.get( 3 ) ).getName().getLocalPart() );
final XmlContentModel foundCircleContentModel = workbookContentModel.findChildElementContentModel( new QName( NAMESPACE, "circle" ) );
assertNotNull( foundCircleContentModel );
final XmlContentModel foundRectangleContentModel = workbookContentModel.findChildElementContentModel( new QName( NAMESPACE, "rectangle" ) );
assertNotNull( foundRectangleContentModel );
}
@Test
public void testInsertOrder() throws Exception
{
final ByteArrayResourceStore resourceStore = new ByteArrayResourceStore();
final TestXmlXsd0004Workbook workbook = TestXmlXsd0004Workbook.TYPE.instantiate( new RootXmlResource( new XmlResourceStore( resourceStore ) ) );
final TestXmlXsd0004Circle circle = workbook.getShapes().insert( TestXmlXsd0004Circle.class );
circle.setRadius( 3 );
circle.setY( 2 );
circle.setX( 1 );
final TestXmlXsd0004Rectangle rectangle = workbook.getShapes().insert( TestXmlXsd0004Rectangle.class );
rectangle.setHeight( 4 );
rectangle.setWidth( 3 );
rectangle.setY( 2 );
rectangle.setX( 1 );
workbook.resource().save();
final String result = new String( resourceStore.getContents(), UTF_8 );
assertEqualsIgnoreNewLineDiffs( loadResource( "ExpectedInsertionOrder.txt" ), result );
}
}