NaturalOrderComparator implements Comparator<OBJECT> { @Pure @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public int compare(OBJECT o1, OBJECT o2) { if (o1 == o2) { return 0; } if (o1 == null) { return Integer.MIN_VALUE; } if (o2 == null) { return Integer.MAX_VALUE; } try { return ((Comparable) o1).compareTo(o2); } catch (Throwable exception) { } try { return -((Comparable) o2).compareTo(o1); } catch (Throwable exception) { } throw new UnsupportedNaturalOrderException(o1); }  @Pure @Override @SuppressWarnings({ "unchecked", "rawtypes" }) int compare(OBJECT o1, OBJECT o2);  }
@Test public void compare() { NaturalOrderComparator<Object> comparator = new NaturalOrderComparator<>(); Integer o1 = 1; Integer o2 = 2; Integer o3 = 3; Integer o4 = 10; Float v1 = 3f; Double v2 = 3.; String v3 = "3"; Object v4 = new Object(); assertEquals(0, comparator.compare(o1, o1)); assertEquals(-1, comparator.compare(o1, o2)); assertEquals(-1, comparator.compare(o1, o3)); assertEquals(-1, comparator.compare(o1, o4)); try { comparator.compare(o1, v1); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o1, v2); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o1, v3); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o1, v4); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } assertEquals(1, comparator.compare(o2, o1)); assertEquals(0, comparator.compare(o2, o2)); assertEquals(-1, comparator.compare(o2, o3)); assertEquals(-1, comparator.compare(o2, o4)); try { comparator.compare(o2, v1); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o2, v2); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o2, v3); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o2, v4); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } assertEquals(1, comparator.compare(o3, o1)); assertEquals(1, comparator.compare(o3, o2)); assertEquals(0, comparator.compare(o3, o3)); assertEquals(-1, comparator.compare(o3, o4)); try { comparator.compare(o3, v1); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o3, v2); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o3, v3); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o3, v4); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } assertEquals(1, comparator.compare(o4, o1)); assertEquals(1, comparator.compare(o4, o2)); assertEquals(1, comparator.compare(o4, o3)); assertEquals(0, comparator.compare(o4, o4)); try { comparator.compare(o4, v1); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o4, v2); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o4, v3); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } try { comparator.compare(o4, v4); fail("Expecting UnsupportedNaturalOrderException"); } catch(UnsupportedNaturalOrderException exception) { } }