/* * Copyright (c) 2005 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.setup; import java.io.IOException; import java.util.HashSet; import java.util.Iterator; import junit.framework.TestCase; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.Diagnostician; import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage; import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator; import org.eclipse.gmf.gmfgraph.Canvas; import org.eclipse.gmf.gmfgraph.Connection; import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.gmfgraph.util.Assistant; import org.eclipse.gmf.mappings.GMFMapPackage; /** * @author artem */ public class TestSetupTest extends TestCase { public TestSetupTest(String name) { super(name); } public void testBasicGraphDefModel() { try { DiaDefSource s = new DiaDefFileSetup().init(Assistant.getBasicGraphDef()); doDiaDefTests(s); } catch (IOException ex) { fail(ex.getMessage()); } } public void testDiaDefSetupNoConfig() { DiaDefSource s = new DiaDefSetup().init(); doDiaDefTests(s); } public void testDiaDefGenerateSetupWithConfig() { final boolean[] setupCanvasDef = {false}; final boolean[] setupLinkDef = {false}; final boolean[] setupNodeDef = {false}; DiaDefSource s = new DiaDefSetup() { public void setupCanvasDef(Canvas canvasDef) { setupCanvasDef[0] = true; } public void setupLinkDef(Connection linkDef) { setupLinkDef[0] = true; } public void setupNodeDef(Node nodeDef) { setupNodeDef[0] = true; } }.init(); assertTrue("DiaDefGenerateSetup.Config.setupNodeDef()", setupNodeDef[0]); assertTrue("DiaDefGenerateSetup.Config.setupLinkDef()", setupLinkDef[0]); assertTrue("DiaDefGenerateSetup.Config.setupCanvasDef()", setupCanvasDef[0]); doDiaDefTests(s); } public void testDomainModelSetup() { DomainModelSetup s = new DomainModelSetup().init(); doDomainSourceTests(s); } /** * Make sure GMF's ocl annotation constraints are being checked * FIXME create model that is valid for EObject validation but invalid for GMF constraints * alternatively, just compart to GMFValidator.INSTANCE. * Perhaps, better place for this test would be separate test case? */ public void testExtendedValidationIsOn() { final EValidator vMap = EValidator.Registry.INSTANCE.getEValidator(GMFMapPackage.eINSTANCE); assertNotNull("No validator set for gmfmap", vMap); assertNotSame("Default validator is in use for gmfmap", EValidator.Registry.INSTANCE.getEValidator(null), vMap); final EValidator vGen = EValidator.Registry.INSTANCE.getEValidator(GMFGenPackage.eINSTANCE); assertNotNull("No validator set for gmfgen", vGen); assertNotSame("Default validator is in use for gmfgen", EValidator.Registry.INSTANCE.getEValidator(null), vGen); } public void testMultiPackageSetup() throws Exception { DomainModelSource s = new MultiplePackagesDomainModelSetup().init(); doDomainSourceTests(s); final HashSet<EPackage> additionalPacks = new HashSet<EPackage>(8); additionalPacks.add(s.getNodeA().getEClass().getEPackage()); additionalPacks.add(s.getNodeB().getEClass().getEPackage()); additionalPacks.add(s.getLinkAsClass().getEClass().getEPackage()); DiaDefSource gmfGraph = new DiaDefFileSetup().init(Assistant.getBasicGraphDef()); ToolDefSource toolDef = new ToolDefSetup(); MapDefSource mapSource = new MapSetup().init(gmfGraph, s, toolDef); final Resource resource = s.getModel().eResource(); resource.getContents().add(mapSource.getMapping()); resource.getContents().add(toolDef.getRegistry()); confineInResource(mapSource.getMapping()); doAssert("Map", Diagnostician.INSTANCE.validate(mapSource.getMapping().getDiagram())); doDiaGenTests(new MultiPackageGenSetup(additionalPacks).init(mapSource)); } public void testDiaGenSetupDM() { doDiaGenTests(new DiaGenSetup().init(new DomainModelSetup().init())); } public void testDiaGenSetupMap() { DomainModelSource ds = new DomainModelSetup().init(); MapDefSource ms = new MapSetup().init(new DiaDefSetup().init(), ds, new ToolDefSetup()); doDiaGenTests(new DiaGenSetup().init(ms)); } private void doDiaDefTests(DiaDefSource s) { doAssert(Diagnostician.INSTANCE.validate(s.getCanvasDef())); } /* * Assume DiaGenSource is brand-new and is not contained in any resource */ private void doDiaGenTests(DiaGenSource s) { final GenEditorGenerator editorGen = s.getGenDiagram().getEditorGen(); confineInResource(editorGen); Diagnostic d = Diagnostician.INSTANCE.validate(s.getNodeA()); doAssert("GenNode", d); d = Diagnostician.INSTANCE.validate(s.getLinkC()); doAssert("GenLink", d); d = Diagnostician.INSTANCE.validate(s.getGenDiagram()); doAssert("GenDiagram", d); d = Diagnostician.INSTANCE.validate(editorGen); doAssert("EditorGenerator", d); } private static void confineInResource(EObject eObject) { new ResourceSetImpl().createResource(URI.createURI("uri://fake")).getContents().add(eObject); } private static void doDomainSourceTests(DomainModelSource s) { doAssert(Diagnostician.INSTANCE.validate(s.getDiagramElement())); doAssert(Diagnostician.INSTANCE.validate(s.getNodeA().getEClass())); doAssert(Diagnostician.INSTANCE.validate(s.getLinkAsRef())); doAssert(Diagnostician.INSTANCE.validate(s.getLinkAsClass().getEClass())); doAssert(Diagnostician.INSTANCE.validate(s.getModel())); } private static void doAssert(Diagnostic d) { doAssert("", d); } private static void doAssert(String prefix, Diagnostic d) { assertTrue(formatMessage(prefix, d), d.getSeverity() == Diagnostic.OK); } private static String formatMessage(String prefix, Diagnostic d) { return prefix + "(severity=" + getSeverityTitle(d) + "):" + getSeverityMessage(d); } private static String getSeverityTitle(Diagnostic d) { if ((d.getSeverity() & Diagnostic.CANCEL) != 0) { return "CANCEL"; } else if ((d.getSeverity() & Diagnostic.ERROR) != 0) { return "ERROR"; } else if ((d.getSeverity() & Diagnostic.WARNING) != 0) { return "WARN"; } else if ((d.getSeverity() & Diagnostic.INFO) != 0) { return "INFO"; } assert d.getSeverity() == Diagnostic.OK; return "OK"; } private static String getSeverityMessage(Diagnostic d) { // walk down to find first leaf with same severity as top-level d for (Iterator<Diagnostic> it = d.getChildren().iterator(); it.hasNext();) { Diagnostic child = it.next(); if (child.getSeverity() == d.getSeverity()) { if (child.getChildren().isEmpty()) { return child.getMessage(); } else { it = child.getChildren().iterator(); } } // else try next sibling } return d.getMessage(); } }