/*******************************************************************************
 * Copyright (c) 2000, 2012 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.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.Platform;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.osgi.service.environment.Constants;

public class EnvironmentTests extends AbstractDebugTest {

	public EnvironmentTests(String name) {
		super(name);
	}

	/**
	 * Tests that we resolve environment variables as case insenitive on Windows.
	 */
	public void testWinOSCaseInsensitiveVariable() throws Exception {
		boolean win32= Platform.getOS().equals(Constants.OS_WIN32);
		if (win32) {
			IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
			String path1 = manager.performStringSubstitution("${env_var:pAth}");
			String path2 = manager.performStringSubstitution("${env_var:PaTh}");
			assertEquals("env vars should be case insensitive", path1, path2);
		}
	}

	/**
	 * Test that we can override a variable in a case insensitive way on Windows
	 */
	public void testWinOSCaseInsensitiveOverride() throws Exception {
		boolean win32= Platform.getOS().equals(Constants.OS_WIN32);
		if (win32) {
			ILaunchConfigurationType type = getLaunchManager().getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
			ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, "testWinOSCaseInsensitiveOverride");
			Map<String, String> override = new HashMap<String, String>();
			override.put("pAtH", "OVERRIDE");
			workingCopy.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, override);
			String[] environment = getLaunchManager().getEnvironment(workingCopy);
			assertNotNull("env should be specified", environment);
			boolean found = false;
			for (int i = 0; i < environment.length; i++) {
				String var = environment[i];
				if (var.endsWith("OVERRIDE")) {
					found = true;
					assertTrue("env var should be PATH", var.substring(0,4).equalsIgnoreCase("PATH"));
				}
			}
			assertTrue("env var path not overridden", found);
		}
	}
}
