/*******************************************************************************
 * Copyright (c) 2010, 2012 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.debug.rhino.tests;

import java.util.Collection;

import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
import org.eclipse.wst.jsdt.debug.transport.packet.Response;

/**
 * Variety of tests for thread requests
 * 
 * @since 1.1
 */
public class ThreadRequestTests extends RequestTest {

	/**
	 * Tests requesting the threads from the debugger when there are none
	 * @throws Exception
	 */
	public void testThreadsWithNoThreads() throws Exception {
		RhinoRequest request = new RhinoRequest(JSONConstants.THREADS);
		debugSession.send(request);
		Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
		assertTrue(response.isSuccess());
		Collection threads = (Collection) response.getBody().get(JSONConstants.THREADS);
		assertNotNull(threads);
		assertTrue(threads.isEmpty());
	}

	/**
	 * Tests asking the VM for a thread with an invalid ID
	 * @throws Exception
	 */
	public void testInvalidThread() throws Exception {
		RhinoRequest request = new RhinoRequest("context"); //$NON-NLS-1$
		request.getArguments().put(JSONConstants.THREAD_ID, Integer.valueOf("9999")); //$NON-NLS-1$
		debugSession.send(request);
		Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
		assertFalse(response.isSuccess());
	}
	
	/**
	 * Tests getting threads from the VM
	 * @throws Exception
	 */
	public void testThreads() throws Exception {
		eventHandler.addSubhandler(new SetBreakpointHandler(new int[] {16}));
		eventHandler.addSubhandler(new ThreadCheckHandler());
		String script = Util.getTestSource(Util.SRC_SCRIPTS_CONTAINER, "script1.js"); //$NON-NLS-1$
		assertNotNull("The test source for [script1.js] must exist", script); //$NON-NLS-1$
		evalScript(script);
		//script event + breakpoint on line 6
		waitForEvents(2);
	}
}
