/*******************************************************************************
 * Copyright (c) 2009, 2010 Nokia 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:
 * Nokia - Initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.debug.edc.debugger.tests;

import java.math.BigInteger;
import java.util.concurrent.TimeUnit;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.services.EDCServicesTracker;
import org.eclipse.cdt.debug.edc.services.IFrameRegisters;
import org.eclipse.cdt.debug.edc.services.Stack;
import org.eclipse.cdt.debug.edc.tests.TestUtils;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.debug.service.IRunControl2;
import org.eclipse.cdt.dsf.debug.service.IStack;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Status;

public class StackService {

	final static private String dbg_derived_types_cpp
	  = "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp";				
	static final int sLineNumber = 57; // line in above source file.

	private static EDCServicesTracker edcTracker;
	private static Stack stackService;

	private static class StackServiceLaunch extends BaseLaunchTest {

		@Override
		protected String getExeFileName() {
			// This is the executable built by Cygwin gcc 3.4.4
			// All source files are built from this folder:
			//   "C:\\myprog\\BlackFlagWascana\\src\\"
			// Note we don't need any source file to perform the test.
			//
			return "BlackFlagMinGW_NoHardcodedBreak.exe";
		}

		@Override
		protected boolean getStopAtMain() {
			return true;
		}

		@Override
		protected IStack getStackService() {
			if (stackService == null) {
				EDCServicesTracker edcTracker
				  = new EDCServicesTracker(EDCDebugger.getBundleContext(), session.getId());
				stackService = edcTracker.getService(Stack.class);
				Assert.assertNotNull(stackService);
			}
			return stackService;
		}
	}

	private static StackServiceLaunch testLaunch;

	@BeforeClass
	public static void launch() throws Exception {
		testLaunch = new StackServiceLaunch();
		testLaunch.basicLaunch();
		edcTracker
		  = new EDCServicesTracker(EDCDebugger.getBundleContext(), testLaunch.session.getId());
		stackService = edcTracker.getService(Stack.class);
		Assert.assertNotNull(stackService);
	}

	@AfterClass
	public static void shutdown() {
		TestUtils.shutdownDebugSession(testLaunch.launch, testLaunch.session);
		testLaunch = null;
	}

	@Test
	/** 
	 * comments in Stack.getArguments() says it's never
	 * called and that Dsf expects args in with locals,
	 * so this is a "coverage" test only (and will cover
	 * the case where getArguments() starts returning
	 * something.
	 */
	public void coverageGetArguments() throws Exception {
		Query<IStack.IVariableDMContext[]> query = new Query<IStack.IVariableDMContext[]>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IVariableDMContext[]> drm) {
				stackService.getArguments(testLaunch.frame, drm);
			}
		};
		testLaunch.session.getExecutor().execute(query);

		IStack.IVariableDMContext[] argsShouldBeNull = query.get(5, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertNull(argsShouldBeNull);
	}

	@Test
	public void testGetFrameData() throws Exception {
		Query<IStack.IFrameDMData> query = new Query<IStack.IFrameDMData>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IFrameDMData> drm) {
				stackService.getModelData(testLaunch.frame, drm);
			}
		};
		testLaunch.session.getExecutor().execute(query);

		IStack.IFrameDMData frameData = query.get(2, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertNotNull(frameData);
		Assert.assertTrue(frameData instanceof Stack.StackFrameData);
		Stack.StackFrameData stackData = (Stack.StackFrameData)frameData;
		Assert.assertEquals(0, stackData.getLevel());

		query = new Query<IStack.IFrameDMData>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IFrameDMData> drm) {
				stackService.getFrameData(testLaunch.frame, drm);
			}
		};
		testLaunch.session.getExecutor().execute(query);

		frameData = query.get(2, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertTrue(frameData instanceof Stack.StackFrameData);
		Assert.assertTrue(stackData.equals(frameData));
	}

	@Test
	public void testAlwaysFailingFrameRegisters() {
		Stack.AlwaysFailingFrameRegisters regs
		  = new Stack.AlwaysFailingFrameRegisters(new CoreException(Status.OK_STATUS));
		Assert.assertNotNull(regs);
		try {
			regs.getRegister(0, 0);
			Assert.fail("AlwaysFailingFrameRegisters.readRegister() did not throw exception; should have thrown CoreException");
		} catch (CoreException ce) {
			Assert.assertSame(Status.OK_STATUS, ce.getStatus());
		} catch (Exception e) {
			Assert.fail("AlwaysFailingFrameRegisters.readRegister() should have thrown CoreException;"
					+ " instead threw exception with message" + e.getMessage());			
		}
		try {
			regs.writeRegister(0, 0, null);
			Assert.fail("AlwaysFailingFrameRegisters.writeRegister() should have thrown CoreException");
		} catch (CoreException ce) {
			Assert.assertSame("Expecting CoreException with OK_STATUS", Status.OK_STATUS, ce.getStatus());
		} catch (Exception e) {
			Assert.fail("AlwaysFailingFrameRegisters.writeRegister() should have thrown CoreException;"
					+ " instead threw exception with message" + e.getMessage());			
		}
	}

	@Test
	public void testPreservedFrameRegisters () {
		IStack.IFrameDMContext[] frames;
		try {
			frames = stackService.getFramesForDMC(testLaunch.threadDMC, 0, IStack.ALL_FRAMES);
			Assert.assertNotNull(frames);
			Assert.assertEquals("Checking number of frames", 4, frames.length);
			Assert.assertTrue("Expected frame[0] would be instanceof StackFrameDMC",
							  frames[0] instanceof Stack.StackFrameDMC);
			Assert.assertTrue("Expected frame[3] would be instanceof StackFrameDMC",
							  frames[3] instanceof Stack.StackFrameDMC);
			Stack.StackFrameDMC frame0 = (Stack.StackFrameDMC)frames[0];
			Stack.StackFrameDMC frame3 = (Stack.StackFrameDMC)frames[3];
			Assert.assertEquals("Expected frame0 would be equal testLaunch.frame",
								0, frame0.compareTo((Stack.StackFrameDMC)testLaunch.frame));
			Assert.assertEquals("Expected frame0 would be 'greater than' testLaunch.frame",
								1, frame3.compareTo((Stack.StackFrameDMC)testLaunch.frame));
			IFrameRegisters frame3Regs = frame3.getFrameRegisters();
			Assert.assertTrue("Expected frame1 regs would be instanceof PreservedFrameRegisters",
							  frame3Regs instanceof Stack.PreservedFrameRegisters);
			BigInteger r5 = frame3Regs.getRegister(5, 4);
			frame3Regs.writeRegister(5, 4, r5.add(BigInteger.ONE));
			Thread.sleep(400);	// allow write to memory to finish
			Assert.assertEquals(r5.intValue()+1, frame3Regs.getRegister(5, 4).intValue());

			frame3Regs.writeRegister(5, 4, r5);	// put it back the way it was
		} catch (Exception e) {
			Assert.fail(e.getMessage());
		}
	}

//	@Test
//	public void testStackFrameDMCFindEnumeratorByName () {
//		// TODO no enumerators in this stack
//		//	need to create an example with IEnumerators
//	}

	@Test
	public void testVariableData () throws Exception {
		testLaunch.waitRunToLine(edcTracker.getService(IRunControl2.class),
				dbg_derived_types_cpp, sLineNumber, 800);	// 800ms to wait for run
		TestUtils.waitForUIUpdate(1500);					// 1500ms to wait for UI update
		Assert.assertTrue(testLaunch.frame instanceof Stack.StackFrameDMC);
		Query<IStack.IVariableDMContext[]> localsQuery = new Query<IStack.IVariableDMContext[]>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IVariableDMContext[]> drm) {
				stackService.getLocals(testLaunch.frame, drm);
			}
		};
		testLaunch.session.getExecutor().execute(localsQuery);

		final IStack.IVariableDMContext[] locals = localsQuery.get(5, TimeUnit.SECONDS);
		Assert.assertTrue(localsQuery.isDone());
		Assert.assertEquals(3, locals.length);
		Query<IStack.IVariableDMData> query = new Query<IStack.IVariableDMData>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IVariableDMData> drm) {
				stackService.getVariableData(locals[0], drm);
			}
		};
		testLaunch.session.getExecutor().execute(query);

		IStack.IVariableDMData varData = query.get(2, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertTrue(varData instanceof Stack.VariableData);
		Stack.VariableData var0 = (Stack.VariableData)varData;
		Assert.assertEquals("i", var0.getName());
//	TODO getValue() currently returns null
//		if/when it is finally impelemnted, uncomment this
//		and remove the Assert.assertNull() on the following line
//		Assert.assertEquals("0", var0.getValue());
		Assert.assertNull("Stack.VariableData.getValue() may now be properly implemented",
						  var0.getValue());

		query = new Query<IStack.IVariableDMData>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IVariableDMData> drm) {
				stackService.getVariableData(locals[1], drm);
			}
		};
		testLaunch.session.getExecutor().execute(query);

		varData = query.get(2, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertTrue(varData instanceof Stack.VariableData);
		Stack.VariableData var1 = (Stack.VariableData)varData;
		Assert.assertEquals("lstruct", var1.getName());
//	TODO getValue() currently returns null
//		if/when it is finally impelemnted, uncomment this
//		and remove the Assert.assertNull() on the following line
//		Assert.assertEquals("0x22feb0", var1.getValue());
		Assert.assertNull("Stack.VariableData.getValue() may now be properly implemented",
						  var1.getValue());

		query = new Query<IStack.IVariableDMData>() {
			@Override
			protected void execute(final DataRequestMonitor<IStack.IVariableDMData> drm) {
				stackService.getVariableData(locals[2], drm);
			}
		};
		testLaunch.session.getExecutor().execute(query);

		varData = query.get(2, TimeUnit.SECONDS);
		Assert.assertTrue(query.isDone());
		Assert.assertTrue(varData instanceof Stack.VariableData);
		Stack.VariableData var2 = (Stack.VariableData)varData;
		Assert.assertEquals("lnested_struct", var2.getName());
//	TODO getValue() currently returns null
//		if/when it is finally impelemnted, uncomment this
//		and remove the Assert.assertNull() on the following line
//		Assert.assertEquals("0x22fa60", var2.getValue());
		Assert.assertNull("Stack.VariableData.getValue() may now be properly implemented",
				  		  var2.getValue());
	}
}
