/*******************************************************************************
 * Copyright (c) 2014 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.breakpoints;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.debug.core.IJavaBreakpoint;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.JDIDebugModel;
import org.eclipse.jdt.debug.testplugin.DebugElementKindEventDetailWaiter;
import org.eclipse.jdt.debug.testplugin.DebugEventWaiter;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.debug.tests.TestAgainException;
import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaClassPrepareBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaLineBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaMethodBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaMethodEntryBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaStratumLineBreakpoint;
import org.eclipse.jdt.internal.debug.core.breakpoints.JavaWatchpoint;
import org.eclipse.jdt.internal.debug.ui.JDIModelPresentation;

/**
 * Tests getting and setting the type name for Java breakpoints
 *
 * @since 3.8.200
 */
public class TypeNameBreakpointTests extends AbstractDebugTest {

	class TestJDIPresentation extends JDIModelPresentation {
		@Override
		public String getMarkerTypeName(IJavaBreakpoint breakpoint, boolean qualified) throws CoreException {
			return super.getMarkerTypeName(breakpoint, qualified);
		}
	}

	TestJDIPresentation fPresentation = new TestJDIPresentation();

	/**
	 * Constructor
	 * @param name
	 */
	public TypeNameBreakpointTests(String name) {
		super(name);
	}

	@Override
	protected IJavaThread launchToBreakpoint(ILaunchConfiguration config, boolean register) throws CoreException {
		DebugEventWaiter waiter = new DebugElementKindEventDetailWaiter(DebugEvent.SUSPEND, IJavaThread.class, DebugEvent.BREAKPOINT);
		waiter.setTimeout(7000);
		Object suspendee = null;
		try {
			suspendee = launchAndWait(config, waiter, register);
		}
		catch (TestAgainException tae) {
			return null;
		}
		return (IJavaThread) suspendee;
	}

	/**
	 * Tests the {@link JavaDebugUtils#typeNamesEqual(String, String)} method
	 *
	 * @throws Exception
	 */
	public void testTypeNamesEqual() throws Exception {
		assertTrue("The type names should be equal when both null", JavaDebugUtils.typeNamesEqual(null, null));
		assertTrue("The type names should be equal when the same string", JavaDebugUtils.typeNamesEqual("type", "type"));
		assertFalse("The type names should not match when one is null", JavaDebugUtils.typeNamesEqual(null, "type"));
		assertFalse("The type names should not match when one is null", JavaDebugUtils.typeNamesEqual("type", null));
	}

	/**
	 * Returns the {@link IResource} for the class HitCountLooper
	 *
	 * @return the {@link IResource} for HitCountLooper
	 */
	IResource getTestResource() throws Exception {
		return get14Project().getProject().getFile("src/HitCountLooper.java");
	}

	/**
	 * Util to get a line breakpoint with a null type name
	 *
	 * @return
	 * @throws Exception
	 */
	JavaLineBreakpoint getNullTypeLineBreakpoint() throws Exception {
		JavaLineBreakpoint bp = (JavaLineBreakpoint) JDIDebugModel.createLineBreakpoint(getTestResource(), null, 16, -1, -1, 0, true, null);
		assertNotNull("The null type breakpoint should exist", bp);
		return bp;
	}

	/**
	 * Util to get an exception breakpoint with a null type
	 *
	 * @return
	 * @throws Exception
	 */
	JavaExceptionBreakpoint getNullTypeExBreakpoint() throws Exception {
		JavaExceptionBreakpoint bp = (JavaExceptionBreakpoint) JDIDebugModel.createExceptionBreakpoint(getTestResource(), null, true, false, true, true, null);
		assertNotNull("The exception breakpoint should not be null", bp);
		return bp;
	}

	/**
	 * Util to get a method entry breakpoint with a null type
	 *
	 * @return
	 * @throws Exception
	 */
	JavaMethodEntryBreakpoint getNullTypeMethodEntryBreakpoint() throws Exception {
		JavaMethodEntryBreakpoint bp = (JavaMethodEntryBreakpoint) JDIDebugModel.createMethodEntryBreakpoint(getTestResource(), null, null, null, 15, -1, -1, 0, true, null);
		assertNotNull("The method entry breakpoint should not be null", bp);
		return bp;
	}

	/**
	 * Util to get a stratum line breakpoint with no type
	 *
	 * @return
	 * @throws Exception
	 */
	JavaStratumLineBreakpoint getNullTypeStratumLineBreakpoint() throws Exception {
		JavaStratumLineBreakpoint bp = (JavaStratumLineBreakpoint) JDIDebugModel.createStratumBreakpoint(getTestResource(), null, null, null, null, 15, -1, -1, 0, true, null);
		assertNotNull("The stratum breakpoint should not be null", bp);
		return bp;
	}

	/**
	 * Util to get a class prepare breakpoint with a null type
	 *
	 * @return
	 * @throws Exception
	 */
	JavaClassPrepareBreakpoint getNullTypeClassPrepareBreakpoint() throws Exception {
		JavaClassPrepareBreakpoint bp = (JavaClassPrepareBreakpoint) JDIDebugModel.createClassPrepareBreakpoint(getTestResource(), null, 1, -1, -1, true, null);
		assertNotNull("The class prepare breakpoint should not be null", bp);
		return bp;
	}

	/**
	 * Util to get a watchpoint with a null type
	 *
	 * @return
	 * @throws Exception
	 */
	JavaWatchpoint getNullTypeWatchpoint() throws Exception {
		JavaWatchpoint bp = (JavaWatchpoint) JDIDebugModel.createWatchpoint(getTestResource(), null, null, 15, -1, -1, 0, true, null);
		bp.setModification(true);
		bp.setAccess(true);
		assertNotNull("The watchpoint should not be null", bp);
		return bp;
	}

	/**
	 * Util to get a method breakpoint with a null type
	 *
	 * @return
	 * @throws Exception
	 */
	JavaMethodBreakpoint getNullTypeMethodBreakpoint() throws Exception {
		JavaMethodBreakpoint bp = (JavaMethodBreakpoint) JDIDebugModel.createMethodBreakpoint(getTestResource(), null, null, null, true, true, false, 15, -1, -1, 0, true, null);
		assertNotNull("The method breakpoint should not be null", bp);
		return bp;
	}

	/**
	 * Tests {@link JDIDebugModel#createLineBreakpoint(org.eclipse.core.resources.IResource, String, int, int, int, int, boolean, java.util.Map)} with
	 * a null type name
	 *
	 * @throws Exception
	 */
	public void testCreateLineBPNullTypeName() throws Exception {
		try {
			JavaLineBreakpoint bp = getNullTypeLineBreakpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the
	 * {@link JDIDebugModel#createMethodBreakpoint(IResource, String, String, String, boolean, boolean, boolean, int, int, int, int, boolean, java.util.Map)}
	 * method with null type infos
	 *
	 * @throws Exception
	 */
	public void testCreateMethodBPNullTypeName() throws Exception {
		try {
			JavaMethodBreakpoint bp = getNullTypeMethodBreakpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#createExceptionBreakpoint(IResource, String, boolean, boolean, boolean, boolean, java.util.Map)} method with
	 * null type infos
	 *
	 * @throws Exception
	 */
	public void testCreateExceptionBPNullTypeName() throws Exception {
		try {
			JavaExceptionBreakpoint bp = getNullTypeExBreakpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#createClassPrepareBreakpoint(IResource, String, int, int, int, boolean, java.util.Map)} method with null type
	 * infos
	 *
	 * @throws Exception
	 */
	public void testCreateClassPrepareBPNullTypeName() throws Exception {
		try {
			JavaClassPrepareBreakpoint bp = getNullTypeClassPrepareBreakpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#createWatchpoint(IResource, String, String, int, int, int, int, boolean, java.util.Map)} method with null type
	 * infos
	 *
	 * @throws Exception
	 */
	public void testCreateWatchpointBPNullTypeName() throws Exception {
		try {
			JavaWatchpoint bp = getNullTypeWatchpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#createStratumBreakpoint(IResource, String, String, String, String, int, int, int, int, boolean, java.util.Map)}
	 * method with null type infos
	 *
	 * @throws Exception
	 */
	public void testCreateStratumBPNullTypeName() throws Exception {
		try {
			JavaStratumLineBreakpoint bp = getNullTypeStratumLineBreakpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#createMethodEntryBreakpoint(IResource, String, String, String, int, int, int, int, boolean, java.util.Map)}
	 * method with null type infos
	 *
	 * @throws Excpetion
	 */
	public void testCreateMethodEntryBPNullTypeName() throws Exception {
		try {
			JavaMethodEntryBreakpoint bp = getNullTypeMethodEntryBreakpoint();
			assertNull("The type name should be null", bp.getTypeName());
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getMarkerTypeName}
	 *
	 * @throws Exception
	 */
	public void testGetPresentationNullTypeName() throws Exception {
		try {
			JavaBreakpoint bp = getNullTypeLineBreakpoint();
			String value = fPresentation.getMarkerTypeName(bp, true);
			assertNull("The value should be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getExceptionBreakpointText} with a null type name
	 *
	 * @throws Exception
	 */
	public void testGetPresentationTypeNameNull2() throws Exception {
		try {
			JavaExceptionBreakpoint bp = getNullTypeExBreakpoint();
			String value = fPresentation.getText(bp);
			assertNotNull("The value should not be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getLineBreakpointText} with a null type name
	 *
	 * @throws Exception
	 */
	public void testGetPresentationTypeNameNull3() throws Exception {
		try {
			JavaLineBreakpoint bp = getNullTypeLineBreakpoint();
			String value = fPresentation.getText(bp);
			assertNotNull("The value should not be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getClassPrepareBreakpointText} with a null type name
	 *
	 * @throws Exception
	 */
	public void testGetPresentationTypeNameNull4() throws Exception {
		try {
			JavaClassPrepareBreakpoint bp = getNullTypeClassPrepareBreakpoint();
			String value = fPresentation.getText(bp);
			assertNotNull("The value should not be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getWatchpointText} with a null type name
	 *
	 * @throws Exception
	 */
	public void testGetPresentationTypeNameNull5() throws Exception {
		try {
			JavaWatchpoint bp = getNullTypeWatchpoint();
			String value = fPresentation.getText(bp);
			assertNotNull("The value should not be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getMethodBreakpointText} with a null type name
	 *
	 * @throws Exception
	 */
	public void testGetPresentationTypeNameNull6() throws Exception {
		try {
			JavaMethodBreakpoint bp = getNullTypeMethodBreakpoint();
			String value = fPresentation.getText(bp);
			assertNotNull("The value should not be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIModelPresentation#getStratumLineBreakpointText} with a null type name
	 *
	 * @throws Exception
	 */
	public void testGetPresentationTypeNameNull7() throws Exception {
		try {
			JavaStratumLineBreakpoint bp = getNullTypeStratumLineBreakpoint();
			String value = fPresentation.getText(bp);
			assertNotNull("The value should not be null", value);
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#lineBreakpointExists(String, int)} method
	 *
	 * @throws Exception
	 */
	public void testJDIDebugModelTypeName2() throws Exception {
		try {
			getNullTypeLineBreakpoint(); // create one
			assertNotNull("The null typed line breakpoint should exist", JDIDebugModel.lineBreakpointExists(null, 16));
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the {@link JDIDebugModel#lineBreakpointExists(String, int)} method with a null type name
	 *
	 * @throws Exception
	 */
	public void testJDIModelTypeNameNull1() throws Exception {
		try {
			getNullTypeLineBreakpoint();
			assertNotNull("The null typed line breakpoint should exist", JDIDebugModel.lineBreakpointExists(getTestResource(), null, 16));
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests that launching with a null typed breakpoint does not suspend and does not cause a failure while trying to create requests
	 *
	 * @throws Exception
	 */
	public void testLaunchNullTypeLineBreakpoint() throws Exception {
		getNullTypeLineBreakpoint();
		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint(getLaunchConfiguration("HitCountLooper"));
			assertNull("The program should not suspend or cause an excpetion", thread);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests launching with an exception breakpoint with a null type name
	 *
	 * @throws Exception
	 */
	public void testLaunchNullTypeExceptionBreakpoint() throws Exception {
		getNullTypeExBreakpoint();
		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint("ThrowsException");
			assertNull("Breakpoint should not cause suspend or excpetion", thread);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests launching with a watchpoint with a null type
	 *
	 * @throws Exception
	 */
	public void testLaunchNullTypeWatchpoint() throws Exception {
		getNullTypeWatchpoint();
		IJavaThread thread = null;
		try {
			thread = launchToBreakpoint("org.eclipse.debug.tests.targets.Watchpoint");
			assertNull("Breakpoint should not cause suspend or exception", thread);
		}
		finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}
}
