blob: 35f307a6749030781261c70add46b48ca9c650d1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.calcite.util;
import org.apache.calcite.runtime.Utilities;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.primitives.Ints;
import org.junit.jupiter.api.Test;
import java.nio.LongBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.function.IntPredicate;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.sameInstance;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.hasToString;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
/**
* Unit test for {@link org.apache.calcite.util.ImmutableBitSet}.
*/
class ImmutableBitSetTest {
/** Tests the method {@link ImmutableBitSet#iterator()}. */
@Test void testIterator() {
assertToIterBitSet("", ImmutableBitSet.of());
assertToIterBitSet("0", ImmutableBitSet.of(0));
assertToIterBitSet("0, 1", ImmutableBitSet.of(0, 1));
assertToIterBitSet("10", ImmutableBitSet.of(10));
check((bitSet, list) -> {
final List<Integer> list2 = new ArrayList<>();
for (Integer integer : bitSet) {
list2.add(integer);
}
assertThat(list2, equalTo(list));
});
}
/** Tests the method {@link ImmutableBitSet#of(int)}. */
@Test void testSingletonConstructor() {
IntConsumer c = i -> {
final ImmutableBitSet s0 = ImmutableBitSet.of(i);
final ImmutableBitSet s1 = ImmutableBitSet.of(ImmutableIntList.of(i));
final ImmutableBitSet s2 = ImmutableBitSet.of(Collections.singleton(i));
final ImmutableBitSet s3 =
ImmutableBitSet.of(99, 100).set(i).clear(100).clear(99);
assertThat(s0.cardinality(), is(1));
assertThat(s0, is(s1));
assertThat(s0, is(s2));
assertThat(s0, is(s3));
assertThat(s1, is(s2));
assertThat(s1, is(s3));
assertThat(s2, is(s3));
};
c.accept(0);
c.accept(1);
c.accept(63);
c.accept(64);
}
@Test void testNegative() {
assertThrows(IndexOutOfBoundsException.class,
() -> ImmutableBitSet.of(-1));
assertThrows(IndexOutOfBoundsException.class,
() -> ImmutableBitSet.of(-2));
assertThrows(IndexOutOfBoundsException.class,
() -> ImmutableBitSet.of(1, 10, -1, 63));
assertThrows(IndexOutOfBoundsException.class,
() -> ImmutableBitSet.of(-1, 10));
assertThrows(IndexOutOfBoundsException.class,
() -> ImmutableBitSet.of(Collections.singleton(-2)));
}
/**
* Tests that iterating over an
* {@link org.apache.calcite.util.ImmutableBitSet} yields the expected string.
*
* @param expected Expected string
* @param bitSet Bit set
*/
private void assertToIterBitSet(String expected, ImmutableBitSet bitSet) {
StringBuilder buf = new StringBuilder();
for (int i : bitSet) {
if (buf.length() > 0) {
buf.append(", ");
}
buf.append(i);
}
assertEquals(expected, buf.toString());
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#toList()}.
*/
@Test void testToList() {
check((bitSet, list) -> assertThat(bitSet.toList(), equalTo(list)));
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#forEachInt}.
*/
@Test void testForEachInt() {
check((bitSet, list) -> {
final List<Integer> list2 = new ArrayList<>();
bitSet.forEachInt(list2::add);
assertThat(list2, equalTo(list));
});
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#forEach}.
*/
@Test void testForEachInteger() {
check((bitSet, list) -> {
final List<Integer> list2 = new ArrayList<>();
bitSet.forEach(list2::add);
assertThat(list2, equalTo(list));
});
}
private void check(BiConsumer<ImmutableBitSet, List<Integer>> consumer) {
consumer.accept(ImmutableBitSet.of(), Collections.emptyList());
consumer.accept(ImmutableBitSet.of(5), Collections.singletonList(5));
consumer.accept(ImmutableBitSet.of(3, 5), Arrays.asList(3, 5));
consumer.accept(ImmutableBitSet.of(63), Collections.singletonList(63));
consumer.accept(ImmutableBitSet.of(64), Collections.singletonList(64));
consumer.accept(ImmutableBitSet.of(3, 63), Arrays.asList(3, 63));
consumer.accept(ImmutableBitSet.of(3, 64), Arrays.asList(3, 64));
consumer.accept(ImmutableBitSet.of(0, 4, 2), Arrays.asList(0, 2, 4));
}
/**
* Tests the method {@link BitSets#range(int, int)}.
*/
@Test void testRange() {
assertEquals(ImmutableBitSet.range(0, 4).toList(),
Arrays.asList(0, 1, 2, 3));
assertEquals(ImmutableBitSet.range(1, 4).toList(),
Arrays.asList(1, 2, 3));
assertEquals(ImmutableBitSet.range(4).toList(),
Arrays.asList(0, 1, 2, 3));
assertEquals(ImmutableBitSet.range(0).toList(),
Collections.<Integer>emptyList());
assertEquals(ImmutableBitSet.range(2, 2).toList(),
Collections.<Integer>emptyList());
assertThat(ImmutableBitSet.range(63, 66),
hasToString("{63, 64, 65}"));
assertThat(ImmutableBitSet.range(65, 68),
hasToString("{65, 66, 67}"));
assertThat(ImmutableBitSet.range(65, 65), hasToString("{}"));
assertThat(ImmutableBitSet.range(65, 65).length(), equalTo(0));
assertThat(ImmutableBitSet.range(65, 165).cardinality(), equalTo(100));
// Same tests as above, using a builder.
assertThat(ImmutableBitSet.builder().set(63, 66).build(),
hasToString("{63, 64, 65}"));
assertThat(ImmutableBitSet.builder().set(65, 68).build(),
hasToString("{65, 66, 67}"));
assertThat(ImmutableBitSet.builder().set(65, 65).build(),
hasToString("{}"));
assertThat(ImmutableBitSet.builder().set(65, 65).build().length(),
equalTo(0));
assertThat(ImmutableBitSet.builder().set(65, 165).build().cardinality(),
equalTo(100));
final ImmutableBitSet e0 = ImmutableBitSet.range(0, 0);
final ImmutableBitSet e1 = ImmutableBitSet.of();
assertThat(e0, is(e1));
assertThat(e0.hashCode(), equalTo(e1.hashCode()));
// Empty builder returns the singleton empty set.
assertThat(ImmutableBitSet.builder().build(),
sameInstance(ImmutableBitSet.of()));
}
@Test void testCompare() {
final List<ImmutableBitSet> sorted = getSortedList();
for (int i = 0; i < sorted.size(); i++) {
for (int j = 0; j < sorted.size(); j++) {
final ImmutableBitSet set0 = sorted.get(i);
final ImmutableBitSet set1 = sorted.get(j);
int c = set0.compareTo(set1);
if (c == 0) {
assertTrue(i == j || i == 3 && j == 4 || i == 4 && j == 3);
} else {
assertEquals(c, Utilities.compare(i, j));
}
assertEquals(c == 0, set0.equals(set1));
assertEquals(c == 0, set1.equals(set0));
}
}
}
@Test void testCompare2() {
final List<ImmutableBitSet> sorted = getSortedList();
sorted.sort(ImmutableBitSet.COMPARATOR);
assertThat(sorted,
hasToString("[{0, 1, 3}, {0, 1}, {1, 1000}, {1}, {1}, {2, 3}, {}]"));
}
private List<ImmutableBitSet> getSortedList() {
return Arrays.asList(
ImmutableBitSet.of(),
ImmutableBitSet.of(0, 1),
ImmutableBitSet.of(0, 1, 3),
ImmutableBitSet.of(1),
ImmutableBitSet.of(1),
ImmutableBitSet.of(1, 1000),
ImmutableBitSet.of(2, 3));
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#toArray}.
*/
@Test void testToArray() {
int[][] arrays = {{}, {0}, {0, 2}, {1, 65}, {100}};
for (int[] array : arrays) {
assertThat(ImmutableBitSet.of(array).toArray(), equalTo(array));
}
}
/**
* Tests the methods
* {@link org.apache.calcite.util.ImmutableBitSet#toList}, and
* {@link org.apache.calcite.util.ImmutableBitSet#asList} and
* {@link org.apache.calcite.util.ImmutableBitSet#asSet}.
*/
@Test void testAsList() {
final List<ImmutableBitSet> list = getSortedList();
// create a set of integers in and not in the lists
final Set<Integer> integers = new HashSet<>();
for (ImmutableBitSet set : list) {
for (Integer integer : set) {
integers.add(integer);
integers.add(integer + 1);
integers.add(integer + 10);
}
}
for (ImmutableBitSet bitSet : list) {
final List<Integer> list1 = bitSet.toList();
final List<Integer> listView = bitSet.asList();
final Set<Integer> setView = bitSet.asSet();
assertThat(list1, hasSize(bitSet.cardinality()));
assertThat(listView, hasSize(bitSet.cardinality()));
assertThat(setView, hasSize(bitSet.cardinality()));
assertThat(list1, hasToString(listView.toString()));
assertThat(list1, hasToString(setView.toString()));
assertThat(list1.equals(listView), is(true));
assertThat(list1.hashCode(), equalTo(listView.hashCode()));
final Set<Integer> set = new HashSet<>(list1);
assertThat(setView.hashCode(), is(set.hashCode()));
assertThat(setView, equalTo(set));
for (Integer integer : integers) {
final boolean b = list1.contains(integer);
assertThat(listView.contains(integer), is(b));
assertThat(setView.contains(integer), is(b));
}
}
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#union(ImmutableBitSet)}.
*/
@Test void testUnion() {
assertThat(ImmutableBitSet.of(1).union(ImmutableBitSet.of(3)),
hasToString("{1, 3}"));
assertThat(ImmutableBitSet.of(1).union(ImmutableBitSet.of(3, 100)),
hasToString("{1, 3, 100}"));
ImmutableBitSet x =
ImmutableBitSet.of(1)
.rebuild()
.addAll(ImmutableBitSet.of(2))
.addAll(ImmutableBitSet.of())
.addAll(ImmutableBitSet.of(3))
.build();
assertThat(x, hasToString("{1, 2, 3}"));
}
@Test void testIntersect() {
assertThat(ImmutableBitSet.of(1, 2, 3, 100, 200)
.intersect(ImmutableBitSet.of(2, 100)),
hasToString("{2, 100}"));
assertThat(ImmutableBitSet.of(1, 3, 5, 101, 20001)
.intersect(ImmutableBitSet.of(2, 100)),
sameInstance(ImmutableBitSet.of()));
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#contains(org.apache.calcite.util.ImmutableBitSet)}.
*/
@Test void testBitSetsContains() {
assertTrue(ImmutableBitSet.range(0, 5)
.contains(ImmutableBitSet.range(2, 4)));
assertTrue(ImmutableBitSet.range(0, 5).contains(ImmutableBitSet.range(4)));
assertFalse(ImmutableBitSet.range(0, 5).contains(ImmutableBitSet.of(14)));
assertFalse(ImmutableBitSet.range(20, 25).contains(ImmutableBitSet.of(14)));
final ImmutableBitSet empty = ImmutableBitSet.of();
assertTrue(ImmutableBitSet.range(20, 25).contains(empty));
assertTrue(empty.contains(empty));
assertFalse(empty.contains(ImmutableBitSet.of(0)));
assertFalse(empty.contains(ImmutableBitSet.of(1)));
assertFalse(empty.contains(ImmutableBitSet.of(63)));
assertFalse(empty.contains(ImmutableBitSet.of(64)));
assertFalse(empty.contains(ImmutableBitSet.of(1000)));
assertTrue(ImmutableBitSet.of(1, 4, 7)
.contains(ImmutableBitSet.of(1, 4, 7)));
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#of(org.apache.calcite.util.ImmutableIntList)}.
*/
@Test void testBitSetOfImmutableIntList() {
ImmutableIntList list = ImmutableIntList.of();
assertThat(ImmutableBitSet.of(list), equalTo(ImmutableBitSet.of()));
list = ImmutableIntList.of(2, 70, 5, 0);
assertThat(ImmutableBitSet.of(list),
equalTo(ImmutableBitSet.of(0, 2, 5, 70)));
}
/**
* Tests the method
* {@link org.apache.calcite.util.ImmutableBitSet#previousClearBit(int)}.
*/
@Test void testPreviousClearBit() {
assertThat(ImmutableBitSet.of().previousClearBit(10), equalTo(10));
assertThat(ImmutableBitSet.of().previousClearBit(0), equalTo(0));
assertThat(ImmutableBitSet.of().previousClearBit(-1), equalTo(-1));
try {
final int actual = ImmutableBitSet.of().previousClearBit(-2);
fail("expected exception, got " + actual);
} catch (IndexOutOfBoundsException e) {
// ok
}
assertThat(ImmutableBitSet.of(0, 1, 3, 4).previousClearBit(4), equalTo(2));
assertThat(ImmutableBitSet.of(0, 1, 3, 4).previousClearBit(3), equalTo(2));
assertThat(ImmutableBitSet.of(0, 1, 3, 4).previousClearBit(2), equalTo(2));
assertThat(ImmutableBitSet.of(0, 1, 3, 4).previousClearBit(1),
equalTo(-1));
assertThat(ImmutableBitSet.of(1, 3, 4).previousClearBit(1), equalTo(0));
}
@Test void testBuilder() {
assertThat(ImmutableBitSet.builder().set(9)
.set(100)
.set(1000)
.clear(250)
.set(88)
.clear(100)
.clear(1000)
.build(),
hasToString("{9, 88}"));
}
/** Unit test for
* {@link org.apache.calcite.util.ImmutableBitSet.Builder#build(ImmutableBitSet)}. */
@Test void testBuilderUseOriginal() {
final ImmutableBitSet fives = ImmutableBitSet.of(5, 10, 15);
final ImmutableBitSet fives1 =
fives.rebuild().clear(2).set(10).build();
assertSame(fives1, fives);
final ImmutableBitSet fives2 =
ImmutableBitSet.builder().addAll(fives).clear(2).set(10).build(fives);
assertSame(fives2, fives);
final ImmutableBitSet fives3 =
ImmutableBitSet.builder().addAll(fives).clear(2).set(10).build();
assertNotSame(fives3, fives);
assertEquals(fives3, fives);
assertEquals(fives3, fives2);
}
@Test void testIndexOf() {
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(0), equalTo(0));
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(2), equalTo(1));
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(3), equalTo(-1));
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(4), equalTo(2));
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(5), equalTo(-1));
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(-1), equalTo(-1));
assertThat(ImmutableBitSet.of(0, 2, 4).indexOf(-2), equalTo(-1));
assertThat(ImmutableBitSet.of().indexOf(-1), equalTo(-1));
assertThat(ImmutableBitSet.of().indexOf(-2), equalTo(-1));
assertThat(ImmutableBitSet.of().indexOf(0), equalTo(-1));
assertThat(ImmutableBitSet.of().indexOf(1000), equalTo(-1));
}
/** Tests {@link ImmutableBitSet.Builder#buildAndReset()}. */
@Test void testReset() {
final ImmutableBitSet.Builder builder = ImmutableBitSet.builder();
builder.set(2);
assertThat(builder.build(), hasToString("{2}"));
try {
builder.set(4);
fail("expected exception");
} catch (IllegalArgumentException e) {
assertThat(e.getMessage(), is("can only use builder once"));
}
try {
final ImmutableBitSet bitSet = builder.build();
fail("expected exception, got " + bitSet);
} catch (IllegalArgumentException e) {
assertThat(e.getMessage(), is("can only use builder once"));
}
try {
final ImmutableBitSet bitSet = builder.buildAndReset();
fail("expected exception, got " + bitSet);
} catch (IllegalArgumentException e) {
assertThat(e.getMessage(), is("can only use builder once"));
}
final ImmutableBitSet.Builder builder2 = ImmutableBitSet.builder();
builder2.set(2);
assertThat(builder2.buildAndReset(), hasToString("{2}"));
assertThat(builder2.buildAndReset(), hasToString("{}"));
builder2.set(151);
builder2.set(3);
assertThat(builder2.buildAndReset(), hasToString("{3, 151}"));
}
@Test void testNth() {
assertThat(ImmutableBitSet.of(0, 2, 4).nth(0), equalTo(0));
assertThat(ImmutableBitSet.of(0, 2, 4).nth(1), equalTo(2));
assertThat(ImmutableBitSet.of(0, 2, 4).nth(2), equalTo(4));
assertThat(ImmutableBitSet.of(0, 2, 63).nth(2), equalTo(63));
assertThat(ImmutableBitSet.of(0, 2, 64).nth(2), equalTo(64));
assertThat(ImmutableBitSet.of(64).nth(0), equalTo(64));
assertThat(ImmutableBitSet.of(64, 65).nth(0), equalTo(64));
assertThat(ImmutableBitSet.of(64, 65).nth(1), equalTo(65));
assertThat(ImmutableBitSet.of(64, 128).nth(1), equalTo(128));
try {
ImmutableBitSet.of().nth(0);
fail("expected throw");
} catch (IndexOutOfBoundsException e) {
// ok
}
try {
ImmutableBitSet.of().nth(1);
fail("expected throw");
} catch (IndexOutOfBoundsException e) {
// ok
}
try {
ImmutableBitSet.of(64).nth(1);
fail("expected throw");
} catch (IndexOutOfBoundsException e) {
// ok
}
try {
ImmutableBitSet.of(64).nth(-1);
fail("expected throw");
} catch (IndexOutOfBoundsException e) {
// ok
}
}
/** Tests the method
* {@link org.apache.calcite.util.BitSets#closure(java.util.SortedMap)}. */
@Test void testClosure() {
final SortedMap<Integer, ImmutableBitSet> empty = new TreeMap<>();
assertThat(ImmutableBitSet.closure(empty), equalTo(empty));
// Currently you need an entry for each position, otherwise you get an NPE.
// We should fix that.
final SortedMap<Integer, ImmutableBitSet> map = new TreeMap<>();
map.put(0, ImmutableBitSet.of(3));
map.put(1, ImmutableBitSet.of());
map.put(2, ImmutableBitSet.of(7));
map.put(3, ImmutableBitSet.of(4, 12));
map.put(4, ImmutableBitSet.of());
map.put(5, ImmutableBitSet.of());
map.put(6, ImmutableBitSet.of());
map.put(7, ImmutableBitSet.of());
map.put(8, ImmutableBitSet.of());
map.put(9, ImmutableBitSet.of());
map.put(10, ImmutableBitSet.of());
map.put(11, ImmutableBitSet.of());
map.put(12, ImmutableBitSet.of());
final String original = map.toString();
final String expected =
"{0={3, 4, 12}, 1={}, 2={7}, 3={3, 4, 12}, 4={4, 12}, 5={}, 6={}, 7={7}, 8={}, 9={}, 10={}, 11={}, 12={4, 12}}";
assertThat(ImmutableBitSet.closure(map), hasToString(expected));
assertThat("argument modified", map, hasToString(original));
// Now a similar map with missing entries. Same result.
final SortedMap<Integer, ImmutableBitSet> map2 = new TreeMap<>();
map2.put(0, ImmutableBitSet.of(3));
map2.put(2, ImmutableBitSet.of(7));
map2.put(3, ImmutableBitSet.of(4, 12));
map2.put(9, ImmutableBitSet.of());
final String original2 = map2.toString();
assertThat(ImmutableBitSet.closure(map2), hasToString(expected));
assertThat("argument modified", map2, hasToString(original2));
}
@Test void testPowerSet() {
final ImmutableBitSet empty = ImmutableBitSet.of();
assertThat(Iterables.size(empty.powerSet()), equalTo(1));
assertThat(empty.powerSet(), hasToString("[{}]"));
final ImmutableBitSet single = ImmutableBitSet.of(2);
assertThat(Iterables.size(single.powerSet()), equalTo(2));
assertThat(single.powerSet(), hasToString("[{}, {2}]"));
final ImmutableBitSet two = ImmutableBitSet.of(2, 10);
assertThat(Iterables.size(two.powerSet()), equalTo(4));
assertThat(two.powerSet(), hasToString("[{}, {10}, {2}, {2, 10}]"));
final ImmutableBitSet seventeen = ImmutableBitSet.range(3, 20);
assertThat(Iterables.size(seventeen.powerSet()), equalTo(131072));
}
@Test void testCreateLongs() {
assertThat(ImmutableBitSet.valueOf(0L), equalTo(ImmutableBitSet.of()));
assertThat(ImmutableBitSet.valueOf(0xAL),
equalTo(ImmutableBitSet.of(1, 3)));
assertThat(ImmutableBitSet.valueOf(0xAL, 0, 0),
equalTo(ImmutableBitSet.of(1, 3)));
assertThat(ImmutableBitSet.valueOf(0, 0, 0xAL, 0),
equalTo(ImmutableBitSet.of(129, 131)));
}
@Test void testCreateLongBuffer() {
assertThat(ImmutableBitSet.valueOf(LongBuffer.wrap(new long[] {})),
equalTo(ImmutableBitSet.of()));
assertThat(ImmutableBitSet.valueOf(LongBuffer.wrap(new long[] {0xAL})),
equalTo(ImmutableBitSet.of(1, 3)));
assertThat(
ImmutableBitSet.valueOf(LongBuffer.wrap(new long[] {0, 0, 0xAL, 0})),
equalTo(ImmutableBitSet.of(129, 131)));
}
@Test void testToLongArray() {
final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969);
assertThat(ImmutableBitSet.valueOf(bitSet.toLongArray()),
equalTo(bitSet));
assertThat(ImmutableBitSet.valueOf(LongBuffer.wrap(bitSet.toLongArray())),
equalTo(bitSet));
}
@Test void testSet() {
final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969);
final ImmutableBitSet bitSet2 = ImmutableBitSet.of(29, 4, 1969, 30);
assertThat(bitSet.set(30), equalTo(bitSet2));
assertThat(bitSet.set(30).set(30), equalTo(bitSet2));
assertThat(bitSet.set(29), equalTo(bitSet));
assertThat(bitSet.setIf(30, false), equalTo(bitSet));
assertThat(bitSet.setIf(30, true), equalTo(bitSet2));
}
@Test void testClear() {
final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969);
final ImmutableBitSet bitSet2 = ImmutableBitSet.of(4, 1969);
assertThat(bitSet.clear(29), equalTo(bitSet2));
assertThat(bitSet.clear(29).clear(29), equalTo(bitSet2));
assertThat(bitSet.clear(29).clear(4).clear(29).clear(1969),
equalTo(ImmutableBitSet.of()));
assertThat(bitSet.clearIf(29, false), equalTo(bitSet));
assertThat(bitSet.clearIf(29, true), equalTo(bitSet2));
}
@Test void testSet2() {
final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969);
final ImmutableBitSet bitSet2 = ImmutableBitSet.of(29, 4, 1969, 30);
assertThat(bitSet.set(30, false), sameInstance(bitSet));
assertThat(bitSet.set(30, true), equalTo(bitSet2));
assertThat(bitSet.set(29, true), sameInstance(bitSet));
}
@Test void testShift() {
final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969);
assertThat(bitSet.shift(0), is(bitSet));
assertThat(bitSet.shift(1), is(ImmutableBitSet.of(30, 5, 1970)));
assertThat(bitSet.shift(-4), is(ImmutableBitSet.of(25, 0, 1965)));
try {
final ImmutableBitSet x = bitSet.shift(-5);
fail("Expected error, got " + x);
} catch (ArrayIndexOutOfBoundsException ignored) {
// Exact message is not specified by Java
}
final ImmutableBitSet empty = ImmutableBitSet.of();
assertThat(empty.shift(-100), is(empty));
}
@Test void testGet2() {
final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969);
assertThat(bitSet.get(0, 8), is(ImmutableBitSet.of(4)));
assertThat(bitSet.get(0, 5), is(ImmutableBitSet.of(4)));
assertThat(bitSet.get(0, 4), is(ImmutableBitSet.of()));
assertThat(bitSet.get(4, 4), is(ImmutableBitSet.of()));
assertThat(bitSet.get(5, 5), is(ImmutableBitSet.of()));
assertThat(bitSet.get(4, 5), is(ImmutableBitSet.of(4)));
assertThat(bitSet.get(4, 1000), is(ImmutableBitSet.of(4, 29)));
assertThat(bitSet.get(4, 32), is(ImmutableBitSet.of(4, 29)));
assertThat(bitSet.get(2000, 10000), is(ImmutableBitSet.of()));
assertThat(bitSet.get(1000, 10000), is(ImmutableBitSet.of(1969)));
assertThat(bitSet.get(5, 10000), is(ImmutableBitSet.of(29, 1969)));
assertThat(bitSet.get(65, 10000), is(ImmutableBitSet.of(1969)));
final ImmutableBitSet emptyBitSet = ImmutableBitSet.of();
assertThat(emptyBitSet.get(0, 4), is(ImmutableBitSet.of()));
assertThat(emptyBitSet.get(0, 0), is(ImmutableBitSet.of()));
assertThat(emptyBitSet.get(0, 10000), is(ImmutableBitSet.of()));
assertThat(emptyBitSet.get(7, 10000), is(ImmutableBitSet.of()));
assertThat(emptyBitSet.get(73, 10000), is(ImmutableBitSet.of()));
}
/**
* Test case for {@link ImmutableBitSet#allContain(Collection, int)}.
*/
@Test void testAllContain() {
ImmutableBitSet set1 = ImmutableBitSet.of(0, 1, 2, 3);
ImmutableBitSet set2 = ImmutableBitSet.of(2, 3, 4, 5);
ImmutableBitSet set3 = ImmutableBitSet.of(3, 4, 5, 6);
Collection<ImmutableBitSet> collection1 = ImmutableList.of(set1, set2, set3);
assertTrue(ImmutableBitSet.allContain(collection1, 3));
assertFalse(ImmutableBitSet.allContain(collection1, 0));
Collection<ImmutableBitSet> collection2 = ImmutableList.of(set1, set2);
assertTrue(ImmutableBitSet.allContain(collection2, 2));
assertTrue(ImmutableBitSet.allContain(collection2, 3));
assertFalse(ImmutableBitSet.allContain(collection2, 4));
}
/**
* Test case for {@link ImmutableBitSet#anyMatch(IntPredicate)}
* and {@link ImmutableBitSet#allMatch(IntPredicate)}.
*
* <p>Checks a variety of predicates (is even, is zero, always true,
* always false) and their negations on a variety of bit sets.
*/
@Test void testAnyMatch() {
BiConsumer<ImmutableBitSet, IntPredicate> c = (bitSet, predicate) -> {
final Set<Integer> integerSet = new HashSet<>(bitSet.asList());
assertThat(bitSet.anyMatch(predicate),
is(integerSet.stream().anyMatch(predicate::test)));
assertThat(bitSet.allMatch(predicate),
is(integerSet.stream().allMatch(predicate::test)));
};
BiConsumer<ImmutableBitSet, IntPredicate> c2 = (bitSet, predicate) -> {
c.accept(bitSet, predicate);
c.accept(bitSet, predicate.negate());
};
final ImmutableBitSet set0 = ImmutableBitSet.of();
final ImmutableBitSet set1 = ImmutableBitSet.of(0, 1, 2, 3);
final ImmutableBitSet set2 = ImmutableBitSet.of(0, 2, 4, 8);
Consumer<IntPredicate> c3 = predicate -> {
c2.accept(set0, predicate);
c2.accept(set1, predicate);
c2.accept(set2, predicate);
};
final IntPredicate isZero = i -> i == 0;
final IntPredicate isEven = i -> i % 2 == 0;
final IntPredicate alwaysTrue = i -> true;
final IntPredicate alwaysFalse = i -> false;
c3.accept(isZero);
c3.accept(isEven);
c3.accept(alwaysTrue);
c3.accept(alwaysFalse);
}
/** Test case for
* {@link org.apache.calcite.util.ImmutableBitSet#toImmutableBitSet()}. */
@Test void testCollector() {
checkCollector(0, 20);
checkCollector();
checkCollector(1, 63);
checkCollector(1, 63, 1);
checkCollector(0, 257);
checkCollector(1024, 257);
}
private void checkCollector(int... integers) {
final List<Integer> list = Ints.asList(integers);
final List<Integer> sortedUniqueList = new ArrayList<>(new TreeSet<>(list));
final ImmutableBitSet bitSet =
list.stream().collect(ImmutableBitSet.toImmutableBitSet());
assertThat(bitSet.asList(), is(sortedUniqueList));
}
}