/*******************************************************************************
 * Copyright (c) 2000, 2006 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 java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;

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

import org.eclipse.jdt.internal.corext.refactoring.rename.RefactoringScanner;
import org.eclipse.jdt.internal.corext.refactoring.rename.RefactoringScanner.TextMatch;

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

public class RefactoringScannerTests extends RefactoringTest{
	
	private static class Position {
		private final int fLine;
		private final int fColumn;
		Position(int line, int column) {
			fLine= line;
			fColumn= column;
		}
	}
	
	
	public RefactoringScannerTests(String name){
		super(name);
	}
	
	private RefactoringScanner fScanner;
	private static Class clazz= RefactoringScannerTests.class;
	
	protected String getRefactoringPath() {
		return "RefactoringScanner/";
	}
	
	public static Test suite() {
		return new RefactoringTestSetup(new TestSuite(clazz));
	}
	
	protected void setUp() throws Exception {
		//no need to call super.setUp();
		fScanner= new RefactoringScanner("TestPattern", "org.eclipse");
	}

	protected void tearDown() throws Exception {
		//no need to call super.tearDown();
	}

	private void helper(String fileName, int expectedMatchCount)	throws Exception{
		String text= getFileContents(getRefactoringPath() + fileName);
		fScanner.scan(text);
		assertEquals("results.length", expectedMatchCount, fScanner.getMatches().size());
	}
	
	private void helper2(String fileName, Position[] expectedMatches)	throws Exception{
		String text= getFileContents(getRefactoringPath() + fileName);
		fScanner.scan(text);
		
		ArrayList expectedMatchesList= new ArrayList(expectedMatches.length);
		for (int i= 0; i < expectedMatches.length; i++)
			expectedMatchesList.add(new Integer(TextRangeUtil.getOffset(text, expectedMatches[i].fLine, expectedMatches[i].fColumn)));
		ArrayList matchesList= new ArrayList();
		Set matches= fScanner.getMatches();
		for (Iterator iter= matches.iterator(); iter.hasNext();) {
			TextMatch element= (TextMatch) iter.next();
			matchesList.add(new Integer(element.getStartPosition()));
		}
		Collections.sort(matchesList);
		assertEquals("results", expectedMatchesList.toString(), matchesList.toString());
	}
	
	//-- tests
	public void test0() throws Exception{
		String text= "";
		fScanner.scan(text);
		assertEquals("results.length", 0, fScanner.getMatches().size());
	}
	
	public void test1() throws Exception{
		helper("A.java", 8);
	}

	public void testWord1() throws Exception{
		helper("B.java", 6);
	}
	
	public void testQualifier() throws Exception{
		helper2("C.java", new Position[] {
				new Position(4, 21),
				new Position(17, 21),
				
				new Position(28, 21),
				new Position(29, 20),
				
				new Position(32, 20),
				
				new Position(37, 21),
				new Position(38, 20),
		});
	}
}

