/**********************************************************************
 * Copyright (c) 2003 IBM Corporation and others. All rights reserved.   This
 * program and the accompanying materials are made available under the terms of
 * the Common Public License v1.0 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors: 
 * IBM - Initial API and implementation
 **********************************************************************/
package org.eclipse.core.tests.runtime.jobs;

import junit.framework.TestCase;
import org.eclipse.core.internal.jobs.InternalJob;
import org.eclipse.core.internal.jobs.JobQueue;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;

/**
 * 
 */
public class JobQueueTest extends TestCase {
	class Entry extends InternalJob {
		Entry(int value) {
			super("Entry");
			setPriority(value);
		}
		protected IStatus run(IProgressMonitor monitor) {
			return Status.OK_STATUS;
		}
	}
	private JobQueue queue;

	public JobQueueTest(String name) {
		super(name);
	}
	protected void setUp() throws Exception {
		super.setUp();
		this.queue = new JobQueue(false);
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}
	public void testEqualValues() {
		//if several equal values are entered, they should come out in FIFO order
		final int NUM_ENTRIES = 10;
		Entry[] entries = new Entry[NUM_ENTRIES];
		for (int i = 0; i < entries.length; i++) {
			entries[i] = new Entry(Job.LONG);
			queue.enqueue(entries[i]);
			assertEquals("1.0." + i, entries[0], queue.peek());
		}
		for (int i = 0; i < entries.length; i++) {
			assertEquals("2.0." + i, entries[i], queue.dequeue());
		}
	}
	public void testBasic() {
		Entry[] entries = createEntries();
		assertTrue("1.0", queue.isEmpty());
		assertTrue("1.1", queue.dequeue() == null);
		assertTrue("1.2", queue.peek() == null);
		for (int i = 0; i < entries.length; i++) {
			queue.enqueue(entries[i]);
			assertTrue("1.3", queue.peek() != null);
		}
		for (int i = 0; i < entries.length; i++) {
			queue.remove(entries[i]);
			if (i+1 < entries.length)
				assertTrue("1.4." + i, queue.peek() != null);
		}
		assertTrue("2.0", queue.isEmpty());
		assertTrue("2.1", queue.dequeue() == null);
		assertTrue("2.2", queue.peek() == null);
		for (int i = 0; i < entries.length; i++) {
			queue.enqueue(entries[i]);
		}
		int count = entries.length;
		while (!queue.isEmpty()) {
			InternalJob peek = queue.peek();
			InternalJob removed = queue.dequeue();
			assertEquals("3.0." + count, peek, removed);
			count--;
		}
		assertEquals("3.1", 0, count);
	}

	private Entry[] createEntries() {
		return new Entry[] {
			new Entry(Job.INTERACTIVE),
			new Entry(Job.BUILD),
			new Entry(Job.INTERACTIVE),
			new Entry(Job.SHORT),
			new Entry(Job.DECORATE),
			new Entry(Job.LONG),
			new Entry(Job.SHORT),
			new Entry(Job.BUILD),
			new Entry(Job.LONG),
			new Entry(Job.DECORATE),
		};
	}
}