diff --git a/org.eclipse.jdt.debug.tests/plugin.xml b/org.eclipse.jdt.debug.tests/plugin.xml
index baffc05..ffefc9a 100644
--- a/org.eclipse.jdt.debug.tests/plugin.xml
+++ b/org.eclipse.jdt.debug.tests/plugin.xml
@@ -32,7 +32,6 @@
       <import plugin="org.eclipse.update.core"/>
       <import plugin="org.eclipse.core.runtime"/>
       <import plugin="org.eclipse.ui.console"/>
-      <import plugin="org.eclipse.test.performance"/>
    </requires>
 
 
@@ -152,14 +151,5 @@
             id="org.eclipse.jdt.debug.tests.testConfigType">
       </launchConfigurationType>
    </extension>
-   <extension
-         point="org.eclipse.debug.core.statusHandlers">
-      <statusHandler
-            code="1000"
-            plugin="org.eclipse.jdt.debug.tests"
-            class="org.eclipse.jdt.debug.tests.ui.performance.JavaApplicationStatusHandler"
-            id="org.eclipse.jdt.debug.tests.performance.statusHandler.JavaApplication">
-      </statusHandler>
-   </extension>
 
 </plugin>
diff --git a/org.eclipse.jdt.debug.tests/test.xml b/org.eclipse.jdt.debug.tests/test.xml
index a8eff76..24ecf1b 100644
--- a/org.eclipse.jdt.debug.tests/test.xml
+++ b/org.eclipse.jdt.debug.tests/test.xml
@@ -20,7 +20,7 @@
     </delete>
   </target>
 
-  <!-- This target defines the regression tests that need to be run. -->
+  <!-- This target defines the tests that need to be run. -->
   <target name="suite">
     <property name="jdt-folder" 
               value="${eclipse-home}/jdt_folder"/>
@@ -32,19 +32,6 @@
                 value="org.eclipse.jdt.debug.tests.AutomatedSuite"/>
     </ant>
   </target>
-  
-  <!-- This target defines the performance tests that need to be run. -->
-  <target name="perfsuite">
-    <property name="jdt-folder" 
-              value="${eclipse-home}/jdt_folder"/>
-    <delete dir="${jdt-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${jdt-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.jdt.debug.tests.PerformanceSuite"/>
-    </ant>
-  </target>  
 
   <!-- This target holds code to cleanup the testing environment after -->
   <!-- after all of the tests have been run. You can use this target to -->
@@ -60,12 +47,5 @@
       <property name="output-file" value="${plugin-name}.xml"/>
     </ant>
   </target>
-  
-  <target name="performance" depends="init,perfsuite,cleanup">
-    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="includes" value="org*.xml"/>
-      <property name="output-file" value="${plugin-name}.xml"/>
-    </ant>
-  </target>  
 
 </project>
diff --git a/org.eclipse.jdt.debug.tests/testprograms/PerfLoop.java b/org.eclipse.jdt.debug.tests/testprograms/PerfLoop.java
deleted file mode 100644
index 1af5c0f..0000000
--- a/org.eclipse.jdt.debug.tests/testprograms/PerfLoop.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import java.util.Vector;
-
-/**
- * A loop adding to a collection
- */
-public class PerfLoop {
-
-	public static void main(String[] args) {
-		Vector v = new Vector(200);
-		for (int i = 0; i < 10000; i++) {
-			v.add(new Integer(i));
-		}
-	}
-}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java
deleted file mode 100644
index 950a676..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AbstractDebugPerformanceTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.debug.tests;
-
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceMeter;
-
-public class AbstractDebugPerformanceTest extends AbstractDebugTest {
-
-	protected PerformanceMeter fPerformanceMeter;
-
-	/**
-	 * Constructs a performance test case with the given name.
-	 * @param name the name of the performance test case
-	 */
-	public AbstractDebugPerformanceTest(String name) {
-		super(name);
-	}
-	
-	/**
-	 * Overridden to create a default performance meter for this test case.
-	 * @throws Exception
-	 */
-	protected void setUp() throws Exception {
-		Performance performance= Performance.getDefault();
-		fPerformanceMeter= performance.createPerformanceMeter(performance.getDefaultScenarioId(this));
-	}
-
-	/**
-	 * Overridden to dispose of the performance meter.
-	 * @throws Exception
-	 */
-	protected void tearDown() throws Exception {
-		fPerformanceMeter.dispose();
-	}
-
-	/**
-	 * Mark the scenario of this test case
-	 * to be included into the global performance summary. The summary shows
-	 * the given dimension of the scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName a short (shorter than 40 characters) descritive name of the scenario
-	 * @param dimension the dimension to show in the summary
-	 */
-	public void tagAsGlobalSummary(String shortName, Dimension dimension) {
-		Performance performance= Performance.getDefault();
-		performance.tagAsGlobalSummary(fPerformanceMeter, shortName, new Dimension[] { dimension } );
-	}
-
-	/**
-	 * Mark the scenario represented by the given PerformanceMeter
-	 * to be included into the global performance summary. The summary shows
-	 * the given dimensions of the scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName a short (shorter than 40 characters) descritive name of the scenario
-	 * @param dimensions an array of dimensions to show in the summary
-	 */
-	public void tagAsGlobalSummary(String shortName, Dimension[] dimensions) {
-		Performance performance= Performance.getDefault();
-		performance.tagAsGlobalSummary(fPerformanceMeter, shortName, dimensions );
-	}
-	
-	/**
-	 * Called from within a test case immediately before the code to measure is run.
-	 * It starts capturing of performance data.
-	 * Must be followed by a call to {@link PerformanceTestCase#stopMeasuring()} before subsequent calls
-	 * to this method or {@link PerformanceTestCase#commitMeasurements()}.
-	 */
-	protected void startMeasuring() {
-		fPerformanceMeter.start();
-	}
-	
-	protected void stopMeasuring() {
-		fPerformanceMeter.stop();
-	}
-	
-	protected void commitMeasurements() {
-		fPerformanceMeter.commit(); 
-	}
-
-	/**
-	 * Asserts default properties of the measurements captured for this test case.
-	 * 
-	 * @throws RuntimeException if the properties do not hold
-	 */
-	protected void assertPerformance() {
-		Performance.getDefault().assertPerformance(fPerformanceMeter);
-	}
-
-	/**
-	 * Asserts that the measurement specified by the given dimension
-	 * is within a certain range with respect to some reference value.
-	 * If the specified dimension isn't available, the call has no effect.
-	 * 
-	 * @param dim the Dimension to check
-	 * @param lowerPercentage a negative number indicating the percentage the measured value is allowed to be smaller than some reference value
-	 * @param upperPercentage a positive number indicating the percentage the measured value is allowed to be greater than some reference value
-	 * @throws RuntimeException if the properties do not hold
-	 */
-	protected void assertPerformanceInRelativeBand(Dimension dim, int lowerPercentage, int upperPercentage) {
-		Performance.getDefault().assertPerformanceInRelativeBand(fPerformanceMeter, dim, lowerPercentage, upperPercentage);
-	}
-}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
index 9a3544c..a1aed97 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
@@ -10,7 +10,9 @@
  *******************************************************************************/
 package org.eclipse.jdt.debug.tests;
 
+import java.util.Enumeration;
 import junit.framework.Test;
+import junit.framework.TestResult;
 import junit.framework.TestSuite;
 import org.eclipse.jdt.debug.tests.core.ArchiveSourceLookupTests;
 import org.eclipse.jdt.debug.tests.core.ArrayTests;
@@ -67,13 +69,19 @@
 import org.eclipse.jdt.debug.tests.core.WatchExpressionTests;
 import org.eclipse.jdt.debug.tests.core.WatchpointTests;
 import org.eclipse.jdt.debug.tests.core.WorkspaceSourceContainerTests;
+import org.eclipse.swt.widgets.Display;
 
 /**
  * Tests for integration and nightly builds.
  */
-public class AutomatedSuite extends DebugSuite {
+public class AutomatedSuite extends TestSuite {
 	
 	/**
+	 * Flag that indicates test are in progress
+	 */
+	protected boolean fTesting = true;
+
+	/**
 	 * Returns the suite.  This is required to
 	 * use the JUnit Launcher.
 	 */
@@ -151,5 +159,43 @@
 		
 		
 	}
+	
+	/**
+	 * Runs the tests and collects their result in a TestResult.
+	 * The debug tests cannot be run in the UI thread or the event
+	 * waiter blocks the UI when a resource changes.
+	 */
+	public void run(final TestResult result) {
+		final Display display = Display.getCurrent();
+		Thread thread = null;
+		try {
+			Runnable r = new Runnable() {
+				public void run() {
+					for (Enumeration e= tests(); e.hasMoreElements(); ) {
+				  		if (result.shouldStop() )
+				  			break;
+						Test test= (Test)e.nextElement();
+						runTest(test, result);
+					}					
+					fTesting = false;
+					display.wake();
+				}
+			};
+			thread = new Thread(r);
+			thread.start();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+				
+		while (fTesting) {
+			try {
+				if (!display.readAndDispatch())
+					display.sleep();
+			} catch (Throwable e) {
+				e.printStackTrace();
+			}			
+		}		
+	}
+
 }
 
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java
deleted file mode 100644
index e458107..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/DebugSuite.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.debug.tests;
-
-import java.util.Enumeration;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Debug test suite framework that runs test in a non UI thread.
- */
-public abstract class DebugSuite extends TestSuite {
-	
-	/**
-	 * Flag that indicates test are in progress
-	 */
-	protected boolean fTesting = true;
-
-
-	/**
-	 * Construct the test suite.
-	 */
-	public DebugSuite() {
-	}
-	
-	/**
-	 * Runs the tests and collects their result in a TestResult.
-	 * The debug tests cannot be run in the UI thread or the event
-	 * waiter blocks the UI when a resource changes.
-	 */
-	public void run(final TestResult result) {
-		final Display display = Display.getCurrent();
-		Thread thread = null;
-		try {
-			Runnable r = new Runnable() {
-				public void run() {
-					for (Enumeration e= tests(); e.hasMoreElements(); ) {
-				  		if (result.shouldStop() )
-				  			break;
-						Test test= (Test)e.nextElement();
-						runTest(test, result);
-					}					
-					fTesting = false;
-					display.wake();
-				}
-			};
-			thread = new Thread(r);
-			thread.start();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-				
-		while (fTesting) {
-			try {
-				if (!display.readAndDispatch())
-					display.sleep();
-			} catch (Throwable e) {
-				e.printStackTrace();
-			}			
-		}		
-	}
-
-}
-
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java
deleted file mode 100644
index 91ac941..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/PerformanceSuite.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.debug.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.debug.tests.performance.PerfConditionalBreakpointsTests;
-import org.eclipse.jdt.debug.tests.performance.PerfSteppingTests;
-
-/**
- * Tests for integration and nightly builds.
- */
-public class PerformanceSuite extends DebugSuite {
-	
-	/**
-	 * Returns the suite.  This is required to
-	 * use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new PerformanceSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public PerformanceSuite() {
-		addTest(new TestSuite(ProjectCreationDecorator.class));
-		
-		addTest(new TestSuite(PerfConditionalBreakpointsTests.class));
-		addTest(new TestSuite(PerfSteppingTests.class));		
-		
-	}
-}
-
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java
index 8a37a07..bd5b902 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ProjectCreationDecorator.java
@@ -121,7 +121,6 @@
 		createLaunchConfiguration("org.eclipse.debug.tests.targets.StepIntoSelectionClass");
 		createLaunchConfiguration("WatchItemTests");
 		createLaunchConfiguration("ArrayTests");
-		createLaunchConfiguration("PerfLoop");
 	}
 	
 	/**
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java
deleted file mode 100644
index e7f2ea6..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfConditionalBreakpointsTests.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.debug.tests.performance;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
-import org.eclipse.jdt.debug.core.IJavaPrimitiveValue;
-import org.eclipse.jdt.debug.core.IJavaStackFrame;
-import org.eclipse.jdt.debug.core.IJavaThread;
-import org.eclipse.jdt.debug.tests.AbstractDebugPerformanceTest;
-import org.eclipse.test.performance.Dimension;
-
-/**
- * Tests performance of conditional breakpoints.
- */
-public class PerfConditionalBreakpointsTests extends
-        AbstractDebugPerformanceTest {
-
-    public PerfConditionalBreakpointsTests(String name) {
-        super(name);
-    }
-
-    public void testConditionalBreakpoint() throws Exception {
-        String typeName = "PerfLoop";
-        IJavaLineBreakpoint bp = createConditionalLineBreakpoint(22, typeName, "i == 99", true);
-
-        List threads= new ArrayList();
-        try {
-            
-            //cold launch, open editor etc.
-            IJavaThread thread  = launchToLineBreakpoint(typeName, bp);
-            threads.add(thread);
-            tagAsGlobalSummary("Conditional Breakpoint", Dimension.CPU_TIME);
-            for (int i = 0; i < 5; i++) {
-                try {
-                    startMeasuring();
-                    thread = launchToLineBreakpoint(typeName, bp);
-                    stopMeasuring();
-                } finally {
-                   threads.add(thread);
-                }
-            }
-
-            commitMeasurements();
-            assertPerformance();
-
-            //verify actually stopping at the correct location
-            IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
-            IVariable var = frame.findVariable("i");
-            assertNotNull("Could not find variable 'i'", var);
-
-            IJavaPrimitiveValue value = (IJavaPrimitiveValue) var.getValue();
-            assertNotNull("variable 'i' has no value", value);
-            int iValue = value.getIntValue();
-            assertEquals("value of 'i' incorrect", 99, iValue);
-            bp.delete();
-        } finally {
-            Iterator iter= threads.iterator();
-            while (iter.hasNext()) {
-                IJavaThread thread = (IJavaThread) iter.next();
-                terminateAndRemove(thread);    
-            }
-            
-            removeAllBreakpoints();
-        }
-    }
-}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java
deleted file mode 100644
index c5b8943..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/performance/PerfSteppingTests.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.debug.tests.performance;
-
-import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
-import org.eclipse.jdt.debug.core.IJavaStackFrame;
-import org.eclipse.jdt.debug.core.IJavaThread;
-import org.eclipse.jdt.debug.tests.AbstractDebugPerformanceTest;
-
-/**
- * Tests performance of stepping.
- */
-public class PerfSteppingTests extends AbstractDebugPerformanceTest {
-	
-	public PerfSteppingTests(String name) {
-		super(name);
-	}
-
-	public void testRapidStepping() throws Exception {
-		String typeName = "PerfLoop";
-		IJavaLineBreakpoint bp = createLineBreakpoint(20, typeName);
-		
-		IJavaThread thread= null;
-		try {
-			thread= launchToLineBreakpoint(typeName, bp);
-
-			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
-			for (int n= 0; n < 10; n++) {
-				startMeasuring();
-				for (int i = 0; i < 100; i++) {
-					stepOver(frame);
-				}
-				stopMeasuring();
-			}
-			commitMeasurements();
-			assertPerformance();
-		} finally {
-			terminateAndRemove(thread);
-			removeAllBreakpoints();
-		}		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java
deleted file mode 100644
index 63bd420..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/JavaApplicationStatusHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jdt.debug.tests.ui.performance;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.debug.core.IStatusHandler;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-
-public class JavaApplicationStatusHandler implements IStatusHandler {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
-     */
-    public Object handleStatus(IStatus status, Object source) throws CoreException {
-        ILaunchConfigurationDialog dialog = (ILaunchConfigurationDialog)source;
-		dialog.setActiveTab(3);
-		return null;
-    }
-}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java
deleted file mode 100644
index 6b125be..0000000
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/performance/OpenLaunchConfigurationDialogTests.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jdt.debug.tests.ui.performance;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDialog;
-import org.eclipse.jdt.debug.tests.AbstractDebugPerformanceTest;
-import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-public class OpenLaunchConfigurationDialogTests extends AbstractDebugPerformanceTest {
-
-    public OpenLaunchConfigurationDialogTests(String name) {
-        super(name);
-    }
-
-    public static String fgIdentifier= "org.eclipse.jdt.launching.localJavaApplication";
-    
-    public void testOpenJavaProgramLaunchConfigurationDialog1() {
-        // cold run
-        ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
-		IStructuredSelection selection= new StructuredSelection(config);
-		for (int i = 0; i < 100; i++) {
-		    openLCD(selection, fgIdentifier); 
-        }
-		
-		commitMeasurements();
-		assertPerformance();
-    }
-    
-    public void testOpenJavaProgramLaunchConfigurationDialog2() {
-        // warm run..depends on testOpenJavaProgramLaunchConfigurationDialog1 for cold start
-        ILaunchConfiguration config = getLaunchConfiguration("Breakpoints");
-		IStructuredSelection selection = new StructuredSelection(config);
-		openLCD(selection, fgIdentifier);
-    }
-
-    private void openLCD(final IStructuredSelection selection, final String groupIdentifier) {
-       
-        //set a status to go to the classpath tab
-	    IStatus status = new Status(IStatus.INFO, IJavaDebugUIConstants.PLUGIN_ID, 1000, "", null); //$NON-NLS-1$
-		LaunchConfigurationsDialog dialog= new LaunchConfigurationsDialog(DebugUIPlugin.getShell(), DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(groupIdentifier));
-		dialog.setBlockOnOpen(false);
-		dialog.setOpenMode(LaunchConfigurationsDialog.LAUNCH_CONFIGURATION_DIALOG_OPEN_ON_SELECTION);
-		dialog.setInitialSelection(selection);
-		dialog.setInitialStatus(status);
-		startMeasuring();
-		dialog.open();
-		dialog.close();
-		stopMeasuring();
-    }
-}
