package com.sap.ide.cts.editor.ocliatests; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Set; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.eclipse.emf.common.util.URI; import org.junit.Before; import org.junit.Test; import behavioral.events.EventFilter; import com.sap.ap.metamodel.utils.MetamodelUtils; import com.sap.furcas.metamodel.TCS.ConcreteSyntax; import com.sap.furcas.test.base.StandaloneConnectionBasedTest; import com.sap.furcas.test.util.TcsTestHelper; import data.classes.Association; import data.classes.AssociationEnd; import data.classes.ClassTypeDefinition; import data.classes.SapClass; public class FailingOclIaTest extends StandaloneConnectionBasedTest { @Before public void initParsingHandlerAndSetupInstanceScopeAnalysis() { // create tcs Syntax ConcreteSyntax tcsSyntax = TcsTestHelper.createTcsSyntaxMappingOnConnection(connection); assertNotNull(tcsSyntax); } @Test public void testDelegatesTo() throws OclManagerException { final OclExpressionRegistration registration = MetamodelUtils.createOclExpression(connection, "testDelegatesTo", "self.delegatesTo()", SapClass.CLASS_DESCRIPTOR); SapClass a = connection.createElement(SapClass.CLASS_DESCRIPTOR); a.setName("A"); SapClass b = connection.createElement(SapClass.CLASS_DESCRIPTOR); b.setName("B"); AssociationEnd aeA = connection.createElement(AssociationEnd.CLASS_DESCRIPTOR); aeA.setName("a"); ClassTypeDefinition aCtd = MetamodelUtils.createClassTypeDefinitionExactlyOne(connection, a); aeA.setType(aCtd); AssociationEnd aeB = connection.createElement(AssociationEnd.CLASS_DESCRIPTOR); aeB.setName("b"); ClassTypeDefinition bCtd = MetamodelUtils.createClassTypeDefinitionExactlyOne(connection, b); Association assoc = connection.createElement(Association.CLASS_DESCRIPTOR); assoc.getEnds().add(aeA); assoc.getEnds().add(aeB); EventFilter eventFilter = registration.getEventFilter(/* notifyNewContextElement */ false); final boolean[] ok = new boolean[1]; ChangeListener listener = new ChangeListener() { @Override public void notify(ChangeEvent event) { // FIXME currently it seems that when getAssociationEnds() correctly is triggered, the "look to right" doesn't find out that otherEnd()->select(delegation->notEmpty()) evaluates to an empty set; why??? Set<URI> affectedElements = registration.getAffectedModelElements((ModelChangeEvent) event, connection); // since no association end is delegating, ideally there would be no impact on delegatesTo on either end ok[0] = affectedElements.size() == 0; } }; connection.getEventRegistry().registerListener(listener, eventFilter); aeB.setType(bCtd); try { assertTrue(ok[0]); } finally { connection.getEventRegistry().deregister(listener); } } }