/*******************************************************************************
 * 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;

import java.text.BreakIterator;

import junit.framework.TestCase;


/**
 * @since 3.0
 */
public class BreakIteratorTest extends TestCase {

	protected BreakIterator fBreakIterator;

	public void assertNextPositions(CharSequence ci, int position) {
		assertNextPositions(ci, new int[] {position});
	}

	public void assertNextPositions(CharSequence ci, int[] positions) {
		fBreakIterator.setText(ci.toString());
		
		// test next()
		for (int i = 0; i < positions.length; i++) {
			int pos= fBreakIterator.next(); 
			assertEquals(positions[i], pos);
		}
		
		// test following()
		int idx= 0;
		for (int i = 0; i < positions.length; i++) {
			int position= positions[i];
			while (idx < position) {
				if (!illegalPos(ci, idx))
					assertEquals(position, fBreakIterator.following(idx));
				idx++;
			}
		}
		
	}

	/**
	 * Check if we are in a multibyte delimiter
	 * @param idx
	 * @return
	 */
	private boolean illegalPos(CharSequence seq, int idx) {
		String DELIMS= "\n\r";
		if (idx == 0 || idx == seq.length())
			return false;
		char one= seq.charAt(idx - 1);
		char two= seq.charAt(idx);
		return one != two && DELIMS.indexOf(one) != -1 && DELIMS.indexOf(two) != -1;
	}

	public void assertPreviousPositions(CharSequence ci, int position) {
		assertPreviousPositions(ci, new int[] {position});
	}

	public void assertPreviousPositions(CharSequence ci, int[] positions) {
		fBreakIterator.setText(ci.toString());
		fBreakIterator.last();
		
		for (int i = positions.length - 1; i >= 0; i--) {
			int pos= fBreakIterator.previous(); 
			assertEquals(positions[i], pos);
		}
	
		// test preceding()
		int idx= ci.length();
		for (int i = positions.length - 1; i >= 0; i--) {
			int position= positions[i];
			while (idx > position) {
				if (!illegalPos(ci, idx))
					assertEquals(position, fBreakIterator.preceding(idx));
				idx--;
			}
		}
	}

}
