package com.sap.furcas.modeladaptation.emf.lookup;
import static com.sap.furcas.test.testutils.ResolutionBeanHelper.refM;
import static com.sap.furcas.test.testutils.StringListHelper.list;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.junit.Before;
import org.junit.Test;
import com.sap.furcas.emf.stubs.EcoreAnyStub;
import com.sap.furcas.metamodel.FURCAS.TCS.TCSPackage;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.ClassTemplateStub;
import com.sap.furcas.runtime.common.interfaces.IMetaModelLookup;
import com.sap.furcas.runtime.common.interfaces.ResolvedNameAndReferenceBean;
import com.sap.furcas.test.testutils.ResourceTestHelper;
import com.sap.furcas.test.testutils.StringListHelper;
public class TestQueryBasedEcoreMetaModelLookUp {
private static IMetaModelLookup<EObject> lookup = null;
@Before
public void setup() throws Exception {
Set<URI> referenceScope = ResourceTestHelper.createFURCASReferenceScope();
referenceScope.addAll(ResourceTestHelper.createEcoreReferenceScope());
lookup = new QueryBasedEcoreMetaModelLookUp(ResourceTestHelper.createResourceSet(), referenceScope);
}
@Test
public void testFilterEClassifierList() throws Exception {
List<String> qualifiedNameOfType = StringListHelper.list("package", "rightclass");
List<EClassifier> expectedResult = new ArrayList<EClassifier>();
List<EClassifier> inputEClassifiers = new ArrayList<EClassifier>();
EcoreAnyStub classi3 = new EcoreAnyStub();
classi3.name = "wrongclass"; // stub adds "package" in qualifiedname
inputEClassifiers.add(classi3);
EcoreAnyStub classi2 = new EcoreAnyStub();
classi2.name = "rightclass"; // stub adds "package" in qualifiedname
inputEClassifiers.add(classi2);
expectedResult.add(classi2);
EcoreAnyStub classi5 = new EcoreAnyStub();
classi5.name = "wrongclass"; // stub adds "package" in qualifiedname
inputEClassifiers.add(classi5);
EcoreAnyStub classi = new EcoreAnyStub();
classi.name = "rightclass"; // stub adds "package" in qualifiedname
inputEClassifiers.add(classi);
expectedResult.add(classi);
EcoreAnyStub classi6 = new EcoreAnyStub();
classi6.name = "wrongclass"; // stub adds "package" in qualifiedname
inputEClassifiers.add(classi6);
List<EClassifier> result = QueryBasedEcoreMetaModelLookUp.filterClassifiers(qualifiedNameOfType, inputEClassifiers);
assertEquals(expectedResult, result);
}
@Test
public void testGetPrimitiveClasses() throws Exception {
// failure here indicates that the PRI for PrimitiveTypes has not been included in query
assertNotNull(lookup.resolveReference(list("ecore", "EString")));
assertNotNull(lookup.resolveReference(list("ecore", "EIntegerObject")));
assertNotNull(lookup.resolveReference(list("ecore", "EBoolean")));
assertNotNull(lookup.resolveReference(list("ecore", "ELongObject")));
assertNotNull(lookup.resolveReference(list("ecore", "EInt")));
assertNotNull(lookup.resolveReference(list("ecore", "ELong")));
}
@Test
public void testGetClasses() throws Exception {
assertNotNull(lookup.resolveReference(list("FURCAS", "TCS", "ConcreteSyntax")));
assertNotNull(lookup.resolveReference(list("FURCAS", "TCS", "Template")));
assertNotNull(lookup.resolveReference(list("FURCAS", "TCS", "Keyword")));
assertNotNull(lookup.resolveReference(StringListHelper.list("FURCAS", "TCS", "ClassTemplate")));
assertNotNull(lookup.resolveReference(list("FURCAS", "TCS", "Token")));
assertNotNull(lookup.resolveReference(list("FURCAS", "TCS", "PrimitiveTemplate")));
assertNull(lookup.resolveReference(list("FURCAS", "TCS", "Classifier")));
assertNull(lookup.resolveReference(list("FURCAS", "TCS", "XYZ")));
assertNull(lookup.resolveReference(list("FURCAS", "TCS", "Year123")));
assertNull(lookup.resolveReference(list("")));
// assertFalse(lookup.resolveReference(null));
}
@Test
public void testHasFeature() throws Exception {
assertNotNull(lookup.getMultiplicity(refM("FURCAS", "TCS", "ConcreteSyntax"), "k"));
assertNull(lookup.getMultiplicity(refM("FURCAS", "TCS", "Template"), "something"));
}
@Test
public void testGetDirectSubTypes() throws Exception {
List<ResolvedNameAndReferenceBean<EObject>> subTypes = new ArrayList<ResolvedNameAndReferenceBean<EObject>>();
subTypes.add(refM("FURCAS", "TCS", "FunctionTemplate"));
subTypes.add(refM("FURCAS", "TCS", "PrimitiveTemplate"));
subTypes.add(refM("FURCAS", "TCS", "ContextTemplate"));
subTypes.add(refM("FURCAS", "TCS", "EnumerationTemplate"));
ResolvedNameAndReferenceBean<EObject> template = lookup.resolveReference(Arrays.asList("FURCAS", "TCS", "Template"));
List<ResolvedNameAndReferenceBean<EObject>> caluclatedSubTypes = lookup.getDirectSubTypes(template);
assertTrue(caluclatedSubTypes.containsAll(subTypes));
assertTrue(subTypes.containsAll(caluclatedSubTypes));
}
@Test
public void testHasFeatureForAssociationEnds() throws Exception {
assertNotNull(lookup.getMultiplicity(refM("FURCAS", "TCS", "Template"), "concreteSyntax"));
assertNull(lookup.getMultiplicity(refM("FURCAS", "TCS", "Template"), "entriesXYZ"));
}
@Test
public void testGetMultiplicity() throws Exception {
assertNotNull(lookup.getMultiplicity(refM("FURCAS", "TCS", "ConcreteSyntax"), "templates"));
assertEquals(true, lookup.getMultiplicity(refM("FURCAS", "TCS", "ConcreteSyntax"), "templates").isOptional());
assertEquals(true, lookup.getMultiplicity(refM("FURCAS", "TCS", "ConcreteSyntax"), "templates").isMultiple());
assertEquals(false, lookup.getMultiplicity(refM("FURCAS", "TCS", "ClassTemplate"), "isMain").isOptional());
assertEquals(false, lookup.getMultiplicity(refM("FURCAS", "TCS", "ClassTemplate"), "isMain").isMultiple());
assertNull(lookup.getMultiplicity(refM("blabla"), "xyz"));
}
@Test
public void testGetTypeClass() throws Exception {
assertEquals(refM("FURCAS", "TCS", "Template"), lookup.getFeatureClassReference(refM("FURCAS", "TCS", "ConcreteSyntax"), "templates"));
assertEquals(refM("FURCAS", "TCS", "Sequence"), lookup.getFeatureClassReference(refM("FURCAS", "TCS", "ClassTemplate"), "templateSequence"));
assertEquals(refM("ecore", "EString"), lookup.getFeatureClassReference(refM("FURCAS", "TCS", "ConcreteSyntax"), "lexer"));
}
@Test
public void testGetEnumLiterals() throws Exception {
List<String> literals = lookup.getEnumLiterals(refM("FURCAS", "TCS", "Associativity"));
assertNotNull(literals);
assertEquals(2, literals.size());
assertTrue(literals.contains("right"));
assertTrue(literals.contains("left"));
}
@Test
public void testValidateOCLQuery() throws Exception {
ClassTemplateStub template = new ClassTemplateStub();
template.metaReference = TCSPackage.eINSTANCE.getConcreteSyntax();
assertTrue("Should yield no errors, as a ConcreteSyntax has a 'keywords' attribute",
lookup.validateOclQuery(template, "self.keywords").isEmpty());;
assertFalse("Should fail. A ConcreteSyntax has no such feature.",
lookup.validateOclQuery(template, "self.someThingThatDoesNotExistForSure").isEmpty());;
}
}