/*
// 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 net.hydromatic.optiq.util;
import org.eigenbase.util.ImmutableIntList;
import com.google.common.collect.Maps;
import org.junit.Test;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
import java.util.SortedMap;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* Unit test for {@link net.hydromatic.optiq.util.BitSets}.
*/
public class BitSetsTest {
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#toIter(java.util.BitSet)}.
*/
@Test public void testToIterBitSet() {
BitSet bitSet = new BitSet();
assertToIterBitSet("", bitSet);
bitSet.set(0);
assertToIterBitSet("0", bitSet);
bitSet.set(1);
assertToIterBitSet("0, 1", bitSet);
bitSet.clear();
bitSet.set(10);
assertToIterBitSet("10", bitSet);
}
/**
* Tests that iterating over a BitSet yields the expected string.
*
* @param expected Expected string
* @param bitSet Bit set
*/
private void assertToIterBitSet(final String expected, BitSet bitSet) {
StringBuilder buf = new StringBuilder();
for (int i : BitSets.toIter(bitSet)) {
if (buf.length() > 0) {
buf.append(", ");
}
buf.append(Integer.toString(i));
}
assertEquals(expected, buf.toString());
}
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#toList(java.util.BitSet)}.
*/
@Test public void testToListBitSet() {
BitSet bitSet = new BitSet(10);
assertEquals(BitSets.toList(bitSet), Collections.<Integer>emptyList());
bitSet.set(5);
assertEquals(BitSets.toList(bitSet), Arrays.asList(5));
bitSet.set(3);
assertEquals(BitSets.toList(bitSet), Arrays.asList(3, 5));
}
/**
* Tests the method {@link net.hydromatic.optiq.util.BitSets#of(int...)}.
*/
@Test public void testBitSetOf() {
assertEquals(
BitSets.toList(BitSets.of(0, 4, 2)),
Arrays.asList(0, 2, 4));
assertEquals(
BitSets.toList(BitSets.of()),
Collections.<Integer>emptyList());
}
/**
* Tests the method {@link net.hydromatic.optiq.util.BitSets#range(int, int)}.
*/
@Test public void testBitSetsRange() {
assertEquals(
BitSets.toList(BitSets.range(0, 4)),
Arrays.asList(0, 1, 2, 3));
assertEquals(
BitSets.toList(BitSets.range(1, 4)),
Arrays.asList(1, 2, 3));
assertEquals(
BitSets.toList(BitSets.range(2, 2)),
Collections.<Integer>emptyList());
}
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#toArray(java.util.BitSet)}.
*/
@Test public void testBitSetsToArray() {
int[][] arrays = {{}, {0}, {0, 2}, {1, 65}, {100}};
for (int[] array : arrays) {
assertThat(BitSets.toArray(BitSets.of(array)), equalTo(array));
}
}
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#union(java.util.BitSet, java.util.BitSet...)}.
*/
@Test public void testBitSetsUnion() {
assertThat(BitSets.union(BitSets.of(1), BitSets.of(3)).toString(),
equalTo("{1, 3}"));
assertThat(BitSets.union(BitSets.of(1), BitSets.of(3, 100)).toString(),
equalTo("{1, 3, 100}"));
assertThat(
BitSets.union(BitSets.of(1), BitSets.of(2), BitSets.of(), BitSets.of(3))
.toString(),
equalTo("{1, 2, 3}"));
}
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#contains(java.util.BitSet, java.util.BitSet)}.
*/
@Test public void testBitSetsContains() {
assertTrue(BitSets.contains(BitSets.range(0, 5), BitSets.range(2, 4)));
assertTrue(BitSets.contains(BitSets.range(0, 5), BitSets.of(4)));
assertFalse(BitSets.contains(BitSets.range(0, 5), BitSets.of(14)));
assertFalse(BitSets.contains(BitSets.range(20, 25), BitSets.of(14)));
final BitSet empty = BitSets.of();
assertTrue(BitSets.contains(BitSets.range(20, 25), empty));
assertTrue(BitSets.contains(empty, empty));
assertFalse(BitSets.contains(empty, BitSets.of(0)));
assertFalse(BitSets.contains(empty, BitSets.of(1)));
assertFalse(BitSets.contains(empty, BitSets.of(1000)));
assertTrue(BitSets.contains(BitSets.of(1, 4, 7), BitSets.of(1, 4, 7)));
}
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#of(org.eigenbase.util.ImmutableIntList)}.
*/
@Test public void testBitSetOfImmutableIntList() {
ImmutableIntList list = ImmutableIntList.of();
assertThat(BitSets.of(list), equalTo(new BitSet()));
list = ImmutableIntList.of(2, 70, 5, 0);
assertThat(BitSets.of(list), equalTo(BitSets.of(0, 2, 5, 70)));
}
/**
* Tests the method
* {@link net.hydromatic.optiq.util.BitSets#previousClearBit(java.util.BitSet, int)}.
*/
@Test public void testPreviousClearBit() {
assertThat(BitSets.previousClearBit(BitSets.of(), 10), equalTo(10));
assertThat(BitSets.previousClearBit(BitSets.of(), 0), equalTo(0));
assertThat(BitSets.previousClearBit(BitSets.of(), -1), equalTo(-1));
try {
final int actual = BitSets.previousClearBit(BitSets.of(), -2);
fail("expected exception, got " + actual);
} catch (IndexOutOfBoundsException e) {
// ok
}
assertThat(BitSets.previousClearBit(BitSets.of(0, 1, 3, 4), 4), equalTo(2));
assertThat(BitSets.previousClearBit(BitSets.of(0, 1, 3, 4), 3), equalTo(2));
assertThat(BitSets.previousClearBit(BitSets.of(0, 1, 3, 4), 2), equalTo(2));
assertThat(BitSets.previousClearBit(BitSets.of(0, 1, 3, 4), 1),
equalTo(-1));
assertThat(BitSets.previousClearBit(BitSets.of(1, 3, 4), 1), equalTo(0));
}
/**
* Tests the method {@link BitSets#closure(java.util.SortedMap)}
*/
@Test public void testClosure() {
final SortedMap<Integer, BitSet> empty = Maps.newTreeMap();
assertThat(BitSets.closure(empty), equalTo(empty));
// Currently you need an entry for each position, otherwise you get an NPE.
// We should fix that.
final SortedMap<Integer, BitSet> map = Maps.newTreeMap();
map.put(0, BitSets.of(3));
map.put(1, BitSets.of());
map.put(2, BitSets.of(7));
map.put(3, BitSets.of(4, 12));
map.put(4, BitSets.of());
map.put(5, BitSets.of());
map.put(6, BitSets.of());
map.put(7, BitSets.of());
map.put(8, BitSets.of());
map.put(9, BitSets.of());
map.put(10, BitSets.of());
map.put(11, BitSets.of());
map.put(12, BitSets.of());
String original = map.toString();
assertThat(BitSets.closure(map).toString(),
equalTo(
"{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("argument modified", map.toString(), equalTo(original));
}
}
// End BitSetsTest.java