1 package net.pterodactylus.sone.core;
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.is;
5 import static org.hamcrest.Matchers.nullValue;
7 import java.util.concurrent.atomic.AtomicInteger;
8 import java.util.concurrent.atomic.AtomicReference;
10 import javax.annotation.Nullable;
12 import net.pterodactylus.sone.core.Options.DefaultOption;
13 import net.pterodactylus.sone.core.Options.Option;
14 import net.pterodactylus.sone.core.Options.OptionWatcher;
16 import com.google.common.base.Predicate;
17 import org.junit.Test;
20 * Unit test for {@link DefaultOption}.
22 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
24 public class DefaultOptionTest {
26 private final Object defaultValue = new Object();
27 private final Object acceptedValue = new Object();
28 private final Predicate<Object> matchesAcceptedValue = new Predicate<Object>() {
30 public boolean apply(@Nullable Object object) {
31 return acceptedValue.equals(object);
36 public void defaultOptionReturnsDefaultValueWhenUnset() {
37 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
38 assertThat(defaultOption.get(), is(defaultValue));
42 public void defaultOptionReturnsNullForRealWhenUnset() {
43 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
44 assertThat(defaultOption.getReal(), nullValue());
48 public void defaultOptionWillReturnSetValue() {
49 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
50 Object newValue = new Object();
51 defaultOption.set(newValue);
52 assertThat(defaultOption.get(), is(newValue));
56 public void defaultOptionWithValidatorAcceptsValidValues() {
57 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, matchesAcceptedValue);
58 defaultOption.set(acceptedValue);
59 assertThat(defaultOption.get(), is(acceptedValue));
62 @Test(expected = IllegalArgumentException.class)
63 public void defaultOptionWithValidatorRejectsInvalidValues() {
64 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, matchesAcceptedValue);
65 defaultOption.set(new Object());
69 public void watcherIsNotifiedOnChange() {
70 final AtomicReference<Object> changedObject = new AtomicReference<Object>();
71 Object newValue = new Object();
72 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, new OptionWatcher<Object>() {
74 public void optionChanged(Option<Object> option, Object oldValue, Object newValue) {
75 assertThat(oldValue, nullValue());
76 changedObject.set(newValue);
79 defaultOption.set(newValue);
80 assertThat(defaultOption.get(), is(newValue));
81 assertThat(changedObject.get(), is(newValue));
85 public void watcherIsNotNotifiedIfValueIsSetTwice() {
86 final AtomicInteger changeCounter = new AtomicInteger();
87 Object newValue = new Object();
88 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, new OptionWatcher<Object>() {
90 public void optionChanged(Option<Object> option, Object oldValue, Object newValue) {
91 changeCounter.incrementAndGet();
94 defaultOption.set(newValue);
95 defaultOption.set(newValue);
96 assertThat(changeCounter.get(), is(1));
100 public void defaultOptionValidatesObjectsCorrectly() {
101 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, matchesAcceptedValue);
102 assertThat(defaultOption.validate(acceptedValue), is(true));
103 assertThat(defaultOption.validate(new Object()), is(false));