/*******************************************************************************
 * Copyright (c) 2016 Till Brychcy 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:
 *     Till Brychcy - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.test.stepping;

import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaValue;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;

public class StepResultTests extends AbstractDebugTest {

	public StepResultTests(String name) {
		super(name);
	}

	public void testReturnValueAfterStepReturn() throws Exception {
		String typeName = "StepResult1";
		ILineBreakpoint bp1 = createLineBreakpoint(28, "StepResult1");
		bp1.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp1, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("h", stackFrame.getMethodName());

			thread = stepReturn(stackFrame);
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());
			IVariable varInG = stackFrame.getVariables()[0];
			assertEquals("h() returned", varInG.getName());
			assertEquals("\"h-i\"", varInG.getValue().toString());


			// skip the synthetic via a step filter.
			IJavaDebugTarget javaDebugTarget = (IJavaDebugTarget) stackFrame.getDebugTarget();
			boolean oldStepFiltersEnabled = javaDebugTarget.isStepFiltersEnabled();
			boolean oldFilterSynthetics = javaDebugTarget.isFilterSynthetics();
			try {
				javaDebugTarget.setStepFiltersEnabled(true);
				javaDebugTarget.setFilterSynthetics(true);
				thread = stepReturn(stackFrame);
			}
			finally {
				javaDebugTarget.setStepFiltersEnabled(oldStepFiltersEnabled);
				javaDebugTarget.setFilterSynthetics(oldFilterSynthetics);
			}
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("f", stackFrame.getMethodName());
			IVariable varInF = stackFrame.getVariables()[0];
			assertEquals("access$0() returned", varInF.getName());
			assertEquals("\"g-h-i-j\"", varInF.getValue().toString());

			thread = stepReturn(stackFrame);
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("main", stackFrame.getMethodName());
			IVariable varInMain1 = stackFrame.getVariables()[0];
			assertEquals("f() returned", varInMain1.getName());

			// test that running the thread a bit will clear the "f() returned"
			thread = stepOver(stackFrame);
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("main", stackFrame.getMethodName());
			IVariable varInMain2 = stackFrame.getVariables()[0];
			assertEquals("x", varInMain2.getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * test that if the step return is aborted by some other break point, no return value of a recursive invocation is shown
	 * 
	 * @throws Exception
	 */
	public void testNoReturnValueAfterAbortedStepReturn() throws Exception {
		String typeName = "StepResult1";
		ILineBreakpoint bp2A = createLineBreakpoint(49, "StepResult1");
		bp2A.setEnabled(true);
		ILineBreakpoint bp2B = createLineBreakpoint(50, "StepResult1");
		bp2B.setEnabled(true);
		ILineBreakpoint bp2C = createLineBreakpoint(24, "StepResult1");
		bp2C.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp2A, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("j", stackFrame.getMethodName());

			// trigger stepReturn, but bp2B will be hit.
			stackFrame.stepReturn();

			resumeToLineBreakpoint(thread, bp2B);

			IStackFrame[] stackFrames = thread.getStackFrames();
			stackFrame = (IJavaStackFrame) stackFrames[0];
			assertEquals("j", stackFrame.getMethodName());

			stackFrame = (IJavaStackFrame) stackFrames[1];
			assertEquals("g", stackFrame.getMethodName());

			// bp2C is at the target stack level of the stepReturn
			resumeToLineBreakpoint(thread, bp2C);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());

			IVariable varInH = stackFrame.getVariables()[0];

			// specifically no "i() returned" must be present
			assertEquals("this", varInH.getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testNoReturnValueAfterStepReturnWithException() throws Exception {
		String typeName = "StepResult1";
		ILineBreakpoint bp3A = createLineBreakpoint(41, "StepResult1");
		bp3A.setEnabled(true);
		ILineBreakpoint bp3B = createLineBreakpoint(33, "StepResult1");
		bp3B.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp3A, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("i", stackFrame.getMethodName());

			stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("h", stackFrame.getMethodName());

			IVariable varInH = stackFrame.getVariables()[0];

			assertEquals("i() threw", varInH.getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testReturnValueAfterStepReturnInStatic() throws Exception {
		String typeName = "StepResult1";
		ILineBreakpoint bp4 = createLineBreakpoint(56, "StepResult1");
		bp4.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp4, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("s", stackFrame.getMethodName());

			thread = stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("main", stackFrame.getMethodName());

			IVariable varInMain = stackFrame.getVariables()[0];

			assertEquals("s() returned", varInMain.getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testReturnValueAfterStepReturnViaInterface() throws Exception {
		String typeName = "StepResult1";
		ILineBreakpoint bp5 = createLineBreakpoint(66, "StepResult1");
		bp5.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp5, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("get", stackFrame.getMethodName());

			thread = stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("testViaInterface", stackFrame.getMethodName());

			IVariable varInMain = stackFrame.getVariables()[0];

			assertEquals("get() returned", varInMain.getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testHasExitedWithExceptionFor5BytesDistance() throws Exception {
		String typeName = "StepResult1";
		ILineBreakpoint bp3 = createLineBreakpoint(41, "StepResult1");
		bp3.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp3, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("i", stackFrame.getMethodName());

			stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("h", stackFrame.getMethodName());

			IVariable varInH = stackFrame.getVariables()[0];

			assertEquals("i() threw", varInH.getName());

			// will set the thread to running to get the toString result
			IJavaValue stringValue = ((IJavaObject) varInH.getValue()).sendMessage("toString", "()Ljava/lang/String;", null, thread, false);

			assertEquals("\"java.lang.RuntimeException: i\"", stringValue.toString());

			// because the thread has run in between, check that after refreshing the stack, the thrown exception is still present
			IVariable varInH2 = stackFrame.getVariables()[0];
			assertEquals("i() threw", varInH2.getName());

		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testStepReturn_ExceptionWithFinallyAndEmptyCatch() throws Exception {
		String typeName = "StepResult2";
		ILineBreakpoint bp6 = createLineBreakpoint(38, "StepResult2");
		bp6.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp6, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("i", stackFrame.getMethodName());

			stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // in finally clause
			assertEquals("g", stackFrame.getMethodName());

			IVariable varInG = stackFrame.getVariables()[0];

			assertEquals("i() threw", varInG.getName());

			stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // after empty catch clause
			assertEquals("f", stackFrame.getMethodName());

			IVariable varInF = stackFrame.getVariables()[0];

			assertEquals("g() threw", varInF.getName());

		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testStepOver_ExceptionWithFinallyAndEmptyCatch() throws Exception {
		String typeName = "StepResult2";
		ILineBreakpoint bp6 = createLineBreakpoint(38, "StepResult2");
		bp6.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp6, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("i", stackFrame.getMethodName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // in finally clause
			assertEquals("g", stackFrame.getMethodName());

			IVariable varInG = stackFrame.getVariables()[0];

			assertEquals("i() threw", varInG.getName());

			stepOver(stackFrame);
			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // still in finally clause
			assertEquals("g", stackFrame.getMethodName());

			IVariable varInG2 = stackFrame.getVariables()[0];

			assertEquals("length() returned", varInG2.getName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // after empty catch clause
			assertEquals("f", stackFrame.getMethodName());

			IVariable varInF = stackFrame.getVariables()[0];

			assertEquals("g() threw", varInF.getName());

		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testStepOver() throws Exception {
		String typeName = "StepResult3";
		ILineBreakpoint bp7 = createLineBreakpoint(22, "StepResult3");
		bp7.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp7, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("f", stackFrame.getMethodName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("hashCode() returned", stackFrame.getVariables()[0].getName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("getClassLoader() returned", stackFrame.getVariables()[0].getName());

			stepOver(stackFrame);
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("<init>() returned", stackFrame.getVariables()[0].getName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("newProxyInstance() returned", stackFrame.getVariables()[0].getName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("get() returned", stackFrame.getVariables()[0].getName());
			assertEquals("\"hello from proxy\"", stackFrame.getVariables()[0].getValue().toString());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("h() returned", stackFrame.getVariables()[0].getName());
			assertEquals("null", String.valueOf(stackFrame.getVariables()[0].getValue()));

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g() returned", stackFrame.getVariables()[0].getName());
			assertEquals("\"XXX\"", stackFrame.getVariables()[0].getValue().toString());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("main", stackFrame.getMethodName());
			assertEquals("g() threw", stackFrame.getVariables()[0].getName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("println() returned", stackFrame.getVariables()[0].getName());

			stepOver(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("currentTimeMillis() returned", stackFrame.getVariables()[0].getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testStepInto() throws Exception {
		String typeName = "StepResult3";
		ILineBreakpoint bp8 = createLineBreakpoint(31, "StepResult3");
		bp8.setEnabled(true);

		IJavaThread thread = null;
		try {
			thread = launchToLineBreakpoint(typeName, bp8, false);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("f", stackFrame.getMethodName());

			stepInto(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());
			assertFalse(stackFrame.getVariables()[0].getName().contains("returned"));

			stepInto(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());
			assertFalse(stackFrame.getVariables()[0].getName().contains("returned"));

			stepInto(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("f", stackFrame.getMethodName());
			assertEquals("g() returned", stackFrame.getVariables()[0].getName());
			assertEquals("\"XXX\"", stackFrame.getVariables()[0].getValue().toString());

			stepInto(stackFrame);
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("f", stackFrame.getMethodName());
			assertFalse(stackFrame.getVariables()[0].getName().contains("returned"));

			stepInto(stackFrame);
			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());
			assertFalse(stackFrame.getVariables()[0].getName().contains("returned"));

			stepInto(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());
			assertFalse(stackFrame.getVariables()[0].getName().contains("returned"));

			stepInto(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("<init>", stackFrame.getMethodName()); // constructor of Exception
			assertFalse(stackFrame.getVariables()[0].getName().contains("returned"));

			stepReturn(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("g", stackFrame.getMethodName());
			assertEquals("<init>() returned", stackFrame.getVariables()[0].getName());

			stepInto(stackFrame);

			stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			assertEquals("main", stackFrame.getMethodName());
			assertEquals("g() threw", stackFrame.getVariables()[0].getName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

}
