| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.core.tests.resources.usecase; |
| |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| import org.eclipse.core.resources.*; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.core.tests.resources.ResourceTest; |
| |
| public class IWorkspaceRunnableUseCaseTest extends ResourceTest { |
| public IWorkspaceRunnableUseCaseTest() { |
| super(); |
| } |
| |
| public IWorkspaceRunnableUseCaseTest(String name) { |
| super(name); |
| } |
| |
| protected IWorkspaceRunnable createRunnable(final IProject project, final IWorkspaceRunnable nestedOperation, final boolean triggerBuild, final Exception exceptionToThrow) { |
| return monitor -> { |
| if (exceptionToThrow != null) { |
| if (exceptionToThrow instanceof CoreException) { |
| throw (CoreException) exceptionToThrow; |
| } |
| if (exceptionToThrow instanceof RuntimeException) { |
| throw (RuntimeException) exceptionToThrow; |
| } |
| throw new IllegalArgumentException(exceptionToThrow); |
| } |
| if (triggerBuild) { |
| project.touch(getMonitor()); |
| } |
| if (nestedOperation != null) { |
| getWorkspace().run(nestedOperation, getMonitor()); |
| } |
| }; |
| } |
| |
| public static Test suite() { |
| return new TestSuite(IWorkspaceRunnableUseCaseTest.class); |
| } |
| |
| public void testNestedOperationsAndBuilds() { |
| IWorkspaceDescription original = getWorkspace().getDescription(); |
| IProject project = getWorkspace().getRoot().getProject("MyProject"); |
| try { |
| IWorkspaceDescription description = getWorkspace().getDescription(); |
| description.setAutoBuilding(true); |
| getWorkspace().setDescription(description); |
| IProjectDescription prjDescription = getWorkspace().newProjectDescription("MyProject"); |
| ICommand command = prjDescription.newCommand(); |
| command.setBuilderName(SignaledBuilder.BUILDER_ID); |
| prjDescription.setBuildSpec(new ICommand[] {command}); |
| project.create(prjDescription, getMonitor()); |
| project.open(getMonitor()); |
| } catch (CoreException e) { |
| fail("0.0", e); |
| } |
| waitForBuild(); |
| SignaledBuilder builder = SignaledBuilder.getInstance(project); |
| |
| /* should trigger a build */ |
| IWorkspaceRunnable op1 = createRunnable(project, null, true, null); |
| IWorkspaceRunnable op2 = createRunnable(project, op1, false, null); |
| IWorkspaceRunnable op3 = createRunnable(project, op2, false, null); |
| builder.reset(); |
| try { |
| getWorkspace().run(op3, getMonitor()); |
| } catch (CoreException e) { |
| fail("1.0", e); |
| } |
| waitForBuild(); |
| assertTrue("1.1", builder.wasExecuted()); |
| |
| /* should not trigger a build */ |
| op1 = createRunnable(project, null, true, new OperationCanceledException()); |
| op2 = createRunnable(project, op1, true, null); |
| op3 = createRunnable(project, op2, true, null); |
| builder.reset(); |
| try { |
| getWorkspace().run(op3, getMonitor()); |
| fail("2.0"); |
| } catch (CoreException e) { |
| fail("2.1", e); |
| } catch (OperationCanceledException e) { |
| // expected |
| } |
| //waitForBuild(); // TODO: The test is invalid since it fails if this line is uncommented. |
| assertTrue("2.2", !builder.wasExecuted()); |
| |
| /* should not trigger a build */ |
| op1 = createRunnable(project, null, true, new CoreException(Status.CANCEL_STATUS)); |
| op2 = createRunnable(project, op1, true, null); |
| op3 = createRunnable(project, op2, true, null); |
| builder.reset(); |
| try { |
| getWorkspace().run(op3, getMonitor()); |
| fail("3.0"); |
| } catch (CoreException e) { |
| assertEquals(Status.CANCEL_STATUS, e.getStatus()); |
| } |
| //waitForBuild(); // TODO: The test is invalid since it fails if this line is uncommented. |
| assertTrue("3.1", !builder.wasExecuted()); |
| |
| /* should not trigger a build */ |
| op1 = createRunnable(project, null, false, null); |
| op2 = createRunnable(project, op1, false, null); |
| op3 = createRunnable(project, op2, false, null); |
| builder.reset(); |
| try { |
| getWorkspace().run(op3, getMonitor()); |
| } catch (CoreException e) { |
| fail("4.0", e); |
| } |
| //waitForBuild(); // TODO: The test is invalid since it fails if this line is uncommented. |
| assertTrue("4.1", !builder.wasExecuted()); |
| |
| /* remove trash */ |
| try { |
| project.delete(true, getMonitor()); |
| getWorkspace().setDescription(original); |
| } catch (CoreException e) { |
| fail("20.0", e); |
| } |
| } |
| } |