/*******************************************************************************
 * Copyright (c) 2011 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.resources.IContainer;
import org.eclipse.debug.internal.core.LaunchConfiguration;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;

/**
 * Class for testing method from the class {@link LaunchConfiguration}
 * @since 3.7
 */
public class LaunchConfigurationTests extends AbstractDebugTest {

	/**
	 * A configuration for testing
	 */
	class TestConfiguration extends LaunchConfiguration {

		/**
		 * Constructor
		 * @param name
		 * @param container
		 */
		protected TestConfiguration(String name, IContainer container) {
			super(name, container);
		}
		
		public String getSimpleNameProxy(String fileName) {
			return getSimpleName(fileName);
		}
		
		public void setNameProxy(String name) {
			setName(name);
		}
		
		public String getFileNameProxy() {
			return getFileName();
		}
	}
	
	TestConfiguration config = new TestConfiguration("Test", null);
	
	/**
	 * Constructor
	 * @param name
	 */
	public LaunchConfigurationTests(String name) {
		super(name);
	}

	/**
	 * Tests the {@link LaunchConfiguration#getSimpleName} method
	 * 
	 * @throws Exception
	 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=332410
	 */
	public void testGetSimpleName() throws Exception {
		//filenames with the ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION as an extension
		String name = config.getSimpleNameProxy("launch.launch");
		assertEquals("Did not get expected name: 'launch'", "launch", name);
		name = config.getSimpleNameProxy("launch.foo.launch");
		assertEquals("Did not get expected name: 'launch.foo'", "launch.foo", name);
		name = config.getSimpleNameProxy("launch.foo.bar.launch");
		assertEquals("Did not get expected name: 'launch.foo.bar'", "launch.foo.bar", name);
		//filenames without the ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION extension
		name = config.getSimpleNameProxy("launch");
		assertEquals("Did not get expected name: 'launch'", "launch", name);
		name = config.getSimpleNameProxy("launch.foo");
		assertEquals("Did not get expected name: 'launch.foo'", "launch.foo", name);
		name = config.getSimpleNameProxy("launch.foo.bar");
		assertEquals("Did not get expected name: 'launch.foo.bar'", "launch.foo.bar", name);
	}
	
	/**
	 * Tests the {@link LaunchConfiguration#setName} method
	 * 
	 * @throws Exception
	 */
	public void testSetName() throws Exception {
		assertEquals("The default name should be: 'Test'", config.getName(), "Test");
		config.setNameProxy("newname");
		assertEquals("The new name should be: 'newname'", config.getName(), "newname");
		//reset the name
		config.setNameProxy("Test");
	}
	
	/**
	 * Tests the {@link LaunchConfiguration#getFileName} method
	 * 
	 * @throws Exception
	 */
	public void testGetFileName() throws Exception {
		String filename = config.getFileNameProxy();
		assertEquals("The filename should be: 'Test.launch'", "Test.launch", filename);
		config.setNameProxy("launch");
		filename = config.getFileNameProxy();
		assertEquals("The filename should be: 'launch.launch'", "launch.launch", filename);
		config.setNameProxy("launch.foo");
		filename = config.getFileNameProxy();
		assertEquals("The filename should be: 'launch.foo.launch'", "launch.foo.launch", filename);
		//reset the name
		config.setNameProxy("Test");
	}
}
