@Override
    public EquatableValueSet intersect(ValueSet other)
    {
        EquatableValueSet otherValueSet = checkCompatibility(other);

        if (whiteList && otherValueSet.isWhiteList()) {
            return new EquatableValueSet(type, true, intersect(entries, otherValueSet.entries));
        }
        else if (whiteList) {
            return new EquatableValueSet(type, true, subtract(entries, otherValueSet.entries));
        }
        else if (otherValueSet.isWhiteList()) {
            return new EquatableValueSet(type, true, subtract(otherValueSet.entries, entries));
        }
        else {
            return new EquatableValueSet(type, false, union(otherValueSet.entries, entries));
        }
    }
@Test
    public void testIntersect()
    {
        assertEquals(EquatableValueSet.none(TestingIdType.ID).intersect(EquatableValueSet.none(TestingIdType.ID)), EquatableValueSet.none(TestingIdType.ID));
        assertEquals(EquatableValueSet.all(TestingIdType.ID).intersect(EquatableValueSet.all(TestingIdType.ID)), EquatableValueSet.all(TestingIdType.ID));
        assertEquals(EquatableValueSet.none(TestingIdType.ID).intersect(EquatableValueSet.all(TestingIdType.ID)), EquatableValueSet.none(TestingIdType.ID));
        assertEquals(EquatableValueSet.none(TestingIdType.ID).intersect(EquatableValueSet.of(TestingIdType.ID, 0L)), EquatableValueSet.none(TestingIdType.ID));
        assertEquals(EquatableValueSet.all(TestingIdType.ID).intersect(EquatableValueSet.of(TestingIdType.ID, 0L)), EquatableValueSet.of(TestingIdType.ID, 0L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L).intersect(EquatableValueSet.of(TestingIdType.ID, 0L)), EquatableValueSet.of(TestingIdType.ID, 0L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L, 1L).intersect(EquatableValueSet.of(TestingIdType.ID, 0L)), EquatableValueSet.of(TestingIdType.ID, 0L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L).complement().intersect(EquatableValueSet.of(TestingIdType.ID, 0L)), EquatableValueSet.none(TestingIdType.ID));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L).complement().intersect(EquatableValueSet.of(TestingIdType.ID, 1L)), EquatableValueSet.of(TestingIdType.ID, 1L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L).intersect(EquatableValueSet.of(TestingIdType.ID, 1L).complement()), EquatableValueSet.of(TestingIdType.ID, 0L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L, 1L).intersect(EquatableValueSet.of(TestingIdType.ID, 0L, 2L)), EquatableValueSet.of(TestingIdType.ID, 0L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L, 1L).complement().intersect(EquatableValueSet.of(TestingIdType.ID, 0L, 2L)), EquatableValueSet.of(TestingIdType.ID, 2L));
        assertEquals(EquatableValueSet.of(TestingIdType.ID, 0L, 1L).complement().intersect(EquatableValueSet.of(TestingIdType.ID, 0L, 2L).complement()), EquatableValueSet.of(TestingIdType.ID, 0L, 1L, 2L).complement());
    }