/******************************************************************************
* Copyright (C) 2013 Fabio Zadrozny
*
* 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:
* Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation
******************************************************************************/
package org.python.pydev.shared_core.auto_edit;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TypedPosition;
import org.eclipse.jface.text.rules.FastPartitioner;
import org.eclipse.jface.text.rules.IPartitionTokenScanner;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.python.pydev.shared_core.partitioner.PartitionCodeReader;
import org.python.pydev.shared_core.string.FastStringBuffer;
import org.python.pydev.shared_core.testutils.TestUtils;
public class PartitionCodeReaderTest extends TestCase {
public void testPartitionCodeReader() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("aaaa bbbb");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(0, 4, "cat1"));
document.addPosition(category, new TypedPosition(4, 5, IDocument.DEFAULT_CONTENT_TYPE));
reader.configureForwardReader(document, 0, document.getLength() - 1);
List<Character> found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected(" ", "b", "b", "b"), TestUtils.listToExpected(found));
reader.configureBackwardReader(document, document.getLength());
found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected("b", "b", "b", "b", " "), TestUtils.listToExpected(found));
}
public void testPartitionCodeReader2() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader("cat1");
Document document = new Document("aaaa bbbb ccc");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(3, 3, "cat1"));
document.addPosition(category, new TypedPosition(8, 3, "cat1"));
reader.configureForwardReader(document, 0, document.getLength() - 1);
List<Character> found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected("a", " ", "b", "b", " ", "c"), TestUtils.listToExpected(found));
reader.configureBackwardReader(document, document.getLength());
found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected("c", " ", "b", "b", " ", "a"), TestUtils.listToExpected(found));
}
public void testPartitionCodeReaderBoundaries() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader("cat1");
Document document = new Document("aaaa bbbb ccc");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(3, 3, "cat1"));
document.addPosition(category, new TypedPosition(8, 3, "cat1"));
reader.configureForwardReader(document, 4, 6);
List<Character> found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected(" ", "b"), TestUtils.listToExpected(found));
reader.configureBackwardReader(document, 5);
found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected("b", " ", "a"), TestUtils.listToExpected(found));
}
public void testPartitionCodeReaderKeepingPositions() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(1, 1, "cat1")); //skip b
document.addPosition(category, new TypedPosition(3, 1, "cat1")); //skip d
reader.configureForwardReader(document, 3, document.getLength(), true);
FastStringBuffer buf = new FastStringBuffer(document.getLength());
readAll(reader, buf);
assertEquals("e", buf.toString());
reader.configureForwardReaderKeepingPositions(2, document.getLength());
buf.clear();
readAll(reader, buf);
assertEquals("ce", buf.toString());
reader.configureForwardReaderKeepingPositions(0, document.getLength());
buf.clear();
readAll(reader, buf);
assertEquals("ace", buf.toString());
}
public void testPartitionCodeReaderUnread() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader("cat1");
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(1, 1, "cat1")); //skip b
document.addPosition(category, new TypedPosition(3, 1, "cat1")); //skip d
reader.configureForwardReader(document, 0, document.getLength(), true);
assertEquals('b', reader.read());
reader.unread();
assertEquals('b', reader.read());
reader.unread();
assertEquals('b', reader.read());
assertEquals('d', reader.read());
assertEquals(-1, reader.read());
reader.unread();
assertEquals(-1, reader.read());
reader.unread();
assertEquals(-1, reader.read());
reader.unread();
reader.unread();
assertEquals('d', reader.read());
for (int i = 0; i < 5; i++) {
reader.read(); //read past EOF (but should actually stay at EOF)
}
reader.unread();
assertEquals(-1, reader.read());
reader.unread();
reader.unread();
assertEquals('d', reader.read());
for (int i = 0; i < 5; i++) {
reader.unread(); //unread to the beggining
}
FastStringBuffer buf = new FastStringBuffer(document.getLength());
readAll(reader, buf);
reader.unread(); //EOF
reader.unread(); //d
reader.unread(); //b
readAll(reader, buf);
assertEquals("bdbd", buf.toString());
reader.configureForwardReaderKeepingPositions(1, document.getLength());
buf.clear();
readAll(reader, buf);
reader.unread(); //EOF
reader.unread(); //d
reader.unread(); //b
readAll(reader, buf);
assertEquals("bdbd", buf.toString());
reader.configureForwardReaderKeepingPositions(2, document.getLength());
buf.clear();
readAll(reader, buf);
reader.unread(); //EOF
reader.unread(); //d
reader.unread(); //b
readAll(reader, buf);
assertEquals("dd", buf.toString());
}
public void testPartitionCodeReaderUnread2() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(1, 1, "cat1")); //skip b
document.addPosition(category, new TypedPosition(3, 1, "cat1")); //skip d
reader.configureForwardReader(document, 0, document.getLength());
FastStringBuffer buf = new FastStringBuffer(document.getLength());
readAll(reader, buf);
reader.unread(); //EOF
reader.unread(); //e
reader.unread(); //c
readAll(reader, buf);
reader.unread(); //EOF
reader.unread(); //e
reader.unread(); //c
reader.unread(); //a
readAll(reader, buf);
reader.unread(); //EOF
assertEquals(-1, reader.read());
reader.unread(); //EOF
reader.unread(); //e
readAll(reader, buf);
assertEquals("aceceacee", buf.toString());
}
public void testPartitionCodeReaderMark() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(1, 1, "cat1")); //skip b
document.addPosition(category, new TypedPosition(3, 1, "cat1")); //skip d
reader.configureForwardReader(document, 0, document.getLength());
int mark = reader.getMark();
assertEquals(0, mark);
assertEquals(reader.read(), 'a');
int mark2 = reader.getMark();
assertEquals(1, mark2);
assertEquals(reader.read(), 'c');
int mark3 = reader.getMark();
assertEquals(3, mark3);
assertEquals(reader.read(), 'e');
int mark4 = reader.getMark();
assertEquals(5, mark4);
assertEquals(reader.read(), -1);
reader.setMark(mark);
assertEquals(reader.read(), 'a');
assertEquals(reader.read(), 'c');
assertEquals(reader.read(), 'e');
assertEquals(reader.read(), -1);
reader.setMark(mark2);
assertEquals(reader.read(), 'c');
assertEquals(reader.read(), 'e');
assertEquals(reader.read(), -1);
reader.setMark(mark3);
assertEquals(reader.read(), 'e');
assertEquals(reader.read(), -1);
reader.setMark(mark4);
assertEquals(reader.read(), -1);
}
public void testPartitionCodeReaderMarkBackwards() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(1, 1, "cat1")); //skip b
document.addPosition(category, new TypedPosition(3, 1, "cat1")); //skip d
reader.configureBackwardReader(document, document.getLength());
int mark = reader.getMark();
assertEquals(5, mark);
assertEquals(reader.read(), 'e');
int mark2 = reader.getMark();
assertEquals(3, mark2);
assertEquals(reader.read(), 'c');
int mark3 = reader.getMark();
assertEquals(1, mark3);
assertEquals(reader.read(), 'a');
int mark4 = reader.getMark();
assertEquals(-1, mark4);
assertEquals(reader.read(), -1);
reader.setMark(mark);
assertEquals(reader.read(), 'e');
assertEquals(reader.read(), 'c');
assertEquals(reader.read(), 'a');
assertEquals(reader.read(), -1);
reader.setMark(mark2);
assertEquals(reader.read(), 'c');
assertEquals(reader.read(), 'a');
assertEquals(reader.read(), -1);
reader.setMark(mark3);
assertEquals(reader.read(), 'a');
assertEquals(reader.read(), -1);
reader.setMark(mark4);
assertEquals(reader.read(), -1);
}
public void testPartitionCodeReaderMark2() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(0, 1, "cat1")); //skip a
document.addPosition(category, new TypedPosition(2, 1, "cat1")); //skip c
document.addPosition(category, new TypedPosition(4, 1, "cat1")); //skip e
reader.configureForwardReader(document, 0, document.getLength());
int mark = reader.getMark();
assertEquals(reader.read(), 'b');
int mark2 = reader.getMark();
assertEquals(reader.read(), 'd');
int mark3 = reader.getMark();
assertEquals(reader.read(), -1);
reader.setMark(mark);
assertEquals(reader.read(), 'b');
assertEquals(reader.read(), 'd');
assertEquals(reader.read(), -1);
reader.setMark(mark2);
assertEquals(reader.read(), 'd');
assertEquals(reader.read(), -1);
reader.setMark(mark3);
assertEquals(reader.read(), -1);
}
public void testPartitionCodeReaderMarkBackwards2() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader(IDocument.DEFAULT_CONTENT_TYPE);
Document document = new Document("abcde");
String category = setupDocument(document);
document.addPosition(category, new TypedPosition(0, 1, "cat1")); //skip a
document.addPosition(category, new TypedPosition(2, 1, "cat1")); //skip c
document.addPosition(category, new TypedPosition(4, 1, "cat1")); //skip e
reader.configureBackwardReader(document, document.getLength());
int mark = reader.getMark();
assertEquals(reader.read(), 'd');
int mark2 = reader.getMark();
assertEquals(reader.read(), 'b');
int mark3 = reader.getMark();
assertEquals(reader.read(), -1);
reader.setMark(mark);
assertEquals(reader.read(), 'd');
assertEquals(reader.read(), 'b');
assertEquals(reader.read(), -1);
reader.setMark(mark2);
assertEquals(reader.read(), 'b');
assertEquals(reader.read(), -1);
reader.setMark(mark3);
assertEquals(reader.read(), -1);
}
private void readAll(PartitionCodeReader reader, FastStringBuffer buf) {
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
buf.append((char) read);
}
}
public void testPartitionCodeReaderEmpty() throws Exception {
PartitionCodeReader reader = new PartitionCodeReader("cat1");
Document document = new Document("aaaa bbbb ccc");
String category = setupDocument(document);
reader.configureForwardReader(document, 4, 6);
List<Character> found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected(), TestUtils.listToExpected(found));
reader.configureBackwardReader(document, 5);
found = new ArrayList<Character>();
while (true) {
int read = reader.read();
if (read == PartitionCodeReader.EOF) {
break;
}
found.add((char) read);
}
assertEquals(TestUtils.listToExpected(), TestUtils.listToExpected(found));
}
public String setupDocument(Document document) {
IPartitionTokenScanner scanner = new RuleBasedPartitionScanner();
FastPartitioner partitioner = new FastPartitioner(scanner, new String[] { IDocument.DEFAULT_CONTENT_TYPE });
String[] managingPositionCategories = partitioner.getManagingPositionCategories();
String category = managingPositionCategories[0];
document.setDocumentPartitioner(partitioner);
document.addPositionCategory(category);
return category;
}
}