/*******************************************************************************
 *  Copyright (c) 2006, 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.launching;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;

/**
 * test class tests the returnable methods of the new <code>LaunchConfigurationTabGroupWrapper</code> to ensure that it returns existing tab group
 * elements and all contributions
 * 
 * @since 3.3
 */
public class TabGroupWrapperTests extends AbstractDebugTest {

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

	/**
	 * Checks that all of the tabs specified in the original tab group and ones that are contributed are created
	 * @throws CoreException
	 */
	public void testAllTabsCreated() throws CoreException {
		ILaunchConfigurationTabGroup javagroup = getJavaLaunchGroup();
		assertNotNull("java tab group cannot be null", javagroup); //$NON-NLS-1$
		javagroup.createTabs(getLaunchConfigurationDialog(IDebugUIConstants.ID_RUN_LAUNCH_GROUP), ILaunchManager.RUN_MODE);
		assertTrue("There must be at least 11 tabs", javagroup.getTabs().length >= 11); //$NON-NLS-1$
	}
	
	/**
	 * Checks to make sure that all of the controls of the tabs (including contributed ones) are disposed on a call to the tab group
	 * wrapper class
	 * @throws CoreException
	 */
	public void testDisposeAllTabs() throws CoreException {
		ILaunchConfigurationTabGroup javagroup = getJavaLaunchGroup();
		assertNotNull("java tab group cannot be null", javagroup); //$NON-NLS-1$
		javagroup.createTabs(getLaunchConfigurationDialog(IDebugUIConstants.ID_RUN_LAUNCH_GROUP), ILaunchManager.RUN_MODE);
		ILaunchConfigurationTab[] tabs = javagroup.getTabs();
		assertTrue("there must be more than 0 tabs", tabs.length > 0); //$NON-NLS-1$
		//dispose all returned tabs
		for(int i = 0; i < tabs.length; i++) {
			tabs[i].dispose();
		}
		//get the tabs from the tab group again
		tabs = javagroup.getTabs();
		boolean alldisposed = true;
		for(int i = 0; i < tabs.length; i++) {
			alldisposed &= tabs[i].getControl() == null;
		}
		assertTrue("All of the controls must be disposed", alldisposed); //$NON-NLS-1$
	}
}