| /******************************************************************************* |
| * Copyright (c) 2015, 2019 Obeo. |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Obeo - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.sirius.tests.swtbot.celleditor; |
| |
| import java.io.ByteArrayInputStream; |
| |
| import org.eclipse.core.internal.registry.ExtensionRegistry; |
| import org.eclipse.core.runtime.ContributorFactoryOSGi; |
| import org.eclipse.core.runtime.IContributor; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.sirius.common.tools.api.util.ReflectionHelper; |
| import org.eclipse.sirius.diagram.DDiagram; |
| import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramContainerEditPart; |
| import org.eclipse.sirius.table.metamodel.table.DTable; |
| import org.eclipse.sirius.tests.support.api.TestsUtil; |
| import org.eclipse.sirius.tests.swtbot.Activator; |
| import org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase; |
| import org.eclipse.sirius.tests.swtbot.support.api.business.UIResource; |
| import org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor; |
| import org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper; |
| import org.eclipse.sirius.tests.swtbot.support.utils.SWTBotUtils; |
| import org.eclipse.sirius.tree.DTree; |
| import org.eclipse.sirius.ui.tools.internal.properties.SiriusCellEditorProviderCollector; |
| import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor; |
| import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; |
| import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart; |
| import org.eclipse.swtbot.swt.finder.SWTBot; |
| import org.eclipse.swtbot.swt.finder.widgets.SWTBotText; |
| import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; |
| |
| /** |
| * Test case to check properties CellEditor extensibility. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=451364 |
| * |
| * @author Florian Barbin |
| */ |
| public class CellEditorExtensionTest extends AbstractSiriusSwtBotGefTestCase { |
| |
| private static final String PATH = "/data/unit/cellEditor/"; |
| |
| private static final String SEMANTIC_MODEL = "cellEditor.ecore"; |
| |
| private static final String REPRESENTATION_MODEL = "cellEditor.aird"; |
| |
| private static final String MODELER = "cellEditor.odesign"; |
| |
| private static final String REPRESENTATION_DESCRIPTION_DIAGRAM = "Diagram"; |
| |
| private static final String REPRESENTATION_DESCRIPTION_TREE = "Tree"; |
| |
| private static final String REPRESENTATION_DESCRIPTION_TABLE = "Table"; |
| |
| private static final String PROPERTIES = "Properties"; |
| |
| private SWTBotEditor table; |
| |
| private SWTBotEditor tree; |
| |
| private static final String PLUGIN_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><?eclipse version=\"3.4\"?><plugin><extension id=\"customCellEditor\" point=\"" |
| + SiriusCellEditorProviderCollector.EXTENSION_POINT_ID + "\"> <provider class=\"org.eclipse.sirius.tests.swtbot.celleditor.CustomCellEditor\"> </provider> </extension></plugin>"; |
| |
| @Override |
| protected void onSetUpBeforeClosingWelcomePage() throws Exception { |
| copyFileToTestProject(Activator.PLUGIN_ID, PATH, SEMANTIC_MODEL, REPRESENTATION_MODEL, MODELER); |
| } |
| |
| @Override |
| protected void onSetUpAfterOpeningDesignerPerspective() throws Exception { |
| sessionAirdResource = new UIResource(designerProject, "/", REPRESENTATION_MODEL); |
| localSession = designerPerspective.openSessionFromFile(sessionAirdResource); |
| registerExtension(); |
| } |
| |
| /** |
| * Tests the semantic properties with diagram editor. |
| */ |
| public void testCellEditorOnDiagram() { |
| if (!TestsUtil.isGTK3supported()) { |
| return; |
| } |
| |
| editor = (SWTBotSiriusDiagramEditor) openRepresentation(localSession.getOpenedSession(), REPRESENTATION_DESCRIPTION_DIAGRAM, "new " + REPRESENTATION_DESCRIPTION_DIAGRAM, DDiagram.class); |
| SWTBotUtils.waitAllUiEvents(); |
| SWTBotGefEditPart botGefEditPart = editor.getEditPart("NewEClass1", AbstractDiagramContainerEditPart.class); |
| botGefEditPart.click(); |
| SWTBotUtils.waitAllUiEvents(); |
| checkCellEditorValue(); |
| } |
| |
| /** |
| * Tests the semantic properties with tree editor. |
| */ |
| public void testCellEditorOnTree() { |
| if (!TestsUtil.isGTK3supported()) { |
| return; |
| } |
| |
| tree = openRepresentation(localSession.getOpenedSession(), REPRESENTATION_DESCRIPTION_TREE, "new " + REPRESENTATION_DESCRIPTION_TREE, DTree.class); |
| SWTBotUtils.waitAllUiEvents(); |
| SWTBot swtBot = tree.bot(); |
| swtBot.tree().getTreeItem("NewEClass1").select(); |
| SWTBotUtils.waitAllUiEvents(); |
| checkCellEditorValue(); |
| } |
| |
| /** |
| * Tests the semantic properties with table editor. |
| */ |
| public void testCellEditorOnTable() { |
| if (!TestsUtil.isGTK3supported()) { |
| return; |
| } |
| |
| table = openRepresentation(localSession.getOpenedSession(), REPRESENTATION_DESCRIPTION_TABLE, "new " + REPRESENTATION_DESCRIPTION_TABLE, DTable.class); |
| SWTBotUtils.waitAllUiEvents(); |
| SWTBot swtBot = table.bot(); |
| swtBot.tree().getTreeItem("NewEClass1").select(); |
| SWTBotUtils.waitAllUiEvents(); |
| checkCellEditorValue(); |
| } |
| |
| private void checkCellEditorValue() { |
| SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES); |
| propertiesBot.setFocus(); |
| SWTBotSiriusHelper.selectPropertyTabItem("Semantic", propertiesBot.bot()); |
| SWTBotTree tree = propertiesBot.bot().tree(); |
| tree.expandNode("NewEClass1").select().getNode("Name").click(); |
| SWTBotText text = propertiesBot.bot().text(); |
| String result = text.getText(); |
| assertEquals("The class name field should be customized", "NewEClass1custom", result); |
| } |
| |
| /** |
| * Installs dynamically an extension that adds "custom" at the end of the value of the "name" field CellEditor. |
| */ |
| private void registerExtension() { |
| IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); |
| IContributor contributor = ContributorFactoryOSGi.createContributor(Activator.getDefault().getBundle()); |
| extensionRegistry.addContribution(new ByteArrayInputStream(PLUGIN_XML.getBytes()), contributor, false, null, null, ((ExtensionRegistry) extensionRegistry).getTemporaryUserToken()); |
| } |
| |
| /** |
| * Remove the installed extension. |
| */ |
| private void removeExtension() { |
| IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry(); |
| IExtension extension = extensionRegistry.getExtension(SiriusCellEditorProviderCollector.EXTENSION_POINT_ID, Activator.PLUGIN_ID + ".customCellEditor"); |
| extensionRegistry.removeExtension(extension, ((ExtensionRegistry) extensionRegistry).getTemporaryUserToken()); |
| // Also force a clean of the internal cache of |
| // SiriusCellEditorProviderCollector |
| ReflectionHelper.setFieldValueWithoutException(SiriusCellEditorProviderCollector.getInstance(), "cache", null); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| tree = null; |
| table = null; |
| removeExtension(); |
| super.tearDown(); |
| } |
| |
| } |