/*******************************************************************************
 * Copyright (c) 2000, 2005 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.debug.jdi.tests;

import java.util.List;
import java.util.ListIterator;

import com.sun.jdi.Field;
import com.sun.jdi.Location;
import com.sun.jdi.request.AccessWatchpointRequest;
import com.sun.jdi.request.BreakpointRequest;
import com.sun.jdi.request.ClassPrepareRequest;
import com.sun.jdi.request.ClassUnloadRequest;
import com.sun.jdi.request.EventRequestManager;
import com.sun.jdi.request.ExceptionRequest;
import com.sun.jdi.request.ModificationWatchpointRequest;
import com.sun.jdi.request.StepRequest;
import com.sun.jdi.request.ThreadDeathRequest;
import com.sun.jdi.request.ThreadStartRequest;

/**
 * Tests for JDI com.sun.jdi.request.EventRequestManager.
 */
public class EventRequestManagerTest extends AbstractJDITest {

	private EventRequestManager fManager;
	/**
	 * Creates a new test.
	 */
	public EventRequestManagerTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	public void localSetUp() {
		// Get the event request manager
		fManager = fVM.eventRequestManager();
	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new EventRequestManagerTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	public String getName() {
		return "com.sun.jdi.request.EventRequestManager";
	}
	/**
	 * Test JDI createAccessWatchpointRequest(Field), accessWatchpointRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIAccessWatchpointRequest() {
		if (!fVM.canWatchFieldAccess())
			return;
		
		// Create an access watchpoint request
		Field field = getField();
		AccessWatchpointRequest request = fManager.createAccessWatchpointRequest(field);
		assertEquals("1", field, request.field());
	
		// Get all access watchpoint requests
		List requests = fManager.accessWatchpointRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("2."+i++, iterator.next() instanceof AccessWatchpointRequest);
		}
		
		// Delete an access watchpoint request
		fManager.deleteEventRequest(request);
		assertEquals("3", 0, fManager.accessWatchpointRequests().size());
	}
	/**
	 * Test JDI createBreakpointRequest(Location), breakpointRequests(), 
	 * deleteEventRequest(EventRequest) and deleteAllBreakpoints()
	 */
	public void testJDIBreakpointRequest() {
		// Create a breakpoint at a valid location
		Location location = getLocation();
		BreakpointRequest bp = fManager.createBreakpointRequest(location);
		assertEquals("1", location, bp.location());

		// Get all breakpoints
		List breakpoints = fManager.breakpointRequests();
		ListIterator iterator = breakpoints.listIterator();
		while (iterator.hasNext()) {
			Object breakpoint = iterator.next();
			assertTrue("3", breakpoint instanceof BreakpointRequest);
		}
		
		// Delete a breakpoint
		fManager.deleteEventRequest(bp);
		assertEquals("4", 0, fManager.breakpointRequests().size());
	
		// Delete all breakpoints
		fManager.createBreakpointRequest(location);
		fManager.deleteAllBreakpoints();
		assertEquals("5", 0, fManager.breakpointRequests().size());
	}
	/**
	 * Test JDI createClassPrepareRequest(), classPrepareRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIClassPrepareRequest() {
		// Create a class prepare request
		ClassPrepareRequest request= fManager.createClassPrepareRequest();
	
		// Get all class prepare requests
		List requests = fManager.classPrepareRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("1."+i++, iterator.next() instanceof ClassPrepareRequest);
		}
		
		// Delete a class prepare request
		fManager.deleteEventRequest(request);
		assertEquals("2", 0, fManager.classPrepareRequests().size());
	}
	/**
	 * Test JDI createClassUnloadRequest(), classUnloadRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIClassUnloadRequest() {
		// Create a class unload request
		ClassUnloadRequest request= fManager.createClassUnloadRequest();
	
		// Get all class unload requests
		List requests = fManager.classUnloadRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("1."+i++, iterator.next() instanceof ClassUnloadRequest);
		}
		
		// Delete a class unload request
		fManager.deleteEventRequest(request);
		assertEquals("2", 0, fManager.classUnloadRequests().size());
	}
	/**
	 * Test JDI createExceptionRequest(), exceptionRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIExceptionRequest() {
		// Create a exception request
		ExceptionRequest request= fManager.createExceptionRequest(null, true, true);
	
		// Get all exception requests
		List requests = fManager.exceptionRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("1."+i++, iterator.next() instanceof ExceptionRequest);
		}
		
		// Delete a exception request
		fManager.deleteEventRequest(request);
		assertEquals("2", i-1, fManager.exceptionRequests().size());
	}
	/**
	 * Test JDI createModificationWatchpointRequest(Field), 
	 * accessWatchpointRequests() and deleteEventRequest(EventRequest)
	 */
	public void testJDIModificationWatchpointRequest() {
		if (!fVM.canWatchFieldAccess())
			return;
	
		// Create a modification watchpoint
		Field field = getField();
		ModificationWatchpointRequest request = fManager.createModificationWatchpointRequest(field);
		assertEquals("1", field, request.field());
	
		// Get all modification watchpoints
		List requests = fManager.modificationWatchpointRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("2."+i++, iterator.next() instanceof ModificationWatchpointRequest);
		}
		
		// Delete a modification watchpoint
		fManager.deleteEventRequest(request);
		assertEquals("3", 0, fManager.modificationWatchpointRequests().size());
	}
	/**
	 * Test JDI createStepRequest(), stepRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIStepRequest() {
		// Create a step request
		StepRequest request= fManager.createStepRequest(getThread(), StepRequest.STEP_LINE, StepRequest.STEP_OVER);
	
		// Get all step requests
		List requests = fManager.stepRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("1."+i++, iterator.next() instanceof StepRequest);
		}
		
		// Delete a step request
		fManager.deleteEventRequest(request);
		assertEquals("2", 0, fManager.stepRequests().size());
	}
	/**
	 * Test JDI createThreadDeathRequest(), threadDeathRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIThreadDeathRequest() {
		// Create a ThreadDeath request
		ThreadDeathRequest request= fManager.createThreadDeathRequest();
	
		// Get all ThreadDeath requests
		List requests = fManager.threadDeathRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("1."+i++, iterator.next() instanceof ThreadDeathRequest);
		}
		
		// Delete a ThreadDeath request
		fManager.deleteEventRequest(request);
		assertEquals("2", 0, fManager.threadDeathRequests().size());
	}
	/**
	 * Test JDI createThreadStartRequest(), classUnloadRequests()
	 * and deleteEventRequest(EventRequest)
	 */
	public void testJDIThreadStartRequest() {
		// Create a ThreadStart request
		ThreadStartRequest request= fManager.createThreadStartRequest();
	
		// Get all ThreadStart requests
		List requests = fManager.classUnloadRequests();
		ListIterator iterator = requests.listIterator();
		int i=0;
		while (iterator.hasNext()) {
			assertTrue("1."+i++, iterator.next() instanceof ThreadStartRequest);
		}
		
		// Delete a ThreadStart request
		fManager.deleteEventRequest(request);
		assertEquals("2", 0, fManager.classUnloadRequests().size());
	}
}
