/*******************************************************************************
 * Copyright (c) 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.test.stepping;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.testplugin.DebugElementEventWaiter;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.ui.actions.StepIntoSelectionHandler;

/**
 * Test stepping into a given selection with Java source level 1.5+
 * @since 3.8
 */
public class StepIntoSelectionWithGenerics extends AbstractDebugTest {

	private String qtypename = "a.b.c.StepIntoSelectionWithGenerics";
	private String pname = "a.b.c";
	private String jname = "StepIntoSelectionWithGenerics.java";
	private String mname = "hello";

	/**
	 * Constructor
	 */
	public StepIntoSelectionWithGenerics() {
		super("StepIntoSelectionWithGenerics");
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jdt.debug.tests.AbstractDebugTest#getProjectContext()
	 */
	@Override
	protected IJavaProject getProjectContext() {
		return get15Project();
	}

	/**
	 * Tests stepping into a method of a top-level class that is generified
	 * @throws Exception
	 */
	public void testStepIntoSelection1() throws Exception {
		createLineBreakpoint(30, qtypename);

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(qtypename);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			ICompilationUnit cu = getCompilationUnit(get15Project(), "src", pname, jname);
			IJavaProject jp = cu.getJavaProject();
			NullProgressMonitor monitor = new NullProgressMonitor();
			IType type = jp.findType(qtypename, monitor);
			assertTrue("The top-level type"+qtypename+" must exist", type.exists());
			IMethod method = type.getMethod(mname, new String[0]);
			assertTrue("Could not find method "+mname+" in type "+qtypename, method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in StepIntoSelectionWithGenerics."+mname, mname, frame.getMethodName());
			assertEquals("Should be stopped on line", 26, frame.getLineNumber());

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

	/**
	 * Tests stepping into a method of an inner class that is generified
	 *
	 * @throws Exception
	 */
	public void testStepIntoSelection2() throws Exception {
		createLineBreakpoint(31, qtypename);

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(qtypename);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			ICompilationUnit cu = getCompilationUnit(get15Project(), "src", pname, jname);
			IJavaProject jp = cu.getJavaProject();
			NullProgressMonitor monitor = new NullProgressMonitor();
			IType type = jp.findType(qtypename, monitor);
			assertTrue("The top-level type"+qtypename+" must exist", type.exists());
			type = jp.findType(qtypename+".InnerClazz", monitor);
			assertNotNull("The iner type InnerClazz must not be null", type);
			IMethod method = type.getMethod(mname, new String[0]);
			assertTrue("Could not find method "+mname+" in type InnerClazz", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in InnerClazz."+mname, mname, frame.getMethodName());
			assertEquals("Should be stopped on line", 21, frame.getLineNumber());

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

	/**
	 * Tests stepping into a method of an inner-inner class that is generified
	 *
	 * @throws Exception
	 */
	public void testStepIntoSelection3() throws Exception {
		createLineBreakpoint(32, qtypename);

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(qtypename);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			ICompilationUnit cu = getCompilationUnit(get15Project(), "src", pname, jname);
			IJavaProject jp = cu.getJavaProject();
			NullProgressMonitor monitor = new NullProgressMonitor();
			IType type = jp.findType(qtypename, monitor);
			assertTrue("The top-level type"+qtypename+" must exist", type.exists());
			type = jp.findType(qtypename+".InnerClazz.InnerClazz2", monitor);
			assertNotNull("The inner type InnerClazz2 must not be null", type);
			IMethod method = type.getMethod(mname, new String[0]);
			assertTrue("Could not find method "+mname+" in type InnerClazz2", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in InnerClazz2."+mname, mname, frame.getMethodName());
			assertEquals("Should be stopped on line", 17, frame.getLineNumber());

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