/*
* Copyright 2011 Google Inc. All Rights Reserved.
*
* 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.googlecode.concurrentlinkedhashmap;
import static com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.MAXIMUM_CAPACITY;
import static com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.Builder.DEFAULT_CONCURRENCY_LEVEL;
import static com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.Builder.DEFAULT_INITIAL_CAPACITY;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.sameInstance;
import org.testng.annotations.Test;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.BoundedEntryWeigher;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.Builder;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.DiscardingListener;
import com.googlecode.concurrentlinkedhashmap.Weighers.EntryWeigherView;
/**
* A unit-test for the builder methods.
*
* @author bmanes@google.com (Ben Manes)
*/
@Test(groups = "development")
public final class BuilderTest extends AbstractTest {
@Test(expectedExceptions = IllegalStateException.class)
public void unconfigured() {
new Builder<Object, Object>().build();
}
@Test(dataProvider = "builder", expectedExceptions = IllegalArgumentException.class)
public void initialCapacity_withNegative(Builder<?, ?> builder) {
builder.initialCapacity(-100);
}
@Test(dataProvider = "builder")
public void initialCapacity_withDefault(Builder<?, ?> builder) {
assertThat(builder.initialCapacity, is(DEFAULT_INITIAL_CAPACITY));
builder.build(); // can't check, so just assert that it builds
}
@Test(dataProvider = "builder")
public void initialCapacity_withCustom(Builder<?, ?> builder) {
assertThat(builder.initialCapacity(100).initialCapacity, is(equalTo(100)));
builder.build(); // can't check, so just assert that it builds
}
@Test(dataProvider = "builder", expectedExceptions = IllegalArgumentException.class)
public void maximumWeightedCapacity_withNegative(Builder<?, ?> builder) {
builder.maximumWeightedCapacity(-100);
}
@Test(dataProvider = "builder")
public void maximumWeightedCapacity(Builder<?, ?> builder) {
assertThat(builder.build().capacity(), is(equalTo(capacity())));
}
@Test(dataProvider = "builder")
public void maximumWeightedCapacity_aboveMaximum(Builder<?, ?> builder) {
builder.maximumWeightedCapacity(MAXIMUM_CAPACITY + 1);
assertThat(builder.build().capacity(), is(MAXIMUM_CAPACITY));
}
@Test(dataProvider = "builder", expectedExceptions = IllegalArgumentException.class)
public void concurrencyLevel_withZero(Builder<?, ?> builder) {
builder.concurrencyLevel(0);
}
@Test(dataProvider = "builder", expectedExceptions = IllegalArgumentException.class)
public void concurrencyLevel_withNegative(Builder<?, ?> builder) {
builder.concurrencyLevel(-100);
}
@Test(dataProvider = "builder")
public void concurrencyLevel_withDefault(Builder<?, ?> builder) {
assertThat(builder.build().concurrencyLevel, is(DEFAULT_CONCURRENCY_LEVEL));
}
@Test(dataProvider = "builder")
public void concurrencyLevel_withCustom(Builder<?, ?> builder) {
assertThat(builder.concurrencyLevel(32).build().concurrencyLevel, is(32));
}
@Test(dataProvider = "builder", expectedExceptions = NullPointerException.class)
public void listener_withNull(Builder<?, ?> builder) {
builder.listener(null);
}
@Test(dataProvider = "builder")
public void listener_withDefault(Builder<Object, Object> builder) {
EvictionListener<Object, Object> listener = DiscardingListener.INSTANCE;
assertThat(builder.build().listener, is(sameInstance(listener)));
}
@Test
public void listener_withCustom() {
Builder<Integer, Integer> builder = new Builder<Integer, Integer>()
.maximumWeightedCapacity(capacity())
.listener(listener);
assertThat(builder.build().listener, is(sameInstance(listener)));
}
@Test(dataProvider = "builder", expectedExceptions = NullPointerException.class)
public void weigher_withNull(Builder<?, ?> builder) {
builder.weigher((Weigher<Object>) null);
}
@Test(dataProvider = "builder", expectedExceptions = NullPointerException.class)
public void weigher_withNull_entry(Builder<?, ?> builder) {
builder.weigher((EntryWeigher<Object, Object>) null);
}
@Test(dataProvider = "builder")
public void weigher_withDefault(Builder<Integer, Integer> builder) {
assertThat(builder.build().weigher, sameInstance((Object) Weighers.entrySingleton()));
}
@Test(dataProvider = "builder")
public void weigher_withCustom(Builder<Integer, byte[]> builder) {
builder.weigher(Weighers.byteArray());
EntryWeigher<?, ?> weigher = ((BoundedEntryWeigher<?, ?>) builder.build().weigher).weigher;
Weigher<?> customWeigher = ((EntryWeigherView<?, ?>) weigher).weigher;
assertThat(customWeigher, is(sameInstance((Object) Weighers.byteArray())));
}
@Test(dataProvider = "builder")
public void weigher_withCustom_entry(Builder<Integer, Integer> builder) {
EntryWeigher<Integer, Integer> custom = new EntryWeigher<Integer, Integer>() {
@Override public int weightOf(Integer key, Integer value) {
return key + value;
}
};
builder.weigher(custom);
EntryWeigher<?, ?> weigher = ((BoundedEntryWeigher<?, ?>) builder.build().weigher).weigher;
assertThat(weigher, is(sameInstance((Object) custom)));
}
}