/*
* Copyright (C) 2011 The Guava Authors
*
* Licensed 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 com.google.common.collect;
import static com.google.common.collect.BoundType.OPEN;
import junit.framework.TestCase;
import java.util.Map;
/**
* Tests for {@code RangeMap}.
*
* @author Louis Wasserman
*/
public class RangeMapTest extends TestCase {
private static final ImmutableList<Range<Integer>> RANGES;
private static final int MIN_BOUND = -1;
private static final int MAX_BOUND = 1;
static {
ImmutableList.Builder<Range<Integer>> builder = ImmutableList.builder();
builder.add(Ranges.<Integer>all());
// Add one-ended ranges
for (int i = MIN_BOUND; i <= MAX_BOUND; i++) {
for (BoundType type : BoundType.values()) {
builder.add(Ranges.upTo(i, type));
builder.add(Ranges.downTo(i, type));
}
}
// Add two-ended ranges
for (int i = MIN_BOUND; i <= MAX_BOUND; i++) {
for (int j = i; j <= MAX_BOUND; j++) {
for (BoundType lowerType : BoundType.values()) {
for (BoundType upperType : BoundType.values()) {
if (i == j & lowerType == OPEN & upperType == OPEN) {
continue;
}
builder.add(Ranges.range(i, lowerType, j, upperType));
}
}
}
}
RANGES = builder.build();
}
public void testAllRangesAlone() {
for (Range<Integer> range : RANGES) {
Map<Integer, Integer> model = Maps.newHashMap();
putModel(model, range, 1);
RangeMap<Integer, Integer> test = RangeMap.create();
test.put(range, 1);
verify(model, test);
}
}
public void testAllRangePairs() {
for (Range<Integer> range1 : RANGES) {
for (Range<Integer> range2 : RANGES) {
Map<Integer, Integer> model = Maps.newHashMap();
putModel(model, range1, 1);
putModel(model, range2, 2);
RangeMap<Integer, Integer> test = RangeMap.create();
test.put(range1, 1);
test.put(range2, 2);
verify(model, test);
}
}
}
public void testAllRangeTriples() {
for (Range<Integer> range1 : RANGES) {
for (Range<Integer> range2 : RANGES) {
for (Range<Integer> range3 : RANGES) {
Map<Integer, Integer> model = Maps.newHashMap();
putModel(model, range1, 1);
putModel(model, range2, 2);
putModel(model, range3, 3);
RangeMap<Integer, Integer> test = RangeMap.create();
test.put(range1, 1);
test.put(range2, 2);
test.put(range3, 3);
verify(model, test);
}
}
}
}
public void testPutAll1() {
for (Range<Integer> range1 : RANGES) {
for (Range<Integer> range2 : RANGES) {
for (Range<Integer> range3 : RANGES) {
Map<Integer, Integer> model = Maps.newHashMap();
putModel(model, range1, 1);
putModel(model, range2, 2);
putModel(model, range3, 3);
RangeMap<Integer, Integer> test = RangeMap.create();
RangeMap<Integer, Integer> test2 = RangeMap.create();
// put range2 and range3 into test2, and then put test2 into test
test.put(range1, 1);
test2.put(range2, 2);
test2.put(range3, 3);
test.putAll(test2);
verify(model, test);
}
}
}
}
public void testPutAll2() {
for (Range<Integer> range1 : RANGES) {
for (Range<Integer> range2 : RANGES) {
for (Range<Integer> range3 : RANGES) {
Map<Integer, Integer> model = Maps.newHashMap();
putModel(model, range1, 1);
putModel(model, range2, 2);
putModel(model, range3, 3);
RangeMap<Integer, Integer> test = RangeMap.create();
RangeMap<Integer, Integer> test2 = RangeMap.create();
// put range3 into test2, and then put test2 into test
test.put(range1, 1);
test.put(range2, 2);
test2.put(range3, 3);
test.putAll(test2);
verify(model, test);
}
}
}
}
private void verify(Map<Integer, Integer> model, RangeMap<Integer, Integer> test) {
for (int i = MIN_BOUND - 1; i <= MAX_BOUND + 1; i++) {
assertEquals(model.get(i), test.get(i));
}
}
private void putModel(Map<Integer, Integer> model, Range<Integer> range, int value) {
for (int i = MIN_BOUND - 1; i <= MAX_BOUND + 1; i++) {
if (range.contains(i)) {
model.put(i, value);
}
}
}
}