/*******************************************************************************
 * Copyright (c) 2000, 2005 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.ui.tests.performance;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.test.performance.Dimension;

public class ObjectContributionsPerformance extends BasicPerformanceTest {

	public  static final int SEED = 1001001;
	private IStructuredSelection selection;
	
	public static Test suite() {
		TestSuite suite = new TestSuite("Object contribution performance");
        suite.addTest(new ObjectContributionsPerformance(
                "large selection, limited contributors",
                generateAdaptableSelection(SEED, 5000),
                BasicPerformanceTest.NONE));
        suite
                .addTest(new ObjectContributionsPerformance(
                        "limited selection, limited contributors",
                        generateAdaptableSelection(SEED, 50),
                        BasicPerformanceTest.NONE));
        return suite;
	}
	
	public ObjectContributionsPerformance(String label, IStructuredSelection selection, int tagging) {
		super("testObjectContributions:" + label, tagging);
		this.selection = selection;
	}

	protected void runTest() {
		ObjectContributionTest tests = new ObjectContributionTest(
                "testObjectContributions");
        tagIfNecessary("UI - " + selection.size() + " contribution(s)",
                Dimension.ELAPSED_PROCESS);
        setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=88274>See Bug 88274</a> ");
        startMeasuring();
        for (int i = 0; i < 5000; i++) {
            tests.assertPopupMenus("1", new String[] { "bogus" }, selection,
                    null, false);
        }
        stopMeasuring();
        commitMeasurements();
        assertPerformance();
	}
	
	protected static IStructuredSelection generateAdaptableSelection(int seed, int size) {
		Random rand = new Random(seed);
		List selection = new ArrayList();
		for (int i = 0; i < size; i++) {
			switch ((int) Math.round(rand.nextDouble() * 5)) {
				case 0 :
					selection.add(new ObjectContributionClasses.A());
					break;
				case 1 :
					selection.add(new ObjectContributionClasses.B());
					break;
				case 2 :
					selection.add(new ObjectContributionClasses.C());
					break;
				case 3 :
					selection.add(new ObjectContributionClasses.Common());
					break;
				case 4 :
					selection.add(new ObjectContributionClasses.D());
					break;
				case 5 :
					selection.add(new ObjectContributionClasses.A1());
					break;
				default :
					selection.add(new Object());
			}
		}
		return new StructuredSelection(selection);
	}
}
