8a1f8d5c16a88ee8706877c15ba60cfca2df9c18
[Sone.git] / src / test / java / net / pterodactylus / sone / core / DefaultOptionTest.java
1 package net.pterodactylus.sone.core;
2
3 import static org.hamcrest.MatcherAssert.assertThat;
4 import static org.hamcrest.Matchers.is;
5 import static org.hamcrest.Matchers.nullValue;
6
7 import java.util.concurrent.atomic.AtomicInteger;
8 import java.util.concurrent.atomic.AtomicReference;
9
10 import javax.annotation.Nullable;
11
12 import net.pterodactylus.sone.core.Options.DefaultOption;
13 import net.pterodactylus.sone.core.Options.Option;
14 import net.pterodactylus.sone.core.Options.OptionWatcher;
15
16 import com.google.common.base.Predicate;
17 import org.junit.Test;
18
19 /**
20  * Unit test for {@link DefaultOption}.
21  *
22  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
23  */
24 public class DefaultOptionTest {
25
26         private final Object defaultValue = new Object();
27         private final Object acceptedValue = new Object();
28         private final Predicate<Object> matchesAcceptedValue = new Predicate<Object>() {
29                 @Override
30                 public boolean apply(@Nullable Object object) {
31                         return acceptedValue.equals(object);
32                 }
33         };
34
35         @Test
36         public void defaultOptionReturnsDefaultValueWhenUnset() {
37                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
38                 assertThat(defaultOption.get(), is(defaultValue));
39         }
40
41         @Test
42         public void defaultOptionReturnsNullForRealWhenUnset() {
43                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
44                 assertThat(defaultOption.getReal(), nullValue());
45         }
46
47         @Test
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));
53         }
54
55         @Test
56         public void defaultOptionWithValidatorAcceptsValidValues() {
57                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, matchesAcceptedValue);
58                 defaultOption.set(acceptedValue);
59                 assertThat(defaultOption.get(), is(acceptedValue));
60         }
61
62         @Test(expected = IllegalArgumentException.class)
63         public void defaultOptionWithValidatorRejectsInvalidValues() {
64                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, matchesAcceptedValue);
65                 defaultOption.set(new Object());
66         }
67
68         @Test
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>() {
73                         @Override
74                         public void optionChanged(Option<Object> option, Object oldValue, Object newValue) {
75                                 assertThat(oldValue, nullValue());
76                                 changedObject.set(newValue);
77                         }
78                 });
79                 defaultOption.set(newValue);
80                 assertThat(defaultOption.get(), is(newValue));
81                 assertThat(changedObject.get(), is(newValue));
82         }
83
84         @Test
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>() {
89                         @Override
90                         public void optionChanged(Option<Object> option, Object oldValue, Object newValue) {
91                                 changeCounter.incrementAndGet();
92                         }
93                 });
94                 defaultOption.set(newValue);
95                 defaultOption.set(newValue);
96                 assertThat(changeCounter.get(), is(1));
97         }
98
99         @Test
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));
104         }
105
106         @Test
107         public void settingToNullWillRestoreDefaultValue() {
108                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
109                 defaultOption.set(null);
110                 assertThat(defaultOption.get(), is(defaultValue));
111         }
112
113         @Test
114         public void validateWithoutValidatorWillValidateNull() {
115                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue);
116                 assertThat(defaultOption.validate(null), is(true));
117         }
118
119         @Test
120         public void validateWithValidatorWillValidateNull() {
121                 DefaultOption<Object> defaultOption = new DefaultOption<Object>(defaultValue, matchesAcceptedValue);
122                 assertThat(defaultOption.validate(null), is(true));
123         }
124
125 }