/*******************************************************************************
 *  Copyright (c) 2005, 2013 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.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointSetOrganizer;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
import org.eclipse.debug.ui.IDebugView;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.progress.WorkbenchJob;

/**
 * Tests adding breakpoints and automatic addition to working sets.
 *
 * @since 3.2
 */
public class BreakpointWorkingSetTests extends AbstractBreakpointWorkingSetTest {

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

	/**
	 * Tests adding a breakpoint to the default working set
	 * @throws Exception
	 */
	public void testAddToDefaultWorkingSet() throws Exception {
		String name = "TEST DEFAULT";
		IWorkingSet set = createSet(name);
		try {
			BreakpointSetOrganizer.setDefaultWorkingSet(set);
			IJavaLineBreakpoint breakpoint = createLineBreakpoint(52, "Breakpoints");
			IAdaptable[] elements = set.getElements();
			assertEquals("Wrong number of breakpoints", 1, elements.length);
			assertEquals("Wrong breakpoint", elements[0], breakpoint);
		} finally {
			removeAllBreakpoints();
			getWorkingSetManager().removeWorkingSet(set);
		}
	}

	/**
	 * Tests adding a breakpoint with no default working set
	 * @throws Exception
	 */
	public void testNoDefaultWorkingSet() throws Exception {
		String name = "TEST DEFAULT";
		IWorkingSet set = createSet(name);
		try {
			BreakpointSetOrganizer.setDefaultWorkingSet(null);
			createLineBreakpoint(52, "Breakpoints");
			IAdaptable[] elements = set.getElements();
			assertEquals("Wrong number of breakpoints", 0, elements.length);
		} finally {
			removeAllBreakpoints();
			getWorkingSetManager().removeWorkingSet(set);
		}
	}

	/**
	 * Tests that we can have N working set shown in the view and add additional breakpoints
	 * to the default ones without causing exceptions
	 *
	 * In this test we have to open / show the view to cause the insert update to occur
	 *
	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=380614
	 * @throws Exception
	 * @since 3.8.100
	 */
	public void testInsertIntoDefaultSet() throws Exception {
		IWorkingSet set1 = createSet("One");
		try {
			BreakpointSetOrganizer.setDefaultWorkingSet(set1);
			IDebugView bpview = openDebugView("org.eclipse.debug.ui.BreakpointView");
			assertNotNull("we should have opened the breakpoints view", bpview);
			final BreakpointsView view = (BreakpointsView) bpview;
			final IBreakpointOrganizer o = getOrganizer("org.eclipse.debug.ui.breakpointWorkingSetOrganizer");
			assertNotNull("we should have found the working set breakpoint organizer", o);
			//update the view organizers on the UI thread because it spawns viewer updates that require it
			Display display = DebugUIPlugin.getStandardDisplay();
			if (!Thread.currentThread().equals(display.getThread())) {
				WorkbenchJob job = new WorkbenchJob("updating working sets in the breakpoint view") {
					@Override
					public IStatus runInUIThread(IProgressMonitor monitor) {
						view.setBreakpointOrganizers(new IBreakpointOrganizer[] {o});
						return Status.OK_STATUS;
					}
				};
				job.schedule();
				job.join();
			}
			else {
				view.setBreakpointOrganizers(new IBreakpointOrganizer[] {o});
			}
			//add a bp
			createLineBreakpoint(52, "Breakpoints");
			IAdaptable[] elements = set1.getElements();
			assertEquals("Wrong number of breakpoints", 1, elements.length);
			BreakpointSetOrganizer.setDefaultWorkingSet(null);
			//add another bp which will wind up in the 'Others' working set
			createLineBreakpoint(53, "Breakpoints");
			createLineBreakpoint(30, "Breakpoints");
		}
		catch(IndexOutOfBoundsException ioobe) {
			fail("testInsertIntoDefaultSet: bug 380614 has not been fixed");
		}
		finally {
			removeAllBreakpoints();
			getWorkingSetManager().removeWorkingSet(set1);
		}
	}
}
