blob: 034a13394379d4cf6adb491b621829d9e789b4d5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 NumberFour AG
*
* 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:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.core.tests.buildpath;
import static org.hamcrest.CoreMatchers.instanceOf;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.ElementChangedEvent;
import org.eclipse.dltk.core.IBuildpathContainer;
import org.eclipse.dltk.core.IElementChangedListener;
import org.eclipse.dltk.core.IModelElementDelta;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptModel;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.tests.ProblemTestUtil;
import org.eclipse.dltk.core.tests.ProjectSetup;
import org.eclipse.dltk.core.tests.model.ModelTestsPlugin;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;
public class SetContainerEventsTest extends Assert {
@Rule
public final ProjectSetup project = new ProjectSetup(
ModelTestsPlugin.WORKSPACE, "SetContainerEvents",
ProjectSetup.Option.INDEXER_DISABLED);
@Rule
public final TemporaryFolder temp = new TemporaryFolder();
@Rule
public final TestName testname = new TestName();
static final boolean VERBOSE = false;
@Test
public void assertNoProblems() throws CoreException {
ProblemTestUtil.assertNoProblems(project.get());
}
final List<IModelElementDelta> added = new ArrayList<IModelElementDelta>();
final List<IModelElementDelta> changed = new ArrayList<IModelElementDelta>();
final List<IModelElementDelta> removed = new ArrayList<IModelElementDelta>();
final IElementChangedListener listener = new IElementChangedListener() {
@Override
public void elementChanged(ElementChangedEvent event) {
if (VERBOSE) {
System.out.println(testname.getMethodName() + " " + event);
}
visit(event.getDelta());
if (VERBOSE) {
System.out.println(added);
System.out.println(changed);
System.out.println(removed);
System.out.println("");
}
}
private void visit(IModelElementDelta delta) {
if (!(delta.getElement() instanceof IScriptModel)) {
switch (delta.getKind()) {
case IModelElementDelta.ADDED:
added.add(delta);
break;
case IModelElementDelta.CHANGED:
changed.add(delta);
break;
case IModelElementDelta.REMOVED:
removed.add(delta);
break;
}
}
for (IModelElementDelta child : delta.getAffectedChildren()) {
visit(child);
}
}
};
// @Test
// Disabled due to http://eclip.se/458130
public void setContainer() throws ModelException,IOException {
final File folder1 = temp.newFolder("folder1");
DLTKCore.addElementChangedListener(listener,
IResourceChangeEvent.POST_CHANGE);
try {
DLTKCore.setBuildpathContainer(TestContainer2.CONTAINER_ID,
new IScriptProject[] { project.getScriptProject() },
new IBuildpathContainer[] { new TestContainer2(folder1) },
null);
} finally {
DLTKCore.removeElementChangedListener(listener);
}
assertEquals(1, added.size());
assertThat(added.get(0).getElement(),
instanceOf(IProjectFragment.class));
assertEquals("folder1", ((IProjectFragment) added.get(0).getElement())
.getPath().lastSegment());
}
@Test
public void changeContainer() throws ModelException,IOException {
final File folder1 = temp.newFolder("folder1");
final File folder2 = temp.newFolder("folder2");
DLTKCore.setBuildpathContainer(TestContainer2.CONTAINER_ID,
new IScriptProject[] { project.getScriptProject() },
new IBuildpathContainer[] { new TestContainer2(folder1) }, null);
DLTKCore.addElementChangedListener(listener,
IResourceChangeEvent.POST_CHANGE);
try {
DLTKCore.setBuildpathContainer(TestContainer2.CONTAINER_ID,
new IScriptProject[] { project.getScriptProject() },
new IBuildpathContainer[] { new TestContainer2(folder2) },
null);
} finally {
DLTKCore.removeElementChangedListener(listener);
}
// XXX (alex) results are not fully correct here, as
// BuildpathChange.generateDelta() calls
// ScriptProject.computeProjectFragments() with checkExistence=false and
// ScriptProjectFragment.getProjectFragment(IPath) can't return fragment
// for the external path.
assertEquals(0, added.size());
assertEquals(0, removed.size());
assertEquals(2, changed.size());
assertEquals(project.getScriptProject(), changed.get(0).getElement());
assertEquals("folder2",
((IProjectFragment) changed.get(1).getElement()).getPath()
.lastSegment());
assertTrue((changed.get(1).getFlags() & IModelElementDelta.F_ADDED_TO_BUILDPATH) != 0);
}
}