/*******************************************************************************
 * Copyright (c) 2000, 2005 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.core;

import java.io.File;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
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.core.JDIDebugModel;
import org.eclipse.jdt.debug.testplugin.JavaProjectHelper;
import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;

/**
 * Tests strata.
 */
public class AlternateStratumTests extends AbstractDebugTest {

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

	/**
	 * Test available strata on a type with alternate strata
	 * 
	 * @throws Exception
	 */
	public void testAvailableStrata() throws Exception {
		String typeName = "HelloWorld";
		prepareXtendBreakpoint(typeName, 3);

		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IJavaReferenceType type = ((IJavaStackFrame) thread.getTopStackFrame()).getReferenceType();
			String[] strata = type.getAvailableStrata();
			assertEquals("Wrong number of available strata", 2, strata.length);
			assertEquals("Wrong strata", "Xtend", strata[0]);
			assertEquals("Wrong strata", "Java", strata[1]);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Test default stratum on a type with alternate strata.
	 * 
	 * @throws Exception
	 */
	public void testDefaultStratum() throws Exception {
		String typeName = "HelloWorld";
		prepareXtendBreakpoint(typeName, 3);

		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IJavaReferenceType type = ((IJavaStackFrame) thread.getTopStackFrame()).getReferenceType();
			String stratum = type.getDefaultStratum();
			assertEquals("Wrong strata", "Xtend", stratum);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testGetSourceNameInStratum2() throws Exception {
		String typeName = "HelloWorld";
		prepareXtendBreakpoint(typeName, 3);

		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			String sourceName = stackFrame.getSourceName("Xtend");
			assertEquals("Wrong source name", "HelloWorld.xtend", sourceName);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testResolveJavaElement() throws Exception {
		String typeName = "HelloWorld";
		prepareXtendBreakpoint(typeName, 3);

		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			IJavaElement javaElement = JavaDebugUtils.resolveJavaElement(stackFrame, stackFrame.getLaunch());
			assertEquals("Wrong java element", "HelloWorld.java", javaElement.getElementName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testResolveJavaProject() throws Exception {
		String typeName = "HelloWorld";
		prepareXtendBreakpoint(typeName, 3);

		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			IJavaProject project = JavaDebugUtils.resolveJavaProject(stackFrame);
			assertEquals("Wrong java project", getProjectContext(), project);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	public void testResolveType() throws Exception {
		String typeName = "HelloWorld";
		prepareXtendBreakpoint(typeName, 3);

		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
			IJavaReferenceType refType = stackFrame.getReferenceType();
			IType type = JavaDebugUtils.resolveType(refType);
			assertEquals("Wrong type", "HelloWorld", type.getElementName());
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	@Override
	protected IJavaProject getProjectContext() {
		return get15Project();
	}

	private void prepareXtendBreakpoint(String typeName, int lineNumber) throws JavaModelException, Exception, CoreException {
		addXtendClass(typeName);
		JDIDebugModel.createStratumBreakpoint(getProjectContext().getProject(), "Xtend", null, null, typeName, lineNumber, -1, -1, 0, true, null);
	}

	private void addXtendClass(String typeName) throws Exception {
		IPath src = getProjectContext().getPath().append(JavaProjectHelper.SRC_DIR).makeAbsolute();
		File xtendSources = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/xtend-source"));
		JavaProjectHelper.importFile(new File(xtendSources, typeName + ".java"), src, null);
		JavaProjectHelper.importFile(new File(xtendSources, typeName + ".xtend"), src, null);
		createLaunchConfiguration(typeName);
		waitForBuild();
		IPath bin = getProjectContext().getPath().append(JavaProjectHelper.BIN_DIR).makeAbsolute();
		File xtendClasses = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/xtend"));
		JavaProjectHelper.importFile(new File(xtendClasses, typeName + ".class"), bin, null);
	}
}
