blob: ee7f237b3bd3d90a34687b89c6b68c26819e3c83 [file] [log] [blame]
package org.eclipse.jst.jsf.core.tests.resource;
import static junit.framework.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
import org.eclipse.jst.jsf.core.tests.resource.MyTestListener.EventData;
import org.eclipse.jst.jsf.test.util.junit4.NoPluginEnvironment;
import org.eclipse.jst.jsf.test.util.mock.MockFile;
import org.eclipse.jst.jsf.test.util.mock.MockProject;
import org.eclipse.jst.jsf.test.util.mock.MockResourceChangeEventFactory;
import org.eclipse.jst.jsf.test.util.mock.MockWorkspaceContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@Category(NoPluginEnvironment.class)
public class FastLifecycleListenerTests_Scenario
{
private MockWorkspaceContext _wsContext;
private MockResourceChangeEventFactory _factory;
private MockProject _project;
private MockFile _file;
private IFolder _folderInProject;
private IFolder _folderInFolder;
@Before
public void setUp() throws Exception
{
_wsContext = new MockWorkspaceContext();
_project = _wsContext.createProject("SomeTestProject");
_folderInProject = _project.getFolder("/folder");
_folderInFolder = _project.getFolder("/folder/folderInFolder");
_file = (MockFile) _project.getFile("/folder/myfile.txt");
_factory = new MockResourceChangeEventFactory(_wsContext);
}
/**
* Add a new file to a folder.
*/
@Test
public void testAddFile()
{
final LifecycleListener listener = new LifecycleListener(_wsContext
.getWorkspace());
final MyTestListener tester = new MyTestListener(_wsContext, listener);
final IResourceChangeEvent event = _factory
.createSimpleFileAdded(_file);
// we shouldn't expect an event because there are no resources
// registered
tester.fireAndExpectNull(event);
listener.addResource(_file);
tester.fireAndExpect(event, _file,
// IMPORTANT: ReasonType is RESOURCE_ADDED because _file is listened for
EventType.RESOURCE_ADDED, ReasonType.RESOURCE_ADDED);
listener.removeResource(_file);
listener.addResource(_file.getParent());
tester.fireAndExpect(
event,
_file,
// IMPORTANT: ReasonType is RESOURCE_ADDED_TO_CONTAINTER because
// _file's
// parent is being listened for.
EventType.RESOURCE_ADDED,
ReasonType.RESOURCE_ADDED_TO_CONTAINER);
// now remove and verify we no longer get the event.
listener.removeListener(tester);
tester.fireAndExpectNull(event);
}
/**
* Remove a file from a folder.
*/
@Test
public void testRemoveFile()
{
final LifecycleListener listener = new LifecycleListener(_wsContext
.getWorkspace());
final MyTestListener tester = new MyTestListener(_wsContext, listener);
final IResourceChangeEvent event = _factory
.createSimpleFileRemove(_file);
// we shouldn't expect an event because there are no resources
// registered
tester.fireAndExpectNull(event);
listener.addResource(_file);
tester.fireAndExpect(event, _file,
// IMPORTANT: ReasonType is RESOURCE_DELETED because _file is listened
// for
EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_DELETED);
listener.removeResource(_file);
listener.addResource(_file.getParent());
tester.fireAndExpect(
event,
_file,
// IMPORTANT: ReasonType is RESOURCE_DELETED_FROM_CONTAINER
// because
// _file's parent is being listened for.
EventType.RESOURCE_INACCESSIBLE,
ReasonType.RESOURCE_DELETED_FROM_CONTAINER);
// now remove and verify we no longer get the event.
listener.removeListener(tester);
tester.fireAndExpectNull(event);
}
/**
* Add a new folder.
*/
@Test
public void testAddFolderToProject()
{
assertEquals(_project, _folderInProject.getParent());
verifyAddFolderTo(_folderInProject);
}
/**
* Add a new folder to a folder.
*/
@Test
public void testAddFolderToFolder()
{
verifyAddFolderTo(_folderInFolder);
}
public void verifyAddFolderTo(final IFolder folder)
{
final LifecycleListener listener = new LifecycleListener(_wsContext
.getWorkspace());
final MyTestListener tester = new MyTestListener(_wsContext, listener);
final IResourceChangeEvent event = _factory
.createSimpleFolderAdded(folder);
// we shouldn't expect an event because there are no resources
// registered
tester.fireAndExpectNull(event);
listener.addResource(folder);
tester.fireAndExpect(event, folder,
// IMPORTANT: ReasonType is RESOURCE_ADDED because folder is listened
// for
EventType.RESOURCE_ADDED, ReasonType.RESOURCE_ADDED);
listener.removeResource(folder);
listener.addResource(folder.getParent());
tester.fireAndExpect(event,
folder,
// IMPORTANT: ReasonType is RESOURCE_ADDED_TO_CONTAINER because
// folder's parent is being listened for.
EventType.RESOURCE_ADDED,
ReasonType.RESOURCE_ADDED_TO_CONTAINER);
// now remove and verify we no longer get the event.
listener.removeListener(tester);
tester.fireAndExpectNull(event);
}
@Test
public void testRemoveFolderFromProject()
{
verifyRemoveFolderFrom(_folderInProject);
}
@Test
public void testRemoveFolderFromFolder()
{
verifyRemoveFolderFrom(_folderInFolder);
}
public void verifyRemoveFolderFrom(final IFolder folder)
{
final LifecycleListener listener = new LifecycleListener(_wsContext
.getWorkspace());
final MyTestListener tester = new MyTestListener(_wsContext, listener);
final IResourceChangeEvent event = _factory
.createSimpleFolderDeleted(folder);
// we shouldn't expect an event because there are no resources
// registered
tester.fireAndExpectNull(event);
listener.addResource(folder);
tester.fireAndExpect(event, folder,
// IMPORTANT: ReasonType is RESOURCE_DELETED because folder is listened
// for
EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_DELETED);
listener.removeResource(folder);
listener.addResource(folder.getParent());
tester.fireAndExpect(
event,
folder,
// IMPORTANT: ReasonType is RESOURCE_DELETED_FROM_CONTAINER
// because
// folder's parent is being listened for.
EventType.RESOURCE_INACCESSIBLE,
ReasonType.RESOURCE_DELETED_FROM_CONTAINER);
// now remove and verify we no longer get the event.
listener.removeListener(tester);
tester.fireAndExpectNull(event);
}
@Test
public void testRenameFolderInProject()
{
verifyRenameFolder(_folderInProject);
}
@Test
public void testRenameFolderInFolder()
{
verifyRenameFolder(_folderInFolder);
}
private void verifyRenameFolder(final IFolder folder)
{
final LifecycleListener listener = new LifecycleListener(_wsContext
.getWorkspace());
final MyTestListener tester = new MyTestListener(_wsContext, listener);
final IFolder newFolder = _project.getFolder(folder
.getProjectRelativePath().removeLastSegments(1).append(
"NewFolderName"));
final IResourceChangeEvent event = _factory.createSimpleFolderRename(
folder, newFolder);
// we shouldn't expect an event because there are no resources
// registered
tester.fireAndExpectNull(event);
EventData oldFolderChange = new EventData(folder,
EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_MOVED);
listener.addResource(folder);
tester.fireAndExpect(event, Collections.singletonList(oldFolderChange));
listener.removeResource(folder);
List<EventData> eventData = new ArrayList<MyTestListener.EventData>();
eventData.add(new EventData(folder,
EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_MOVED_CONTAINER));
eventData.add(new EventData(newFolder, EventType.RESOURCE_ADDED,
ReasonType.RESOURCE_MOVED_CONTAINER));
listener.addResource(folder.getParent());
tester.fireAndExpect(event,
eventData);
// now remove and verify we no longer get the event.
listener.removeListener(tester);
tester.fireAndExpectNull(event);
}
@Test
public void testRenameFile()
{
verifyRenameFile(_file);
}
private void verifyRenameFile(final IFile file)
{
List<EventData> eventData = new ArrayList<MyTestListener.EventData>();
final LifecycleListener listener = new LifecycleListener(_wsContext
.getWorkspace());
final MyTestListener tester = new MyTestListener(_wsContext, listener);
final IFile newFile = _project.getFile(file
.getProjectRelativePath().removeLastSegments(1).append(
"NewFileName"));
final IResourceChangeEvent event = _factory.createSimpleFileRename(
file, newFile);
// we shouldn't expect an event because there are no resources
// registered
tester.fireAndExpectNull(event);
EventData oldFileChange = new EventData(file,
EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_MOVED);
listener.addResource(file);
eventData.add(oldFileChange);
tester.fireAndExpect(event, eventData);
listener.addResource(newFile);
eventData.add(new EventData(newFile,
EventType.RESOURCE_ADDED, ReasonType.RESOURCE_MOVED));
tester.fireAndExpect(event, eventData);
listener.removeResource(file);
listener.removeResource(newFile);
eventData.clear();
eventData.add(new EventData(file,
EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_MOVED_CONTAINER));
eventData.add(new EventData(newFile, EventType.RESOURCE_ADDED,
ReasonType.RESOURCE_MOVED_CONTAINER));
listener.addResource(file.getParent());
tester.fireAndExpect(event,
eventData);
// now remove and verify we no longer get the event.
listener.removeListener(tester);
tester.fireAndExpectNull(event);
}
// /**
// * Move a folder from one place to another
// */
// @Test
// public void testMoveFolderIn()
// {
// final LifecycleListener listener = new LifecycleListener(_wsContext
// .getWorkspace());
// final MyTestListener tester = new MyTestListener(_wsContext, listener);
// final IFolder newFolder = _project.getFolder("/someOtherFolder");
// final IResourceChangeEvent event = _factory.createSimpleFolderRename(
// _folderInFolder, newFolder);
// // we shouldn't expect an event because there are no resources
// // registered
// tester.fireAndExpectNull(event);
// EventData oldFolderChange = new EventData(_folderInFolder,
// EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_MOVED);
// listener.addResource(_folderInFolder);
// tester.fireAndExpect(event, Collections.singletonList(oldFolderChange));
// listener.removeResource(_folderInFolder);
//
// List<EventData> eventData = new ArrayList<MyTestListener.EventData>();
// eventData.add(new EventData(_folderInFolder,
// EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_MOVED_CONTAINER));
// eventData.add(new EventData(newFolder, EventType.RESOURCE_ADDED,
// ReasonType.RESOURCE_MOVED_CONTAINER));
// listener.addResource(_folderInFolder.getParent());
// tester.fireAndExpect(event,
// eventData);
//
// // now remove and verify we no longer get the event.
// listener.removeListener(tester);
// tester.fireAndExpectNull(event);
// }
}