/*******************************************************************************
 *  Copyright (c) 2008, 2009 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.ui.actions;

import org.eclipse.equinox.internal.p2.ui.model.*;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;

/**
 * Abstract class to set up different IU selection combinations
 */
public abstract class ProfileModificationActionTest extends ActionTest {
	protected IInstallableUnit[] getMixedIUs() {
		return new IInstallableUnit[] {top1, top2, nested};
	}

	protected Object[] getCategoryAndChildIUElements() {
		CategoryElement element = new CategoryElement(null, category);
		AvailableIUElement child = new AvailableIUElement(element, uninstalled, TESTPROFILE, true);
		return new Object[] {element, child};
	}

	protected Object[] getNestedCategoriesAndChildIUElements() {
		CategoryElement element = new CategoryElement(null, category);
		CategoryElement nested = new CategoryElement(element, category);
		AvailableIUElement child = new AvailableIUElement(nested, uninstalled, TESTPROFILE, true);
		return new Object[] {element, nested, child};
	}

	protected IInstallableUnit[] getTopLevelIUs() {
		return new IInstallableUnit[] {top1, top2};
	}

	protected IInstallableUnit[] getTopLevelIUsWithLockedIU() {
		return new IInstallableUnit[] {top1, top2, locked};
	}

	protected IIUElement[] getTopLevelIUElements() {
		return new IIUElement[] {element(top1), element(top2)};
	}

	protected Object[] getMixedIUElements() {
		return new IIUElement[] {element(top1), element(top2), element(nested)};
	}

	protected Object[] getTopLevelIUElementsWithLockedIU() {
		return new IIUElement[] {element(top1), element(top2), element(locked)};
	}

	protected Object[] getMixedIUsAndElements() {
		return new Object[] {top1, element(top2)};
	}

	protected Object[] getMixedIUsAndNonIUs() {
		return new Object[] {top1, top2, new Object()};
	}

	protected Object[] getNonIUSelection() {
		return getInvalidSelection();
	}

	protected IIUElement element(IInstallableUnit iu) {
		return new InstalledIUElement(profileElement, profile.getProfileId(), iu);
	}
}
