/*******************************************************************************
 * 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.LinkedList;
import java.util.List;

import com.sun.jdi.request.EventRequest;
import com.sun.jdi.request.StepRequest;

/**
 * Tests for JDI com.sun.jdi.request.EventRequest.
 */
public class EventRequestTest extends AbstractJDITest {

	private List fRequests = new LinkedList();
	/**
	 * Creates a new test.
	 */
	public EventRequestTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	public void localSetUp() {
		// Get all kinds of request
		if (fVM.canWatchFieldAccess())
			fRequests.add(getAccessWatchpointRequest());
		fRequests.add(getBreakpointRequest());
		fRequests.add(fVM.eventRequestManager().createClassPrepareRequest());
		fRequests.add(fVM.eventRequestManager().createClassUnloadRequest());
		fRequests.add(getExceptionRequest());
		if (fVM.canWatchFieldModification())
			fRequests.add(getModificationWatchpointRequest());
		fRequests.add(
			fVM.eventRequestManager().createStepRequest(
				getThread(),
				StepRequest.STEP_LINE,
				StepRequest.STEP_OVER));
		fRequests.add(fVM.eventRequestManager().createThreadDeathRequest());
		fRequests.add(fVM.eventRequestManager().createThreadStartRequest());
	}
	/**
	 * Make sure the test leaves the VM in the same state it found it.
	 */
	public void localTearDown() {
		// Delete the requests we created in this test
		fVM.eventRequestManager().deleteEventRequests(fRequests);
	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new EventRequestTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	public String getName() {
		return "com.sun.jdi.request.EventRequest";
	}
	/**
	 * Test JDI disable(), enable(), isEnable() and setEnable(boolean).
	 */
	public void testJDIEnable() {
		for (int i = 0; i < fRequests.size(); i++) {
			EventRequest request = (EventRequest) fRequests.get(i);
			assertTrue("1." + i, !request.isEnabled());
			request.setEnabled(true);
			assertTrue("2." + i, request.isEnabled());
			request.setEnabled(false);
			assertTrue("3." + i, !request.isEnabled());
			request.enable();
			assertTrue("4." + i, request.isEnabled());
			request.disable();
			assertTrue("5." + i, !request.isEnabled());
		}
	}
	/**
	 * Test JDI setSuspendPolicy(int) and suspendPolicy().
	 */
	public void testJDISuspendPolicy() {
		int policy = EventRequest.SUSPEND_EVENT_THREAD;
		for (int i = 0; i < fRequests.size(); i++) {
			EventRequest request = (EventRequest) fRequests.get(i);
			request.setSuspendPolicy(policy);
		}
		for (int i = 0; i < fRequests.size(); i++) {
			EventRequest request = (EventRequest) fRequests.get(i);
			assertTrue(String.valueOf(i), request.suspendPolicy() == policy);
		}
	}
	/**
	 * Test JDI putProperty and getProperty.
	 */
	public void testJDIProperties() {
		EventRequest request = (EventRequest) fRequests.get(0);
		request.putProperty(new Integer(0), "prop1");
		String prop = (String) request.getProperty(new Integer(0));
		assertTrue("1", prop.equals("prop1"));

		request.putProperty(new Integer(0), null);
		prop = (String) request.getProperty(new Integer(0));
		assertTrue("2", prop == null);

		request.putProperty(new Integer(0), "prop2");
		request.putProperty(new Integer(0), "prop3");
		prop = (String) request.getProperty(new Integer(0));
		assertTrue("3", prop.equals("prop3"));

		request.putProperty(new Integer(0), null);
		prop = (String) request.getProperty(new Integer(0));
		assertTrue("4", prop == null);

		request.putProperty(new Integer(1), null);
		prop = (String) request.getProperty(new Integer(1));
		assertTrue("5", prop == null);

		request.putProperty(new Integer(1), "prop1");
		prop = (String) request.getProperty(new Integer(1));
		assertTrue("6", prop.equals("prop1"));

	}
}
