// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.collide.shared.document;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.document.util.PositionUtils;
import com.google.common.base.Joiner;
import junit.framework.TestCase;
import org.junit.Assert;
/**
* Tests for {@link PositionUtils}.
*/
public class PositionUtilsTests extends TestCase {
/** Tests are dependent on these values, do not change. */
private static final String[] LINES = {"Hello world\n", "Foo bar\n", "Something else\n"};
private Document doc;
private Line line;
private Position startOfLine1;
private Position endOfLine1;
private Position startOfLine2;
private Position endOfLine2;
private Position startOfLine3;
private Position endOfLine3;
public void testPositionEquality() {
assertEquals(startOfLine1, new Position(new LineInfo(line, 0), 0));
assertNotSame(startOfLine1, startOfLine2);
}
public void testIntersection() {
// Equal ranges
assertIntersectionEquals(startOfLine1, endOfLine1, startOfLine1, endOfLine1, startOfLine1,
endOfLine1);
// Ranges start at same place
assertIntersectionEquals(startOfLine1, endOfLine1, startOfLine1, endOfLine1, startOfLine1,
endOfLine2);
assertIntersectionEquals(startOfLine1, endOfLine1, startOfLine1, endOfLine2, startOfLine1,
endOfLine1);
// One range inside another
assertIntersectionEquals(startOfLine2, endOfLine2, startOfLine1, endOfLine3, startOfLine2,
endOfLine2);
// Ranges end at same place
assertIntersectionEquals(startOfLine2, endOfLine2, startOfLine1, endOfLine2, startOfLine2,
endOfLine2);
// Typical intersection
assertIntersectionEquals(startOfLine2, endOfLine2, startOfLine1, endOfLine2, startOfLine2,
endOfLine3);
// No intersection
assertIntersectionEquals(null, null, startOfLine1, endOfLine1, startOfLine2, endOfLine2);
}
public void testDifference() {
// No difference
assertDifferenceEquals(startOfLine1, endOfLine1, startOfLine1, endOfLine1);
// Ranges start at same place
assertDifferenceEquals(startOfLine1, endOfLine1, startOfLine1, endOfLine2, startOfLine2,
endOfLine2);
assertDifferenceEquals(startOfLine1, endOfLine2, startOfLine1, endOfLine1, startOfLine2,
endOfLine2);
// One range inside another
assertDifferenceEquals(startOfLine1, endOfLine3, startOfLine2, endOfLine2, startOfLine1,
endOfLine1, startOfLine3, endOfLine3);
// Ranges end at same place
assertDifferenceEquals(startOfLine1, endOfLine2, startOfLine2, endOfLine2, startOfLine1,
endOfLine1);
// Typical intersection
assertDifferenceEquals(startOfLine1, endOfLine2, startOfLine2, endOfLine3, startOfLine1,
endOfLine1, startOfLine3, endOfLine3);
// No intersection
assertDifferenceEquals(startOfLine1, endOfLine1, startOfLine2, endOfLine2, startOfLine1,
endOfLine1, startOfLine2, endOfLine2);
}
@Override
protected void setUp() throws Exception {
doc =
Document.createFromString(Joiner.on("").join(LINES));
line = doc.getFirstLine();
Line curLine = line;
startOfLine1 = new Position(new LineInfo(curLine, 0), 0);
endOfLine1 = new Position(new LineInfo(curLine, 0), LINES[0].length() - 1);
curLine = curLine.getNextLine();
startOfLine2 = new Position(new LineInfo(curLine, 1), 0);
endOfLine2 = new Position(new LineInfo(curLine, 1), LINES[1].length() - 1);
curLine = curLine.getNextLine();
startOfLine3 = new Position(new LineInfo(curLine, 2), 0);
endOfLine3 = new Position(new LineInfo(curLine, 2), LINES[2].length() - 1);
}
private void assertIntersectionEquals(Position expectedStart, Position expectedEnd,
Position aStart, Position aEnd, Position bStart, Position bEnd) {
Position[] intersection =
PositionUtils.getIntersection(new Position[] {aStart, aEnd}, new Position[] {bStart, bEnd});
if (expectedStart == null) {
assertEquals(null, intersection);
} else {
Assert.assertArrayEquals((new Position[] {expectedStart, expectedEnd}), intersection);
}
}
private void assertDifferenceEquals(Position aStart, Position aEnd, Position bStart,
Position bEnd, Position... expected) {
JsonArray<Position[]> difference =
PositionUtils.getDifference(new Position[] {aStart, aEnd}, new Position[] {bStart, bEnd});
assertEquals(expected.length / 2, difference.size());
int expectedPos = 0;
for (int diffPos = 0; diffPos < difference.size(); diffPos++) {
Assert.assertArrayEquals(new Position[] {expected[expectedPos++], expected[expectedPos++]},
difference.get(diffPos));
}
}
}