diff options
author | Christian W. Damus | 2014-07-28 20:19:32 +0000 |
---|---|---|
committer | Christian W. Damus | 2014-07-28 20:32:25 +0000 |
commit | ff92db7ebae27632a177d12aa2bf60ef20290de1 (patch) | |
tree | bb7e3b9fe484bcf455d97f9165102d509cb38586 /tests | |
parent | 46e0d0f09cae61e222ef9bdb55a371ceb66bf3ea (diff) | |
download | org.eclipse.papyrus-ff92db7ebae27632a177d12aa2bf60ef20290de1.tar.gz org.eclipse.papyrus-ff92db7ebae27632a177d12aa2bf60ef20290de1.tar.xz org.eclipse.papyrus-ff92db7ebae27632a177d12aa2bf60ef20290de1.zip |
437217: [Editors] In-place reloading of model resources in the editors
https://bugs.eclipse.org/bugs/show_bug.cgi?id=437217
New JUnit tests for issues discovered in verification.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/junit/plugins/core/org.eclipse.papyrus.editor.integration.tests/src/org/eclipse/papyrus/editor/integration/tests/tests/EditorReloadTest.java | 207 |
1 files changed, 171 insertions, 36 deletions
diff --git a/tests/junit/plugins/core/org.eclipse.papyrus.editor.integration.tests/src/org/eclipse/papyrus/editor/integration/tests/tests/EditorReloadTest.java b/tests/junit/plugins/core/org.eclipse.papyrus.editor.integration.tests/src/org/eclipse/papyrus/editor/integration/tests/tests/EditorReloadTest.java index 315031ed396..b9fc4f21e19 100644 --- a/tests/junit/plugins/core/org.eclipse.papyrus.editor.integration.tests/src/org/eclipse/papyrus/editor/integration/tests/tests/EditorReloadTest.java +++ b/tests/junit/plugins/core/org.eclipse.papyrus.editor.integration.tests/src/org/eclipse/papyrus/editor/integration/tests/tests/EditorReloadTest.java @@ -14,11 +14,13 @@ package org.eclipse.papyrus.editor.integration.tests.tests; import static org.eclipse.papyrus.junit.matchers.DiagramMatchers.collapsedIn; import static org.eclipse.papyrus.junit.matchers.DiagramMatchers.editPartSelected; +import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.fail; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -41,6 +43,8 @@ import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.gef.ui.views.palette.PaletteView; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor; import org.eclipse.papyrus.infra.core.resource.ModelSet; import org.eclipse.papyrus.infra.core.services.IService; @@ -59,19 +63,26 @@ import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.navigator.CommonViewer; +import org.eclipse.ui.part.IPage; +import org.eclipse.ui.part.PageBookView; +import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import org.eclipse.uml2.uml.NamedElement; import org.eclipse.uml2.uml.OpaqueAction; import org.eclipse.uml2.uml.Package; import org.eclipse.uml2.uml.Type; import org.eclipse.uml2.uml.UMLPackage; +import org.eclipse.uml2.uml.VisibilityKind; +import org.eclipse.uml2.uml.resource.UMLResource; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.google.common.base.Splitter; +import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -87,6 +98,8 @@ import com.google.common.collect.Sets; @PluginResource({ EditorReloadTest.EMPLOYMENT_MODEL, EditorReloadTest.BANKING_MODEL, EditorReloadTest.LIBRARY_MODEL }) public class EditorReloadTest extends AbstractPapyrusTest { + static final String PROPERTY_SHEET_VIEW_ID = "org.eclipse.ui.views.PropertySheet"; + static final String EMPLOYMENT_MODEL = "model/reload/employment.di"; static final String BANKING_MODEL = "model/reload/banking.di"; @@ -255,59 +268,70 @@ public class EditorReloadTest extends AbstractPapyrusTest { editorFixture.activate(employmentEditor); - CommonViewer explorer = editorFixture.getModelExplorerView().getCommonViewer(); Set<String> selectedLabels = ImmutableSet.of("employment::Company", "types::Name::firstName"); - explorer.getTree().setSelection(getItems(explorer, selectedLabels)); - Set<URI> selectedObjects = Sets.newHashSet(); - for(Object next : ((IStructuredSelection)explorer.getSelection()).toList()) { - EObject object = EMFHelper.getEObject(next); - selectedObjects.add(EcoreUtil.getURI(object)); - } - pokeLibraryModel(); - reload.save(libraryEditor); + reload.verifySelection(modelExplorerSupplier(), selectedLabels); + } + + @ShowView(value = ModelExplorerPageBookView.VIEW_ID, location = Location.LEFT) + @Test + public void testModelExplorerExpansionRestored() { + final ReloadAssertion reload = new ReloadAssertion(employmentEditor); editorFixture.activate(employmentEditor); - explorer = editorFixture.getModelExplorerView().getCommonViewer(); - Set<URI> selectedAgain = Sets.newHashSet(); - for(Object next : ((IStructuredSelection)explorer.getSelection()).toList()) { - EObject object = EMFHelper.getEObject(next); - selectedAgain.add(EcoreUtil.getURI(object)); - } - assertThat(selectedAgain, is(selectedObjects)); + Set<String> expandedLabels = ImmutableSet.of("employment::A_company_person_1", "types::UML Primitive Types::PrimitiveTypes::Real"); + + reload.verifyExpansion(modelExplorerSupplier(), expandedLabels); } @ShowView(value = ModelExplorerPageBookView.VIEW_ID, location = Location.LEFT) @Test - public void testModelExplorerExpansionRestored() { + public void testModelExplorerReferencedLibrariesRestored() { final ReloadAssertion reload = new ReloadAssertion(employmentEditor); editorFixture.activate(employmentEditor); - CommonViewer explorer = editorFixture.getModelExplorerView().getCommonViewer(); - Set<String> expandedLabels = ImmutableSet.of("employment::A_company_person_1", "types::UML Primitive Types::PrimitiveTypes::Real"); - for(TreeItem next : getItems(explorer, expandedLabels)) { - next.setExpanded(true); - } - Set<URI> expandedObjects = Sets.newHashSet(); - for(Object next : explorer.getExpandedElements()) { - EObject object = EMFHelper.getEObject(next); - expandedObjects.add(EcoreUtil.getURI(object)); - } + // Load something we haven't loaded before + editorFixture.getModelSet(employmentEditor).getResource(URI.createURI(UMLResource.JAVA_PRIMITIVE_TYPES_LIBRARY_URI), true); + editorFixture.flushDisplayEvents(); + + Set<String> selectedLabels = ImmutableSet.of("Java Primitive Types::Long"); + + reload.verifySelection(modelExplorerSupplier(), selectedLabels); + } + + @ShowView(value = { ModelExplorerPageBookView.VIEW_ID, PROPERTY_SHEET_VIEW_ID }, location = { Location.LEFT, Location.BELOW }) + @Test + public void testPropertySheetRestoredShowingCorrectInput() { + final ReloadAssertion reload = new ReloadAssertion(employmentEditor); pokeLibraryModel(); - reload.save(libraryEditor); + pokeEmploymentModel(); // And this one, too! + + EditPart companyClassEP = editorFixture.activateDiagram(employmentEditor, "classes").findEditPart("Company", org.eclipse.uml2.uml.Class.class); + assertThat(companyClassEP, notNullValue()); + editorFixture.select(companyClassEP); + editorFixture.flushDisplayEvents(); - editorFixture.activate(employmentEditor); + EObject propertySheetSelection = getPropertySheetSelection(); + assertThat(propertySheetSelection, is(EMFHelper.getEObject(companyClassEP))); - explorer = editorFixture.getModelExplorerView().getCommonViewer(); - Set<URI> expandedAgain = Sets.newHashSet(); - for(Object next : explorer.getExpandedElements()) { - EObject object = EMFHelper.getEObject(next); - expandedAgain.add(EcoreUtil.getURI(object)); - } - assertThat(expandedAgain, is(expandedObjects)); + editorFixture.activate(editorFixture.getView(ModelExplorerPageBookView.VIEW_ID, false)); + Set<String> selectedLabels = ImmutableSet.of("employment::Person"); + reload.select(modelExplorerSupplier(), selectedLabels); + editorFixture.flushDisplayEvents(); + + editorFixture.saveAll(); + + reload.assertReloaded(); // The editor is reloaded immediately because it is already active + + editorFixture.flushDisplayEvents(); + + // The property sheet still has the Person class selected, not Company + propertySheetSelection = getPropertySheetSelection(); + assertThat(propertySheetSelection, instanceOf(org.eclipse.uml2.uml.Class.class)); + assertThat(((org.eclipse.uml2.uml.Class)propertySheetSelection).getName(), is("Person")); } // @@ -334,6 +358,16 @@ public class EditorReloadTest extends AbstractPapyrusTest { domain.getCommandStack().execute(domain.createCommand(SetCommand.class, new CommandParameter(ssn, UMLPackage.Literals.NAMED_ELEMENT__NAME, "SocialSecurityNumber"))); } + void pokeEmploymentModel() { + // First, make sure that the library editor is active (user can't edit it, otherwise!) + editorFixture.activate(employmentEditor); + + Package employment = editorFixture.getModel(employmentEditor); + Type person = employment.getOwnedType("Person"); + EditingDomain domain = editorFixture.getEditingDomain(employmentEditor); + domain.getCommandStack().execute(domain.createCommand(SetCommand.class, new CommandParameter(person, UMLPackage.Literals.NAMED_ELEMENT__VISIBILITY, VisibilityKind.PUBLIC_LITERAL))); + } + <P extends PaletteEntry> P find(PaletteContainer container, String label, Class<P> type) { P result = null; @@ -418,6 +452,37 @@ public class EditorReloadTest extends AbstractPapyrusTest { return result; } + Supplier<CommonViewer> modelExplorerSupplier() { + return new Supplier<CommonViewer>() { + + public CommonViewer get() { + return editorFixture.getModelExplorerView().getCommonViewer(); + } + }; + } + + EObject getPropertySheetSelection() { + IViewPart propertySheet = editorFixture.getView(PROPERTY_SHEET_VIEW_ID, true); + assertThat(propertySheet, instanceOf(PageBookView.class)); + IPage currentPage = ((PageBookView)propertySheet).getCurrentPage(); + assertThat(currentPage, instanceOf(TabbedPropertySheetPage.class)); + TabbedPropertySheetPage tabbed = (TabbedPropertySheetPage)currentPage; + + IStructuredSelection result = null; + + try { + Method getCurrentSelection = TabbedPropertySheetPage.class.getDeclaredMethod("getCurrentSelection"); + getCurrentSelection.setAccessible(true); + result = (IStructuredSelection)getCurrentSelection.invoke(tabbed); + assertThat("Nothing selected in property sheet", (result == null) || result.isEmpty(), is(false)); + } catch (Exception e) { + e.printStackTrace(); + fail("Failed to get property sheet selection: " + e.getLocalizedMessage()); + } + + return EMFHelper.getEObject(result.getFirstElement()); + } + private class ReloadAssertion { private final Set<IMultiDiagramEditor> editors; @@ -468,6 +533,76 @@ public class EditorReloadTest extends AbstractPapyrusTest { } } + void verifySelection(Supplier<? extends org.eclipse.jface.viewers.TreeViewer> viewerSupplier, Set<String> selectedLabels) { + assertThat("Must have exactly one dependent editor registered for test.", editors.size(), is(1)); + + final IMultiDiagramEditor dependent = Iterables.getOnlyElement(editors); + + Set<URI> selectedObjects = select(viewerSupplier, selectedLabels); + + editorFixture.activate(dependent); + + Set<URI> selectedAgain = getSelection(viewerSupplier); + + assertThat(selectedAgain, is(selectedObjects)); + } + + Set<URI> select(Supplier<? extends org.eclipse.jface.viewers.TreeViewer> viewerSupplier, Set<String> selectedLabels) { + org.eclipse.jface.viewers.TreeViewer viewer = viewerSupplier.get(); + + Set<URI> result = Sets.newHashSet(); + List<Object> selection = Lists.newArrayListWithCapacity(selectedLabels.size()); + for(TreeItem item : getItems(viewer, selectedLabels)) { + selection.add(item.getData()); + EObject object = EMFHelper.getEObject(item.getData()); + result.add(EcoreUtil.getURI(object)); + } + + viewer.setSelection(new StructuredSelection(selection)); + + return result; + } + + Set<URI> getSelection(Supplier<? extends org.eclipse.jface.viewers.TreeViewer> viewerSupplier) { + org.eclipse.jface.viewers.TreeViewer viewer = viewerSupplier.get(); + Set<URI> result = Sets.newHashSet(); + for(Object next : ((IStructuredSelection)viewer.getSelection()).toList()) { + EObject object = EMFHelper.getEObject(next); + result.add(EcoreUtil.getURI(object)); + } + return result; + } + + void verifyExpansion(Supplier<? extends TreeViewer> viewerSupplier, Set<String> expandedLabels) { + assertThat("Must have exactly one dependent editor registered for test.", editors.size(), is(1)); + + final IMultiDiagramEditor dependent = Iterables.getOnlyElement(editors); + org.eclipse.jface.viewers.TreeViewer viewer = viewerSupplier.get(); + + for(TreeItem next : getItems(viewer, expandedLabels)) { + next.setExpanded(true); + } + Set<URI> expandedObjects = Sets.newHashSet(); + for(Object next : viewer.getExpandedElements()) { + EObject object = EMFHelper.getEObject(next); + expandedObjects.add(EcoreUtil.getURI(object)); + } + + pokeLibraryModel(); + save(libraryEditor); + + editorFixture.activate(dependent); + + viewer = viewerSupplier.get(); + Set<URI> expandedAgain = Sets.newHashSet(); + for(Object next : viewer.getExpandedElements()) { + EObject object = EMFHelper.getEObject(next); + expandedAgain.add(EcoreUtil.getURI(object)); + } + assertThat(expandedAgain, is(expandedObjects)); + + } + void assertUnloaded() { assertThat("Some editors were not unloaded", unloaded, is(editors)); } |