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

import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.test.performance.PerformanceMeter;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;

import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.ui.texteditor.ITextEditor;

/**
 * @since 3.1
 */
public abstract class SaveEditorTest extends TextPerformanceTestCase {
	
	private static final Class THIS= SaveEditorTest.class;
	
	private static final int WARM_UP_RUNS= 10;
	
	private static final int MEASURED_RUNS= 5;
	
	private static final String FILE_PREFIX= "StyledText";
	
	private static final String PREFIX= "/" + PerformanceTestSetup.PROJECT + "/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/" + FILE_PREFIX;
	
	private static final String FILE_SUFFIX= ".java";

	private AbstractTextEditor[] fEditors;

	private static final int EDITORS= 10;

	private boolean fWasAutobuilding;
	
	public static Test suite() {
		TestSuite suite= new TestSuite(THIS.getName());
		suite.addTest(SaveTextEditorTest.suite());
		suite.addTest(SaveJavaEditorTest.suite());
		return suite;
	}
	
	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());
		EditorTestHelper.joinBackgroundActivities();
		fWasAutobuilding= ResourceTestHelper.setAutoBuilding(false);
	}

	protected int getNumberOfEditors() {
		return EDITORS;
	}

	protected abstract String getEditorId();

	protected void tearDown() throws Exception { 
		super.tearDown();
		EditorTestHelper.closeAllEditors();
		try {
			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=72633
			ResourceTestHelper.delete(PREFIX, FILE_SUFFIX, getNumberOfEditors());
		} finally {
			ResourceTestHelper.setAutoBuilding(fWasAutobuilding);
			EditorTestHelper.joinBackgroundActivities();
		}
	}
	
	public void test1() throws Exception {
		measureRevert(getNullPerformanceMeter(), getWarmUpRuns());
		measureRevert(createPerformanceMeter(), getMeasuredRuns());
		commitAllMeasurements();
		assertAllPerformance();
	}
	
	protected void measureRevert(PerformanceMeter performanceMeter, int runs) throws Exception {
		for (int i= 0; i < runs; i++) {
			for (int j= 0; j < getNumberOfEditors(); j++)
				dirtyEditor(fEditors[j]);
			for (int j= 0; j < getNumberOfEditors(); j++)
				EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(fEditors[j]), 100, 10000, 100);
			performanceMeter.start();
			for (int j= 0; j < getNumberOfEditors(); j++)
				EditorTestHelper.getActivePage().saveEditor(fEditors[j], false);
			performanceMeter.stop();
			for (int j= 0; j < getNumberOfEditors(); j++)
				assertFalse(fEditors[j].isDirty());
		}
	}
	
	private void dirtyEditor(ITextEditor editor) throws BadLocationException {
		IDocument document= EditorTestHelper.getDocument(editor);
		if (document.getLength() > 0 && document.getChar(0) == ' ')
			document.replace(0, 1, "");
		else
			document.replace(0, 0, " ");
		assertTrue(editor.isDirty());
	}
}
