/* * Copyright (c) 2006, 2008 Borland Software Corporation * * 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 junit.framework.TestCase; import org.eclipse.emf.codegen.ecore.genmodel.GenClass; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory; import org.eclipse.gmf.codegen.gmfgen.GenFeatureSeqInitializer; import org.eclipse.gmf.codegen.gmfgen.GenFeatureValueSpec; import org.eclipse.gmf.codegen.gmfgen.GenReferenceNewElementSpec; import org.eclipse.gmf.codegen.gmfgen.TypeModelFacet; import org.eclipse.gmf.codegen.gmfgen.ValueExpression; import org.eclipse.gmf.internal.bridge.genmodel.GenModelMatcher; public class GenFeatureSeqInitializerTest extends TestCase { private GenModelMatcher genModelMatcher; private GenReferenceNewElementSpec newElementSpec_EClass_eReferences; private GenReferenceNewElementSpec newElementSpec_EClass_eReferences_eReferenceType; private GenFeatureSeqInitializer initializer_EClass_eReferences_eReferenceType; private GenFeatureSeqInitializer rootInitializer; private TypeModelFacet initializedModelFacet; private GenFeatureSeqInitializer initializer_EClass_eReferences; private GenFeatureValueSpec featureVal_EClass_name; private GenFeatureValueSpec featureVal_EClass_eReferences_name; private GenFeatureValueSpec featureVal_EClass_eReferences_eReferenceType_name; public GenFeatureSeqInitializerTest(String name) { super(name); } @Override protected void setUp() throws Exception { // use ecore as test model this.genModelMatcher = new GenModelMatcher(EcorePackage.eINSTANCE); initializedModelFacet = createInitializedElement(EcorePackage.eINSTANCE.getEClass()); assertNotNull(initializedModelFacet.getMetaClass()); rootInitializer = (GenFeatureSeqInitializer)initializedModelFacet.getModelElementInitializer(); featureVal_EClass_name = addFeatureValueSpec(rootInitializer, EcorePackage.eINSTANCE.getENamedElement_Name(), "'a Name'"); //$NON-NLS-1$ newElementSpec_EClass_eReferences = addNewElementSpec(rootInitializer, EcorePackage.eINSTANCE.getEClass_EReferences()); initializer_EClass_eReferences = createNewElementInitializer(newElementSpec_EClass_eReferences, null); featureVal_EClass_eReferences_name = addFeatureValueSpec(initializer_EClass_eReferences, EcorePackage.eINSTANCE.getENamedElement_Name(), "'a Name'"); //$NON-NLS-1$ newElementSpec_EClass_eReferences_eReferenceType = addNewElementSpec(initializer_EClass_eReferences, EcorePackage.eINSTANCE.getEReference_EReferenceType()); initializer_EClass_eReferences_eReferenceType = createNewElementInitializer(newElementSpec_EClass_eReferences_eReferenceType, null); featureVal_EClass_eReferences_eReferenceType_name = addFeatureValueSpec(initializer_EClass_eReferences_eReferenceType, EcorePackage.eINSTANCE.getENamedElement_Name(), "'a Name'"); //$NON-NLS-1$ } public void testStructure() throws Exception { assertNull(rootInitializer.getCreatingInitializer()); assertSame(newElementSpec_EClass_eReferences, initializer_EClass_eReferences.getCreatingInitializer()); assertSame(newElementSpec_EClass_eReferences_eReferenceType, initializer_EClass_eReferences_eReferenceType.getCreatingInitializer()); assertSame(rootInitializer, newElementSpec_EClass_eReferences.getFeatureSeqInitializer()); assertSame(initializer_EClass_eReferences, newElementSpec_EClass_eReferences_eReferenceType.getFeatureSeqInitializer()); assertTrue(rootInitializer.getInitializers().contains(newElementSpec_EClass_eReferences)); assertTrue(initializer_EClass_eReferences.getInitializers().contains(newElementSpec_EClass_eReferences_eReferenceType)); assertSame(rootInitializer, featureVal_EClass_name.getFeatureSeqInitializer()); assertSame(initializer_EClass_eReferences, featureVal_EClass_eReferences_name.getFeatureSeqInitializer()); assertSame(initializer_EClass_eReferences_eReferenceType, featureVal_EClass_eReferences_eReferenceType_name.getFeatureSeqInitializer()); assertSame(initializedModelFacet, rootInitializer.getTypeModelFacet()); assertSame(initializedModelFacet, initializer_EClass_eReferences.getTypeModelFacet()); assertSame(initializedModelFacet, initializer_EClass_eReferences_eReferenceType.getTypeModelFacet()); } public void testContext() throws Exception { assertNotNull(rootInitializer.getElementClass()); assertSame(initializedModelFacet.getMetaClass(), rootInitializer.getElementClass()); assertSame(initializer_EClass_eReferences.getElementClass(), newElementSpec_EClass_eReferences.getFeature().getTypeGenClass()); assertSame(initializer_EClass_eReferences_eReferenceType.getElementClass(), newElementSpec_EClass_eReferences_eReferenceType.getFeature().getTypeGenClass()); // test explicit context newElementSpec_EClass_eReferences_eReferenceType.setFeature(genModelMatcher.findGenFeature(EcorePackage.eINSTANCE.getETypedElement_EType())); assertSame(genModelMatcher.findGenClass(EcorePackage.eINSTANCE.getEClassifier()), initializer_EClass_eReferences_eReferenceType.getElementClass()); // downcast the context to compatible sub-class GenClass expectedEClassCtx = genModelMatcher.findGenClass(EcorePackage.eINSTANCE.getEClass()); initializer_EClass_eReferences_eReferenceType.setElementClass(expectedEClassCtx); assertSame(expectedEClassCtx, initializer_EClass_eReferences_eReferenceType.getElementClass()); // reset explicit context initializer_EClass_eReferences_eReferenceType.setElementClass(null); assertSame(genModelMatcher.findGenClass(EcorePackage.eINSTANCE.getEClassifier()), initializer_EClass_eReferences_eReferenceType.getElementClass()); } private GenFeatureSeqInitializer createNewElementInitializer(GenReferenceNewElementSpec newElementSpec, EClass elementClass) { GenFeatureSeqInitializer seqInitializer = GMFGenFactory.eINSTANCE.createGenFeatureSeqInitializer(); seqInitializer.setElementClass(genModelMatcher.findGenClass(elementClass)); newElementSpec.getNewElementInitializers().add(seqInitializer); return seqInitializer; } private GenReferenceNewElementSpec addNewElementSpec(GenFeatureSeqInitializer owningInitializer, EStructuralFeature eFeature) { GenReferenceNewElementSpec newElementSpec = GMFGenFactory.eINSTANCE.createGenReferenceNewElementSpec(); newElementSpec.setFeature(genModelMatcher.findGenFeature(eFeature)); owningInitializer.getInitializers().add(newElementSpec); return newElementSpec; } private TypeModelFacet createInitializedElement(EClass eClass) { TypeModelFacet modelFacet = GMFGenFactory.eINSTANCE.createTypeModelFacet(); modelFacet.setMetaClass(genModelMatcher.findGenClass(eClass)); GenFeatureSeqInitializer seqInitializer = GMFGenFactory.eINSTANCE.createGenFeatureSeqInitializer(); modelFacet.setModelElementInitializer(seqInitializer); return modelFacet; } public void testElementClassFeauture() throws Exception { // should be readonly for the top initializer GenClass oldVal = rootInitializer.getElementClass(); GenClass newVal = genModelMatcher.findGenClass(EcorePackage.eINSTANCE.getEAnnotation()); assertNotSame(oldVal, newVal); rootInitializer.setElementClass(newVal); assertNotSame(newVal, rootInitializer.getElementClass()); assertSame(oldVal, rootInitializer.getElementClass()); oldVal = initializer_EClass_eReferences.getElementClass(); assertNotSame(newVal, initializer_EClass_eReferences.getElementClass()); initializer_EClass_eReferences.setElementClass(newVal); assertSame(newVal, initializer_EClass_eReferences.getElementClass()); // setting null should result in the default derived from the feature type initializer_EClass_eReferences.setElementClass(null); assertSame(oldVal, initializer_EClass_eReferences.getElementClass()); } private GenFeatureValueSpec addFeatureValueSpec(GenFeatureSeqInitializer owningInitializer, EStructuralFeature eFeature, String oclBody) { GenFeatureValueSpec valueSpec = GMFGenFactory.eINSTANCE.createGenFeatureValueSpec(); ValueExpression expr = GMFGenFactory.eINSTANCE.createValueExpression(); valueSpec.setFeature(genModelMatcher.findGenFeature(eFeature)); valueSpec.setValue(expr); expr.setBody(oclBody); owningInitializer.getInitializers().add(valueSpec); return valueSpec; } }