/*******************************************************************************
 * Copyright (c) 2007, 2008 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.equinox.p2.tests.director;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.provisional.p2.director.IDirector;
import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest;
import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
import org.osgi.framework.Version;

public class SingletonTest extends AbstractProvisioningTest {
	IInstallableUnit f1;
	IInstallableUnit f1_1;

	IInstallableUnit f2;
	IInstallableUnit f2_1;

	IInstallableUnit junit38;
	IInstallableUnit junit40;

	IDirector director;
	IProfile profile;

	protected void setUp() throws Exception {
		f1 = createIU("f1", new Version(1, 0, 0), true);

		f1_1 = createIU("f1", new Version(1, 1, 0), true);

		f2 = createIU("f2", new Version(1, 0, 0), true);

		f2_1 = createIU("f2", new Version(1, 0, 1));

		junit38 = createIU("junit", new Version(3, 8, 1));

		junit40 = createIU("junit", new Version(4, 0, 1));

		createTestMetdataRepository(new IInstallableUnit[] {f1, f1_1, junit38, junit40, f2, f2_1});

		profile = createProfile("TestProfile." + getName());
		director = createDirector();
	}

	public void testMultipleVersionNonSingleton() {
		// The installation of junit38 and junit 40 together should succeed
		ProfileChangeRequest request = new ProfileChangeRequest(profile);
		request.addInstallableUnits(new IInstallableUnit[] {junit38, junit40});
		assertEquals(IStatus.OK, director.provision(request, null, new NullProgressMonitor()).getSeverity());
	}

	public void testMultipleVersionSingleton() {
		// The installation of junit38 and junit 40 together should not succeed
		ProfileChangeRequest request = new ProfileChangeRequest(profile);
		request.addInstallableUnits(new IInstallableUnit[] {f1, f1_1});
		assertEquals(IStatus.ERROR, director.provision(request, null, new NullProgressMonitor()).getSeverity());
	}

	public void testMultipleVersionSingleton2() {
		// The installation of junit38 and junit 40 together should not succeed
		ProfileChangeRequest request = new ProfileChangeRequest(profile);
		request.addInstallableUnits(new IInstallableUnit[] {f2, f2_1});
		assertEquals(IStatus.ERROR, director.provision(request, null, new NullProgressMonitor()).getSeverity());
	}
}
