### Question:
Jarvis { public static List<Point> convexHull(List<Point> points) { if (points.size() < 3) { return null; } List<Point> ch = new ArrayList<>(); Point left = findLeftMost(points); Point current = left; do { ch.add(current); assert ch.size() <= points.size() : "hull has more points than graph"; if (ch.size() > points.size()) { return null; } Point next = null; for (Point p : points) { if (next == null) { next = p; continue; } long cp = crossProduct(current, p, next); if (cp > 0 || (cp == 0 && current.distanceTo(p) > current.distanceTo(next))) { next = p; } } if (next == null) { return null; } current = next; } while (current != left); return ch; }  static List<Point> convexHull(List<Point> points);  }### Answer:
@Test public void test() { Point[] points = { new Point(0, 3), new Point(1, 1), new Point(2, 2), new Point(4, 4), new Point(0, 0), new Point(1, 2), new Point(3, 1), new Point(3, 3) }; List<Point> result = Jarvis.convexHull(Arrays.asList(points)); Assert.assertEquals(4, result.size()); Assert.assertEquals(new Point(0, 0), result.get(0)); Assert.assertEquals(new Point(0, 3), result.get(1)); Assert.assertEquals(new Point(4, 4), result.get(2)); Assert.assertEquals(new Point(3, 1), result.get(3)); }
@Test public void test2() { Point[] points = { new Point(0, 3), new Point(4, 2), new Point(3, 5), new Point(5, 3), new Point(3, 0), new Point(1, 1), new Point(1, 2), new Point(2, 2) }; List<Point> result = Jarvis.convexHull(Arrays.asList(points)); Assert.assertEquals(5, result.size()); Assert.assertEquals(new Point(0, 3), result.get(0)); Assert.assertEquals(new Point(3, 5), result.get(1)); Assert.assertEquals(new Point(5, 3), result.get(2)); Assert.assertEquals(new Point(3, 0), result.get(3)); Assert.assertEquals(new Point(1, 1), result.get(4)); }
@Test public void testCollinear() { Point[] points = new Point[] { new Point(604, 76), new Point(609, 81), new Point(606, 78), new Point(602, 74), new Point(610, 74), new Point(609, 77), new Point(602, 72), new Point(606, 77), new Point(611, 77), new Point(607, 72), new Point(616, 74), new Point(611, 70), new Point(611, 71), new Point(610, 73), new Point(614, 82), new Point(615, 79), new Point(615, 77), new Point(615, 76), new Point(634, 71), new Point(604, 76) }; Jarvis.convexHull(Arrays.asList(points)); }