package org.eclipse.dltk.core.tests.launching;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.dltk.core.tests.model.SuiteOfTestCases;
import org.eclipse.dltk.internal.launching.EnvironmentResolver;
import org.eclipse.dltk.launching.EnvironmentVariable;

import junit.framework.Test;

public class EnvironmentResolverTests extends SuiteOfTestCases {
	public EnvironmentResolverTests(String name) {
		super(name);
	}

	public void testEnvironmentResolve001() {
		Map<String, String> env = new HashMap<>();
		EnvironmentVariable[] vars = new EnvironmentVariable[] { mk("A", "a") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertNotNull(resolve);
		test(resolve, "A", "a");
	}

	public void testEnvironmentResolve002() {
		Map<String, String> env = new HashMap<>();
		EnvironmentVariable[] vars = new EnvironmentVariable[] { mk("A", "a"),
				mk("B", "a$Ac") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars,
				true);
		assertNotNull(resolve);
		test(resolve, "A", "a");
		test(resolve, "B", "a$Ac");
	}

	public void testEnvironmentResolve002a() {
		Map<String, String> env = new HashMap<>();
		EnvironmentVariable[] vars = new EnvironmentVariable[] { mk("A", "a"),
				mk("B", "a$A:c") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertNotNull(resolve);
		test(resolve, "A", "a");
		test(resolve, "B", "aa:c");
	}

	public void testEnvironmentResolve003() {
		Map<String, String> env = new HashMap<>();
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				mk("AUTOTEST", "/Develop/cisco/ats5.0.0"),
				mk("ATS_EASY", "$AUTOTEST/ats_easy") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertNotNull(resolve);
		test(resolve, "AUTOTEST", "/Develop/cisco/ats5.0.0");
		test(resolve, "ATS_EASY", "/Develop/cisco/ats5.0.0/ats_easy");
	}

	public void testEnvironmentResolve004() {
		Map<String, String> env = new HashMap<>();
		env.put("PATH", "/bin:/usr/bin");
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				mk("PATH", "/sbin:$PATH") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertNotNull(resolve);
		test(resolve, "PATH", "/sbin:/bin:/usr/bin");
	}

	public void testEnvironmentResolve005() {
		Map<String, String> env = new HashMap<>();
		env.put("PATH", "/bin:/usr/bin");
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				new EnvironmentVariable("a1", "A1"),
				new EnvironmentVariable("a2", "A2$a1"),
				new EnvironmentVariable("a3", "A3$a2"),
				new EnvironmentVariable("a4", "A4$a3") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertNotNull(resolve);
		test(resolve, "a1", "A1");
		test(resolve, "a2", "A2A1");
		test(resolve, "a3", "A3A2A1");
		test(resolve, "a4", "A4A3A2A1");
	}

	public void testEnvironmentResolve006() {
		Map<String, String> env = new HashMap<>();
		env.put("PATH", "/bin:/usr/bin");
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				new EnvironmentVariable("a1", "A1$a4"),
				new EnvironmentVariable("a2", "A2$a1"),
				new EnvironmentVariable("a3", "A3$a2"),
				new EnvironmentVariable("a4", "A4$a3") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertEquals(resolve.length, 0);
	}

	public void testEnvironmentResolve007() {
		Map<String, String> env = new HashMap<>();
		env.put("PATH", "/bin:/usr/bin");
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				new EnvironmentVariable("a1", "$a2"),
				new EnvironmentVariable("a2", "a2") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertEquals(resolve.length, 2);
		test(resolve, "a1", "a2");
		test(resolve, "a2", "a2");
	}

	public void testEnvironmentResolve008() {
		Map<String, String> env = new HashMap<>();
		env.put("PATH", "/bin:/usr/bin");
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				new EnvironmentVariable("PATH", "/sbii/bin/:$PATH"),
				new EnvironmentVariable("a2", "alla{$PATH}") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars);
		assertEquals(resolve.length, 2);
		test(resolve, "PATH", "/sbii/bin/:/bin:/usr/bin");
		test(resolve, "a2", "alla{/sbii/bin/:/bin:/usr/bin}");
	}

	public void testEnvironmentResolve008a() {
		Map<String, String> env = new HashMap<>();
		EnvironmentVariable[] vars = new EnvironmentVariable[] {
				new EnvironmentVariable("PATH", "/sbii/bin/:$PATH"),
				new EnvironmentVariable("a2", "alla{$PATH}") };
		EnvironmentVariable[] resolve = EnvironmentResolver.resolve(env, vars,
				true);
		assertEquals(resolve.length, 2);
		test(resolve, "PATH", "/sbii/bin/:$PATH");
		test(resolve, "a2", "alla{$PATH}");
	}

	private void test(EnvironmentVariable[] resolve, String b, String v) {
		assertContains(resolve, mk(b, v));
	}

	private EnvironmentVariable mk(String name, String value) {
		return new EnvironmentVariable(name, value);
	}

	private void assertContains(EnvironmentVariable[] resolve,
			EnvironmentVariable environmentVariable) {
		String name = environmentVariable.getName();
		for (int i = 0; i < resolve.length; i++) {
			if (resolve[i].getName().equals(name)) {
				assertEquals("Variable:" + name, environmentVariable.getValue(),
						resolve[i].getValue());
				return;
			}
		}
		fail("Not found " + environmentVariable.toString());
	}

	public static Test suite() {
		return new Suite(EnvironmentResolverTests.class);
	}
}
