/**
* Copyright (c) 2004-2007 IBM Corporation and others.
* 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:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.test.core.ecore;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.StringWriter;
import java.util.Collections;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.emf.test.models.key.Item;
import org.eclipse.emf.test.models.key.KeyFactory;
import org.eclipse.emf.test.models.key.KeyPackage;
import org.eclipse.emf.test.models.key.Root;
public class KeyTest extends TestCase
{
private static final String TEMP_FILE_DIR = "/home/tmp/";
private static final boolean SYSOUT = false;
public KeyTest(String name)
{
super(name);
}
public static Test suite()
{
TestSuite ts = new TestSuite("KeyTest");
ts.addTest(new KeyTest("testModel"));
ts.addTest(new KeyTest("testSaveAndLoad"));
ts.addTest(new KeyTest("testConstraint"));
return ts;
}
public void testModel() throws Exception
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(KeyPackage.eNS_URI, KeyPackage.eINSTANCE);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMLResourceFactoryImpl());
Resource resource1 = resourceSet.createResource(URI.createURI("http:///My.key"));
Root root = KeyFactory.eINSTANCE.createRoot();
Item itemAXY = KeyFactory.eINSTANCE.createItem();
itemAXY.setName("a");
itemAXY.getSignature().add("org.eclipse.example.X");
itemAXY.getSignature().add("org.eclipse.example.Y");
itemAXY.getRelatedItems().add(itemAXY);
root.getItems().add(itemAXY);
{
Item x = KeyFactory.eINSTANCE.createItem();
x.setName("a b");
x.getSignature().add("\'\"#, % {} []/ org.eclipse.example.X");
x.getSignature().add("org.eclipse.example.Y");
x.getRelatedItems().add(x);
root.getItems().add(x);
}
{
Item x = KeyFactory.eINSTANCE.createItem();
x.getRelatedItems().add(x);
root.getItems().add(x);
}
{
Item x = KeyFactory.eINSTANCE.createItem();
x.getRelatedItems().add(x);
x.getSignature().add("org.eclipse.example.Y");
root.getItems().add(x);
}
{
Item x = KeyFactory.eINSTANCE.createItem();
x.getRelatedItems().add(x);
x.getSignature().add(null);
x.getSignature().add("");
x.getSignature().add(null);
root.getItems().add(x);
}
resource1.getContents().add(root);
if (SYSOUT) resource1.save(System.out, null);
StringWriter out1 = new StringWriter();
resource1.save(new URIConverter.WriteableOutputStream(out1, "UTF-8"), null);
Resource resource2 = resourceSet.createResource(URI.createURI("http://My2.key"));
resource2.load(new URIConverter.ReadableInputStream(out1.toString()), null);
if (SYSOUT) resource2.save(System.err, null);
StringWriter out2 = new StringWriter();
resource2.save(new URIConverter.WriteableOutputStream(out2, "UTF-8"), null);
assertEquals(out1.toString(), out2.toString());
}
public void testSaveAndLoad() throws Exception
{
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("pack");
pack.setNsURI("packNSURI");
EClass class1 = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(class1);
class1.setName("class1");
EAttribute att0 = EcoreFactory.eINSTANCE.createEAttribute();
class1.getEStructuralFeatures().add(att0);
att0.setName("att0");
att0.setEType(EcorePackage.Literals.ESTRING);
EClass class2 = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(class2);
class2.setName("class2");
EAttribute att1 = EcoreFactory.eINSTANCE.createEAttribute();
class2.getEStructuralFeatures().add(att1);
att1.setName("att1");
att1.setEType(EcorePackage.Literals.ESTRING);
EAttribute att2 = EcoreFactory.eINSTANCE.createEAttribute();
class2.getEStructuralFeatures().add(att2);
att2.setName("att2");
att2.setEType(EcorePackage.Literals.ESTRING);
EClass class3 = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(class3);
class3.getESuperTypes().add(class2);
class3.setName("class3");
EAttribute att3ID = EcoreFactory.eINSTANCE.createEAttribute();
class3.getEStructuralFeatures().add(att3ID);
att3ID.setName("att3");
att3ID.setID(true);
att3ID.setEType(EcorePackage.Literals.ESTRING);
EReference singleReference = EcoreFactory.eINSTANCE.createEReference();
class1.getEStructuralFeatures().add(singleReference);
singleReference.setEType(class2);
singleReference.setName("SingleReference1");
EReference multiReference = EcoreFactory.eINSTANCE.createEReference();
class1.getEStructuralFeatures().add(multiReference);
multiReference.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
multiReference.setEType(class2);
multiReference.setName("multiReference1");
EReference containmentMultiReference = EcoreFactory.eINSTANCE.createEReference();
class2.getEStructuralFeatures().add(containmentMultiReference);
containmentMultiReference.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
containmentMultiReference.setEType(class2);
containmentMultiReference.setName("containmentMultiReference1");
containmentMultiReference.setContainment(true);
EReference containmentMultiKeyReference = EcoreFactory.eINSTANCE.createEReference();
class2.getEStructuralFeatures().add(containmentMultiKeyReference);
containmentMultiKeyReference.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
containmentMultiKeyReference.setEType(class2);
containmentMultiKeyReference.setName("containmentMultiReference2");
containmentMultiKeyReference.setContainment(true);
containmentMultiKeyReference.getEKeys().add(att1);
containmentMultiKeyReference.getEKeys().add(att2);
EObject obj21 = pack.getEFactoryInstance().create(class2);
obj21.eSet(att1, "obj21.att1");
obj21.eSet(att2, "obj21.att2");
EObject obj22 = pack.getEFactoryInstance().create(class2);
obj22.eSet(att1, "obj22.att1 % / \\");
EObject obj23 = pack.getEFactoryInstance().create(class2);
obj23.eSet(att2, "obj23.att2");
EObject obj24 = pack.getEFactoryInstance().create(class2);
obj24.eSet(att1, "obj24.att1");
obj24.eSet(att2, "obj24.att2");
//
EObject obj31 = pack.getEFactoryInstance().create(class3);
obj31.eSet(att1, "obj31.att1");
obj31.eSet(att2, "obj31.att2");
obj31.eSet(att3ID, "obj31.att3ID");
EObject obj32 = pack.getEFactoryInstance().create(class3);
obj32.eSet(att3ID, "obj32.att3ID");
EObject obj33 = pack.getEFactoryInstance().create(class3);
obj33.eSet(att1, "obj33.att1");
obj33.eSet(att2, "obj33.att2");
EObject obj34 = pack.getEFactoryInstance().create(class3);
obj34.eSet(att1, "obj34.att1");
obj34.eSet(att3ID, "obj34.att3ID");
EObject obj35 = pack.getEFactoryInstance().create(class3);
obj35.eSet(att1, "obj35.att1");
obj35.eSet(att2, "obj35.att2");
EObject obj36 = pack.getEFactoryInstance().create(class3);
obj36.eSet(att1, "obj36.att1");
@SuppressWarnings("unchecked")
List<EObject> list21MKR = ((List<EObject>)obj21.eGet(containmentMultiKeyReference));
list21MKR.add(obj22);
list21MKR.add(obj23);
list21MKR.add(obj24);
@SuppressWarnings("unchecked")
List<EObject> list31MKR = ((List<EObject>)obj31.eGet(containmentMultiKeyReference));
list31MKR.add(obj32);
list31MKR.add(obj33);
list31MKR.add(obj34);
@SuppressWarnings("unchecked")
List<EObject> list31MR = ((List<EObject>)obj31.eGet(containmentMultiReference));
list31MR.add(obj35);
list31MR.add(obj36);
EObject obj11 = pack.getEFactoryInstance().create(class1);
obj11.eSet(att0, "obj11.att0");
obj11.eSet(singleReference, obj23);
@SuppressWarnings("unchecked")
List<EObject> list11MR = ((List<EObject>)obj11.eGet(multiReference));
list11MR.add(obj21);
list11MR.add(obj22);
list11MR.add(obj23);
list11MR.add(obj24);
list11MR.add(obj31);
list11MR.add(obj32);
list11MR.add(obj33);
list11MR.add(obj34);
list11MR.add(obj35);
list11MR.add(obj36);
Resource resource1 = new XMLResourceImpl(URI.createFileURI(TEMP_FILE_DIR + "foo1.xml"));
resource1.getContents().add(obj11);
Resource resource2 = new XMIResourceImpl(URI.createFileURI(TEMP_FILE_DIR + "foo2.xmi"));
resource2.getContents().add(obj21);
resource2.getContents().add(obj31);
String content1 = getResourceText(resource1);
String content2 = getResourceText(resource2);
if (SYSOUT)
{
System.out.println("======");
System.out.println(content1);
System.out.println("\n\n======\n");
System.out.println(content2);
System.out.println("\n\n======\n");
}
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(pack.getNsURI(), pack);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml", new XMLResourceFactoryImpl());
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
Resource loadedResource1 = resourceSet.createResource(URI.createFileURI(TEMP_FILE_DIR + "foo1.xml"));
loadedResource1.load(new ByteArrayInputStream(content1.getBytes()), Collections.EMPTY_MAP);
Resource loadedResource2 = resourceSet.createResource(URI.createFileURI(TEMP_FILE_DIR + "foo2.xmi"));
loadedResource2.load(new ByteArrayInputStream(content2.getBytes()), Collections.EMPTY_MAP);
EObject loadedObj21 = loadedResource2.getContents().get(0);
assertEquals(obj21.eGet(att1), loadedObj21.eGet(att1));
assertEquals(obj21.eGet(att2), loadedObj21.eGet(att2));
EObject loadedObj22 = (EObject)((List<?>)loadedObj21.eGet(containmentMultiKeyReference)).get(0);
assertEquals(obj22.eGet(att1), loadedObj22.eGet(att1));
assertEquals(obj22.eGet(att2), loadedObj22.eGet(att2));
EObject loadedObj23 = (EObject)((List<?>)loadedObj21.eGet(containmentMultiKeyReference)).get(1);
assertEquals(obj23.eGet(att1), loadedObj23.eGet(att1));
assertEquals(obj23.eGet(att2), loadedObj23.eGet(att2));
EObject loadedObj24 = (EObject)((List<?>)loadedObj21.eGet(containmentMultiKeyReference)).get(2);
assertEquals(obj24.eGet(att1), loadedObj24.eGet(att1));
assertEquals(obj24.eGet(att2), loadedObj24.eGet(att2));
EObject loadedObj31 = loadedResource2.getContents().get(1);
assertEquals(obj31.eGet(att1), loadedObj31.eGet(att1));
assertEquals(obj31.eGet(att2), loadedObj31.eGet(att2));
assertEquals(obj31.eGet(att3ID), loadedObj31.eGet(att3ID));
EObject loadedObj32 = (EObject)((List<?>)loadedObj31.eGet(containmentMultiKeyReference)).get(0);
assertEquals(obj32.eGet(att1), loadedObj32.eGet(att1));
assertEquals(obj32.eGet(att2), loadedObj32.eGet(att2));
assertEquals(obj32.eGet(att3ID), loadedObj32.eGet(att3ID));
EObject loadedObj33 = (EObject)((List<?>)loadedObj31.eGet(containmentMultiKeyReference)).get(1);
assertEquals(obj33.eGet(att1), loadedObj33.eGet(att1));
assertEquals(obj33.eGet(att2), loadedObj33.eGet(att2));
assertEquals(obj33.eGet(att3ID), loadedObj33.eGet(att3ID));
EObject loadedObj34 = (EObject)((List<?>)loadedObj31.eGet(containmentMultiKeyReference)).get(2);
assertEquals(obj34.eGet(att1), loadedObj34.eGet(att1));
assertEquals(obj34.eGet(att2), loadedObj34.eGet(att2));
assertEquals(obj34.eGet(att3ID), loadedObj34.eGet(att3ID));
EObject loadedObj35 = (EObject)((List<?>)loadedObj31.eGet(containmentMultiReference)).get(0);
assertEquals(obj35.eGet(att1), loadedObj35.eGet(att1));
assertEquals(obj35.eGet(att2), loadedObj35.eGet(att2));
assertEquals(obj35.eGet(att3ID), loadedObj35.eGet(att3ID));
EObject loadedObj36 = (EObject)((List<?>)loadedObj31.eGet(containmentMultiReference)).get(1);
assertEquals(obj36.eGet(att1), loadedObj36.eGet(att1));
assertEquals(obj36.eGet(att2), loadedObj36.eGet(att2));
assertEquals(obj36.eGet(att3ID), loadedObj36.eGet(att3ID));
EObject loadedObj11 = loadedResource1.getContents().get(0);
assertEquals(obj11.eGet(att0), loadedObj11.eGet(att0));
assertEquals(loadedObj23, loadedObj11.eGet(singleReference));
assertEquals(loadedObj21, ((List<?>)loadedObj11.eGet(multiReference)).get(0));
assertEquals(loadedObj22, ((List<?>)loadedObj11.eGet(multiReference)).get(1));
assertEquals(loadedObj23, ((List<?>)loadedObj11.eGet(multiReference)).get(2));
assertEquals(loadedObj24, ((List<?>)loadedObj11.eGet(multiReference)).get(3));
assertEquals(loadedObj31, ((List<?>)loadedObj11.eGet(multiReference)).get(4));
assertEquals(loadedObj32, ((List<?>)loadedObj11.eGet(multiReference)).get(5));
assertEquals(loadedObj33, ((List<?>)loadedObj11.eGet(multiReference)).get(6));
assertEquals(loadedObj34, ((List<?>)loadedObj11.eGet(multiReference)).get(7));
assertEquals(loadedObj35, ((List<?>)loadedObj11.eGet(multiReference)).get(8));
assertEquals(loadedObj36, ((List<?>)loadedObj11.eGet(multiReference)).get(9));
}
protected String getResourceText(Resource resource) throws Exception
{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
resource.save(outputStream, Collections.EMPTY_MAP);
return new String(outputStream.toByteArray());
}
public void testConstraint()
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(KeyPackage.eNS_URI, KeyPackage.eINSTANCE);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMLResourceFactoryImpl());
Resource resource = resourceSet.createResource(URI.createURI("http:///My.key"));
Root root = KeyFactory.eINSTANCE.createRoot();
{
Item item = KeyFactory.eINSTANCE.createItem();
root.getItems().add(item);
}
{
Item itemA = KeyFactory.eINSTANCE.createItem();
itemA.setName("a");
root.getItems().add(itemA);
}
{
Item itemAXY = KeyFactory.eINSTANCE.createItem();
itemAXY.setName("a");
itemAXY.getSignature().add("org.eclipse.example.X");
itemAXY.getSignature().add("org.eclipse.example.Y");
itemAXY.getRelatedItems().add(itemAXY);
root.getItems().add(itemAXY);
}
{
Item itemAX = KeyFactory.eINSTANCE.createItem();
itemAX.setName("a");
itemAX.getSignature().add("org.eclipse.example.X");
itemAX.getRelatedItems().add(itemAX);
root.getItems().add(itemAX);
}
{
Item itemANull = KeyFactory.eINSTANCE.createItem();
itemANull.setName("a");
itemANull.getSignature().add(null);
root.getItems().add(itemANull);
}
{
Item itemA = KeyFactory.eINSTANCE.createItem();
itemA.setName("a");
root.getItems().add(itemA);
}
resource.getContents().add(root);
Diagnostic diagnostic = Diagnostician.INSTANCE.validate(root);
assertEquals(diagnostic.getSeverity(), Diagnostic.ERROR);
assertEquals(diagnostic.getChildren().size(), 1);
if (SYSOUT) System.err.println(diagnostic.getChildren().get(0));
}
}