/**
* <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: XMLTest.java,v 1.16 2011/08/25 12:42:34 mtaal Exp $
*/
package org.eclipse.emf.texo.test.copycompare;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
import org.eclipse.emf.texo.component.ComponentProvider;
import org.eclipse.emf.texo.converter.EMFModelConverter;
import org.eclipse.emf.texo.converter.ObjectComparator;
import org.eclipse.emf.texo.converter.ObjectComparator.ObjectComparatorException;
import org.eclipse.emf.texo.converter.ObjectCopier;
import org.eclipse.emf.texo.datagenerator.DataGeneratorUtils;
import org.eclipse.emf.texo.json.ModelJSONConverter;
import org.eclipse.emf.texo.model.DynamicModelObject;
import org.eclipse.emf.texo.model.ModelFeatureMapEntry;
import org.eclipse.emf.texo.model.ModelObject;
import org.eclipse.emf.texo.model.ModelPackage;
import org.eclipse.emf.texo.model.ModelResolver;
import org.eclipse.emf.texo.store.MemoryObjectStore;
import org.eclipse.emf.texo.test.TestUtils;
import org.junit.Assert;
/**
* Test copy and compare for an unnamed model package.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
* @version $Revision: 1.16 $
*/
public class CopyCompareTest extends TestCase {
private ModelPackage modelPackage;
public CopyCompareTest(ModelPackage modelPackage) {
super(modelPackage.getNsURI());
this.modelPackage = modelPackage;
}
@Override
public void runTest() throws Exception {
final MemoryObjectStore memObjectStore = ComponentProvider.getInstance().newInstance(MemoryObjectStore.class);
final List<EObject> eObjects = TestUtils.generateTestSet(1, 3, 3, 10000,
Collections.singletonList(modelPackage.getEPackage()), getEClasses());
final EMFModelConverter emfModelConverter = new EMFModelConverter();
emfModelConverter.setUriResolver(memObjectStore);
final List<Object> objects = emfModelConverter.convert(eObjects);
memObjectStore.addData(emfModelConverter.getAllConvertedObjects());
for (Object m1 : objects) {
if (m1 instanceof DynamicModelObject) {
// ignore these for now..
continue;
}
final Object m2 = getObjectCopier().copy(m1);
Assert.assertTrue(m1 != m2);
getObjectComparator().compare(m1, m2);
final Object json1 = getToJsonConverter(memObjectStore).convert(m1);
final Object json2 = getToJsonConverter(memObjectStore).convert(m2);
Assert.assertEquals(json1.toString(), json2.toString());
// now change m2 and do a new compare
Assert.assertTrue(changeStringEAttribute(m2, new ArrayList<Object>()));
try {
getObjectComparator().compare(m1, m2);
Assert.fail();
} catch (ObjectComparatorException e) {
// fine
}
}
}
private boolean changeStringEAttribute(Object o, List<Object> visited) {
if (visited.contains(o) || !ModelResolver.getInstance().isModelEnabled(o)) {
return false;
}
visited.add(o);
final ModelObject<?> m = ModelResolver.getInstance().getModelObject(o);
for (EAttribute eAttr : m.eClass().getEAllAttributes()) {
final Object v = m.eGet(eAttr);
if (v instanceof Long) {
m.eSet(eAttr, new Long((Long) v + 1));
return true;
} else if (v instanceof Integer) {
m.eSet(eAttr, (Integer) v + 1);
return true;
} else if (v instanceof Date) {
m.eSet(eAttr, new Date());
return true;
} else if (v instanceof String) {
m.eSet(eAttr, v + "test"); //$NON-NLS-1$
return true;
} else if (v instanceof Collection<?>) {
@SuppressWarnings("unchecked")
final Collection<Object> c = (Collection<Object>) v;
if (!c.isEmpty()) {
final Object value = c.iterator().next();
if (FeatureMapUtil.isFeatureMap(eAttr)) {
for (Object co : c) {
ModelFeatureMapEntry<?> fme = ModelResolver.getInstance().getModelFeatureMapEntry(eAttr, co);
if (fme.getValue() instanceof String) {
fme.setValue(fme.getValue() + "test"); //$NON-NLS-1$
return true;
}
}
}
if (value instanceof Long) {
c.add(new Long(4));
return true;
}
if (value instanceof Integer) {
c.add(new Integer(4));
return true;
}
if (value instanceof Date) {
c.add(new Date());
return true;
}
if (value instanceof String) {
c.add("test"); //$NON-NLS-1$
return true;
}
}
}
}
for (EReference eReference : m.eClass().getEAllReferences()) {
final Object v = m.eGet(eReference);
if (v instanceof Collection<?>) {
@SuppressWarnings("unchecked")
final Collection<Object> c = (Collection<Object>) v;
for (Object oc : c) {
if (oc instanceof Map.Entry<?, ?>) {
final Map.Entry<?, ?> entry = (Map.Entry<?, ?>) oc;
if (changeStringEAttribute(entry.getKey(), visited)) {
return true;
}
if (changeStringEAttribute(entry.getValue(), visited)) {
return true;
}
} else
if (changeStringEAttribute(oc, visited)) {
return true;
}
}
} else {
if (changeStringEAttribute(v, visited)) {
return true;
}
}
}
return false;
}
private ModelJSONConverter getToJsonConverter(MemoryObjectStore store) {
final ModelJSONConverter toJsonConverter = ComponentProvider.getInstance().newInstance(ModelJSONConverter.class);
toJsonConverter.setObjectResolver(store);
toJsonConverter.setConvertNonContainedReferencedObjects(false);
toJsonConverter.setMaxChildLevelsToConvert(1);
toJsonConverter.setPreSortManyValues(true);
toJsonConverter.setSerializeTitleProperty(false);
toJsonConverter.setSkipVolatileEFeatures(true);
return toJsonConverter;
}
private ObjectCopier getObjectCopier() {
final ObjectCopier objectCopier = ComponentProvider.getInstance().newInstance(ObjectCopier.class);
objectCopier.setCopyChildren(true);
objectCopier.setCopyReferences(true);
return objectCopier;
}
private ObjectComparator getObjectComparator() {
final ObjectComparator objectComparator = ComponentProvider.getInstance().newInstance(ObjectComparator.class);
return objectComparator;
}
public List<EClass> getEClasses() {
return DataGeneratorUtils.getRootEClasses(Collections.singletonList(modelPackage.getEPackage()));
}
}