@Override
    public Boolean includes(Object param) {
        if (param == null) {
            return null;
        }
        if (lowEndPoint == null) {
            if (highEndPoint == null) {
                return null;
            } else {
                return negInfRangeIncludes(param);
            }
        } else {
            if (highEndPoint == null) {
                return posInfRangeIncludes(param);
            } else {
                return finiteRangeIncludes(param);
            }
        }
    }
@Test
    void includes() {
        RangeImpl rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN, 10, 15, Range.RangeBoundary.OPEN);
        assertThat(rangeImpl.includes(-15)).isFalse();
        assertThat(rangeImpl.includes(5)).isFalse();
        assertThat(rangeImpl.includes(10)).isFalse();
        assertThat(rangeImpl.includes(12)).isTrue();
        assertThat(rangeImpl.includes(15)).isFalse();
        assertThat(rangeImpl.includes(156)).isFalse();

        rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED, 10, 15, Range.RangeBoundary.OPEN);
        assertThat(rangeImpl.includes(10)).isTrue();
        assertThat(rangeImpl.includes(12)).isTrue();
        assertThat(rangeImpl.includes(15)).isFalse();

        rangeImpl = new RangeImpl(Range.RangeBoundary.OPEN, 10, 15, Range.RangeBoundary.CLOSED);
        assertThat(rangeImpl.includes(10)).isFalse();
        assertThat(rangeImpl.includes(12)).isTrue();
        assertThat(rangeImpl.includes(15)).isTrue();

        rangeImpl = new RangeImpl(Range.RangeBoundary.CLOSED, 10, 15, Range.RangeBoundary.CLOSED);
        assertThat(rangeImpl.includes(10)).isTrue();
        assertThat(rangeImpl.includes(12)).isTrue();
        assertThat(rangeImpl.includes(15)).isTrue();
    }