// Copyright (c) 2009-2010 by the projectusus.org contributors
// This software is released under the terms and conditions
// of the Eclipse Public License (EPL) 1.0.
// See http://www.eclipse.org/legal/epl-v10.html for details.
package org.projectusus.core.internal.proportions;
import static org.eclipse.core.resources.ResourcesPlugin.getWorkspace;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItem;
import static org.junit.matchers.JUnitMatchers.hasItems;
import static org.projectusus.core.internal.TestProjectCreator.SOURCE_FOLDER;
import java.util.Collection;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.projectusus.adapter.ICodeProportionComputationTarget;
import org.projectusus.core.internal.JavaProject;
import org.projectusus.core.internal.Workspace;
public class FileChangeNotificationsPDETest {
@Rule
public Workspace workspace = new Workspace();
@Rule
public JavaProject project1 = new JavaProject();
@Rule
public JavaProject project2 = new JavaProject();
private TestResourceChangeListener listener = new TestResourceChangeListener();
@After
public void tearDown() throws CoreException {
getWorkspace().removeResourceChangeListener( listener );
}
@Test
public void fileAdded() throws Exception {
getWorkspace().addResourceChangeListener( listener );
IFile file = project1.createFile( "Bla.java", "really interesting stuff" );
listener.assertNoException();
ICodeProportionComputationTarget target = listener.getTarget();
assertEquals( 1, target.getProjects().size() );
assertThat( target.getProjects(), hasItem( project1.get() ) );
assertEquals( 1, target.getFiles( project1.get() ).size() );
IFile affectedFile = target.getFiles( project1.get() ).iterator().next();
assertEquals( file, affectedFile );
}
@Test
public void fileDeleted() throws Exception {
IFile file = project1.createFile( "Bla.java", "stuff that didn't survive" );
workspace.buildFullyAndWait();
getWorkspace().addResourceChangeListener( listener );
file.delete( true, new NullProgressMonitor() );
listener.assertNoException();
ICodeProportionComputationTarget target = listener.getTarget();
assertEquals( 1, target.getProjects().size() );
assertThat( target.getProjects(), hasItem( project1.get() ) );
assertEquals( 0, target.getFiles( project1.get() ).size() );
assertEquals( 1, target.getRemovedFiles( project1.get() ).size() );
IFile affectedFile = target.getRemovedFiles( project1.get() ).iterator().next();
assertEquals( file, affectedFile );
}
@Test
public void fileChanged() throws Exception {
IFile file = project1.createFile( "Bla.java", "stuff that will be replaced" );
workspace.buildFullyAndWait();
getWorkspace().addResourceChangeListener( listener );
project1.updateContent( file, "replacement" );
listener.assertNoException();
ICodeProportionComputationTarget target = listener.getTarget();
assertEquals( 1, target.getProjects().size() );
assertThat( target.getProjects(), hasItem( project1.get() ) );
assertEquals( 0, target.getRemovedFiles( project1.get() ).size() );
assertEquals( 1, target.getFiles( project1.get() ).size() );
IFile affectedFile = target.getFiles( project1.get() ).iterator().next();
assertEquals( file, affectedFile );
}
@Test
public void fileMoved() throws Exception {
IFile file = project1.createFile( "Bla.java", "stuff that will be replaced" );
IFolder folder = project1.createFolder( "dir" );
workspace.buildFullyAndWait();
getWorkspace().addResourceChangeListener( listener );
file.move( folder.getFullPath().append( file.getName() ), true, new NullProgressMonitor() );
listener.assertNoException();
ICodeProportionComputationTarget target = listener.getTarget();
assertEquals( 1, target.getProjects().size() );
assertThat( target.getProjects(), hasItem( project1.get() ) );
// original file comes along as deleted
assertEquals( 1, target.getRemovedFiles( project1.get() ).size() );
IFile removedFile = target.getRemovedFiles( project1.get() ).iterator().next();
assertEquals( new Path( "/" + project1.get().getName() + "/" + SOURCE_FOLDER + "/Bla.java" ), removedFile.getFullPath() );
// file at new location is registered as affected file
assertEquals( 1, target.getFiles( project1.get() ).size() );
IFile affectedFile = target.getFiles( project1.get() ).iterator().next();
assertEquals( new Path( "/" + project1.get().getName() + "/" + SOURCE_FOLDER + "/dir/Bla.java" ), affectedFile.getFullPath() );
}
@Test
public void multipleFilesCreatedAtOnce() throws Exception {
getWorkspace().addResourceChangeListener( listener );
// run in batch so that we get only one cumulative notification
getWorkspace().run( new IWorkspaceRunnable() {
public void run( IProgressMonitor monitor ) throws CoreException {
project1.createFile( "a.java", "really" );
project1.createFile( "b.java", "interesting" );
project2.createFile( "c.java", "stuff" );
}
}, new NullProgressMonitor() );
workspace.buildFullyAndWait();
listener.assertNoException();
ICodeProportionComputationTarget target = listener.getTarget();
Collection<IProject> affectedProjects = target.getProjects();
assertEquals( 2, affectedProjects.size() );
assertThat( affectedProjects, hasItems( project1.get(), project2.get() ) );
assertEquals( 2, target.getFiles( project1.get() ).size() );
assertEquals( 1, target.getFiles( project2.get() ).size() );
}
}