/** * Copyright (c) 2006 Eclipse.org * * 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: * dvorak - initial API and implementation */ package org.eclipse.gmf.tests.gen; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; 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.edit.provider.IItemPropertyDescriptor; import org.eclipse.emf.edit.provider.IItemPropertySource; import org.eclipse.gmf.mappings.FeatureInitializer; import org.eclipse.gmf.mappings.FeatureSeqInitializer; import org.eclipse.gmf.mappings.FeatureValueSpec; import org.eclipse.gmf.mappings.GMFMapFactory; import org.eclipse.gmf.mappings.GMFMapPackage; import org.eclipse.gmf.mappings.MappingEntry; import org.eclipse.gmf.mappings.ReferenceNewElementSpec; import org.eclipse.gmf.mappings.provider.GMFMapItemProviderAdapterFactory; @SuppressWarnings("unchecked") public class HandcodedGMFMapItemProvidersTest extends TestCase { Resource resource; public HandcodedGMFMapItemProvidersTest(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); ResourceSet rs = new ResourceSetImpl(); URI uri = URI.createURI("uri://myResource"); //$NON-NLS-1$ this.resource = rs.getResource(uri, false); if (this.resource == null) { this.resource = rs.createResource(uri); } assertNotNull("Resource must have been created", this.resource); //$NON-NLS-1$ // add ecore metamodel as the data source for IItemPropertyDescriptor.getChoiceOfValues() rs.getResources().add(EcorePackage.eINSTANCE.eResource()); } public void testReferenceNewElementInitializer() throws Exception { EStructuralFeature feature = GMFMapPackage.eINSTANCE.getFeatureInitializer_Feature(); FeatureSeqInitializer fSeqInitializer = createRootInitializer(EcorePackage.eINSTANCE.getEClass()); ReferenceNewElementSpec featureInitializer = GMFMapFactory.eINSTANCE.createReferenceNewElementSpec(); fSeqInitializer.getInitializers().add(featureInitializer); // create new ReferenceNewElementInitializer featureInitializer.setFeature(EcorePackage.eINSTANCE.getEClass_EStructuralFeatures()); FeatureSeqInitializer newElementInitializer = GMFMapFactory.eINSTANCE.createFeatureSeqInitializer(); featureInitializer.getNewElementInitializers().add(newElementInitializer); Collection newEStructuralFeatureChoices = getChoiceOfValues(newElementInitializer, GMFMapPackage.eINSTANCE.getFeatureSeqInitializer_ElementClass()); assertConcreteSubClasses(EcorePackage.eINSTANCE.getEStructuralFeature(), newEStructuralFeatureChoices); assertEquals("Only EReference, EAttribute subclasses expected", Arrays.asList(new EClass[] { //$NON-NLS-1$ EcorePackage.eINSTANCE.getEAttribute(), EcorePackage.eINSTANCE.getEReference() }), newEStructuralFeatureChoices); FeatureValueSpec nestedFeatureValueSpec = GMFMapFactory.eINSTANCE.createFeatureValueSpec(); newElementInitializer.getInitializers().add(nestedFeatureValueSpec); newElementInitializer.setElementClass(EcorePackage.eINSTANCE.getEAttribute()); assertInitFeatures(EcorePackage.eINSTANCE.getEAttribute(), getChoiceOfValues(nestedFeatureValueSpec, feature)); newElementInitializer.setElementClass(null); assertInitFeatures(EcorePackage.eINSTANCE.getEStructuralFeature(), getChoiceOfValues(nestedFeatureValueSpec, feature)); } public void testFeatureInitializer() throws Exception { EStructuralFeature feature = GMFMapPackage.eINSTANCE.getFeatureInitializer_Feature(); FeatureSeqInitializer fSeqInitializer = createRootInitializer(EcorePackage.eINSTANCE.getEClass()); FeatureInitializer featureInitializer = GMFMapFactory.eINSTANCE.createFeatureValueSpec(); fSeqInitializer.getInitializers().add(featureInitializer); // no other choices for domain element as its derived from MappingEntry assertEquals(Collections.singleton(fSeqInitializer.getElementClass()), getChoiceOfValues(fSeqInitializer, GMFMapPackage.eINSTANCE.getFeatureSeqInitializer_ElementClass())); // test for EClass features only assertInitFeatures(EcorePackage.eINSTANCE.getEClass(), getChoiceOfValues(featureInitializer, feature)); fSeqInitializer.getMappingEntry().setDomainMetaElement(null); assertEqualsChoices("All ecore features expected for no domain element", //$NON-NLS-1$ appendNullChoice(getAllFeatures()), getChoiceOfValues(featureInitializer, feature)); } void assertInitFeatures(EClass elementClass, Collection<EStructuralFeature> featureChoices) { assertTrue("multiple features expected", featureChoices.size() > 0); //$NON-NLS-1$ for (EStructuralFeature nextFeature : featureChoices) { assertTrue("Feature must be changeable", nextFeature.isChangeable()); //$NON-NLS-1$ assertTrue("Feature must come from the element EClas", nextFeature.getEContainingClass().isSuperTypeOf(elementClass)); //$NON-NLS-1$ } } void assertConcreteSubClasses(EClass superClass, Collection<EClass> eClassChoices) { assertTrue("multiple EClasses expected", eClassChoices.size() > 0); //$NON-NLS-1$ for (EClass nextClass : eClassChoices) { assertTrue("Choice EClass must be subClass", superClass.isSuperTypeOf(nextClass)); //$NON-NLS-1$ assertTrue("Concrete EClass expected", !nextClass.isAbstract() && !nextClass.isInterface()); //$NON-NLS-1$ } } private FeatureSeqInitializer createRootInitializer(EClass domainElement) { MappingEntry mappingEntry = GMFMapFactory.eINSTANCE.createNodeMapping(); resource.getContents().add(mappingEntry); mappingEntry.setDomainMetaElement(domainElement); FeatureSeqInitializer fSeqInitializer = GMFMapFactory.eINSTANCE.createFeatureSeqInitializer(); mappingEntry.setDomainInitializer(fSeqInitializer); return fSeqInitializer; } private static void assertEqualsChoices(String msg, Collection c1, Collection c2) { assertEquals(msg, new HashSet(c1), new HashSet(c2)); } private static List<EClass> getAllEClasses() { List<EClass> allClasses = new ArrayList<EClass>(); for (Iterator it = EcorePackage.eINSTANCE.getEClassifiers().iterator(); it.hasNext();) { EClassifier nextClassifier = (EClassifier) it.next(); if(nextClassifier instanceof EClass) { allClasses.add((EClass)nextClassifier); } } return allClasses; } private List<EStructuralFeature> getAllFeatures() { List<EStructuralFeature> featList = new ArrayList<EStructuralFeature>(); for (EClass eClass : getAllEClasses()) { featList.addAll(eClass.getEStructuralFeatures()); } return featList; } private static <T> Collection<T> appendNullChoice(Collection<T> choices) { assertFalse(choices.contains(null)); Collection<T> allWithNull = new ArrayList<T>(choices); allWithNull.add(null); return allWithNull; } private static Collection getChoiceOfValues(EObject object, EStructuralFeature featureToSet) { IItemPropertySource propertySource = (IItemPropertySource)new GMFMapItemProviderAdapterFactory().adapt(object, IItemPropertySource.class); IItemPropertyDescriptor propertyDescriptor = null; for (Iterator it = propertySource.getPropertyDescriptors(object).iterator(); it.hasNext();) { IItemPropertyDescriptor nextDescriptor = (IItemPropertyDescriptor) it.next(); if(nextDescriptor.getFeature(object) == featureToSet) { propertyDescriptor = nextDescriptor; } } assertNotNull("Property descriptor for " + featureToSet + " must exist", propertyDescriptor); //$NON-NLS-1$ //$NON-NLS-2$ return propertyDescriptor.getChoiceOfValues(object); } }