blob: ddb6f64101103359c76e01b7fe7eb69d93f1726c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.compare.internal.WorkQueue;
import org.eclipse.compare.internal.Worker;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.operation.IRunnableWithProgress;
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 = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
// Nothing to do for now
}
};
IRunnableWithProgress r2 = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
// Nothing to do for now
}
};
// Ensure that adding an element adds it
q.add(r);
assertTrue(q.size() == 1);
assertTrue(q.contains(r));
assertTrue(q.remove() == r);
assertTrue(q.isEmpty());
// Ensure that adding an element again replaces it
q.add(r);
q.add(r);
assertTrue(q.size() == 1);
assertTrue(q.contains(r));
// Ensure remove order matches add order
q.add(r2);
assertTrue(q.size() == 2);
assertTrue(q.contains(r));
assertTrue(q.contains(r2));
assertTrue(q.remove() == r);
assertTrue(q.size() == 1);
assertTrue(q.remove() == r2);
assertTrue(q.isEmpty());
// Ensure remove order adjusted when same element added
q.add(r);
q.add(r2);
q.add(r);
assertTrue(q.size() == 2);
assertTrue(q.contains(r));
assertTrue(q.contains(r2));
assertTrue(q.remove() == r2);
assertTrue(q.size() == 1);
assertTrue(q.remove() == r);
assertTrue(q.isEmpty());
}
public void testWorker() throws InvocationTargetException, InterruptedException {
final Worker w = new Worker("");
final List worked = new ArrayList();
IRunnableWithProgress r = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
assertTrue(w.isWorking());
assertTrue(w.hasWork());
worked.add(this);
}
};
IRunnableWithProgress r2 = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
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());
assertTrue(worked.size() == 1);
assertTrue(worked.get(0) == r);
// 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());
assertTrue(worked.size() == 2);
assertTrue(worked.get(0) == r);
assertTrue(worked.get(1) == r2);
// 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());
assertTrue(worked.size() == 2);
assertTrue(worked.get(1) == r);
assertTrue(worked.get(0) == r2);
}
public void testCancelOnRequeue() throws InvocationTargetException, InterruptedException {
final Worker w = new Worker("");
final List worked = new ArrayList();
IRunnableWithProgress r = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
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() {
public void run(IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException {
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());
assertTrue(worked.size() == 3);
assertTrue(worked.get(0) == r);
assertTrue(worked.get(1) == r2);
assertTrue(worked.get(2) == r);
}
}