/*
* Copyright (c) 2005, 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.io.IOException;
import java.util.List;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.gmf.codegen.gmfgen.GenCommonBase;
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
import org.eclipse.gmf.codegen.gmfgen.GenLink;
import org.eclipse.gmf.codegen.gmfgen.GenNode;
import org.eclipse.gmf.codegen.gmfgen.GenTopLevelNode;
import org.eclipse.gmf.codegen.gmfgen.Palette;
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.DiagramRunTimeModelHelper;
import org.eclipse.gmf.mappings.GMFMapPackage;
import org.eclipse.gmf.mappings.LinkMapping;
import org.eclipse.gmf.mappings.Mapping;
import org.eclipse.gmf.mappings.NodeMapping;
import org.eclipse.gmf.mappings.TopNodeReference;
import org.eclipse.gmf.tests.Utils;
import org.eclipse.m2m.internal.qvt.oml.InternalTransformationExecutor;
import org.eclipse.m2m.internal.qvt.oml.trace.Trace;
import org.eclipse.m2m.internal.qvt.oml.trace.TraceRecord;
import org.eclipse.m2m.qvt.oml.BasicModelExtent;
import org.eclipse.m2m.qvt.oml.ExecutionContextImpl;
import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;
import org.eclipse.m2m.qvt.oml.ModelExtent;
@SuppressWarnings("restriction")
public abstract class QvtGenModelTransformerTest extends AbstractMappingTransformerTest {
protected GenEditorGenerator myTransformationResult;
// private final DiagramRunTimeModelHelper myDiagramModelHelper;
protected Resource traceResource;
protected QvtGenModelTransformerTest(String name, DiagramRunTimeModelHelper rtHelper) {
super(name);
assert rtHelper != null;
// myDiagramModelHelper = rtHelper;
}
protected void setUp() throws Exception {
super.setUp();
myTransformationResult = executeQVT();
}
protected GenEditorGenerator executeQVT() throws IOException {
GenModel genModel = Utils.createGenModel(getCanvasMapping().getDomainModel());
Mapping mapping = getMapping();
ResourceSet resourceSet = genModel.eResource().getResourceSet();
traceResource = resourceSet.createResource(URI.createURI("test.qvtotrace"));
InternalTransformationExecutor executor =
new InternalTransformationExecutor(URI.createURI("platform:/plugin/org.eclipse.gmf.bridge/transforms/Map2Gen.qvto")) {
@Override
protected void handleExecutionTraces(Trace traces) {
traceResource.getContents().add(traces);
super.handleExecutionTraces(traces);
}
};
ExecutionContextImpl context = new ExecutionContextImpl();
context.setConfigProperty("rcp", false);
context.setConfigProperty("useMapMode", false);
context.setConfigProperty("useFullRunTime", false);
context.setConfigProperty("useInTransformationCodeGen", true);
EList<EObject> mapObjects = new BasicEList<EObject>();
mapObjects.add(mapping);
ModelExtent inMap = new BasicModelExtent(mapObjects);
EList<EObject> genObjects = new BasicEList<EObject>();
genObjects.add(genModel);
ModelExtent inGen = new BasicModelExtent(genObjects);
Resource res = resourceSet.createResource(URI.createURI("platform:/plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel"));
res.load(null);
ModelExtent inNotation = new BasicModelExtent(res.getContents());
ModelExtent output = new BasicModelExtent();
ExecutionDiagnostic result = executor.execute(context, inMap, inGen, inNotation, output);
if(result.getSeverity() == Diagnostic.OK) {
List<EObject> outObjects = output.getContents();
assertTrue(outObjects.get(0) instanceof GenEditorGenerator);
return (GenEditorGenerator) outObjects.get(0);
}
return null;
}
protected GenNode[] find(NodeMapping nodeMap) {
assert nodeMap != null;
GenNode genNode = findTopNode(nodeMap);
return genNode != null ? new GenNode[] {genNode} : new GenNode[]{};//findChildNodes(nodeMap);
}
protected GenTopLevelNode findTopNode(NodeMapping nodeMap) {
assert nodeMap != null;
Trace trace = (Trace) traceResource.getContents().get(0);
for (TraceRecord record: trace.getTraceRecords()) {
if (record.getContext().getContext().getType().equals(GMFMapPackage.eINSTANCE.getTopNodeReference().getName())) {
if (record.getContext().getContext().getValue().getModelElement().equals(nodeMap.eContainer())) {
return (GenTopLevelNode) record.getResult().getResult().get(0).getValue().getModelElement();
}
}
}
return null;
}
private GenLink find(LinkMapping linkMapping) {
assert linkMapping != null;
Trace trace = (Trace) traceResource.getContents().get(0);
for (TraceRecord record: trace.getTraceRecords()) {
if (record.getContext().getContext().getType().equals(GMFMapPackage.eINSTANCE.getLinkMapping().getName())) {
if (record.getContext().getContext().getValue().getModelElement().equals(linkMapping)) {
EObject modelElement = record.getResult().getResult().get(0).getValue().getModelElement();
if (modelElement instanceof GenLink)
return (GenLink) modelElement ;
}
}
}
return null;
}
public void testGenModelTransform() {
assertNotNull("GenEditorGenerator is expected as result of mapping transformation", myTransformationResult);
assertNotNull("GenDiagram is expected to be set...", myTransformationResult.getDiagram());
assertNotNull("... as well as GenPlugin is expected to be set", myTransformationResult.getPlugin());
assertNotNull("Diagram filename extension not set", myTransformationResult.getDiagramFileExtension());
// FIXME add more
GenNode[] genNodes = find(getNodeMapping());
assertEquals("Result model contains no GenNode for nodeMapping", 1, genNodes.length);
// FIXME add more
GenLink genLinks = find(getLinkMapping());
assertNotNull("Result model contains no GenLink for linkMapping", genLinks);
// FIXME add more
}
public void testCreatedPalette() {
final Palette palette = myTransformationResult.getDiagram().getPalette();
for (TopNodeReference topNode : getMapping().getNodes()) {
final NodeMapping nodeMapping = topNode.getChild();
GenTopLevelNode genNode = findTopNode(nodeMapping);
assertNotNull(genNode);
assertEquals(nodeMapping.getTool() != null ? 1 : 0, countUses(genNode, palette));
}
for (LinkMapping linkMapping : getMapping().getLinks()) {
GenLink genLink = find(linkMapping);
assertNotNull(genLink);
assertEquals(linkMapping.getTool() != null ? 1 : 0, countUses(genLink, palette));
}
// TODO add grooping test
}
private static int countUses(GenCommonBase genElement, Palette palette) {
int uses = 0;
for (ToolGroup nextGroup : palette.getGroups()) {
for (ToolGroupItem item : nextGroup.getEntries()) {
if (false == item instanceof ToolEntry) {
continue;
}
for (GenCommonBase cb : ((ToolEntry) item).getElements()) {
if (cb == genElement) {
uses++;
// although it's hardly there's more that one GenCommonBase in EMF EList for ToolEntry#elements, doesn't hurt
// *not to* break here
}
}
}
}
return uses;
}
}