diff --git a/src/main/java/ch/usi/si/seart/treesitter/Point.java b/src/main/java/ch/usi/si/seart/treesitter/Point.java index 16f21c67..cd48290e 100644 --- a/src/main/java/ch/usi/si/seart/treesitter/Point.java +++ b/src/main/java/ch/usi/si/seart/treesitter/Point.java @@ -6,6 +6,7 @@ import lombok.Generated; import lombok.Getter; import lombok.experimental.FieldDefaults; +import org.jetbrains.annotations.NotNull; /** * Represents a two-dimensional point with row and column coordinates. @@ -22,7 +23,7 @@ @AllArgsConstructor @EqualsAndHashCode @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class Point { +public class Point implements Comparable { private static final Point ORIGIN = new Point(0, 0); @@ -53,6 +54,20 @@ public String toString() { public boolean isOrigin() { return equals(ORIGIN); } + + /* Compares this point with another point for positional order. + * Points are compared by their row coordinates first, + * and if those are equal they are then compared by their column coordinates. + * + * @param other the object to be compared + * @return the row comparison result, or the column comparison result if the rows are equal + * @since 1.5.1 + */ + @Override + public int compareTo(@NotNull Point other) { + int comparison = Integer.compare(this.row, other.row); + return comparison != 0 ? comparison : Integer.compare(this.column, other.column); + } /** * Adds another point to this point, diff --git a/src/test/java/ch/usi/si/seart/treesitter/PointTest.java b/src/test/java/ch/usi/si/seart/treesitter/PointTest.java index 7826f014..2cac4802 100644 --- a/src/test/java/ch/usi/si/seart/treesitter/PointTest.java +++ b/src/test/java/ch/usi/si/seart/treesitter/PointTest.java @@ -6,6 +6,9 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.stream.Stream; class PointTest { @@ -23,6 +26,18 @@ void testIsOrigin() { void testIsNotOrigin(Point point) { Assertions.assertFalse(point.isOrigin()); } + + @Test + void testCompareTo() { + List sorted = List.of( + new Point(0, 0), new Point(0, 1), + new Point(1, 0), new Point(1, 1) + ); + ArrayList unsorted = new ArrayList<>(sorted); + Collections.shuffle(unsorted); + Collections.sort(unsorted); + Assertions.assertEquals(sorted, unsorted); + } @Test void testAdd() {