/* * Copyright (c) 2006, 2008 Borland Software Corporation * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.tr; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.gmf.codegen.gmfgen.Palette; import org.eclipse.gmf.codegen.gmfgen.Separator; import org.eclipse.gmf.codegen.gmfgen.ToolEntry; import org.eclipse.gmf.codegen.gmfgen.ToolGroup; import org.eclipse.gmf.codegen.gmfgen.ToolGroupItem; import org.eclipse.gmf.internal.bridge.genmodel.BasicDiagramRunTimeModelHelper; import org.eclipse.gmf.tests.setup.DiaDefSource; import org.eclipse.gmf.tests.setup.MapDefSource; import org.eclipse.gmf.tests.setup.MapSetup; import org.eclipse.gmf.tests.setup.ToolDefSetup; import org.eclipse.gmf.tooldef.AbstractTool; import org.eclipse.gmf.tooldef.CreationTool; import org.eclipse.gmf.tooldef.GMFToolFactory; import org.eclipse.gmf.tooldef.GenericTool; /** * TODO test ToolEntry.properties to appear in the code * TODO test collape/active attibutes of tooldef.ToolGroup * @author artem */ public class QvtPaletteTransformationTest extends QvtGenModelTransformerTest { private static final int TOOLS_FOR_CHECK = 5; private static final int SEP_2_POS = 4; private static final int SEP_1_POS = 2; private AbstractTool myTool2Reuse; /* * Besides, we add it as a top-level tool, to check in #testTopLevelToolDefMovedToDefaultGroup * And, it's a tool that is not referenced from any mappingEntry */ private GenericTool myToolWithClass; private CreationTool myToolFromWrongPalette; private org.eclipse.gmf.tooldef.ToolGroup myGroupWithWrongTool; private org.eclipse.gmf.tooldef.ToolGroup myGroupWithOrderAndSeparators; private org.eclipse.gmf.tooldef.ToolGroup myToolStackGroup; public QvtPaletteTransformationTest(String name) { super(name, new BasicDiagramRunTimeModelHelper()); } protected MapDefSource initMapModel(DiaDefSource graphDef) { final ToolDefSetup toolDefSetup = new ToolDefSetup(); final MapSetup init = new MapSetup().init(graphDef, getSetup().getDomainModel(), toolDefSetup); // use same tool twice myTool2Reuse = GMFToolFactory.eINSTANCE.createCreationTool(); myTool2Reuse.setTitle("NodeTool"); toolDefSetup.getPalette().getTools().add(myTool2Reuse); init.getNodeA().setTool(myTool2Reuse); init.getNodeB().setTool(myTool2Reuse); myToolWithClass = GMFToolFactory.eINSTANCE.createGenericTool(); myToolWithClass.setTitle("ToolWithClass"); myToolWithClass.setToolClass(Object.class.getName()); // and explicitly add it as a top-level tool init.getMapping().getDiagram().getPalette().getTools().add(myToolWithClass); myToolFromWrongPalette = GMFToolFactory.eINSTANCE.createCreationTool(); myToolFromWrongPalette.setTitle("ToolFromWrongPalette"); myGroupWithWrongTool = GMFToolFactory.eINSTANCE.createToolGroup(); myGroupWithWrongTool.setTitle("GroupWithWrongTool"); myGroupWithWrongTool.getTools().add(myToolFromWrongPalette); init.getClassLink().setTool(myToolFromWrongPalette); myGroupWithOrderAndSeparators = GMFToolFactory.eINSTANCE.createToolGroup(); myGroupWithOrderAndSeparators.setTitle("GroupWithOrderAndSeparators"); myGroupWithOrderAndSeparators.getTools().addAll(createToolsForOrderCheck(TOOLS_FOR_CHECK)); myGroupWithOrderAndSeparators.getTools().add(SEP_1_POS, GMFToolFactory.eINSTANCE.createPaletteSeparator()); myGroupWithOrderAndSeparators.getTools().add(SEP_2_POS, GMFToolFactory.eINSTANCE.createPaletteSeparator()); toolDefSetup.getPalette().getTools().add(myGroupWithOrderAndSeparators); myToolStackGroup = GMFToolFactory.eINSTANCE.createToolGroup(); myToolStackGroup.setTitle("StackGroup"); myToolStackGroup.setStack(true); myToolStackGroup.getTools().addAll(createToolsForOrderCheck(2)); toolDefSetup.getPalette().getTools().add(myToolStackGroup); return init; } private static List<AbstractTool> createToolsForOrderCheck(final int numOfTools) { assert numOfTools > 0; ArrayList<AbstractTool> rv = new ArrayList<AbstractTool>(numOfTools); for (int i = 0; i < numOfTools; i++) { // testOrderPreserved relies on fact there are GenericTools GenericTool t = GMFToolFactory.eINSTANCE.createGenericTool(); t.setTitle("ToolOrder" + i); t.setToolClass(Object.class.getName()); rv.add(t); } return rv; } public void testToolEntryReuse() { ToolEntry te = findToolEntry(myTool2Reuse); assertNotNull(te); assertEquals(2, te.getGenNodes().size()); assertEquals(2, te.getElements().size()); assertEquals(0, te.getGenLinks().size()); assertEquals("Node[A|B] should share same ToolEntry", 1, countToolEntriesWithName(myTool2Reuse.getTitle())); } public void testUseNonReferencedTool() { ToolEntry te = findToolEntry(myToolWithClass); assertNotNull("Present", te); assertEquals("... and only once", 1, countToolEntriesWithName(myToolWithClass.getTitle())); assertEquals(0, te.getGenNodes().size()); assertEquals(0, te.getElements().size()); assertEquals(0, te.getGenLinks().size()); } public void testUseToolWithClass() { ToolEntry te = findToolEntry(myToolWithClass); assertNotNull("Present", te); assertNotNull(te.getQualifiedToolName()); assertEquals(myToolWithClass.getToolClass(), te.getQualifiedToolName()); } public void testTopLevelToolDefMovedToDefaultGroup() { ToolEntry te = findToolEntry(myToolWithClass); assertNotNull("Present", te); assertFalse("not in palette...", te.eContainer() instanceof Palette); assertTrue("... rather in some group ...", te.eContainer() instanceof ToolGroup); ToolGroup group = (ToolGroup) te.eContainer(); assertTrue("... which in turn is child of palette", group.eContainer() instanceof Palette); } public void testReferenceToolFromWrongPalette() { ToolEntry te = findToolEntry(myToolFromWrongPalette); assertNotNull("Present", te); assertEquals("... and only once", 1, countToolEntriesWithName(myToolFromWrongPalette.getTitle())); assertTrue("There's some group for mis-referenced tools...", te.eContainer() instanceof ToolGroup); ToolGroup group = (ToolGroup) te.eContainer(); assert myGroupWithWrongTool.getTools().contains(myToolFromWrongPalette) : "just make sure we didn't forget to add one to another"; assertNotSame("But it's not the transformation of the original owner", myGroupWithWrongTool.getTitle(), group.getTitle()); } public void testOrderPreserved() { ToolGroup transformed = findTransformedGroup(myGroupWithOrderAndSeparators); assertNotNull(transformed); Iterator<ToolGroupItem> itTransformed = transformed.getEntries().iterator(); int toolsCompared = 0; for (Iterator<AbstractTool> itOriginal = myGroupWithOrderAndSeparators.getTools().iterator(); itOriginal.hasNext();) { GenericTool next = null; do { Object o = itOriginal.next(); if (o instanceof GenericTool) { next = (GenericTool) o; } } while (next == null && itOriginal.hasNext()); if (next == null && !itOriginal.hasNext()) { break; } while (itTransformed.hasNext()) { Object o = itTransformed.next(); if (o instanceof ToolEntry) { assertEquals(next.getTitle(), ((ToolEntry) o).getTitle()); toolsCompared++; break; } } } assertEquals(TOOLS_FOR_CHECK, toolsCompared); } public void testSeparators() { ToolGroup transformed = findTransformedGroup(myGroupWithOrderAndSeparators); assertNotNull(transformed); ToolGroupItem item = transformed.getEntries().get(SEP_1_POS); assertTrue(item instanceof Separator); item = transformed.getEntries().get(SEP_2_POS); assertTrue(item instanceof Separator); } public void testStackGroup(){ ToolGroup explicitlyStack = findTransformedGroup(myToolStackGroup); assertNotNull(explicitlyStack); assertTrue(explicitlyStack.isStack()); ToolGroup byDefaultNotStack = findTransformedGroup(myGroupWithOrderAndSeparators); assertNotNull(byDefaultNotStack); assertFalse(byDefaultNotStack.isStack()); } private ToolGroup findTransformedGroup(org.eclipse.gmf.tooldef.ToolGroup toolGroup) { ToolGroup transformed = null; for (ToolGroup next : getResultPalette().getGroups()) { if (toolGroup.getTitle().equals(next.getTitle())) { transformed = next; break; } } return transformed; } private ToolEntry findToolEntry(AbstractTool tool) { Palette palette = getResultPalette(); for (Iterator<EObject> it = palette.eAllContents(); it.hasNext();) { EObject next = it.next(); if (next instanceof ToolEntry) { ToolEntry toolEntry = (ToolEntry) next; if (tool.getTitle().equals(toolEntry.getTitle())) { return toolEntry; } } } return null; } private Palette getResultPalette() { Palette palette = myTransformationResult.getDiagram().getPalette(); return palette; } private int countToolEntriesWithName(String name) { int count = 0; Palette palette = getResultPalette(); for (Iterator<EObject> it = palette.eAllContents(); it.hasNext();) { EObject next = it.next(); if (next instanceof ToolEntry) { ToolEntry toolEntry = (ToolEntry) next; if (name.equals(toolEntry.getTitle())) { count++; } } } return count; } }