/******************************************************************************* * Copyright (c) 2013, 2017 NumberFour AG and others. * * 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<>(); final List<IModelElementDelta> changed = new ArrayList<>(); final List<IModelElementDelta> removed = new ArrayList<>(); 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); } }