/*******************************************************************************
 * Copyright (c) 2004, 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.layout;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.test.performance.Dimension;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.tests.performance.BasicPerformanceTest;

/**
 * Measures the time to resize the widget 10 times, including the time required
 * to redraw.
 * 
 * @since 3.1
 */
public class ResizeTest extends BasicPerformanceTest {

	private TestWidgetFactory widgetFactory;

	private int xIterations = 10;

	private int yIterations = 10;

	private String tagString;

	
	
	/**
	 * Create a new instance of the receiver.
	 * @param factory
	 */
	public ResizeTest(TestWidgetFactory factory) {
		this(factory, NONE, factory.getName() + " setSize");
	}

	
	
	/**
	 * Create a new instance of the receiver.
	 * @param factory
	 * @param tagging
	 * @param tag
	 */
	public ResizeTest(TestWidgetFactory factory, int tagging,
			String tag) {
		super(factory.getName() + " setSize", tagging);
		this.tagString = tag;
		this.widgetFactory = factory;
	}

	/**
	 * Run the test
	 */
	protected void runTest() throws CoreException, WorkbenchException {

		tagIfNecessary(tagString, Dimension.ELAPSED_PROCESS);

		widgetFactory.init();
		final Composite widget = widgetFactory.getControl();
		Rectangle initialBounds = widget.getBounds();
		final Point maxSize = widgetFactory.getMaxSize();

		waitForBackgroundJobs();
		processEvents();
		for (int j = 0; j < 100; j++) {

			startMeasuring();
			for (int i = 0; i < 10; i++) {

				for (int xIteration = 0; xIteration < xIterations; xIteration += 5) {

					for (int yIteration = 0; yIteration < yIterations; yIteration++) {
						// Avoid giving the same x value twice in a row in order
						// to make it hard to cache
						int xSize = maxSize.x
								* ((xIteration + yIteration) % xIterations)
								/ xIterations;
						int ySize = maxSize.y * yIteration / yIterations;

						widget.setSize(xSize, ySize);

						processEvents();
					}

				}

			}
			stopMeasuring();
		}
		commitMeasurements();
		assertPerformance();

		widget.setBounds(initialBounds);
		widgetFactory.done();
	}

}
