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

import junit.awtui.TestRunner;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.ConfigurableLineTracker;
import org.eclipse.jface.text.GapTextStore;
import org.eclipse.jface.text.ILineTracker;
import org.eclipse.jface.text.IRegion;



public class LineTrackerTest4 extends TestCase {
	
	private GapTextStore fText;
	private ILineTracker  fTracker;
	
	
	public LineTrackerTest4(String name) {
		super(name);
	}
	
	public static void main(String args[]) {
		String a[] = { "org.eclipse.jface.text.test.LineTrackerTest4" };
		TestRunner.main(a);
	}
	
	protected int getLineOffset(int line, int[] lines) {
		int offset= 0;
		for (int i= 0; i < line; i++)
			offset += (lines[i] + 2);
		return offset;
	}
	
	protected void checkLines(int[] lines) {
		
		assertTrue("invalid number of line", fTracker.getNumberOfLines() == lines.length);
	
		for (int i= 0; i < lines.length; i++) {
			
			try {
				
				IRegion line= fTracker.getLineInformation(i);
				
				assertTrue("line: " + i + " length=" + line.getLength() + " should be:" + lines[i], line.getLength() == lines[i]);
				
				int expected= getLineOffset(i, lines);
				assertTrue("line: " + i + " offset=" + line.getOffset() + " should be:" + expected, line.getOffset() == expected);
			
			} catch (BadLocationException x) {
				assertTrue(false);
			}
		}
	}
	
	protected void setUp() {
	
		fText= new GapTextStore(50, 300);
		fTracker= new ConfigurableLineTracker(new String[] { "\r\n" });
		fText.set("x\r\nx\r\nx\r\nx\r\nx\r\n");
		fTracker.set("x\r\nx\r\nx\r\nx\r\nx\r\n");
	}
	
	public static Test suite() {
		return new TestSuite(LineTrackerTest4.class); 
	}
	
	protected void tearDown () {
		fTracker= null;
		fText= null;
	}
	
	public void testEditScript1() {
	
		try {
	
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
	
			fTracker.replace(0, fText.getLength(), "x");
			fText.replace(0, fText.getLength(), "x");
			
			checkLines(new int[] { 1 });
	
			fTracker.replace(1, 0, "y");
			fText.replace(1, 0, "y");
			
			checkLines(new int[] { 2 });
	
			fTracker.replace(2, 0, "z");
			fText.replace(2, 0, "z");
	
			checkLines(new int[] { 3 });
	
			fTracker.replace(3, 0, "\r\n");
			fText.replace(3, 0, "\r\n");
	
			checkLines(new int[] { 3, 0 });
	
			
			fTracker.replace(5, 0, "x");
			fText.replace(5, 0, "x");
	
			checkLines(new int[] { 3, 1 });
	
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	
	}
	
	public void testEmptyLines() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
			
			fTracker.replace(0, 15, null);
			fText.replace(0, 15, null);
			checkLines(new int[] { 0 });
	
			fTracker.replace(0, 0, "\r\n\r\n\r\n\r\n\r\n");
			fText.replace(0, 0, "\r\n\r\n\r\n\r\n\r\n");
			checkLines(new int[] { 0, 0, 0, 0, 0, 0 });
	
			for (int i= 0; i < 10; i++) {
				int no= fTracker.getLineNumberOfOffset(i);
				double l= Math.floor(i/2);
				assertTrue("invalid line number " + no + " for position " + i + " should be " + l, l == no);
			}
	
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testInsert1() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
			
			fTracker.replace(4, 0, "yyyy");
			fText.replace(4, 0, "yyyy");
			checkLines(new int[] { 1, 5, 1, 1, 1, 0 });
	
			fTracker.replace(11, 0, "y\r\n");
			fText.replace(11, 0, "y\r\n");
			checkLines(new int[] { 1, 5, 2, 0, 1, 1, 0 });
			
			fTracker.replace(14, 0, "y\r\n");
			fText.replace(14, 0, "y\r\n");
			checkLines(new int[] { 1, 5, 2, 1, 0, 1, 1, 0 });
			
			fTracker.replace(17, 0, "y");
			fText.replace(17, 0, "y");
			checkLines(new int[] { 1, 5, 2, 1, 1, 1, 1, 0 });
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testInsert2() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
			
			fTracker.replace(4, 0, "yyyy");
			fText.replace(4, 0, "yyyy");
			checkLines(new int[] { 1, 5, 1, 1, 1, 0 });
	
			fTracker.replace(11, 0, "y\r\ny\r\ny");
			fText.replace(11, 0, "y\r\ny\r\ny");
			checkLines(new int[] {  1, 5, 2, 1, 1, 1, 1, 0 });
	
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testLinesNumbers() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
			
			fTracker.replace(0, 15, "\r\na\r\nbb\r\nccc\r\ndddd\r\neeeee\r\n" );
			fText.replace(0, 10, "\na\nbb\nccc\ndddd\neeeee\n" );
			checkLines(new int[] { 0, 1, 2, 3, 4, 5, 0 });
	
			int offset= 0;
			for (int i= 0; i < 5; i++) {
				for (int j= 0; j <= i; j++) {
					int no= fTracker.getLineNumberOfOffset(offset + j);
					assertTrue("invalid line number " + no + " reported instead of " + i, no == i);
				}
				offset += (i + 2);
			}
			
	
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testOffsets() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
	
			for (int i= 0; i < 5; i++) {
				IRegion line= fTracker.getLineInformation(i);
				int pos= line.getOffset() + line.getLength() + 1;
				int offset= (3 * i) + 2;
				assertTrue("invalid line end offset " + pos + " for line " + i + " should be " + offset,  offset == pos);
			}
	
			for (int i= 0; i < 5; i++) {
				int pos= fTracker.getLineOffset(i);
				int offset= 3 * i;
				assertTrue("invalid line start offset " + pos + " for line " + i + " should be "  + offset, pos == offset);
			}
	
			for (int i= 0; i < 15; i++) {
				int line= fTracker.getLineNumberOfOffset(i);
				double l= Math.floor(i/3);
				assertTrue("invalid line number " + line + " for position " + i + " should be " + l, l == line);
			}
			
			int lastLine= fTracker.getLineNumberOfOffset(fText.getLength());
			assertTrue("invalid last line number " + lastLine, 5 == lastLine);
			
			int offset= fTracker.getLineOffset(lastLine);
			assertTrue("invalid last line start offset " + offset, fText.getLength() == offset);
			
			int length= fTracker.getLineLength(lastLine);
			assertTrue("invalid last line end offset " + (offset + length -1),  0 == length);
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testRemove() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
			
			fTracker.replace(4, 2, null);
			fText.replace(4, 2, null);
			checkLines(new int[] { 1, 2, 1, 1, 0 });
	
			fTracker.replace(8, 2, null);
			fText.replace(8, 2, null);
			checkLines(new int[] { 1, 2, 2, 0 });
	
			fTracker.replace(4, 7, null);
			fText.replace(4, 7, null);
			checkLines(new int[] { 1, 1 });
	
			fTracker.replace(0, 4, null);
			fText.replace(0, 4, null);
			checkLines(new int[] { 0 });
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testReplace() {
	
		try {
	
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
	
			fTracker.replace(0, fText.getLength(), "\tx\r\n\tx\r\n\tx\r\n\tx\r\n\tx\r\n");
			fText.replace(0, fText.getLength(), "\tx\r\n\tx\r\n\tx\r\n\tx\r\n\tx\r\n");
			
			checkLines(new int[] { 2, 2, 2, 2, 2, 0 });
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	
	}
	
	public void testShiftLeft() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
	
			fTracker.replace(0, fText.getLength(), "\tx\r\n\tx\r\n\tx\r\n\tx\r\n\tx\r\n");
			fText.replace(0, fText.getLength(), "\tx\r\n\tx\r\n\tx\r\n\tx\r\n\tx\r\n");
			checkLines(new int[] { 2, 2, 2, 2, 2, 0 });
			
			for (int i= 0; i < 5; i++) {
				int pos= fTracker.getLineOffset(i);
				fTracker.replace(pos, 1, null);
				fText.replace(pos, 1, null);
			}
	
	
			String txt= fText.get(0, fText.getLength());
			assertEquals("invalid text", "x\r\nx\r\nx\r\nx\r\nx\r\n", txt);
			
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
	
	public void testShiftRight() {
	
		try {
			
			checkLines(new int[] { 1, 1, 1, 1, 1, 0 });
	
			for (int i= 0; i < 5; i++) {
				int pos= fTracker.getLineOffset(i);
				fTracker.replace(pos, 0, "\t");
				fText.replace(pos, 0, "\t");
			}
	
			checkLines(new int[] { 2, 2, 2, 2, 2, 0 });
	
			String txt= fText.get(0, fText.getLength());
			assertEquals("invalid text", "\tx\r\n\tx\r\n\tx\r\n\tx\r\n\tx\r\n", txt);
			
		} catch (BadLocationException e) {
			assertTrue("BadLocationException", false);
		}
	}
}
