blob: 92c07f5e547895e8cc05093d2de18b342f8ed038 [file] [log] [blame]
/*******************************************************************************
* 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.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;
import org.eclipse.ui.tests.performance.TestRunnable;
/**
* 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};
exercise(new TestRunnable() {
public void run() {
// 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 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();
}
}