From 777f6a354846e960e2cd7f2b72bfc8c069fef71e Mon Sep 17 00:00:00 2001 From: Thomas Degueule Date: Sat, 19 Sep 2015 20:58:08 +0200 Subject: [PATCH] Run eclipse tests in a deterministic order, separate test cases --- .../META-INF/MANIFEST.MF | 4 +- .../tests/eclipse/SimpleFsmProject.xtend | 49 ++++++++++++--- .../eclipse/shared/WorkspaceTestHelper.xtend | 62 +++++++++++++++++++ 3 files changed, 107 insertions(+), 8 deletions(-) diff --git a/tests/fr.inria.diverse.melange.tests.eclipse/META-INF/MANIFEST.MF b/tests/fr.inria.diverse.melange.tests.eclipse/META-INF/MANIFEST.MF index 2e3c1b26e..8ea8ba809 100644 --- a/tests/fr.inria.diverse.melange.tests.eclipse/META-INF/MANIFEST.MF +++ b/tests/fr.inria.diverse.melange.tests.eclipse/META-INF/MANIFEST.MF @@ -18,7 +18,9 @@ Require-Bundle: fr.inria.diverse.melange.ui, fr.inria.diverse.melange.tools.xtext.testing;bundle-version="0.1.0", org.eclipse.e4.ui.workbench;bundle-version="1.2.2", org.eclipse.core.expressions;bundle-version="3.4.600", - org.eclipse.jdt.ui;bundle-version="3.10.2" + org.eclipse.jdt.ui;bundle-version="3.10.2", + org.junit;bundle-version="4.11.0", + org.eclipse.emf.compare;bundle-version="3.2.0" Import-Package: org.hamcrest.core, org.junit;version="4.5.0", org.junit.runner;version="4.5.0" diff --git a/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/SimpleFsmProject.xtend b/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/SimpleFsmProject.xtend index 5eaf84f31..93b341d7b 100644 --- a/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/SimpleFsmProject.xtend +++ b/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/SimpleFsmProject.xtend @@ -8,35 +8,70 @@ import org.eclipse.xtext.junit4.AbstractXtextTests import org.eclipse.xtext.junit4.InjectWith import org.eclipse.xtext.junit4.XtextRunner import org.eclipse.xtext.junit4.ui.util.IResourcesSetupUtil +import org.junit.After import org.junit.Before +import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith +import org.junit.runners.MethodSorters @RunWith(XtextRunner) @InjectWith(MelangeUiInjectorProvider) +@FixMethodOrder(MethodSorters::NAME_ASCENDING) public class SimpleFsmProject extends AbstractXtextTests { IProject melangeFsm @Inject WorkspaceTestHelper helper + static final String PROJECT_NAME = "SimpleFsmProject" static final String MELANGE_FILE = "SimpleFsmProject/src/simplefsm/SimpleFsm.melange" @Before override setUp() { - super.setUp - helper.init - IResourcesSetupUtil::cleanWorkspace - melangeFsm = helper.deployMelangeProject("SimpleFsmProject", - "tests-inputs/SimpleFsmProject.zip") - IResourcesSetupUtil::reallyWaitForAutoBuild + // We don't want to regenerate everything for each test + if (!helper.projectExists(PROJECT_NAME)) { + super.setUp + helper.init + IResourcesSetupUtil::cleanWorkspace + melangeFsm = helper.deployMelangeProject(PROJECT_NAME, + "tests-inputs/SimpleFsmProject.zip") + IResourcesSetupUtil::reallyWaitForAutoBuild + helper.openEditor(MELANGE_FILE) + } else { + melangeFsm = helper.getProject(PROJECT_NAME) + } + } + + @After + override tearDown() { + // Nope } @Test - def void testNoErrorsInWorkspace() { + def void test0NoErrorsInWorkspace() { + helper.assertNoMarkers + } + + @Test + def void test1GeneratedModelTypes() { helper.generateInterfaces(MELANGE_FILE) + helper.assertNoMarkers + + val fsmMT = helper.getMT(melangeFsm, "FsmMT") + val tfsmMT = helper.getMT(melangeFsm, "TimedFsmMT") + + helper.assertMatch(fsmMT, "tests-inputs/modelTypes/FsmMT.ecore") + helper.assertMatch(tfsmMT, "tests-inputs/modelTypes/TimedFsmMT.ecore") + } + + @Test + def void test2GeneratedAdaptersCompile() { helper.generateAdapters(MELANGE_FILE) helper.assertNoMarkers + } + @Test + def void test3TransfoProducesExpectedOutput() { val expected = ''' State 1 Transition a diff --git a/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/shared/WorkspaceTestHelper.xtend b/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/shared/WorkspaceTestHelper.xtend index cb16eff39..42f5f7e24 100644 --- a/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/shared/WorkspaceTestHelper.xtend +++ b/tests/fr.inria.diverse.melange.tests.eclipse/src/main/java/fr/inria/diverse/melange/tests/eclipse/shared/WorkspaceTestHelper.xtend @@ -16,6 +16,17 @@ import org.eclipse.core.runtime.jobs.Job import org.eclipse.debug.core.DebugPlugin import org.eclipse.debug.core.ILaunchManager import org.eclipse.debug.ui.IDebugUIConstants +import org.eclipse.emf.common.util.URI +import org.eclipse.emf.compare.EMFCompare +import org.eclipse.emf.compare.Match +import org.eclipse.emf.compare.diff.DefaultDiffEngine +import org.eclipse.emf.compare.diff.FeatureFilter +import org.eclipse.emf.compare.scope.DefaultComparisonScope +import org.eclipse.emf.ecore.EPackage +import org.eclipse.emf.ecore.EReference +import org.eclipse.emf.ecore.EStructuralFeature +import org.eclipse.emf.ecore.EcorePackage +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl import org.eclipse.jdt.core.JavaCore import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants import org.eclipse.jdt.ui.JavaUI @@ -50,6 +61,14 @@ class WorkspaceTestHelper { closeWelcomePage } + def IProject getProject(String projectName) { + return ResourcesPlugin::workspace.root.getProject(projectName) + } + + def boolean projectExists(String projectName) { + return getProject(projectName).exists + } + def IProject deployMelangeProject(String projectName, String zipLocation) { val newProject = JavaProjectSetupUtil::createJavaProject(projectName) JavaProjectSetupUtil::addSourceFolder(newProject, "src") @@ -228,4 +247,47 @@ class WorkspaceTestHelper { return CharStreams::toString(CharStreams::newReaderSupplier([outputFile.contents], Charsets::UTF_8)) } + + /** + * Returns the EPackage for generated model type {@link mtName} + * in {@link project} + */ + def EPackage getMT(IProject project, String mtName) { + val rs = new ResourceSetImpl + val res = rs.getResource(URI::createURI('''platform:/resource/«project.name»/model-gen/«mtName».ecore'''), true) + + return res.contents.head as EPackage + } + + def void assertMatch(EPackage pkg, String refEcore) { + val rs = new ResourceSetImpl + val uri = URI::createURI(refEcore) + val res = rs.getResource(uri, true) + val ref = res.contents.head as EPackage + + val scope = new DefaultComparisonScope(pkg, ref, null) + // We don't want to take order into account + // We don't want to take eAnnotations (especially "aspect") into account + val comparison = EMFCompare.builder().setDiffEngine( + new DefaultDiffEngine() { + override def FeatureFilter createFeatureFilter() { + return new FeatureFilter() { + override boolean isIgnoredReference(Match match, EReference ref) { + return ref == EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS + || super.isIgnoredReference(match, ref) + } + + override boolean checkForOrderingChanges(EStructuralFeature f) { + return false + } + } + } + } + ).build.compare(scope) + + if (!comparison.differences.empty) + Assert::fail(comparison.differences.join(", ")) + + Assert::assertTrue(comparison.differences.empty) + } }