public boolean isOverlappedBy(final VersionRange<T> that) {
        if (this.isEmpty() || that.isEmpty())
            return false;

        if (this.isAll() || that.isAll())
            return true;

        if (this.minimum == null)
            return that.minimum == null || that.minimum.compareTo(this.maximum) <= 0;

        if (this.maximum == null)
            return that.maximum == null || that.maximum.compareTo(this.minimum) >= 0;

        return that.contains(minimum) || that.contains(maximum) || (that.minimum != null && contains(that.minimum));
    }
@Test
    public void testIsOverlappedBy() {
        assertIsOverlappedBy(true, all(), all());
        assertIsOverlappedBy(false, all(), empty());
        assertIsOverlappedBy(false, empty(), empty());

        assertIsOverlappedBy(true, all(), VersionNumber.between("10", "20"));
        assertIsOverlappedBy(true, all(), VersionNumber.atLeast("10"));
        assertIsOverlappedBy(true, all(), VersionNumber.atMost("10"));

        assertIsOverlappedBy(false, empty(), VersionNumber.between("10", "20"));
        assertIsOverlappedBy(false, empty(), VersionNumber.atLeast("10"));
        assertIsOverlappedBy(false, empty(), VersionNumber.atMost("10"));

        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("10", "20"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("5", "20"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("5", "15"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("5", "10"));
        assertIsOverlappedBy(false, VersionNumber.between("10", "20"), VersionNumber.between("5", "5"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("10", "30"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("15", "30"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.between("20", "30"));
        assertIsOverlappedBy(false, VersionNumber.between("10", "20"), VersionNumber.between("21", "30"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.atLeast("5"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.atLeast("10"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.atLeast("15"));
        assertIsOverlappedBy(true, VersionNumber.between("10", "20"), VersionNumber.atLeast("20"));
        assertIsOverlappedBy(false, VersionNumber.between("10", "20"), VersionNumber.atLeast("25"));

        assertIsOverlappedBy(true, VersionNumber.atLeast("10"), VersionNumber.atLeast("10"));
        assertIsOverlappedBy(true, VersionNumber.atLeast("10"), VersionNumber.atLeast("20"));
        assertIsOverlappedBy(true, VersionNumber.atLeast("10"), VersionNumber.atLeast("5"));
        assertIsOverlappedBy(true, VersionNumber.atLeast("10"), VersionNumber.atMost("10"));
        assertIsOverlappedBy(true, VersionNumber.atLeast("10"), VersionNumber.atMost("20"));
        assertIsOverlappedBy(false, VersionNumber.atLeast("10"), VersionNumber.atMost("5"));
    }