package com.sap.runlet.expressionpad.failing;
import java.util.Set;
import junit.framework.TestCase;
import com.sap.ap.metamodel.utils.MetamodelUtils;
import com.sap.runlet.abstractexpressionpad.Evaluator;
import com.sap.tc.moin.repository.Connection;
import com.sap.tc.moin.repository.LRI;
import com.sap.tc.moin.repository.MRI;
import com.sap.tc.moin.repository.events.type.LinkRemoveEvent;
import com.sap.tc.moin.repository.mmi.reflect.RefFeatured;
import com.sap.tc.moin.repository.mmi.reflect.RefObject;
import com.sap.tc.moin.repository.ocl.freestyle.OclExpressionRegistration;
import com.sap.tc.moin.repository.ocl.notification.OclManagerException;
import data.classes.AElementsOfTypeClazz;
import data.classes.ClassTypeDefinition;
import data.classes.SapClass;
import dataaccess.expressions.MethodCallExpression;
public class RunletOclIaTests extends TestCase {
private Connection connection;
private Connection getConnection() {
return connection;
}
protected void setUp() {
connection = Evaluator.getResourceSet("ngpm.stdlib");
}
/**
* self.object.getType().getInnermost().oclAsType(data::classes::ClassTypeDefinition).clazz.allSignatures()->select(s | s.name = '__TEXT___')
*/
public void testAnalysisOfRecursiveOperationWithSelfAndSyntheticEvent() throws OclManagerException {
final OclExpressionRegistration registration = MetamodelUtils
.createOclExpression(
connection,
"testAnalysisOfRecursiveOperationWithSelf",
"self.object.getType().getInnermost().oclAsType(data::classes::ClassTypeDefinition).clazz.allSignatures()->select(s | s.name = '__TEXT___')", MethodCallExpression.CLASS_DESCRIPTOR);
final SapClass numberClass = MetamodelUtils.findClass(getConnection(), "Number");
String facilityId = numberClass.get___Mri().getLri().getDataAreaDescriptor().getFacilityId();
final ClassTypeDefinition ctd = (ClassTypeDefinition) connection.getElement(connection.getSession().getMoin()
.getFacilityById(facilityId).getRIFactory().createLri(
numberClass.get___Mri().getLri().getDataAreaDescriptor().getDataAreaName(),
"E016575C85CC9470B83811DEAFF1001CBF0234BB"));
LinkRemoveEvent lre = new LinkRemoveEvent() {
@Override
public RefFeatured getAffectedMetaObject(Connection resolvingConnection) {
return resolvingConnection.getAssociation(AElementsOfTypeClazz.ASSOCIATION_DESCRIPTOR).refMetaObject();
}
@Override
public MRI getAffectedMetaObjectMri() {
return getAffectedMetaObject(getConnection()).get___Mri();
}
@Override
public RefObject getFirstLinkEnd(Connection resolvingConnection) {
return ctd;
}
@Override
public MRI getFirstLinkEndMri() {
return ctd.get___Mri();
}
@Override
public LRI getNonStoredLinkEndLri() {
return getFirstLinkEndMri().getLri();
}
@Override
public int getPosition() {
return -1;
}
@Override
public RefObject getSecondLinkEnd(Connection resolvingConnection) {
return numberClass;
}
@Override
public MRI getSecondLinkEndMri() {
return getSecondLinkEnd(getConnection()).get___Mri();
}
@Override
public MRI getStoredLinkEndMri() {
return getSecondLinkEndMri();
}
@Override
public Connection getEventTriggerConnection() {
return getConnection();
}
@Override
public void veto(String reason) {
throw new RuntimeException("Veto: " + reason);
}
};
Set<MRI> affectedElements = registration.getAffectedModelElements(lre, getConnection());
// no elements are expected to be affected; the ClassTypeDefinition marks the output
// of the "t0" MethodSignature on the output multiplicity test class. The OCL expression,
// however, only considers ObjectBasedExpression elements.
// FIXME we're currently getting 191 results here; check if this was to be expected...
assertEquals(0, affectedElements.size());
}
}