/*******************************************************************************
 * 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.ui.tests.refactoring;

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

import org.eclipse.core.runtime.NullProgressMonitor;

import org.eclipse.ltk.core.refactoring.IUndoManager;
import org.eclipse.ltk.core.refactoring.RefactoringCore;
import org.eclipse.ltk.internal.core.refactoring.UndoManager;
import org.eclipse.ltk.internal.core.refactoring.UndoManager2;

public class UndoManagerTests extends RefactoringTest {
	
	private static final Class clazz= UndoManagerTests.class;
	public UndoManagerTests(String name) {
		super(name);
	}
	
	public static Test suite() {
		return new RefactoringTestSetup(new TestSuite(clazz));
	}
	
	public static Test setUpTest(Test test) {
		return new RefactoringTestSetup(test);
	}
	
	private void checkState(boolean undo, boolean redo, int undoCount, int redoCount){
		checkState(0, undo, redo, undoCount, redoCount);
	}
	
	protected IUndoManager getUndoManager() {
		return RefactoringCore.getUndoManager();
	}
	
	protected void tearDown() throws Exception {
		super.tearDown();
		RefactoringCore.getUndoManager().flush();
	}
	
	private void checkState(int iterationCount, boolean undo, boolean redo, int undoCount, int redoCount){
		assertTrue(iterationCount + " undo", undo == RefactoringCore.getUndoManager().anythingToUndo());
		assertTrue(iterationCount + " redo", redo == RefactoringCore.getUndoManager().anythingToRedo());
		testCounts(iterationCount, undoCount, redoCount);
	}

	private void testCounts(int iterationCount, int undoCount, int redoCount) {
		if (RefactoringCore.getUndoManager() instanceof UndoManager) {
			UndoManager manager= (UndoManager)RefactoringCore.getUndoManager();
			assertTrue(iterationCount + "undo stack", manager.testHasNumberOfUndos(undoCount));
			assertTrue(iterationCount + "redo stack", manager.testHasNumberOfRedos(redoCount));
		} else if (RefactoringCore.getUndoManager() instanceof UndoManager2) {
			UndoManager2 manager= (UndoManager2)RefactoringCore.getUndoManager();
			assertTrue(iterationCount + "undo stack", manager.testHasNumberOfUndos(undoCount));
			assertTrue(iterationCount + "redo stack", manager.testHasNumberOfRedos(redoCount));
		}
	}
	
	private void performUndo() throws Exception {
		RefactoringCore.getUndoManager().performUndo(null, new NullProgressMonitor());
	}
	
	private void performRedo() throws Exception {
		RefactoringCore.getUndoManager().performRedo(null, new NullProgressMonitor());
	}
	
	public void test0() throws Exception{
		checkState(false, false, 0, 0);
	}
	
	public void test1() throws Exception{	
		performRefactoring(new NullRefactoring());
		checkState(true, false, 1, 0);
	}
	
	public void test2() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		checkState(false, true, 0, 1);
	}
	
	public void test3() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		performRedo();
		checkState(true, false, 1, 0);
	}
	
	public void test4() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		performRedo();
		performUndo();
		checkState(false, true, 0, 1);
	}

	public void test5() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		performRedo();
		performRefactoring(new NullRefactoring());
		checkState(true, false, 2, 0);
	}
	
	public void test6() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		performRedo();
		performRefactoring(new NullRefactoring());
		performUndo();
		performUndo();
		checkState(false, true, 0, 2);
	}	
	
	public void test7() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		performRedo();
		performRefactoring(new NullRefactoring());
		performUndo();
		checkState(true, true, 1, 1);
	}	
	
	public void test8() throws Exception{
		// limit is 5 since the stack is limited to 5 entries
		int limit= 5;
		for (int i= 0; i < limit; i++){
			checkState(i, i != 0, false, i, 0);			
			performRefactoring(new NullRefactoring());
		}
		for (int i= 0; i < limit; i++){
			checkState(i, i != limit, i != 0, limit - i, i);			
			performUndo();
		}
		
		for (int i= 0; i < limit; i++){
			checkState(i, i != 0, i != limit, i, limit - i);			
			performRedo();
		}
	}
	

	public void test9() throws Exception{	
		performRefactoring(new NullRefactoring());
		performUndo();
		performRedo();
		performRefactoring(new NullRefactoring());
		performUndo();
		RefactoringCore.getUndoManager().flush();
		checkState(false, false, 0, 0);
	}		
}
