blob: 996ce86ec44fb9b43fbcdb031d9fca8a0bc124a3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2014 Formal Mind GmbH and University of Dusseldorf.
* 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:
* Michael Jastram - initial API and implementation
******************************************************************************/
package org.eclipse.rmf.reqif10.pror.testframework;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.ItemProvider;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.rmf.ext.prostep.util.ProstepAdapterFactory;
import org.eclipse.rmf.reqif10.ReqIF;
import org.eclipse.rmf.reqif10.pror.configuration.provider.ConfigurationItemProviderAdapterFactory;
import org.eclipse.rmf.reqif10.pror.configuration.util.ConfigurationAdapterFactory;
import org.eclipse.rmf.reqif10.pror.provider.ReqIF10ItemProviderAdapterFactory;
import org.eclipse.rmf.reqif10.pror.testdata.TestData;
import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceFactoryImpl;
import org.eclipse.rmf.reqif10.serialization.ReqIF10ResourceImpl;
import org.eclipse.rmf.serialization.XMLPersistenceMappingResourceSetImpl;
import org.junit.After;
import org.junit.Before;
/**
* Abstract class designed for testing {@link ItemProvider}s with JUnit 4. It
* provides a basic infrastructure of {@link #adapterFactory},
* {@link #editingDomain} and {@link #commandStack}.
* <p>
*
* In addition, it provides a {@link #listener} that can be attached to
* anything. The notifications it receives are collected in
* {@link #notifications} for validation.
* <p>
*
* It is possible, to filter the notifications that are being collected. Often,
* we attach the listener to an ItemProvider. There is only one ItemProvider
* for a class of Objects (e.g. SpecObjects), but we're interested only in one
* particular object. calling #setListenerFilter() can limit the Notifications
* that are being collected.
*
* Models for testing can be stored as RIF files and retrieved via
* {@link #getTestRIF(String)}. There is {@link #getItemProvider(Object)} for
* easily retrieve the provider for a given element.
*
* @author jastram
*/
abstract public class AbstractItemProviderTest {
/** The properly configured {@link AdapterFactory} */
public ComposedAdapterFactory adapterFactory;
/** The properly configured {@link EditingDomain} */
public AdapterFactoryEditingDomain editingDomain;
/** The properly configured {@link CommandStack} */
public BasicCommandStack commandStack;
/**
* A listener that can be used for testing. If notified, it writes the
* notification to {@link #notifications}.
*/
public INotifyChangedListener listener;
/** The notifications from {@link #listener}. */
public List<Notification> notifications = new ArrayList<Notification>();
private Filter filter;
@Before
public void setupAbstractItemProviderTest() {
adapterFactory = new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
adapterFactory
.addAdapterFactory(new ResourceItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new ConfigurationAdapterFactory());
adapterFactory
.addAdapterFactory(new ReqIF10ItemProviderAdapterFactory());
adapterFactory
.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
adapterFactory
.addAdapterFactory(new ConfigurationItemProviderAdapterFactory());
adapterFactory.addAdapterFactory(new ProstepAdapterFactory());
commandStack = new BasicCommandStack();
editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
commandStack, new XMLPersistenceMappingResourceSetImpl());
editingDomain.getResourceSet().getResourceFactoryRegistry()
.getExtensionToFactoryMap()
.put("reqif", new ReqIF10ResourceFactoryImpl());
listener = new INotifyChangedListener() {
public void notifyChanged(Notification notification) {
if (filter != null) {
if (!filter.accept(notification)) {
return;
}
}
AbstractItemProviderTest.this.notifications.add(notification);
}
};
}
@After
public void teardownAbstractItemProviderTest() {
adapterFactory = null;
editingDomain = null;
commandStack = null;
listener = null;
filter = null;
notifications = new ArrayList<Notification>();
}
public void setListenerFilter(Filter filter) {
this.filter = filter;
}
/**
* Builds a ReqIF model from a file that is stored in org.eclipse.rmf.reqif10.pror.testdata.
*
* @param filename
* without path
* @return a {@link RIF} object
* @throws URISyntaxException
*/
public ReqIF getTestReqif(String filename) throws URISyntaxException {
URI resourceURI = TestData.getURI(filename);
Resource resource = editingDomain.getResourceSet().getResource(
resourceURI, true);
ReqIF reqif = (ReqIF) resource.getContents().get(0);
return reqif;
}
/**
* Tries to retrieve the Itemprovider for the given object.
*
* @return the ItemProvider or null.
*/
public ItemProviderAdapter getItemProvider(Object obj) {
// We assume that all itemproviders implement IItemLabelProvider,
// otherwise this wouldn't work.
return (ItemProviderAdapter) this.adapterFactory.adapt(obj,
IItemLabelProvider.class);
}
protected void setViaCommand(Object object, EStructuralFeature feature, Object value) {
ItemProviderAdapter ip = getItemProvider(object);
Command cmd;
if (feature.isMany()) {
List<Object> list = new ArrayList<Object>();
list.add(value);
cmd = ip.createCommand(object, editingDomain, AddCommand.class,
new CommandParameter(object, feature, list));
} else {
cmd = ip.createCommand(object, editingDomain, SetCommand.class,
new CommandParameter(object, feature, value));
}
commandStack.execute(cmd);
}
protected void removeViaCommand(Object object, EStructuralFeature feature, Object value) {
ItemProviderAdapter ipad = getItemProvider(object);
Command cmd;
if (feature.isMany()) {
List<Object> list = new ArrayList<Object>();
list.add(value);
cmd = ipad.createCommand(object, editingDomain, RemoveCommand.class,
new CommandParameter(object, feature, list));
} else {
cmd = ipad.createCommand(object, editingDomain, SetCommand.class,
new CommandParameter(object, feature, null));
}
commandStack.execute(cmd);
}
/**
* Convenience Method for quickly printing XML to the console. Works for any ReqIF element.
*/
public void dumpEObjectToConsole(EObject eobj) throws IOException {
URI fileURI;
Resource resource = eobj.eResource();
if (resource == null) {
File tempFile = File.createTempFile("reqif", ".reqif");
tempFile.deleteOnExit();
fileURI = URI.createFileURI(tempFile.getAbsolutePath());
resource = editingDomain.getResourceSet().createResource(fileURI);
}
((ReqIF10ResourceImpl) resource).setIsLoading(true);
resource.getContents().add(eobj);
resource.save(System.out, null);
}
}