/*******************************************************************************
 * Copyright (c) 2000, 2008 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.jdt.text.tests.performance;


import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.test.performance.Dimension;
import org.eclipse.test.performance.PerformanceMeter;

import org.eclipse.ui.IWorkbenchPage;

import org.eclipse.ui.texteditor.AbstractTextEditor;


public abstract class ActivateEditorTest extends TextPerformanceTestCase {

	private static final Class<ActivateEditorTest> THIS= ActivateEditorTest.class;

	private static final int WARM_UP_RUNS= 10;

	private static final int MEASURED_RUNS= 5;

	private static final int EDITORS= 30;

	private static final String FILE_PREFIX= "TextLayout";

	private static final String PREFIX= "/" + PerformanceTestSetup.PROJECT + "/Eclipse SWT/win32/org/eclipse/swt/graphics/" + FILE_PREFIX;

	private static final String FILE_SUFFIX= ".java";

	private String fShortName;

	private AbstractTextEditor[] fEditors;

	public ActivateEditorTest() {
		super();
	}

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

	public static Test suite() {
		TestSuite suite= new TestSuite(THIS.getName());
		suite.addTest(ActivateJavaEditorTest.suite());
		suite.addTest(ActivateTextEditorTest.suite());
		return suite;
	}

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		setWarmUpRuns(WARM_UP_RUNS);
		setMeasuredRuns(MEASURED_RUNS);
		ResourceTestHelper.replicate(PREFIX + FILE_SUFFIX, PREFIX, FILE_SUFFIX, getNumberOfEditors(), FILE_PREFIX, FILE_PREFIX, ResourceTestHelper.SKIP_IF_EXISTS);
		fEditors= EditorTestHelper.openInEditor(ResourceTestHelper.findFiles(PREFIX, FILE_SUFFIX, 0, getNumberOfEditors()), getEditorId());
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
		EditorTestHelper.closeAllEditors();
		ResourceTestHelper.delete(PREFIX, FILE_SUFFIX, getNumberOfEditors());
	}

	public void testActivateEditor() {
		measureActivateEditor(fEditors, getWarmUpRuns(), getNullPerformanceMeter());
		PerformanceMeter performanceMeter;
		if (getShortName() != null)
			performanceMeter= createPerformanceMeterForSummary(getShortName(), Dimension.ELAPSED_PROCESS);
		else
			performanceMeter= createPerformanceMeter();

		String degradationComment= getDegradationComment();
		if (degradationComment != null)
			explainDegradation(degradationComment, performanceMeter);

		measureActivateEditor(fEditors, getMeasuredRuns(), performanceMeter);
		commitAllMeasurements();
		assertAllPerformance();
	}

	protected String getDegradationComment() {
		return null;
	}

	protected void measureActivateEditor(AbstractTextEditor[] editors, int runs, PerformanceMeter performanceMeter) {
		IWorkbenchPage page= EditorTestHelper.getActivePage();
		for (int i= 0; i < runs; i++) {
			assertTrue(editors.length == 0 || editors[0] != page.getActivePart());
			performanceMeter.start();
			for (AbstractTextEditor editor : editors) {
				page.activate(editor);
				waitUntilReady(editor);
				EditorTestHelper.runEventQueue(editor);
			}
			performanceMeter.stop();
			for (AbstractTextEditor editor : editors)
				EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(editor), 100, 10000, 100);
		}
	}

	/**
	 * Waits until the editor is ready.
	 *
	 * @param editor the editor
	 */
	protected void waitUntilReady(AbstractTextEditor editor) {
	}

	protected abstract String getEditorId();

	protected static int getNumberOfEditors() {
		return EDITORS;
	}

	protected final String getShortName() {
		return fShortName;
	}

	protected final void setShortName(String shortName) {
		fShortName= shortName;
	}
}
