diff options
author | Maxime Porhel | 2014-11-07 10:19:44 +0000 |
---|---|---|
committer | Maxime Porhel | 2014-11-19 09:59:08 +0000 |
commit | dea709c6bdd029eb54676b2c87087ab484f4bb7a (patch) | |
tree | 74d8ec3b30c5f0dacaf74a56e346d22032019acf | |
parent | f6356a72fe997f526563e9f8d6acad05257127f3 (diff) | |
download | org.eclipse.sirius-dea709c6bdd029eb54676b2c87087ab484f4bb7a.tar.gz org.eclipse.sirius-dea709c6bdd029eb54676b2c87087ab484f4bb7a.tar.xz org.eclipse.sirius-dea709c6bdd029eb54676b2c87087ab484f4bb7a.zip |
[447729] Test to detect invalid variable in interpreted expression
The test checks the variables defined in our metamodels eannotations
("http://www.eclipse.org/sirius/interpreted/expression/variables").
It allows to reveal the issue of Bug 447729 with DiagramVariablesTest
Bug: 447729
Change-Id: I05cd0aca52cfdf24023dc7c55cb2894dbb025d4a
Signed-off-by: Maxime Porhel <maxime.porhel@obeo.fr>
3 files changed, 133 insertions, 12 deletions
diff --git a/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/AbstractInterpretedExpressionTestCase.java b/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/AbstractInterpretedExpressionTestCase.java index 2294786082..8e060ff5b6 100644 --- a/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/AbstractInterpretedExpressionTestCase.java +++ b/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/AbstractInterpretedExpressionTestCase.java @@ -11,6 +11,7 @@ package org.eclipse.sirius.tests.support.api; import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; import junit.framework.TestCase; @@ -18,13 +19,17 @@ import junit.framework.TestCase; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EPackage; +import org.eclipse.sirius.viewpoint.ViewpointPackage; import org.eclipse.sirius.viewpoint.description.DescriptionPackage; import org.junit.Assert; import com.google.common.base.Predicate; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; import com.google.common.collect.Sets; /** @@ -81,7 +86,106 @@ public abstract class AbstractInterpretedExpressionTestCase extends TestCase { /** * Test that all interpreted expression has a variable documentation. */ - public void testVariablesInterpretedExpressionEAnnotation() { + public void testVariableTypesInterpretedExpressionEAnnotation() { + Multimap<EAttribute, String> wrongTypes = ArrayListMultimap.create(); + + for (EAttribute attr : interpretedExpressions) { + EAnnotation varAnnotations = attr.getEAnnotation(AbstractInterpretedExpressionTestCase.VARIABLES); + if (varAnnotations != null) { + for (String varName : varAnnotations.getDetails().keySet()) { + String doc = varAnnotations.getDetails().get(varName); + if (doc != null && doc.indexOf("|") != -1) { + String typeName = doc.substring(0, doc.indexOf("|")).trim(); + String errorMessage = validateVariableType(typeName); + if (errorMessage != null) { + wrongTypes.put(attr, varName + ":" + typeName + " > " + errorMessage); + } + } + } + } + } + + Assert.assertTrue(getMessage(wrongTypes), wrongTypes.isEmpty()); + } + + private String getMessage(Multimap<EAttribute, String> wrongTypes) { + StringBuilder sb = new StringBuilder(); + sb.append(wrongTypes.size()); + sb.append(" variable(s) available in interpreted expressions need type correction:"); + for (EAttribute attr : wrongTypes.keySet()) { + sb.append("\n . "); + sb.append(attr.eResource().getURIFragment(attr)); + for (String v : wrongTypes.get(attr)) { + sb.append("\n . " + v); + } + } + return sb.toString(); + } + + private String validateVariableType(String typeName) { + String errorMessage = "cannot be checked, the test method must be improved"; + if ("ecore.EObject".equals(typeName) || "EObject".equals(typeName)) { + errorMessage = null; + } else { + int indexOf = typeName.indexOf("."); + String pName = typeName.substring(0, indexOf).trim(); + String cName = typeName.substring(indexOf + 1).trim(); + + EPackage ePackage = getEPackage(pName, getAvailablePackages()); + if (ePackage != null) { + EClassifier eClassifier = ePackage.getEClassifier(cName); + if (eClassifier == null) { + errorMessage = "the EClass " + cName + " has not been found in the indicated EPackage."; + } else { + // Valid type. + errorMessage = null; + } + } else { + errorMessage = "the EPackage" + pName + " might not be accessible for the expression."; + } + } + return errorMessage; + } + + private Collection<EPackage> getAvailablePackages() { + LinkedHashSet<EPackage> availablePackages = Sets.newLinkedHashSet(); + availablePackages.add(basePackage); + availablePackages.add(getDialectPackage()); + availablePackages.add(ViewpointPackage.eINSTANCE); + return availablePackages; + } + + /** + * Allow to indicate which is the dialect package (in case of sur diagram + * types or dialect extension). + * + * @return the dialect package (or core base package) + */ + protected EPackage getDialectPackage() { + return getBasePackage(); + } + + private EPackage getEPackage(String pName, Collection<EPackage> packages) { + EPackage found = null; + for (EPackage p : packages) { + if (p.getName().equals(pName)) { + found = p; + } else { + found = getEPackage(pName, p.getESubpackages()); + } + + if (found != null) { + break; + } + } + return found; + + } + + /** + * Test that all interpreted expression variables have a known type. + */ + public void testVariablesInInterpretedExpressionEAnnotation() { List<EAttribute> nonDocumented = Lists.newArrayList(); Predicate<EAttribute> needsDocumentation = new Predicate<EAttribute>() { diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/vsm/interpreted/expression/variables/SiriusVariablesTest.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/vsm/interpreted/expression/variables/SiriusVariablesTest.java index 90efd96659..156845b87f 100644 --- a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/vsm/interpreted/expression/variables/SiriusVariablesTest.java +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/vsm/interpreted/expression/variables/SiriusVariablesTest.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.sirius.tests.unit.api.vsm.interpreted.expression.variables; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.sirius.diagram.DiagramPackage; import org.eclipse.sirius.tests.support.api.AbstractInterpretedExpressionTestCase; import org.eclipse.sirius.viewpoint.ViewpointPackage; @@ -20,9 +22,16 @@ import org.eclipse.sirius.viewpoint.ViewpointPackage; */ public class SiriusVariablesTest extends AbstractInterpretedExpressionTestCase { - @Override - protected void setUp() throws Exception { - setBasePackage(ViewpointPackage.eINSTANCE); - super.setUp(); - } + @Override + protected void setUp() throws Exception { + setBasePackage(ViewpointPackage.eINSTANCE); + super.setUp(); + } + + @Override + protected EPackage getDialectPackage() { + // Required until Bug 450473 correction: viewpoint.ecore contains + // variables typed with diagram.Diagram + return DiagramPackage.eINSTANCE; + } } diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/vsm/interpreted/expression/variables/SequenceVariablesTest.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/vsm/interpreted/expression/variables/SequenceVariablesTest.java index 14341e56a0..af8c0d0c1c 100644 --- a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/vsm/interpreted/expression/variables/SequenceVariablesTest.java +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/vsm/interpreted/expression/variables/SequenceVariablesTest.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.sirius.tests.unit.diagram.sequence.vsm.interpreted.expression.variables; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.sirius.diagram.DiagramPackage; import org.eclipse.sirius.diagram.sequence.SequencePackage; import org.eclipse.sirius.tests.support.api.AbstractInterpretedExpressionTestCase; @@ -18,11 +20,17 @@ import org.eclipse.sirius.tests.support.api.AbstractInterpretedExpressionTestCas * * @author mporhel */ -public class SequenceVariablesTest extends AbstractInterpretedExpressionTestCase { +public class SequenceVariablesTest extends + AbstractInterpretedExpressionTestCase { - @Override - protected void setUp() throws Exception { - setBasePackage(SequencePackage.eINSTANCE); - super.setUp(); - } + @Override + protected void setUp() throws Exception { + setBasePackage(SequencePackage.eINSTANCE); + super.setUp(); + } + + @Override + protected EPackage getDialectPackage() { + return DiagramPackage.eINSTANCE; + } } |