blob: 4a8b11685edf6f0025d8b2ed209074909552240a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2018 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.compare.tests;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.compare.internal.WorkQueue;
import org.eclipse.compare.internal.Worker;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.operation.IRunnableWithProgress;
import junit.framework.TestCase;
public class AsyncExecTests extends TestCase {
public AsyncExecTests() {
super();
}
public AsyncExecTests(String name) {
super(name);
}
public void testQueueAdd() {
WorkQueue q = new WorkQueue();
assertTrue(q.isEmpty());
IRunnableWithProgress r = monitor -> {
// Nothing to do for now
};
IRunnableWithProgress r2 = monitor -> {
// Nothing to do for now
};
// Ensure that adding an element adds it
q.add(r);
assertEquals(1, q.size());
assertTrue(q.contains(r));
assertEquals(r, q.remove());
assertTrue(q.isEmpty());
// Ensure that adding an element again replaces it
q.add(r);
q.add(r);
assertEquals(1, q.size());
assertTrue(q.contains(r));
// Ensure remove order matches add order
q.add(r2);
assertEquals(2, q.size());
assertTrue(q.contains(r));
assertTrue(q.contains(r2));
assertEquals(r, q.remove());
assertEquals(1, q.size());
assertEquals(r2, q.remove());
assertTrue(q.isEmpty());
// Ensure remove order adjusted when same element added
q.add(r);
q.add(r2);
q.add(r);
assertEquals(2, q.size());
assertTrue(q.contains(r));
assertTrue(q.contains(r2));
assertEquals(r2, q.remove());
assertEquals(1, q.size());
assertEquals(r, q.remove());
assertTrue(q.isEmpty());
}
public void testWorker() {
final Worker w = new Worker("");
final List<IRunnableWithProgress> worked = new ArrayList<>();
IRunnableWithProgress r = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
assertTrue(w.isWorking());
assertTrue(w.hasWork());
worked.add(this);
}
};
IRunnableWithProgress r2 = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
assertTrue(w.isWorking());
assertTrue(w.hasWork());
worked.add(this);
}
};
// Test one task
w.add(r);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
assertTrue(worked.isEmpty());
w.run(new NullProgressMonitor());
assertFalse(w.hasWork());
assertFalse(w.isWorking());
assertEquals(1, worked.size());
assertEquals(r, worked.get(0));
// Test two tasks
worked.clear();
w.add(r);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.add(r2);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.run(new NullProgressMonitor());
assertFalse(w.hasWork());
assertFalse(w.isWorking());
assertEquals(2, worked.size());
assertEquals(r, worked.get(0));
assertEquals(r2, worked.get(1));
// Test re-add order
worked.clear();
w.add(r);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.add(r2);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.add(r);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.run(new NullProgressMonitor());
assertFalse(w.hasWork());
assertFalse(w.isWorking());
assertEquals(2, worked.size());
assertEquals(r, worked.get(1));
assertEquals(r2, worked.get(0));
}
public void testCancelOnRequeue() {
final Worker w = new Worker("");
final List<IRunnableWithProgress> worked = new ArrayList<>();
IRunnableWithProgress r = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
if (worked.isEmpty()) {
worked.add(this);
w.add(this);
assertTrue(monitor.isCanceled());
throw new OperationCanceledException();
}
assertTrue(w.isWorking());
assertTrue(w.hasWork());
worked.add(this);
}
};
IRunnableWithProgress r2 = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
assertTrue(w.isWorking());
assertTrue(w.hasWork());
worked.add(this);
}
};
worked.clear();
w.add(r);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.add(r2);
assertTrue(w.hasWork());
assertFalse(w.isWorking());
w.run(new NullProgressMonitor());
assertFalse(w.hasWork());
assertFalse(w.isWorking());
assertEquals(3, worked.size());
assertEquals(r, worked.get(0));
assertEquals(r2, worked.get(1));
assertEquals(r, worked.get(2));
}
}