/*******************************************************************************
 * Copyright (c) 2009 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.tests.sourcelookup;

import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
import org.eclipse.jdt.debug.core.IJavaReferenceType;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;

/**
 * Tests resolution of Java debug model type into Java model types.
 */
public class TypeResolutionTests extends AbstractDebugTest {

	public TypeResolutionTests(String name) {
		super(name);
	}
	
	public void testTypeAA() throws Exception {
		resolve(65, "EvalNestedTypeTests$A$AA");
	}	
	
	public void testTypeAB() throws Exception {
		resolve(94, "EvalNestedTypeTests$A$AB");
	}	
	
	public void testTypeAC() throws Exception {
		resolve(120, "EvalNestedTypeTests$A$AC");
	}	
	
	public void testAnonTypeA1() throws Exception {
		resolve(145, "EvalNestedTypeTests$A$1");
	}
	
	public void testTypeAE() throws Exception {
		resolve(179, "EvalNestedTypeTests$A$AE");
	}
	
	public void testAnonTypeA2() throws Exception {
		resolve(203, "EvalNestedTypeTests$A$2");
	}	
	
	public void testTypeBB() throws Exception {
		resolve(252, "EvalNestedTypeTests$B$BB");
	}
	
	public void testTypeBC() throws Exception {
		resolve(279, "EvalNestedTypeTests$B$BC");
	}
	
	public void testAnonTypeB() throws Exception {
		resolve(304, "EvalNestedTypeTests$B$1");
	}
	
	public void testTypeB() throws Exception {
		resolve(312, "EvalNestedTypeTests$B");
	}
	
	public void testTypeCB() throws Exception {
		resolve(354, "EvalNestedTypeTests$C$CB");
	}
	
	public void testTypeCC() throws Exception {
		resolve(381, "EvalNestedTypeTests$C$CC");
	}	
	
	public void testAnonTypeC1() throws Exception {
		resolve(406, "EvalNestedTypeTests$C$1");
	}
	
	public void testAnonTypeDB() throws Exception {
		resolve(455, "EvalNestedTypeTests$1$DB");
	}
	
	public void testAnonTypeDC() throws Exception {
		resolve(481, "EvalNestedTypeTests$1$DC");
	}
	
	public void testAnonType11() throws Exception {
		resolve(506, "EvalNestedTypeTests$1$1");
	}	

	public void testTopLevelType() throws Exception {
		resolve(523, "EvalNestedTypeTests");
	}
	
	public void testTypeEB() throws Exception {
		resolve(566, "EvalNestedTypeTests$E$EB");
	}
	
	public void testTypeEC() throws Exception {
		resolve(592, "EvalNestedTypeTests$E$EC");
	}
	
	public void testAnonTypeE1() throws Exception {
		resolve(616, "EvalNestedTypeTests$E$1");
	}	
	
	public void testAnonTypeFB() throws Exception {
		resolve(664, "EvalNestedTypeTests$2$FB");
	}
	
	public void testAnonTypeFC() throws Exception {
		resolve(690, "EvalNestedTypeTests$2$FC");
	}
	
	public void testAnonType21() throws Exception {
		resolve(714, "EvalNestedTypeTests$2$1");
	}
	
	/**
	 * Performs a resolution test. Debugs to a breakpoint and resolves the
	 * declaring type of the stack frame.
	 * 
	 * @param line breakpoint line number
	 * @param expectedName expected fully qualified name of resolved type
	 * @throws Exception on failure
	 */
	protected void resolve(int line, String expectedName) throws Exception {
		String typeName = "EvalNestedTypeTests";
		IJavaLineBreakpoint bp = createLineBreakpoint(line, typeName);
		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName, false);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IBreakpoint hit = getBreakpoint(thread);
			assertEquals("Wrong breakpoint", bp, hit);
			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
			IJavaReferenceType referenceType = frame.getReferenceType();
			IType type = JavaDebugUtils.resolveType(referenceType);
			assertNotNull("failed to resolve type", type);
			assertEquals("Wrong type", expectedName, type.getFullyQualifiedName());
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}	
	}	

}
