/**
* <copyright>
*
* Copyright (c) 2009, 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: EMFConversionTest.java,v 1.9 2011/08/25 12:42:35 mtaal Exp $
*/
package org.eclipse.emf.texo.xml.test;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.texo.converter.EMFModelConverter;
import org.eclipse.emf.texo.converter.ModelEMFConverter;
import org.eclipse.emf.texo.datagenerator.DataGeneratorUtils;
import org.eclipse.emf.texo.datagenerator.ModelDataGenerator;
import org.eclipse.emf.texo.test.model.samples.accounting.AccountingModelPackage;
import org.eclipse.emf.texo.test.model.samples.emap.EmapsampleModelPackage;
import org.eclipse.emf.texo.test.model.samples.extlibrary.ExtlibraryModelPackage;
import org.eclipse.emf.texo.test.model.samples.play.PlayModelPackage;
import org.eclipse.emf.texo.test.model.samples.rental.RentalModelPackage;
/**
* Test the conversion from and to EMF objects.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
* @version $Revision: 1.9 $
*/
public class EMFConversionTest extends TestCase {
// fails because order is not maintained in lists/sets
public void _testExtLibrary() throws Exception {
final List<EPackage> ePackages = new ArrayList<EPackage>();
ePackages.add(ExtlibraryModelPackage.INSTANCE.getEPackage());
final List<EClass> eClasses = new ArrayList<EClass>();
eClasses.add(ExtlibraryModelPackage.INSTANCE.getLibraryEClass());
doTest(ePackages, eClasses);
}
// not supported because of multiple inheritance
// public void testExtendedPOTestData() throws Exception {
// final List<EPackage> ePackages = new ArrayList<EPackage>();
// ePackages.add(Epo2ModelPackage.INSTANCE.getEPackage());
// final List<EClass> eClasses = new ArrayList<EClass>();
// eClasses.add(Epo2ModelPackage.INSTANCE.getSupplierEClass());
// doTest(ePackages, eClasses);
// }
// fails because exports adds <Vat xsi:nill="true"/>
public void _testAccountingTestData() throws Exception {
final List<EPackage> ePackages = new ArrayList<EPackage>();
ePackages.add(AccountingModelPackage.INSTANCE.getEPackage());
final List<EClass> eClasses = new ArrayList<EClass>();
eClasses.add(AccountingModelPackage.INSTANCE.getAccountingEClass());
doTest(ePackages, eClasses);
}
public void testEmapTestData() throws Exception {
final List<EPackage> ePackages = new ArrayList<EPackage>();
ePackages.add(EmapsampleModelPackage.INSTANCE.getEPackage());
doTest(ePackages, DataGeneratorUtils.getRootEClasses(ePackages));
}
public void testRentalTestData() throws Exception {
final List<EPackage> ePackages = new ArrayList<EPackage>();
ePackages.add(RentalModelPackage.INSTANCE.getEPackage());
doTest(ePackages, DataGeneratorUtils.getRootEClasses(ePackages));
}
public void testPlayTestData() throws Exception {
final List<EPackage> ePackages = new ArrayList<EPackage>();
ePackages.add(PlayModelPackage.INSTANCE.getEPackage());
final List<EClass> eClasses = new ArrayList<EClass>();
eClasses.add(PlayModelPackage.INSTANCE.getPlayTypeEClass());
doTest(ePackages, eClasses);
}
private void doTest(final List<EPackage> ePackages, final List<EClass> eClasses) throws Exception {
// create a testset
final List<EObject> beforeEObjects = generateTestSet(ePackages, eClasses, 3, 5, 5, 100000);
// create the xmi string
final String beforeXMIString = getXMIString(beforeEObjects);
// System.err.println(beforeXMIString);
// convert to ModelObjects
final EMFModelConverter emfModelConverter = new EMFModelConverter();
final List<Object> objects = emfModelConverter.convert(beforeEObjects);
// convert back
final ModelEMFConverter modelEMFConverter = new ModelEMFConverter();
final List<EObject> afterEObjects = modelEMFConverter.convert(objects);
// create xmi string
final String afterXMIString = getXMIString(afterEObjects);
// System.err.println(afterXMIString);
// writeXMIToFile("_1.xml", beforeXMIString);
// writeXMIToFile("_2.xml", afterXMIString);
assertEquals(beforeXMIString, afterXMIString);
}
// private void writeXMIToFile(String suffix, String content) throws Exception {
// final FileWriter fw = new FileWriter("/home/mtaal/mytmp/xml" + suffix);
// fw.write(content);
// fw.flush();
// fw.close();
// }
private String getXMIString(final List<EObject> eObjects) throws Exception {
final XMIResource resource = new XMIResourceImpl();
resource.getContents().addAll(eObjects);
final StringWriter sw = new StringWriter();
resource.save(sw, Collections.EMPTY_MAP);
return sw.toString();
}
private List<EObject> generateTestSet(final List<EPackage> ePackages, final List<EClass> eClasses,
final int dataSize, final int collectionSize, final int maxDepth, final int maxObjects) {
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.getResult();
}
}