/*******************************************************************************
* Copyright (c) 2005, 2008 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.ui.workbench.texteditor.tests.revisions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.eclipse.jface.internal.text.revisions.LineIndexOutOfBoundsException;
import org.eclipse.jface.internal.text.revisions.Range;
import org.eclipse.jface.text.source.LineRange;
public class RangeTest {
@Test
public void testLegalOperations() {
Range r= Range.createRelative(0, 1);
assertEquals(0, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r= Range.createAbsolute(5, 6);
assertEquals(5, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r= Range.copy(new LineRange(5, 1));
assertEquals(5, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r= Range.createRelative(5, 1);
assertEquals(5, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r.moveBy(10);
assertEquals(15, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r.moveBy(-8);
assertEquals(7, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r.moveTo(12);
assertEquals(12, r.start());
assertEquals(1, r.length());
assertConsistency(r);
r.resizeBy(4);
assertEquals(12, r.start());
assertEquals(5, r.length());
assertConsistency(r);
r.resizeAndMoveBy(3);
assertEquals(15, r.start());
assertEquals(2, r.length());
assertConsistency(r);
r.resizeAndMoveBy(-3);
assertEquals(12, r.start());
assertEquals(5, r.length());
assertConsistency(r);
r.setLength(3);
assertEquals(12, r.start());
assertEquals(3, r.length());
assertConsistency(r);
r.resizeBy(13);
assertEquals(12, r.start());
assertEquals(16, r.length());
assertConsistency(r);
r.resizeBy(-4);
assertEquals(12, r.start());
assertEquals(12, r.length());
assertConsistency(r);
r.setEnd(18);
assertEquals(12, r.start());
assertEquals(6, r.length());
assertConsistency(r);
r.moveEndTo(13);
assertEquals(7, r.start());
assertEquals(6, r.length());
assertConsistency(r);
r.setLengthAndMove(3);
assertEquals(10, r.start());
assertEquals(3, r.length());
assertConsistency(r);
r.setStart(7);
assertEquals(7, r.start());
assertEquals(6, r.length());
assertConsistency(r);
}
@Test
public void testSplit() throws Exception {
Range r= Range.createRelative(12, 18);
Range second= r.split(8);
assertEquals(12, r.start());
assertEquals(8, r.length());
assertConsistency(r);
assertEquals(20, second.start());
assertEquals(10, second.length());
assertConsistency(second);
}
@Test
public void testIllegalOperations() throws Exception {
try {
Range.copy(null);
fail();
} catch (NullPointerException e) {
}
try {
Range.createRelative(0, 0);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createRelative(0, -1);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createRelative(-1, 0);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createRelative(-1, -1);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(0, 0);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(0, -1);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(-1, 0);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(-1, 12);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(10, 10);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(12, 10);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
try {
Range.createAbsolute(12, -3);
fail();
} catch (LineIndexOutOfBoundsException e) {
}
Range r= Range.createRelative(5, 10);
try {
r.moveBy(-6);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
r.moveBy(-4);
try {
r.moveBy(-2);
fail();
} catch (LineIndexOutOfBoundsException e) {
r.moveBy(4);
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.resizeBy(-11);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.resizeAndMoveBy(-6);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.resizeAndMoveBy(10);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.resizeAndMoveBy(11);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.resizeAndMoveBy(20);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setLength(0);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setLength(-1);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.moveTo(-1);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setEnd(5);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setEnd(3);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setEnd(-5);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setStart(18);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.moveEndTo(9);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
try {
r.setLengthAndMove(16);
fail();
} catch (LineIndexOutOfBoundsException e) {
assertEquals(5, r.start());
assertEquals(10, r.length());
assertConsistency(r);
}
}
@Test
public void testIllegalSplit() throws Exception {
Range r= Range.createRelative(12, 18);
try {
r.split(-1);
} catch (LineIndexOutOfBoundsException e) {
assertEquals(12, r.start());
assertEquals(18, r.length());
assertConsistency(r);
}
try {
r.split(0);
} catch (LineIndexOutOfBoundsException e) {
assertEquals(12, r.start());
assertEquals(18, r.length());
assertConsistency(r);
}
try {
r.split(18);
} catch (LineIndexOutOfBoundsException e) {
assertEquals(12, r.start());
assertEquals(18, r.length());
assertConsistency(r);
}
try {
r.split(20);
} catch (LineIndexOutOfBoundsException e) {
assertEquals(12, r.start());
assertEquals(18, r.length());
assertConsistency(r);
}
}
private static void assertConsistency(Range r) {
assertEquals(r, r);
assertTrue(r.equalRange(Range.copy(r)));
assertTrue(r.equalRange(Range.createRelative(r.start(), r.length())));
assertTrue(r.equalRange(Range.createAbsolute(r.start(), r.end())));
assertEquals(r.getStartLine(), r.start());
assertEquals(r.getNumberOfLines(), r.length());
assertEquals(r.start() + r.length(), r.end());
}
}