blob: 859f2ab77f6e521fc569e1ff377f80a6cd86810f [file] [log] [blame]
package com.intellij.openapi.editor.impl;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Conditions;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.tree.IElementType;
import gnu.trove.Equality;
import junit.framework.TestCase;
public class RangeIteratorTest extends TestCase {
private static final Equality ALL_EQUAL = new DummyEquality(true);
private static final Equality ALL_DIFFERENT = new DummyEquality(false);
private static final RangeIterator.Gaps NO_GAPS = new RangeIterator.Gaps() {
@Override
public boolean isGapAt(int offset) {
return false;
}
};
private static final RangeIterator.Gaps MY_GAPS = new RangeIterator.Gaps() {
@Override
public boolean isGapAt(int offset) {
return 3 <= offset && offset < 6;
}
};
private static final Condition<TextAttributes> ANY = Conditions.alwaysTrue();
public void testExpanded() {
RangeIterator iterator = createIterator(ALL_EQUAL, NO_GAPS);
checkPosition(iterator, 2, 4);
iterator.advance();
checkPosition(iterator, 5, 9);
assertTrue(iterator.atEnd());
}
public void testCollapsed() {
RangeIterator iterator = createIterator(ALL_EQUAL, MY_GAPS);
checkPosition(iterator, 2, 3);
iterator.advance();
checkPosition(iterator, 6, 9);
assertTrue(iterator.atEnd());
}
public void testDifferentExpanded() {
RangeIterator iterator = createIterator(ALL_DIFFERENT, NO_GAPS);
checkPosition(iterator, 2, 4);
iterator.advance();
checkPosition(iterator, 5, 7);
assertFalse(iterator.atEnd());
iterator.advance();
checkPosition(iterator, 7, 9);
assertTrue(iterator.atEnd());
}
public void testEndInFolding() {
RangeIterator iterator = createIterator(ALL_EQUAL, new int[]{1}, new int[]{5}, MY_GAPS);
checkPosition(iterator, 1, 3);
assertTrue(iterator.atEnd());
}
public void testDividedByFolding() {
RangeIterator iterator = createIterator(ALL_EQUAL, new int[]{1}, new int[]{9}, MY_GAPS);
checkPosition(iterator, 1, 3);
iterator.advance();
checkPosition(iterator, 6, 9);
assertTrue(iterator.atEnd());
}
public void testAllFolded() {
RangeIterator iterator = new RangeIterator(MY_GAPS, ALL_EQUAL,
new MyHighlighterIterator(new int[]{4}, new int[]{5}), ANY);
iterator.init(new TextRange(0, Integer.MAX_VALUE));
assertTrue(iterator.atEnd());
}
private void checkPosition(RangeIterator iterator, int start, int end) {
assertEquals(start, iterator.getStart());
assertEquals(end, iterator.getEnd());
}
private RangeIterator createIterator(Equality equality, RangeIterator.Gaps gaps) {
return createIterator(equality, new int[]{2, 5, 7}, new int[]{4, 7, 9}, gaps);
}
private RangeIterator createIterator(Equality equality, int[] starts, int[] ends, RangeIterator.Gaps gaps) {
RangeIterator iterator = new RangeIterator(gaps, equality,
new MyHighlighterIterator(starts, ends), ANY);
iterator.init(new TextRange(0, Integer.MAX_VALUE));
iterator.advance();
return iterator;
}
private static class MyHighlighterIterator implements HighlighterIterator {
private final int[] myStarts;
private final int[] myEnds;
private int myIndex = 0;
public MyHighlighterIterator(int[] starts, int[] ends) {
myStarts = starts;
myEnds = ends;
}
@Override
public TextAttributes getTextAttributes() {
return null;
}
@Override
public IElementType getTokenType() {
throw new UnsupportedOperationException();
}
@Override
public void advance() {
myIndex++;
}
@Override
public int getEnd() {
return myEnds[myIndex];
}
@Override
public int getStart() {
return myStarts[myIndex];
}
@Override
public boolean atEnd() {
return myIndex == myStarts.length;
}
@Override
public Document getDocument() {
throw new UnsupportedOperationException();
}
@Override
public void retreat() {
throw new UnsupportedOperationException();
}
}
private static class DummyEquality implements Equality {
private final boolean myResult;
public DummyEquality(boolean result) {
myResult = result;
}
@Override
public boolean equals(Object o1, Object o2) {
return myResult;
}
}
}