View Javadoc
1   package io.atlassian.fugue;
2   
3   import org.junit.Rule;
4   import org.junit.Test;
5   import org.junit.rules.ExpectedException;
6   
7   import java.util.Iterator;
8   import java.util.Optional;
9   import java.util.concurrent.atomic.AtomicInteger;
10  import java.util.stream.Stream;
11  
12  import static java.util.stream.Collectors.toList;
13  import static org.hamcrest.Matchers.contains;
14  import static org.hamcrest.Matchers.emptyIterable;
15  import static org.hamcrest.Matchers.notNullValue;
16  import static org.hamcrest.core.Is.is;
17  import static org.junit.Assert.assertThat;
18  
19  public class TryDelayedTest {
20  
21    @Rule public ExpectedException thrown = ExpectedException.none();
22  
23    @Test public void success() {
24      Try<Integer> t = Checked.delay(() -> 1);
25      assertThat(t.isSuccess(), is(true));
26      assertThat(t.isFailure(), is(false));
27    }
28  
29    @Test public void failure() {
30      Try<Integer> t = Checked.delay(() -> {
31        throw new Exception("ex");
32      });
33      assertThat(t.isSuccess(), is(false));
34      assertThat(t.isFailure(), is(true));
35    }
36  
37    @Test public void onlyEvaluatedOnce() {
38      AtomicInteger evaluated = new AtomicInteger(0);
39      Try<Integer> t = Checked.delay(() -> evaluated.addAndGet(1));
40      t.isSuccess(); // evaluated at the first call
41      t.isFailure(); // evaluation result is already cached.
42      assertThat(evaluated.get(), is(1));
43    }
44  
45    @Test public void flatMapDoesNotEvaluate() {
46      AtomicInteger evaluated = new AtomicInteger(0);
47      Try<Integer> a = Checked.delay(() -> evaluated.addAndGet(1));
48      Try<Integer> b = a.flatMap(i -> Checked.now(() -> i * 10));
49      assertThat(evaluated.get(), is(0));
50      assertThat(b.getOrElse(() -> -1), is(10));
51      assertThat(evaluated.get(), is(1));
52    }
53  
54    @Test public void mapDoesNotEvaluate() {
55      AtomicInteger evaluated = new AtomicInteger(0);
56      Try<Integer> a = Checked.delay(() -> evaluated.addAndGet(1));
57      Try<Integer> b = a.map(i -> i * 10);
58      assertThat(evaluated.get(), is(0));
59      assertThat(b.getOrElse(() -> -1), is(10));
60      assertThat(evaluated.get(), is(1));
61    }
62  
63    @Test public void recoverDoesNotEvaluate() {
64      AtomicInteger evaluated = new AtomicInteger(0);
65      Try<Integer> a = Checked.delay(() -> {
66        evaluated.addAndGet(1);
67        throw new Exception();
68      });
69      Try<Integer> b = a.recover(e -> 0);
70      assertThat(evaluated.get(), is(0));
71      assertThat(b.getOrElse(() -> -1), is(0));
72      assertThat(evaluated.get(), is(1));
73    }
74  
75    @Test public void recoverWithDoesNotEvaluate() {
76      AtomicInteger evaluated = new AtomicInteger(0);
77      Try<Integer> a = Checked.delay(() -> {
78        evaluated.addAndGet(1);
79        throw new Exception();
80      });
81      Try<Integer> b = a.recoverWith(e -> Try.successful(0));
82      assertThat(evaluated.get(), is(0));
83      assertThat(b.getOrElse(() -> -1), is(0));
84      assertThat(evaluated.get(), is(1));
85    }
86  
87    @Test public void orElseSuccessInstanceDoesNotEvaluate() {
88      AtomicInteger evaluated = new AtomicInteger(0);
89      Try<Integer> a = Checked.delay(() -> evaluated.addAndGet(1));
90      Try<Integer> b = a.orElse(Try.successful(19));
91      assertThat(evaluated.get(), is(0));
92      assertThat(b.getOrElse(() -> -1), is(1));
93      assertThat(evaluated.get(), is(1));
94    }
95  
96    @Test public void orElseSuccessSupplierDoesNotEvaluate() {
97      AtomicInteger evaluated = new AtomicInteger(0);
98      Try<Integer> a = Checked.delay(() -> evaluated.addAndGet(1));
99      Try<Integer> b = a.orElse(() -> Try.successful(19));
100     assertThat(evaluated.get(), is(0));
101     assertThat(b.getOrElse(() -> -1), is(1));
102     assertThat(evaluated.get(), is(1));
103   }
104 
105   @Test public void orElseFailureInstanceDoesNotEvaluate() {
106     AtomicInteger evaluated = new AtomicInteger(0);
107     Try<Integer> a = Checked.delay(() -> {
108       evaluated.incrementAndGet();
109       throw new RuntimeException();
110     });
111     Try<Integer> b = a.orElse(Try.successful(19));
112     assertThat(evaluated.get(), is(0));
113     assertThat(b.getOrElse(() -> -1), is(19));
114     assertThat(evaluated.get(), is(1));
115   }
116 
117   @Test public void orElseFailureSupplierDoesNotEvaluate() {
118     AtomicInteger evaluated = new AtomicInteger(0);
119     Try<Integer> a = Checked.delay(() -> {
120       evaluated.incrementAndGet();
121       throw new RuntimeException();
122     });
123     Try<Integer> b = a.orElse(() -> Try.successful(19));
124     assertThat(evaluated.get(), is(0));
125     assertThat(b.getOrElse(() -> -1), is(19));
126     assertThat(evaluated.get(), is(1));
127   }
128 
129   @Test public void filterOrElseTrueDoesNotEvaluate() {
130     AtomicInteger evaluated = new AtomicInteger(0);
131     Try<Integer> a = Checked.delay(() -> {
132       evaluated.addAndGet(1);
133       return 4;
134     });
135     Try<Integer> b = a.filterOrElse(v -> true, IllegalStateException::new);
136     assertThat(evaluated.get(), is(0));
137     assertThat(b.getOrElse(() -> -1), is(4));
138     assertThat(evaluated.get(), is(1));
139   }
140 
141   @Test public void filterOrElseFalseDoesNotEvaluate() {
142     AtomicInteger evaluated = new AtomicInteger(0);
143     Try<Integer> a = Checked.delay(() -> evaluated.addAndGet(1));
144     Try<Integer> b = a.filterOrElse(v -> false, IllegalStateException::new);
145     assertThat(evaluated.get(), is(0));
146     assertThat(b.getOrElse(() -> -1), is(-1));
147     assertThat(evaluated.get(), is(1));
148   }
149 
150   @Test public void filterOrElseFailureDoesNotEvaluate() {
151     AtomicInteger evaluated = new AtomicInteger(0);
152     Try<Integer> a = Checked.delay(() -> {
153       evaluated.incrementAndGet();
154       throw new RuntimeException();
155     });
156     Try<Integer> b = a.filterOrElse(v -> true, IllegalStateException::new);
157     assertThat(evaluated.get(), is(0));
158     assertThat(b.getOrElse(() -> -1), is(-1));
159     assertThat(evaluated.get(), is(1));
160   }
161 
162   @Test public void toOption() {
163     Try<Integer> t = Checked.delay(() -> 1);
164     assertThat(t.toOption(), is(Option.some(1)));
165   }
166 
167   @Test public void toOptionNone() {
168     Try<Integer> t = Checked.delay(() -> {
169       throw new RuntimeException();
170     });
171     assertThat(t.toOption(), is(Option.none()));
172   }
173 
174   @Test public void toEitherRight() {
175     Try<Integer> t = Checked.delay(() -> 1);
176     assertThat(t.toEither(), is(Either.right(1)));
177   }
178 
179   @Test public void toEitherLeft() {
180     RuntimeException runtimeException = new RuntimeException();
181     Try<Integer> t = Checked.delay(() -> {
182       throw runtimeException;
183     });
184     assertThat(t.toEither(), is(Either.left(runtimeException)));
185   }
186 
187   @Test public void toOptional() {
188     Try<Integer> t = Checked.delay(() -> 1);
189     assertThat(t.toOptional(), is(Optional.of(1)));
190   }
191 
192   @Test public void toOptionalEmpty() {
193     Try<Integer> t = Checked.delay(() -> {
194       throw new RuntimeException();
195     });
196     assertThat(t.toOptional(), is(Optional.empty()));
197   }
198 
199   @Test public void toStream() {
200     Try<Integer> t = Checked.delay(() -> 1);
201     Stream<Integer> stream = t.toStream();
202     assertThat(stream, notNullValue());
203     assertThat(stream.collect(toList()), contains(1));
204   }
205 
206   @Test public void toStreamEmpty() {
207     Try<Integer> t = Checked.delay(() -> {
208       throw new RuntimeException();
209     });
210     Stream<Integer> stream = t.toStream();
211     assertThat(stream, notNullValue());
212     assertThat(stream.collect(toList()), emptyIterable());
213   }
214 
215   @Test public void forEach() {
216     Try<Integer> t = Checked.delay(() -> 1);
217     final AtomicInteger invoked = new AtomicInteger(0);
218     t.forEach(invoked::set);
219 
220     assertThat(invoked.get(), is(1));
221   }
222 
223   @Test public void forEachEmpty() {
224     Try<Integer> t = Checked.delay(() -> {
225       throw new RuntimeException();
226     });
227     final AtomicInteger invoked = new AtomicInteger(0);
228     t.forEach(invoked::set);
229     assertThat(invoked.get(), is(0));
230   }
231 
232   @Test public void iteratorNotEmpty() {
233     Try<Integer> t = Checked.delay(() -> 18);
234     Iterator<Integer> iterator = t.iterator();
235     assertThat(iterator.hasNext(), is(true));
236     assertThat(iterator.next(), is(18));
237     assertThat(iterator.hasNext(), is(false));
238   }
239 
240   @Test public void iteratorEmpty() {
241     Try<Integer> t = Checked.delay(() -> {
242       throw new RuntimeException();
243     });
244     Iterator<Integer> iterator = t.iterator();
245     assertThat(iterator.hasNext(), is(false));
246   }
247 
248 }