package monolipse.ui.tests; import monolipse.core.BooCore; import monolipse.core.IAssemblySource; import monolipse.core.IMonoProject; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; public class BooProjectTestCase extends AbstractBooTestCase { public void testProjectAdapter() { IMonoProject adapted = (IMonoProject) _project.getProject().getAdapter(IMonoProject.class); assertSame(_booProject, adapted); } public void testAddAssemblySource() throws Exception { assertEquals(0, _booProject.getAssemblySources().length); IAssemblySource foo = addAssemblySource("src/Foo"); assertNotNull(foo); IFolder folder = foo.getFolder(); assertNotNull(folder); assertTrue(folder.exists()); IAssemblySource[] sources = _booProject.getAssemblySources(); assertEquals(1, sources.length); assertSame(foo, sources[0]); assertSame(foo, folder.getAdapter(IAssemblySource.class)); IAssemblySource bar = addAssemblySource("src/Bar"); sources = _booProject.getAssemblySources(); assertEquals(2, sources.length); assertContains(foo, sources); assertContains(bar, sources); } public void testAssemblySourceOrder() throws Exception { IAssemblySource foo = addAssemblySource("src/Foo"); IAssemblySource bar = addAssemblySource("src/Bar"); IAssemblySource baz = addAssemblySource("src/Baz"); IAssemblySource bang = addAssemblySource("src/Bang"); foo.setReferences(BooCore.createAssemblyReference(bar)); baz.setReferences(BooCore.createAssemblyReference(foo)); bang.setReferences(BooCore.createAssemblyReference(foo)); // (baz, bang) -> foo -> bar // build order should be: // bang, bar, foo, baz IAssemblySource[] order = _booProject.getAssemblySourceOrder(bang, foo, bar, baz); assertSame(bar, order[0]); assertSame(foo, order[1]); assertSame(bang, order[2]); assertSame(baz, order[3]); } static class ResourceChangeListener implements IResourceChangeListener { private IResourceDelta _delta; public IResourceDelta getDelta() { return _delta; } public void resourceChanged(IResourceChangeEvent event) { synchronized (this) { try { _delta = event.getDelta(); } finally { notify(); } } } } public void testGetAffectedAssemblySources() throws Exception { final IAssemblySource foo = addAssemblySource("src/Foo"); final IAssemblySource bar = addAssemblySource("src/Bar"); final IAssemblySource baz = addAssemblySource("src/Baz"); foo.setReferences(BooCore.createAssemblyReference(bar)); baz.setReferences(BooCore.createAssemblyReference(foo)); final ResourceChangeListener listener = new ResourceChangeListener(); final IWorkspace workspace = getProject().getWorkspace(); workspace.addResourceChangeListener(listener); try { synchronized (listener) { WorkspaceJob job = new WorkspaceJob("addFile") { public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { try { copyResourceTo("Bar.boo", "src/Bar"); } catch (Exception e) { fail(e.toString()); } return Status.OK_STATUS; } }; job.schedule(); listener.wait(); } } finally { workspace.removeResourceChangeListener(listener); } assertNotNull(listener.getDelta()); IAssemblySource[] sources = _booProject.getAffectedAssemblySources(listener.getDelta()); assertNotNull(sources); assertEquals(3, sources.length); assertContains(foo, sources); assertContains(bar, sources); assertContains(baz, sources); } void assertContains(Object element, Object[] array) { for (int i=0; i<array.length; ++i) { if (element == array[i]) return; } fail("Element '" + element + "' not found."); } }