/** * <copyright> * * Copyright (c) 2010 Springsite BV (The Netherlands) and others * 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: * Martin Taal - Initial API and implementation * * </copyright> * * $Id: TestUtils.java,v 1.2 2011/08/25 12:42:19 mtaal Exp $ */ package org.eclipse.emf.texo.test; import java.io.StringReader; import java.io.StringWriter; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.EMFCompare; import org.eclipse.emf.compare.match.DefaultComparisonFactory; import org.eclipse.emf.compare.match.DefaultEqualityHelperFactory; import org.eclipse.emf.compare.match.DefaultMatchEngine; import org.eclipse.emf.compare.match.IComparisonFactory; import org.eclipse.emf.compare.match.IMatchEngine; import org.eclipse.emf.compare.match.eobject.IEObjectMatcher; import org.eclipse.emf.compare.match.impl.MatchEngineFactoryImpl; import org.eclipse.emf.compare.match.impl.MatchEngineFactoryRegistryImpl; import org.eclipse.emf.compare.scope.IComparisonScope; import org.eclipse.emf.compare.utils.UseIdentifiers; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl; import org.eclipse.emf.texo.converter.ModelEMFConverter; import org.eclipse.emf.texo.datagenerator.ModelDataGenerator; import org.eclipse.emf.texo.xml.ModelXMLLoader; import org.eclipse.emf.texo.xml.ModelXMLSaver; import org.junit.Assert; /** * Utility methods for testcases. * * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> * @version $Revision: 1.2 $ */ public class TestUtils { /** * Convert the objects to a XML/XMI String (depending on doXMI). * * @param objects * the objects to convert to XML/XMI * @param doXMI * xmi or xml * @return the xmi/xml string */ public static String writeXML(final List<Object> objects, boolean doXMI) { final ModelXMLSaver xmlSaver = new ModelXMLSaver(); xmlSaver.setSaveAsXMI(doXMI); xmlSaver.setObjects(objects); final StringWriter sw = new StringWriter(); xmlSaver.setWriter(sw); xmlSaver.write(); return sw.toString(); } /** * Read a set of objects from a xml/xmi string. * * @param xml * the xml/xmi content * @param doXMI * read as xmi or xml * @return the read objects */ public static List<Object> readXML(final String xml, boolean doXMI) { final ModelXMLLoader xmlLoader = new ModelXMLLoader(); xmlLoader.setLoadAsXMI(doXMI); xmlLoader.setReader(new StringReader(xml)); return xmlLoader.read(); } /** * Generate a testset. * * @See {@link ModelDataGenerator} */ public static List<EObject> generateTestSet(final int dataSize, final int collectionSize, final int maxDepth, final int maxObjects, List<EPackage> ePackages, List<EClass> eClasses) { final ModelDataGenerator generator = generateTestSetModelGenerator(dataSize, collectionSize, maxDepth, maxObjects, ePackages, eClasses); return generator.getResult(); } public static ModelDataGenerator generateTestSetModelGenerator(final int dataSize, final int collectionSize, final int maxDepth, final int maxObjects, List<EPackage> ePackages, List<EClass> eClasses) { final ModelDataGenerator modelDataGenerator = new ModelDataGenerator(); modelDataGenerator.setStartEClasses(eClasses); modelDataGenerator.setMaxDepth(maxDepth); modelDataGenerator.setCollectionSize(collectionSize); modelDataGenerator.setDataSize(dataSize); modelDataGenerator.setMaxObjects(maxObjects); modelDataGenerator.setEPackages(ePackages); modelDataGenerator.generateTestData(); System.err.println(modelDataGenerator.getTotalObjectCount()); return modelDataGenerator; } /** * Compare a set of objects using EMF Compare. */ public static void compareObjects(final List<Object> objects1, final List<Object> objects2) { final ModelEMFConverter modelEMFConverter = new ModelEMFConverter(); final List<EObject> eObjects1 = modelEMFConverter.convert(objects1); final ModelEMFConverter modelEMFConverter2 = new ModelEMFConverter(); final List<EObject> eObjects2 = modelEMFConverter2.convert(objects2); // compare sizes, should be all > 0 and the same! Assert.assertFalse(objects1.isEmpty()); Assert.assertEquals(objects1.size(), objects2.size()); Assert.assertEquals(objects1.size(), eObjects1.size()); Assert.assertEquals(eObjects1.size(), eObjects2.size()); // the objects should be different instances for (int i = 0; i < objects1.size(); i++) { Assert.assertTrue(objects1.get(i) != objects2.get(i)); } compareEObjects(eObjects1, eObjects2); } /** * Compare a set of EObjects using EMF Compare. */ public static void compareEObjects(final List<EObject> eObjects1, final List<EObject> eObjects2) { // note it is necessary to put the resources in a resourceset // cause EMF uses the resourceset to compute id's etc. final ResourceSet resourceSet = new ResourceSetImpl(); final Resource resource1 = new XMLResourceImpl(URI.createURI("resource1.xml")); //$NON-NLS-1$ final Resource resource2 = new XMLResourceImpl(URI.createURI("resource2.xml")); //$NON-NLS-1$ resourceSet.getResources().add(resource1); resourceSet.getResources().add(resource2); resource1.getContents().addAll(eObjects1); resource2.getContents().addAll(eObjects2); final IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER); final IComparisonFactory comparisonFactory = new DefaultComparisonFactory(new DefaultEqualityHelperFactory()); final IMatchEngine.Factory matchEngineFactory = new MatchEngineFactoryImpl(matcher, comparisonFactory); matchEngineFactory.setRanking(20); IMatchEngine.Factory.Registry matchEngineRegistry = new MatchEngineFactoryRegistryImpl(); matchEngineRegistry.add(matchEngineFactory); final EMFCompare comparator = EMFCompare.builder().setMatchEngineFactoryRegistry(matchEngineRegistry).build(); // Compare the two models final IComparisonScope scope = EMFCompare.createDefaultScope(resource1, resource2); final Comparison comparison = comparator.compare(scope); final EList<Diff> differences = comparison.getDifferences(); final StringBuilder sb = new StringBuilder(); for (Diff diff : differences) { sb.append(diff.toString() + "\n"); //$NON-NLS-1$ } Assert.assertTrue(sb.toString(), differences.isEmpty()); } }