/*******************************************************************************
 * Copyright (c) 2004, 2006 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.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.tests.performance.BasicPerformanceTest;

/**
 * Measures the performance of a widget's computeSize method
 * 
 * @since 3.1
 */
public class ComputeSizeTest extends BasicPerformanceTest {

    private TestWidgetFactory widgetFactory;
    private int xIterations = 10;
    private int yIterations = 10;
    
    /**
     * @param testName
     */
    public ComputeSizeTest(TestWidgetFactory widgetFactory) {
        super(widgetFactory.getName() + " computeSize");
        
        this.widgetFactory = widgetFactory;
    }

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

        widgetFactory.init();
        final Composite widget = widgetFactory.getControl();
        //Rectangle initialBounds = widget.getBounds();
        final Point maxSize = widgetFactory.getMaxSize();
        
        // Iteration counter. We increment this each pass through the loop in order to 
        // generate slightly different test data each time
        final int[] counter = new int[] {0};
 
		for (int j = 0; j < 100; j++) {
	        // This counter determines whether we're computing a width,
			// height, or fixed
			// size and whether or not we flush the cache.

			// We do things this way to avoid calling computeSize with the same (or
			// similar) values
			// twice in a row, which would be too easy to cache.
			int count = counter[0];

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

               for (int xIteration = 0; xIteration < xIterations; xIteration++) {
                   
                   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;

                       // Alternate between flushing and not flushing the cache
                       boolean flushState = (count % 2) != 0;
                       
                       // Alternate between width, height, and fixed, and default size queries 
                       // (note: we need to alternate in order to make the result hard to cache)
                       switch(count % 4) {
                           case 0: widget.computeSize(xSize, SWT.DEFAULT, flushState); break;
                           case 1: widget.computeSize(SWT.DEFAULT, ySize, flushState); break;
                           case 2: widget.computeSize(xSize, ySize, flushState); break;
                           case 3: widget.computeSize(SWT.DEFAULT, SWT.DEFAULT, flushState); break;
                       }

						count++;
					}
				}

			}
			stopMeasuring();
			processEvents();
			counter[0]++;
		}

		commitMeasurements();
		assertPerformance();
        widgetFactory.done();
    }
}
