package org.eclipse.swt.custom;
/**
 * Use this test class to validate an implementation of the StyledTextContent
 * interface.  To perform the validation, copy this class to the package where 
 * your StyledTextContent implementation lives.  Then specify the fully qualified
 * name of your StyledTextContent class as an argument to the main method of this 
 * class. 
 * 
 * NOTE:  This test class assumes that your StyledTextContent implementation 
 * handles the following delimiters:
 * 
 * 		/r
 * 		/n
 * 		/r/n
 */

import org.eclipse.swt.custom.*;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import java.io.*;
import java.lang.reflect.*;

public class StyledTextContentSpec implements TextChangeListener {
	static String contentClassName;
	static int failCount = 0;
	static int errorCount = 0;
	Class contentClass = null;
	StyledTextContent contentInstance = null;
	int verify = 0;
	Method currentMethod = null;
	boolean failed = false;
	StyledText widget = null;
	Shell shell = null;
	
public StyledTextContentSpec() {
}
public void assert(String message, boolean condition) {
	System.out.print("\t" + currentMethod.getName() + " " + message);
	if (!condition) 
		fail(message);
	else 
		System.out.println(" passed");
		
}
public void fail(String message) {
	failed = true;
	System.out.println(" FAILED");
	failCount++;
}
public StyledTextContent getContentInstance() {
	contentInstance.setText("");
	widget.setContent(contentInstance);
	return contentInstance;
}
public static String getTestText() {
	return 
		"This is the first line.\r\n" +
		"This is the second line.\r\n" +
		"This is the third line.\r\n" +
		"This is the fourth line.\r\n" +
		"This is the fifth line.\r\n" +
		"\r\n" +
		"This is the first line again.\r\n" +
		"This is the second line again.\r\n" +
		"This is the third line again.\r\n" +
		"This is the fourth line again.\r\n" +
		"This is the fifth line again.\r\n" +
		"\r\n" +
		"This is the first line once again.\r\n" +
		"This is the second line once again.\r\n" +
		"This is the third line once again.\r\n" +
		"This is the fourth line once again.\r\n" +
		"This is the fifth line once again.";
}
public static void main(String[] args) {
	StyledTextContentSpec spec = new StyledTextContentSpec();
	if (args.length > 0) {
		contentClassName = args[0];
	} else {
		MessageBox box = new MessageBox(Display.getDefault().getActiveShell(), SWT.ICON_ERROR);
		box.setMessage("Content class must be specified as an execution argument."); //$NON-NLS-1$
		box.open();
		return;
	}
	spec.run();
	System.out.println();
	System.out.println(failCount + " TEST FAILURES.");
	System.out.println(errorCount + " UNEXPECTED ERRORS.");
}
public void run() {
	if (contentClassName.equals("")) {
		MessageBox box = new MessageBox(Display.getDefault().getActiveShell(), SWT.ICON_ERROR);
		box.setMessage("Content class must be specified as an execution argument."); //$NON-NLS-1$
		box.open();
		return;
	}
	if (contentClass == null) {
		try {
			contentClass = Class.forName(contentClassName);
		} catch (ClassNotFoundException e) {
			MessageBox box = new MessageBox(Display.getDefault().getActiveShell(), SWT.ICON_ERROR);
			box.setMessage("Content class:\n" + contentClassName + "\nnot found"); //$NON-NLS-1$
			box.open();
			return;
		}
	}
	try {
		contentInstance = (StyledTextContent)contentClass.newInstance();
	} catch (IllegalAccessException e) {
		MessageBox box = new MessageBox(Display.getDefault().getActiveShell(), SWT.ICON_ERROR);
		box.setMessage("Unable to access content class:\n" + contentClassName); //$NON-NLS-1$
		box.open();
		return;
	} catch (InstantiationException e) {
		MessageBox box = new MessageBox(Display.getDefault().getActiveShell(), SWT.ICON_ERROR);
		box.setMessage("Unable to instantiate content class:\n" + contentClassName); //$NON-NLS-1$
		box.open();
		return;
	}
	Class clazz;
	clazz = this.getClass();
	Method[] methods = clazz.getDeclaredMethods();
	for (int i=0; i<methods.length; i++) {
		setUp();
		currentMethod = methods[i];
		failed = false;
		try {
			if (currentMethod.getName().startsWith("test_")) {
				System.out.println();
				System.out.println(currentMethod.getName() + "...");
				currentMethod.invoke(this, new Object[0]);
				if (!failed) {
					System.out.println("PASSED.");
				} else {
					System.out.println("FAILED");
				}
			} 
		} catch (InvocationTargetException ex) {
			System.out.println("\t" + currentMethod.getName() + " ERROR ==> " + ex.getTargetException().toString());
			System.out.println("FAILED");
			errorCount++;
		} catch (Exception ex) {
			System.out.println("\t" + currentMethod.getName() + " ERROR ==> " + ex.toString());
			System.out.println("FAILED");
			errorCount++;
		}
		if (verify != 0) {
			verify = 0;
			contentInstance.removeTextChangeListener(this);
		}
		tearDown();
	}
}
public void textSet(TextChangedEvent event) {
}
public void textChanged(TextChangedEvent event) {
}
public void textChanging(TextChangingEvent event) {
	switch (verify) {
		case 1 : {
			assert(":1a:", event.replaceLineCount == 0);
			assert(":1b:", event.newLineCount == 1);
			break;
		}
		case 2 : {
			assert(":2a:", event.replaceLineCount == 2);
			assert(":2b:", event.newLineCount == 0);
			break;
		}
		case 3 : {
			assert(":3a:", event.replaceLineCount == 0);
			assert(":3b:", event.newLineCount == 2);
			break;
		}
		case 4: {
			assert(":4:", false);
			break;
		}
		case 5 : {
			assert(":5a:", event.replaceLineCount == 0);
			assert(":5b:", event.newLineCount == 1);
			break;
		}
		case 6 : {
			assert(":6a:", event.replaceLineCount == 1);
			assert(":6b:", event.newLineCount == 0);
			break;
		}
		case 8 : {
			assert(":8a:", event.replaceLineCount == 1);
			assert(":8b:", event.newLineCount == 0);
			break;
		}
		case 9 : {
			assert(":9a:", event.replaceLineCount == 1);
			assert(":9b:", event.newLineCount == 0);
			break;
		}
		case 10:{
			assert(":10:", false);
			break;
		}
		case 11: {
			assert(":11:", false);
			break;
		}
		case 12: {
			assert(":12a:", event.replaceLineCount == 0);
			assert(":12b:", event.newLineCount == 1);
			break;
		}
		case 13: {
			assert(":13a:", event.replaceLineCount == 0);
			assert(":13b:", event.newLineCount == 1);
			break;
		}
		case 14: {
			assert(":14:", false);
			break;
		}
		case 15: {
			assert(":15a:", event.replaceLineCount == 1);
			assert(":15b:", event.newLineCount == 2);
			break;
		}
		case 16:{
			assert(":16:", false);
			break;
		}
		case 17: {
			assert(":17:", false);
			break;
		}
		case 18: {
			assert(":18a:", event.replaceLineCount == 0);
			assert(":18b:", event.newLineCount == 2);
			break;
		}
		case 19: {
			assert(":19a:", event.replaceLineCount == 0);
			assert(":19b:", event.newLineCount == 3);
			break;
		}
		case 20: {
			assert(":20:", false);
			break;
		}
	}
}
public void test_Insert() {
	StyledTextContent content = getContentInstance();
	String newText;
	
	content.setText("This\nis a test\r");
	content.replaceTextRange(0, 0, "test\n ");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":1a:", newText.equals("test\n This\nis a test\r"));
	assert(":1b:", content.getLineCount() == 4);
	assert(":1c:", content.getLine(0).equals("test"));
	assert(":1d:", content.getLine(1).equals(" This"));
	assert(":1e:", content.getLine(2).equals("is a test"));
	assert(":1f:", content.getLine(3).equals(""));

	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 0, "*** ");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":2a:", newText.equals("This\n*** is a test\r"));
	assert(":2b:", content.getLineCount() == 3);
	assert(":2c:", content.getLine(0).equals("This"));
	assert(":2d:", content.getLine(1).equals("*** is a test"));
	assert(":2e:", content.getLine(2).equals(""));

	content.setText("Line 1\r\nLine 2");
	content.replaceTextRange(0, 0, "\r");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3a:", newText.equals("\rLine 1\r\nLine 2"));
	assert(":3b:", content.getLineCount() == 3);
	assert(":3c:", content.getLine(0).equals(""));
	assert(":3d:", content.getLine(1).equals("Line 1"));
	assert(":3e:", content.getLine(2).equals("Line 2"));
	content.replaceTextRange(9, 0, "\r");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3f:", newText.equals("\rLine 1\r\n\rLine 2"));
	assert(":3g:", content.getLineCount() == 4);
	assert(":3h:", content.getLine(0).equals(""));
	assert(":3i:", content.getLine(1).equals("Line 1"));
	assert(":3j:", content.getLine(2).equals(""));
	assert(":3k:", content.getLine(3).equals("Line 2"));

	content.setText("This\nis a test\r");
	content.replaceTextRange(0, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4a:", newText.equals("\nThis\nis a test\r"));
	assert(":4b:", content.getLineCount() == 4);
	assert(":4c:", content.getLine(0).equals(""));
	assert(":4d:", content.getLine(1).equals("This"));
	assert(":4e:", content.getLine(2).equals("is a test"));
	assert(":4f:", content.getLine(3).equals(""));
	
	content.setText("This\nis a test\r");
	content.replaceTextRange(7, 0, "\r\nnewLine");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":5a:", newText.equals("This\nis\r\nnewLine a test\r"));
	assert(":5b:", content.getLineCount() == 4);
	assert(":5c:", content.getLine(0).equals("This"));
	assert(":5d:", content.getLine(1).equals("is"));
	assert(":5e:", content.getLine(2).equals("newLine a test"));
	assert(":5f:", content.getLine(3).equals(""));

	content.setText("");
	content.replaceTextRange(0, 0, "This\nis\r\nnewLine a test\r");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6a:", newText.equals("This\nis\r\nnewLine a test\r"));
	assert(":6b:", content.getLineCount() == 4);
	assert(":6c:", content.getLine(0).equals("This"));
	assert(":6d:", content.getLine(1).equals("is"));
	assert(":6e:", content.getLine(2).equals("newLine a test"));
	assert(":6f:", content.getLine(3).equals(""));

	// insert at end
	content.setText("This");
	content.replaceTextRange(4, 0, "\n ");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":7a:", newText.equals("This\n "));
	assert(":7b:", content.getLineCount() == 2);
	assert(":7c:", content.getLine(0).equals("This"));
	assert(":7d:", content.getLine(1).equals(" "));
	content.setText("This\n");
	content.replaceTextRange(5, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":7e:", newText.equals("This\n\n"));
	assert(":7f:", content.getLineCount() == 3);
	assert(":7g:", content.getLine(0).equals("This"));
	assert(":7h:", content.getLine(1).equals(""));
	assert(":7i:", content.getLine(2).equals(""));

	// insert at beginning
	content.setText("This");
	content.replaceTextRange(0, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":8a:", newText.equals("\nThis"));
	assert(":8b:", content.getLineCount() == 2);
	assert(":8c:", content.getLine(0).equals(""));
	assert(":8d:", content.getLine(1).equals("This"));

	// insert text
	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 0, "*** ");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":9a:", newText.equals("This\n*** is a test\r"));
	assert(":9b:", content.getLineCount() == 3);
	assert(":9c:", content.getLine(0).equals("This"));
	assert(":9d:", content.getLine(1).equals("*** is a test"));
	assert(":9e:", content.getLine(2).equals(""));
	
	content.setText("This\n");
	content.replaceTextRange(5, 0, "line");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":10a:", newText.equals("This\nline"));
	assert(":10b:", content.getLineCount() == 2);
	assert(":10c:", content.getLine(0).equals("This"));
	assert(":10d:", content.getLine(1).equals("line"));
	assert(":10e:", content.getLineAtOffset(8) == 1);
	assert(":10f:", content.getLineAtOffset(9) == 1);

	// insert at beginning 
	content.setText("This\n");
	content.replaceTextRange(0, 0, "line\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":11a:", newText.equals("line\nThis\n"));
	assert(":11b:", content.getLineCount() == 3);
	assert(":11c:", content.getLine(0).equals("line"));
	assert(":11d:", content.getLine(1).equals("This"));
	assert(":11e:", content.getLineAtOffset(5) == 1);

	content.setText("Line 1\r\nLine 2\r\nLine 3");
	content.replaceTextRange(0, 0, "\r");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":12a:", newText.equals("\rLine 1\r\nLine 2\r\nLine 3"));
	assert(":12b:", content.getLineCount() == 4);
	assert(":12c:", content.getLine(0).equals(""));
	assert(":12d:", content.getLine(1).equals("Line 1"));
	assert(":12e:", content.getLine(2).equals("Line 2"));
	assert(":12f:", content.getLine(3).equals("Line 3"));

	content.setText("Line 1\nLine 2\nLine 3");
	content.replaceTextRange(7, 0, "Line1a\nLine1b\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":13a:", newText.equals("Line 1\nLine1a\nLine1b\nLine 2\nLine 3"));
	assert(":13b:", content.getLineCount() == 5);
	assert(":13c:", content.getLine(0).equals("Line 1"));
	assert(":13d:", content.getLine(1).equals("Line1a"));
	assert(":13e:", content.getLine(2).equals("Line1b"));
	assert(":13f:", content.getLine(3).equals("Line 2"));
	assert(":13g:", content.getLine(4).equals("Line 3"));

	content.setText("Line 1\nLine 2\nLine 3");
	content.replaceTextRange(11, 0, "l1a");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":14a:", newText.equals("Line 1\nLinel1a 2\nLine 3"));
	assert(":14b:", content.getLineCount() == 3);
	assert(":14c:", content.getLine(0).equals("Line 1"));
	assert(":14d:", content.getLine(1).equals("Linel1a 2"));
	assert(":14e:", content.getLine(2).equals("Line 3"));

	content.setText("Line 1\nLine 2 is a very long line that spans many words\nLine 3");
	content.replaceTextRange(19, 0, "very, very, ");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":15a:", newText.equals("Line 1\nLine 2 is a very, very, very long line that spans many words\nLine 3"));
	assert(":15b:", content.getLineCount() == 3);
	assert(":15c:", content.getLine(0).equals("Line 1"));
	assert(":15d:", content.getLine(1).equals("Line 2 is a very, very, very long line that spans many words"));
	assert(":15e:", content.getLine(2).equals("Line 3"));
}

public void test_Empty() {
	StyledTextContent content = getContentInstance();
	assert(":1a:", content.getLineCount() == 1);
	assert(":1b:", content.getLine(0).equals(""));

	content.setText("test");
	content.replaceTextRange(0,4,"");
	assert(":2a:", content.getLineCount() == 1);
	assert(":2b:", content.getLine(0).equals(""));
}
public void test_Line_Conversion() {
	StyledTextContent content = getContentInstance();
	
	content.setText("This\nis a test\rrepeat\nend\r");
	assert(":1a:", content.getLineCount() == 5);	
	assert(":1b:", content.getLine(0).equals("This"));
	assert(":1c:", content.getOffsetAtLine(0) == 0);	
	assert(":1d:", content.getLine(1).equals("is a test"));
	assert(":1e:", content.getLineAtOffset(4) == 0);
	assert(":1f:", content.getOffsetAtLine(1) == 5);	
	assert(":1g:", content.getLine(2).equals("repeat"));
	assert(":1h:", content.getOffsetAtLine(2) == 15);	
	assert(":1i:", content.getLine(3).equals("end"));
	assert(":1j:", content.getOffsetAtLine(3) == 22);
	assert(":1k:", content.getLine(4).equals(""));
	assert(":1l:", content.getOffsetAtLine(4) == 26);
	
	content.setText("This\r\nis a test");
	assert(":2a:", content.getLineCount() == 2);
	assert(":2b:", content.getLine(1).equals("is a test"));
	assert(":2c:", content.getLineAtOffset(4) == 0);
	assert(":2d:", content.getLineAtOffset(5) == 0);

	content.setText("This\r\nis a test\r");
	assert(":3a:", content.getLineCount() == 3);
	assert(":3b:", content.getLine(1).equals("is a test"));
	assert(":3c:", content.getLineAtOffset(15) == 1);
	
	content.setText("\r\n");
	assert(":4a:", content.getLineCount() == 2);
	assert(":4b:", content.getLine(0).equals(""));
	assert(":4c:", content.getLine(1).equals(""));
	assert(":4d:", content.getLineAtOffset(0) == 0);
	assert(":4e:", content.getLineAtOffset(1) == 0);
	assert(":4f:", content.getLineAtOffset(2) == 1);

	content.setText("\r\n\n\r\r\n");
	assert(":5a:", content.getLineCount() == 5);
	assert(":5b:", content.getLine(0).equals(""));
	assert(":5c:", content.getOffsetAtLine(0) == 0);	
	assert(":5d:", content.getLine(1).equals(""));
	assert(":5e:", content.getOffsetAtLine(1) == 2);	
	assert(":5f:", content.getLine(2).equals(""));
	assert(":5g:", content.getOffsetAtLine(2) == 3);	
	assert(":5h:", content.getLine(3).equals(""));
	assert(":5i:", content.getOffsetAtLine(3) == 4);
	assert(":5j:", content.getLine(4).equals(""));
	assert(":5k:", content.getOffsetAtLine(4) == 6);
	
	content.setText("test\r\rtest2\r\r");
	assert(":6a:", content.getLineCount() == 5);
	assert(":6b:", content.getLine(0).equals("test"));
	assert(":6c:", content.getOffsetAtLine(0) == 0);
	assert(":6d:", content.getLine(1).equals(""));
	assert(":6e:", content.getOffsetAtLine(1) == 5);	
	assert(":6f:", content.getLine(2).equals("test2"));
	assert(":6g:", content.getOffsetAtLine(2) == 6);	
	assert(":6h:", content.getLine(3).equals(""));
	assert(":6i:", content.getOffsetAtLine(3) == 12);
	assert(":6j:", content.getLine(4).equals(""));
	assert(":6k:", content.getOffsetAtLine(4) == 13);
}
public void test_Offset_To_Line() {
	StyledTextContent content = getContentInstance();
	
	content.setText("This\nis a test\rrepeat\nend\r");
	assert(":1a:", content.getLineAtOffset(0) == 0);
	assert(":1b:", content.getLineAtOffset(3) == 0);
	assert(":1c:", content.getLineAtOffset(4) == 0);
	assert(":1d:", content.getLineAtOffset(25) == 3);
	assert(":1e:", content.getLineAtOffset(26) == 4);
	
	content.setText("This\r\nis a test");
	assert(":2a:", content.getLineAtOffset(5) == 0);
	assert(":2b:", content.getLineAtOffset(6) == 1);
	assert(":2c:", content.getLineAtOffset(10) == 1);
	
	content.setText("\r\n");
	assert(":3a:", content.getLineAtOffset(0) == 0);
	assert(":3b:", content.getLineAtOffset(1) == 0);
	assert(":3c:", content.getLineAtOffset(2) == 1);

	content.setText("\r\n\n\r\r\n");
	assert(":4a:", content.getLineAtOffset(0) == 0);
	assert(":4b:", content.getLineAtOffset(1) == 0);
	assert(":4c:", content.getLineAtOffset(2) == 1);
	assert(":4d:", content.getLineAtOffset(3) == 2);
	assert(":4e:", content.getLineAtOffset(4) == 3);
	assert(":4f:", content.getLineAtOffset(5) == 3);
	assert(":4g:", content.getLineAtOffset(6) == 4);

	content.setText("\r\n\r\n");
	assert(":5a:", content.getLineAtOffset(0) == 0);
	assert(":5b:", content.getLineAtOffset(1) == 0);
	assert(":5c:", content.getLineAtOffset(2) == 1);
	assert(":5d:", content.getLineAtOffset(3) == 1);
	assert(":5e:", content.getLineAtOffset(4) == 2);

	content.setText("\r\r\r\n\r\n");
	assert(":6a:", content.getLineAtOffset(0) == 0);
	assert(":6b:", content.getLineAtOffset(1) == 1);
	assert(":6c:", content.getLineAtOffset(2) == 2);
	assert(":6d:", content.getLineAtOffset(4) == 3);
	
	content.setText("");
	assert(":7a:", content.getLineAtOffset(0) == 0);
	
	content = getContentInstance();
	assert(":8a:", content.getLineAtOffset(0) == 0);	
}

public void test_Line_To_Offset() {
	StyledTextContent content = getContentInstance();
	
	content.setText("This\nis a test\rrepeat\nend\r");
	assert(":1a:", content.getOffsetAtLine(0) == 0);
	assert(":1b:", content.getOffsetAtLine(1) == 5);
	assert(":1c:", content.getOffsetAtLine(2) == 15);
	assert(":1d:", content.getOffsetAtLine(3) == 22);
	assert(":1e:", content.getOffsetAtLine(4) == 26);
	
	content.setText("This\r\nis a test");
	assert(":2a:", content.getOffsetAtLine(0) == 0);
	assert(":2b:", content.getOffsetAtLine(1) == 6);
	
	content.setText("\r\n");
	assert(":3a:", content.getOffsetAtLine(0) == 0);
	assert(":3b:", content.getOffsetAtLine(1) == 2);

	content.setText("\r\n\n\r\r\n");
	assert(":4a:", content.getOffsetAtLine(0) == 0);
	assert(":4b:", content.getOffsetAtLine(1) == 2);
	assert(":4c:", content.getOffsetAtLine(2) == 3);
	assert(":4d:", content.getOffsetAtLine(3) == 4);
	assert(":4e:", content.getOffsetAtLine(4) == 6);

	content.setText("\r\ntest\r\n");
	assert(":5a:", content.getOffsetAtLine(0) == 0);
	assert(":5b:", content.getOffsetAtLine(1) == 2);
	assert(":5c:", content.getOffsetAtLine(2) == 8);
}

public void test_Delete() {
	StyledTextContent content = getContentInstance();
	String newText;
	
	content.setText("This\nis a test\r");
	content.replaceTextRange(6, 2, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":1a:", newText.equals("This\nia test\r"));
	assert(":1b:", content.getLine(0).equals("This"));
	assert(":1c:", content.getLine(1).equals("ia test"));
	
	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 9, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":2a:", newText.equals("This\n\r"));
	assert(":2b:",content.getLineCount() == 3);
	assert(":2c:", content.getLine(0).equals("This"));
	assert(":2d:", content.getLine(1).equals(""));
	assert(":2e:", content.getLine(2).equals(""));
	
	content.setText("This\nis a test\nline 3\nline 4");
	content.replaceTextRange(21, 7, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3a:", newText.equals("This\nis a test\nline 3"));
	assert(":3b:", content.getLineCount() == 3);
	assert(":3c:", content.getLine(0).equals("This"));
	assert(":3d:", content.getLine(1).equals("is a test"));
	assert(":3e:", content.getLine(2).equals("line 3"));
	
	content.setText("This\nis a test\nline 3\nline 4");
	content.replaceTextRange(0, 5, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4a:", newText.equals("is a test\nline 3\nline 4"));
	assert(":4b:", content.getLineCount() == 3);
	assert(":4c:", content.getLine(0).equals("is a test"));
	assert(":4d:", content.getLine(1).equals("line 3"));
	assert(":4e:", content.getLine(2).equals("line 4"));
	content.replaceTextRange(16, 7, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4f:", newText.equals("is a test\nline 3"));
	assert(":4g:", content.getLine(0).equals("is a test"));
	assert(":4h:", content.getLine(1).equals("line 3"));
	content.replaceTextRange(9, 7, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4i:", newText.equals("is a test"));
	assert(":4j:", content.getLine(0).equals("is a test"));
	content.replaceTextRange(1, 8, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4k:", newText.equals("i"));
	assert(":4l:", content.getLine(0).equals("i"));
	content.replaceTextRange(0, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4m:", newText.equals(""));
	assert(":4n:", content.getLine(0).equals(""));

	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 9, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":5a:", newText.equals("This\n\r"));
	assert(":5b:",content.getLineCount() == 3);
	assert(":5c:", content.getLine(0).equals("This"));
	assert(":5d:", content.getLine(1).equals(""));
	assert(":5e:", content.getLine(2).equals(""));

	content.setText("L1\r\nL2\r\nL3\r\nL4\r\n");
	content.replaceTextRange(4, 8, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6a:", newText.equals("L1\r\nL4\r\n"));
	assert(":6b:",content.getLineCount() == 3);
	assert(":6c:", content.getLine(0).equals("L1"));
	assert(":6d:", content.getLine(1).equals("L4"));
	assert(":6e:", content.getLine(2).equals(""));

	content.setText("\nL1\r\nL2");
	content.replaceTextRange(0, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":7a:", newText.equals("L1\r\nL2"));
	assert(":7b:",content.getLineCount() == 2);
	assert(":7c:", content.getLine(0).equals("L1"));
	assert(":7d:", content.getLine(1).equals("L2"));

	content.setText("\nL1\r\nL2\r\n");
	content.replaceTextRange(7, 2, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":8a:", newText.equals("\nL1\r\nL2"));
	assert(":8b:",content.getLineCount() == 3);
	assert(":8c:", content.getLine(0).equals(""));
	assert(":8d:", content.getLine(1).equals("L1"));
	assert(":8e:", content.getLine(2).equals("L2"));

	content.setText("\nLine 1\nLine 2\n");
	content.replaceTextRange(0, 7, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":9a:", newText.equals("\nLine 2\n"));
	assert(":9b:", content.getLineCount() == 3);
	assert(":9c:", content.getLine(0).equals(""));
	assert(":9d:", content.getLine(1).equals("Line 2"));
	assert(":9e:", content.getLine(2).equals(""));

	content.setText("Line 1\nLine 2\n");
	content.replaceTextRange(6, 8, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":10a:", newText.equals("Line 1"));
	assert(":10b:", content.getLineCount() == 1);
	assert(":10c:", content.getLine(0).equals("Line 1"));

	content.setText("Line one is short\r\nLine 2 is a longer line\r\nLine 3\n");
	content.replaceTextRange(12, 17, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":11a:", newText.equals("Line one is a longer line\r\nLine 3\n"));
	assert(":11b:", content.getLineCount() == 3);
	assert(":11c:", content.getLine(0).equals("Line one is a longer line"));
	assert(":11d:", content.getLine(1).equals("Line 3"));
	assert(":11e:", content.getLine(2).equals(""));

}
public void test_Replace() {
	StyledTextContent content = getContentInstance();
	String newText;
	
	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 4, "a");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":1a:", newText.equals("This\na test\r"));
	assert(":1b:",content.getLineCount() == 3);
	assert(":1c:", content.getLine(0).equals("This"));
	assert(":1d:", content.getLine(1).equals("a test"));
	assert(":1e:", content.getLine(2).equals(""));

	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 2, "was");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":2a:", newText.equals("This\nwas a test\r"));
	assert(":2b:",content.getLineCount() == 3);
	assert(":2c:", content.getLine(0).equals("This"));
	assert(":2d:", content.getLine(1).equals("was a test"));
	assert(":2e:", content.getLine(2).equals(""));

	content.setText("This is a test\r");
	content.replaceTextRange(5, 2, "was");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3a:", newText.equals("This was a test\r"));
	assert(":3b:",content.getLineCount() == 2);
	assert(":3c:", content.getLine(0).equals("This was a test"));
	assert(":3d:", content.getLineAtOffset(15) == 0);
	
	content.setText("Line 1\nLine 2\nLine 3");
	content.replaceTextRange(0, 7, "La\nLb\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4a:", newText.equals("La\nLb\nLine 2\nLine 3"));
	assert(":4b:", content.getLine(0).equals("La"));
	assert(":4c:", content.getLine(1).equals("Lb"));
	assert(":4d:", content.getLine(2).equals("Line 2"));
	assert(":4e:", content.getLine(3).equals("Line 3"));

	content.setText(getTestText());
	newText = content.getTextRange(0, content.getCharCount());
	int start = content.getOffsetAtLine(6);
	int end = content.getOffsetAtLine(11);
	content.replaceTextRange(start, end - start, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":5a:", content.getLineCount() == 12);
	assert(":5a:", content.getLine(5).equals(""));
	assert(":5a:", content.getLine(6).equals(""));
	start = content.getOffsetAtLine(7);
	content.replaceTextRange(start, content.getCharCount() - start, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":5a:", content.getLineCount() == 8);
	assert(":5a:", content.getLine(5).equals(""));
	assert(":5a:", content.getLine(6).equals(""));
	assert(":5a:", content.getLine(7).equals(""));

}
public void test_Special_Cases() {
	String newText;
	StyledTextContent content = getContentInstance();
	assert(":0a:", content.getLineCount() == 1);
	assert(":0b:", content.getOffsetAtLine(0) == 0);
	
	content.setText("This is the input/output text component.");
	content.replaceTextRange(0, 0, "\n");
	assert(":1a:", content.getLine(0).equals(""));
	content.replaceTextRange(1, 0, "\n");
	assert(":1b:",content.getLine(0).equals(""));
	content.replaceTextRange(2, 0, "\n");
	assert(":1c:",content.getLine(0).equals(""));
	content.replaceTextRange(3, 0, "\n");
	assert(":1d:",content.getLine(0).equals(""));
	content.replaceTextRange(4, 0, "\n");
	assert(":1e:",content.getLine(0).equals(""));
	content.replaceTextRange(5, 0, "\n");
	assert(":1f:",content.getLine(0).equals(""));
	content.replaceTextRange(6, 0, "\n");
	assert(":1g:",content.getLine(0).equals(""));
	content.replaceTextRange(7, 0, "\n");
	assert(":1h:",content.getLine(0).equals(""));

	content.setText("This is the input/output text component.");
	content.replaceTextRange(0, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":2a:", newText.equals("\nThis is the input/output text component."));
	assert(":2b:", content.getLine(0).equals(""));
	assert(":2c:", content.getLine(1).equals("This is the input/output text component."));
	content.replaceTextRange(1, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":2d:", newText.equals("\n\nThis is the input/output text component."));
	assert(":2e:", content.getLine(0).equals(""));
	assert(":2f:", content.getLine(1).equals(""));
	assert(":2g:", content.getLine(2).equals("This is the input/output text component."));

	content.replaceTextRange(2, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3a:", newText.equals("\n\n\nThis is the input/output text component."));
	assert(":3b:", content.getLine(0).equals(""));
	assert(":3c:", content.getLine(1).equals(""));
	assert(":3d:", content.getLine(2).equals(""));
	assert(":3e:", content.getLine(3).equals("This is the input/output text component."));
	content.replaceTextRange(3, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3f:", newText.equals("\n\n\n\nThis is the input/output text component."));
	assert(":3g:", content.getLine(0).equals(""));
	assert(":3h:", content.getLine(1).equals(""));
	assert(":3i:", content.getLine(2).equals(""));
	assert(":3j:", content.getLine(3).equals(""));
	assert(":3k:", content.getLine(4).equals("This is the input/output text component."));

	content.replaceTextRange(3, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4a:", newText.equals("\n\n\nThis is the input/output text component."));
	assert(":4b:", content.getLine(0).equals(""));
	assert(":4c:", content.getLine(1).equals(""));
	assert(":4d:", content.getLine(2).equals(""));
	assert(":4e:", content.getLine(3).equals("This is the input/output text component."));
	content.replaceTextRange(2, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":4f:", newText.equals("\n\nThis is the input/output text component."));
	assert(":4g:", content.getLine(0).equals(""));
	assert(":4h:", content.getLine(1).equals(""));
	assert(":4i:", content.getLine(2).equals("This is the input/output text component."));

	content.replaceTextRange(2, 0, "a");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":5a:", newText.equals("\n\naThis is the input/output text component."));
	assert(":5b:", content.getLine(0).equals(""));
	assert(":5c:", content.getLine(1).equals(""));
	assert(":5d:", content.getLine(2).equals("aThis is the input/output text component."));

	content.setText("abc\r\ndef");
	content.replaceTextRange(1, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6a:", newText.equals("ac\r\ndef"));
	assert(":6b:", content.getLineCount() == 2);
	assert(":6c:", content.getLine(0).equals("ac"));
	assert(":6d:", content.getLine(1).equals("def"));
	content.replaceTextRange(1, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6e:", newText.equals("a\r\ndef"));
	assert(":6f:", content.getLineCount() == 2);
	assert(":6g:", content.getLine(0).equals("a"));
	assert(":6h:", content.getLine(1).equals("def"));
	content.replaceTextRange(1, 2, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6i:", newText.equals("adef"));
	assert(":6j:", content.getLineCount() == 1);
	assert(":6k:", content.getLine(0).equals("adef"));
	content.replaceTextRange(1, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6l:", newText.equals("aef"));
	assert(":6m:", content.getLineCount() == 1);
	assert(":6n:", content.getLine(0).equals("aef"));
	content.replaceTextRange(1, 1, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":6o:", newText.equals("af"));
	assert(":6p:", content.getLineCount() == 1);
	assert(":6q:", content.getLine(0).equals("af"));

	content.setText("abc");
	content.replaceTextRange(0, 1, "1");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":7a:", content.getLineCount() == 1);
	assert(":7b:", newText.equals("1bc"));
	assert(":7c:", content.getLine(0).equals("1bc"));
	content.replaceTextRange(0, 0, "\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":7d:", newText.equals("\n1bc"));
	assert(":7e:", content.getLineCount() == 2);
	assert(":7f:", content.getLine(0).equals(""));
	assert(":7g:", content.getLine(1).equals("1bc"));
	
	content = getContentInstance();
	content.replaceTextRange(0,0,"a");
	
	content.setText("package test;\n/* Line 1\n * Line 2\n */\npublic class SimpleClass {\n}");
	content.replaceTextRange(14, 23, "\t/*Line 1\n\t * Line 2\n\t */");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":8a:", newText.equals("package test;\n\t/*Line 1\n\t * Line 2\n\t */\npublic class SimpleClass {\n}"));
	assert(":8b:", content.getLineCount() == 6);
	assert(":8c:", content.getLine(0).equals("package test;"));
	assert(":8d:", content.getLine(1).equals("\t/*Line 1"));
	assert(":8e:", content.getLine(2).equals("\t * Line 2"));
	assert(":8f:", content.getLine(3).equals("\t */"));
	assert(":8g:", content.getLine(4).equals("public class SimpleClass {"));
	assert(":8h:", content.getLine(5).equals("}"));
}
public void test_Text_Changed_Event() {
	StyledTextContent content = getContentInstance();
	content.addTextChangeListener(this);
	verify = 1;
	content.setText("testing");
	content.replaceTextRange(0, 0, "\n");

	verify = 2;
	content.setText("\n\n");
	content.replaceTextRange(0, 2, "a");

	verify = 3;
	content.setText("a");
	content.replaceTextRange(0, 1, "\n\n");

	verify = 5;
	content.setText("Line 1\r\nLine 2");
	content.replaceTextRange(0, 0, "\r");

	verify = 6;
	content.setText("This\nis a test\nline 3\nline 4");
	content.replaceTextRange(21, 7, "");

	verify = 7;
	content.setText("This\nis a test\r");
	content.replaceTextRange(5, 9, "");

	verify = 8;
	content.setText("\nL1\r\nL2\r\n");
	content.replaceTextRange(7, 2, "");

	verify = 9;
	content.setText("L1\r\n");
	content.replaceTextRange(2, 2, "test");

	verify = 12;
	content.setText("L1\r");
	content.replaceTextRange(3, 0, "\n");

	verify = 13;
	content.setText("L1\n");
	content.replaceTextRange(2, 0, "\r");

	verify = 15;
	content.setText("L1\r\n");
	content.replaceTextRange(2, 2, "test\n\n");

	verify = 18;
 	content.setText("L1\r");
	content.replaceTextRange(3, 0, "\ntest\r\n");

	verify = 19;
	content.setText("L1\n");
	content.replaceTextRange(2, 0, "test\r\r\r");

	verify = 0;
	content.removeTextChangeListener(this);
}
public void test_Delimiter_Special_Cases() {
	StyledTextContent content = getContentInstance();
	String newText;
	
	content.setText("\nL1\r\nL2\r\n");
	content.replaceTextRange(7, 2, "");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":1:", newText.equals("\nL1\r\nL2"));
	
	content.setText("L1\r\n");
	content.replaceTextRange(2, 2, "test\n\n");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":2:", newText.equals("L1test\n\n"));

	content.setText("L1\n");
	content.replaceTextRange(2, 0, "test\r\r\r");
	newText = content.getTextRange(0, content.getCharCount());
	assert(":3:", newText.equals("L1test\r\r\r\n"));

}
protected void setUp()  {
	// create shell
	shell = new Shell ();
	GridLayout layout = new GridLayout();
	layout.numColumns = 1;
	shell.setSize(500, 300);
	shell.setLayout(layout);
	// create widget
	widget = new StyledText (shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
	GridData spec = new GridData();
	spec.horizontalAlignment = spec.FILL;
	spec.grabExcessHorizontalSpace = true;
	spec.verticalAlignment = spec.FILL;
	spec.grabExcessVerticalSpace = true;
	widget.setLayoutData(spec);
	shell.open ();
}
protected void tearDown()  {
	if (shell != null && !shell.isDisposed ()) 
		shell.dispose ();
	shell = null;

}


}
