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();
41 t.isFailure();
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 }