blob: 28ec410725a7c2bec6a68ff8ed1988f8ea946cd2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Bros (Mia-Software)
* Grégoire Dupé (Mia-Software) - Bug 471096 - MetaclassInstance features have to be moved to an EMF dedicated plug-in
*******************************************************************************/
package org.eclipse.modisco.infra.common.core.tests;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
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.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.modisco.util.emf.core.internal.allinstances.MetaclassInstances;
import org.eclipse.modisco.util.emf.core.internal.allinstances.MetaclassInstancesAdapterFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@SuppressWarnings("nls")
public class MetaclassInstancesTest {
private MetaclassInstances metaclassInstances;
private Resource resource;
@Before
public void setUp() throws Exception {
ResourceSet resourceSet = new ResourceSetImpl();
this.resource = resourceSet
.createResource(URI
.createURI("http://org.eclipse.modisco.infra.common.core.internal.tests/test.ecore"));
this.metaclassInstances = (MetaclassInstances) MetaclassInstancesAdapterFactory
.getInstance().adapt(this.resource, MetaclassInstances.class);
}
@Test
public void testNonExisting() {
Assert.assertNotNull(this.metaclassInstances);
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.EENUM, true);
Assert.assertTrue(instances.isEmpty());
}
@Test
public void testCreateClass() {
EClass someClass = EcoreFactory.eINSTANCE.createEClass();
someClass.setName("MyClass");
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.ECLASS, true);
Assert.assertTrue(instances.isEmpty());
this.resource.getContents().add(someClass);
assertContainsMyClass();
}
@Test
public void testCreateAttribute() {
EClass someClass = EcoreFactory.eINSTANCE.createEClass();
this.resource.getContents().add(someClass);
EAttribute companyName = EcoreFactory.eINSTANCE.createEAttribute();
companyName.setName("myAttribute");
someClass.getEStructuralFeatures().add(companyName);
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.EATTRIBUTE, false);
Assert.assertTrue(instances.size() == 1);
EObject eObject = instances.iterator().next();
Assert.assertTrue(eObject instanceof EAttribute);
EAttribute eAttribute = (EAttribute) eObject;
Assert.assertTrue(eAttribute.getName().equals("myAttribute"));
}
@Test
public void testWithPackageAndClasses() {
EPackage aPackage = EcoreFactory.eINSTANCE.createEPackage();
this.resource.getContents().add(aPackage);
aPackage.setName("aPackage");
aPackage.setNsPrefix("aPackage");
aPackage.setNsURI("http:///aPackage");
EClass class1 = EcoreFactory.eINSTANCE.createEClass();
EClass class2 = EcoreFactory.eINSTANCE.createEClass();
EClass class3 = EcoreFactory.eINSTANCE.createEClass();
aPackage.getEClassifiers().add(class1);
aPackage.getEClassifiers().add(class2);
aPackage.getEClassifiers().add(class3);
assertionsForPackageAndClasses();
this.metaclassInstances.clearCache();
assertionsForPackageAndClasses();
}
@SuppressWarnings("unchecked")
@Test
public void testWithPackageAndClasses2() {
EPackage aPackage = EcoreFactory.eINSTANCE.createEPackage();
aPackage.setName("aPackage");
aPackage.setNsPrefix("aPackage");
aPackage.setNsURI("http:///aPackage");
EClass class1 = EcoreFactory.eINSTANCE.createEClass();
EClass class2 = EcoreFactory.eINSTANCE.createEClass();
EClass class3 = EcoreFactory.eINSTANCE.createEClass();
EReference ePackageEClassifiers = EcorePackage.eINSTANCE.getEPackage_EClassifiers();
EList<EClassifier> classifiers = (EList<EClassifier>) aPackage.eGet(ePackageEClassifiers);
classifiers.add(class1);
aPackage.getEClassifiers().add(class2);
classifiers.add(class3);
this.resource.getContents().add(aPackage);
assertionsForPackageAndClasses();
this.metaclassInstances.clearCache();
assertionsForPackageAndClasses();
}
private void assertionsForPackageAndClasses() {
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.EPACKAGE, false);
Assert.assertTrue(instances.size() == 1);
instances = this.metaclassInstances.getInstances(EcorePackage.Literals.EPACKAGE, true);
Assert.assertTrue(instances.size() == 1);
final int nExpectedInstances = 3;
instances = this.metaclassInstances.getInstances(EcorePackage.Literals.ECLASS, true);
Assert.assertTrue(instances.size() == nExpectedInstances);
instances = this.metaclassInstances.getInstances(EcorePackage.Literals.ECLASS, false);
Assert.assertTrue(instances.size() == nExpectedInstances);
}
@Test
public void testRemoveClassAtRoot() {
EClass someClass = EcoreFactory.eINSTANCE.createEClass();
someClass.setName("MyClass");
this.resource.getContents().add(someClass);
assertContainsMyClass();
this.resource.getContents().remove(someClass);
assertNoClass();
}
@Test
public void testRemoveClassUnderPackage() {
EPackage aPackage = EcoreFactory.eINSTANCE.createEPackage();
this.resource.getContents().add(aPackage);
EClass myClass = EcoreFactory.eINSTANCE.createEClass();
myClass.setName("MyClass");
aPackage.getEClassifiers().add(myClass);
assertContainsMyClass();
EcoreUtil.remove(myClass);
assertNoClass();
aPackage.getEClassifiers().add(myClass);
assertContainsMyClass();
aPackage.getEClassifiers().remove(myClass);
assertNoClass();
}
private void assertNoClass() {
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.ECLASS, false);
Assert.assertTrue(instances.size() == 0);
}
private void assertContainsMyClass() {
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.ECLASS, false);
Assert.assertTrue(instances.size() == 1);
EObject eObject = instances.iterator().next();
Assert.assertTrue(eObject instanceof EClass);
EClass eClass = (EClass) eObject;
Assert.assertTrue(eClass.getName().equals("MyClass"));
}
@Test
public void testSubInstances() {
EPackage aPackage = EcoreFactory.eINSTANCE.createEPackage();
this.resource.getContents().add(aPackage);
EClass myClass = EcoreFactory.eINSTANCE.createEClass();
myClass.setName("MyClass");
aPackage.getEClassifiers().add(myClass);
EDataType myDataType = EcoreFactory.eINSTANCE.createEDataType();
myDataType.setName("MyDataType");
aPackage.getEClassifiers().add(myDataType);
Collection<EObject> instances = this.metaclassInstances.getInstances(
EcorePackage.Literals.ECLASSIFIER, false);
Assert.assertTrue(instances.size() == 0);
instances = this.metaclassInstances.getInstances(EcorePackage.Literals.ECLASSIFIER, true);
Assert.assertTrue(instances.size() == 2);
Iterator<EObject> iterator = instances.iterator();
EObject eObject = iterator.next();
Assert.assertTrue(eObject instanceof EClass);
EClass eClass = (EClass) eObject;
Assert.assertTrue(eClass.getName().equals("MyClass"));
eObject = iterator.next();
Assert.assertTrue(eObject instanceof EDataType);
EDataType eDataType = (EDataType) eObject;
Assert.assertTrue(eDataType.getName().equals("MyDataType"));
}
}