/*******************************************************************************
 * 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.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;

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;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;

/**
 * Variety of tests requesting information from scripts
 * 
 * @since 1.1
 */
public class ScriptRequestTests extends RequestTest {

	/**
	 * Tests asking for all scripts when there are none
	 * 
	 * @throws Exception
	 */
	public void testScriptsWithNoScripts() throws Exception {
		RhinoRequest request = new RhinoRequest(JSONConstants.SCRIPTS);
		debugSession.send(request);
		Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
		assertTrue(response.isSuccess());
		Collection scripts = (Collection) response.getBody().get(JSONConstants.SCRIPTS);
		assertNotNull(scripts);
		assertTrue(scripts.isEmpty());
	}
	
	/**
	 * Tests getting a script and asserting its information
	 * 
	 * @throws Exception
	 */
	public void testScript() throws Exception {
		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$
		Scriptable scope = null;
		Context context = contextFactory.enterContext();
		try {
			scope = context.initStandardObjects();
			context.evaluateString(scope, script, "script", 0, null); //$NON-NLS-1$
		} finally {
			Context.exit();
		}

		RhinoRequest request = new RhinoRequest(JSONConstants.SCRIPTS);
		debugSession.send(request);
		Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
		assertTrue(response.isSuccess());
		List scripts = (List) response.getBody().get(JSONConstants.SCRIPTS);
		assertNotNull(scripts);
		assertFalse(scripts.isEmpty());

		request = new RhinoRequest("script"); //$NON-NLS-1$
		request.getArguments().put("scriptId", scripts.get(0)); //$NON-NLS-1$
		debugSession.send(request);
		response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
		assertTrue(response.isSuccess());
		Map result = (Map) response.getBody().get(JSONConstants.SCRIPT);
		assertEquals(script, result.get(JSONConstants.SOURCE));
		List lineNumbers = (List) result.get(JSONConstants.LINES);
		assertEquals(8, lineNumbers.size());
		assertTrue("The line number [10] should be returned", lineNumbers.contains(new BigDecimal(10))); //$NON-NLS-1$
		assertTrue("The line number [11] should be returned", lineNumbers.contains(new BigDecimal(11))); //$NON-NLS-1$
		assertTrue("The line number [12] should be returned", lineNumbers.contains(new BigDecimal(12))); //$NON-NLS-1$
		assertTrue("The line number [15] should be returned", lineNumbers.contains(new BigDecimal(15))); //$NON-NLS-1$
		assertTrue("The line number [16] should be returned", lineNumbers.contains(new BigDecimal(16))); //$NON-NLS-1$
		assertTrue("The line number [19] should be returned", lineNumbers.contains(new BigDecimal(19))); //$NON-NLS-1$
		assertTrue("The line number [22] should be returned", lineNumbers.contains(new BigDecimal(22))); //$NON-NLS-1$
		assertTrue("The line number [23] should be returned", lineNumbers.contains(new BigDecimal(23))); //$NON-NLS-1$

		List functionNames = (List) result.get(JSONConstants.FUNCTIONS);
		assertEquals(2, functionNames.size());
		assertEquals("test", functionNames.get(0)); //$NON-NLS-1$
		assertEquals("test2", functionNames.get(1)); //$NON-NLS-1$
	}
}
