/*******************************************************************************
 * 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("no method return value", 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("no method return value", 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();
		}
	}

}
