/*******************************************************************************
 * Copyright (c) 2000, 2003 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.ui.tests.actions;

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

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.ISourceRange;

import org.eclipse.jdt.ui.tests.refactoring.MySetup;
import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;

import org.eclipse.jdt.internal.ui.javaeditor.selectionactions.GoToNextPreviousMemberAction;

public class GoToNextPreviousMemberActionTests extends RefactoringTest{

	private static final Class clazz= GoToNextPreviousMemberActionTests.class;
	private static final String REFACTORING_PATH= "GoToNextPreviousMemberAction/";
	public GoToNextPreviousMemberActionTests(String name){
		super(name);
	}
	
	protected String getRefactoringPath() {
		return REFACTORING_PATH;
	}
	
	public static Test suite() {
		return new MySetup(new TestSuite(clazz));
	}
	
	private String getSimpleTestFileName(){
		return "A_" + getName() + ".java";
	}
	
	private String getTestFileName(){
		return TEST_PATH_PREFIX + getRefactoringPath() + getSimpleTestFileName();
	}
	
	//------------
	protected ICompilationUnit createCUfromTestFile() throws Exception {
		return createCU(getPackageP(), getSimpleTestFileName(), getFileContents(getTestFileName()));
	}
	
	private void helper(int startLine, int startColumn, int endLine, int endColumn, 
											int expectedStartLine, int expectedStartColumn, boolean isSelectNext) throws Exception {
		ICompilationUnit cu= createCUfromTestFile();
		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
		ISourceRange actualNewRange= new GoToNextPreviousMemberAction(isSelectNext).getNewSelectionRange(selection, cu.getAllTypes());
		ISourceRange expectedNewRange= TextRangeUtil.getSelection(cu, expectedStartLine, expectedStartColumn, expectedStartLine, expectedStartColumn);
		assertEquals("incorrect selection offset", expectedNewRange.getOffset(), actualNewRange.getOffset());
		assertEquals("incorrect selection length", expectedNewRange.getLength(), actualNewRange.getLength());
	}	

	private void helperNext(int startLine, int startColumn, int expectedStartLine, int expectedStartColumn) throws Exception{
		helper(startLine, startColumn, startLine, startColumn, expectedStartLine, expectedStartColumn, true);										
	}

	private void helperPrevious(int startLine, int startColumn, int expectedStartLine, int expectedStartColumn) throws Exception{
		helper(startLine, startColumn, startLine, startColumn, expectedStartLine, expectedStartColumn, false);			
	}

	//----
	public void testPrevious0() throws Exception{
		helperPrevious(6, 5, 5, 11);
	}

	public void testPrevious1() throws Exception{
		helperPrevious(8, 5, 7, 6);
	}

	public void testPrevious2() throws Exception{
		helperPrevious(3, 1, 3, 1);
	}

	public void testPrevious3() throws Exception{
		helperPrevious(15, 9, 13, 6);
	}

	public void testPrevious4() throws Exception{
		helperPrevious(19, 1, 18, 9);
	}

	public void testPrevious5() throws Exception{
		helperPrevious(31, 10, 27, 10);
	}

	public void testPrevious6() throws Exception{
		helperPrevious(35, 3, 34, 2);
	}

	public void testNext0() throws Exception{
		helperNext(3, 1, 4, 7);
	}

	public void testNext1() throws Exception{
		helperNext(27, 10, 31, 10);
	}

	public void testNext2() throws Exception{
		helperNext(35, 2, 35, 2);
	}

	public void testNext3() throws Exception{
		helperNext(19, 1, 20, 13);
	}

}
