/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ant.tests.ui.editor.performance;

import org.eclipse.ant.tests.ui.testplugin.AbstractAntUITest;

/**
 * Measures the time to type in one single target into a large buildfile
 * 
 * @since 3.1
 */
public class NonInitialTypingTest extends AbstractAntUITest {

	public NonInitialTypingTest(String name) {
		super(name);
	}

	// private ITextEditor fEditor;
	//
	// private static final char[] TARGET= ("<target name=\"newTarget\" >\r" +
	// "<echo>\"New Target\"</echo>\r" +
	// "</target>\r").toCharArray();
	//
	// private PerformanceMeter fMeter;
	//
	// private KeyboardProbe fKeyboardProbe;
	//
	// protected void setUp() throws PartInitException, BadLocationException {
	// EditorTestHelper.runEventQueue();
	// IFile file= getProject().getFolder("buildfiles").getFolder("performance").getFile("build.xml");
	// fEditor= (ITextEditor) EditorTestHelper.openInEditor(file, true);
	// // dirty editor to avoid initial dirtying / validate edit costs
	// dirtyEditor();
	// Performance performance= Performance.getDefault();
	// fMeter= performance.createPerformanceMeter(performance.getDefaultScenarioId(this));
	// fKeyboardProbe= new KeyboardProbe();
	//
	// int offset= getInsertPosition();
	// fEditor.getSelectionProvider().setSelection(new TextSelection(offset, 0));
	// EditorTestHelper.runEventQueue();
	// sleep(1000);
	// }
	//
	// private void dirtyEditor() {
	// fEditor.getSelectionProvider().setSelection(new TextSelection(0, 0));
	// EditorTestHelper.runEventQueue();
	// sleep(1000);
	//
	// Display display= EditorTestHelper.getActiveDisplay();
	// fKeyboardProbe.pressChar('{', display);
	// SWTEventHelper.pressKeyCode(display, SWT.BS);
	// sleep(1000);
	// }
	//
	// protected void tearDown() throws Exception {
	// sleep(1000);
	// EditorTestHelper.revertEditor(fEditor, true);
	// EditorTestHelper.closeAllEditors();
	//
	// fMeter.commit();
	// }
	//
	// public void testTypeAMethod() {
	// Display display= EditorTestHelper.getActiveDisplay();
	//
	// fMeter.start();
	// for (int i= 0; i < TARGET.length; i++) {
	// fKeyboardProbe.pressChar(TARGET[i], display);
	// }
	// fMeter.stop();
	// }
	//
	// private synchronized void sleep(int time) {
	// try {
	// wait(time);
	// } catch (InterruptedException e) {
	// }
	// }
	//
	// private int getInsertPosition() throws BadLocationException {
	// IDocument document= EditorTestHelper.getDocument(fEditor);
	// int lines= document.getNumberOfLines();
	// int offset= document.getLineOffset(lines - 2);
	// return offset;
	// }
}
