/*******************************************************************************
 * 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);
	}
}
