1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.lang3.function;
19
20 import static org.apache.commons.lang3.LangAssertions.assertNullPointerException;
21 import static org.junit.jupiter.api.Assertions.assertEquals;
22 import static org.junit.jupiter.api.Assertions.assertNotNull;
23 import static org.junit.jupiter.api.Assertions.assertThrows;
24
25 import java.io.IOException;
26 import java.util.concurrent.atomic.AtomicReference;
27
28 import org.apache.commons.lang3.AbstractLangTest;
29 import org.junit.jupiter.api.Test;
30
31
32
33
34 class FailableConsumerTest extends AbstractLangTest {
35
36 @Test
37 void testAccept_invokesConsumer() throws IOException {
38 final AtomicReference<String> ref = new AtomicReference<>();
39 final FailableConsumer<String, IOException> consumer = ref::set;
40 consumer.accept("world");
41 assertEquals("world", ref.get());
42 }
43
44 @Test
45 void testAccept_throwsCheckedExceptionOnFailure() {
46 final IOException expected = new IOException("fail");
47 final FailableConsumer<String, IOException> consumer = s -> {
48 throw expected;
49 };
50 final IOException thrown = assertThrows(IOException.class, () -> consumer.accept("x"));
51 assertEquals(expected, thrown);
52 }
53
54 @Test
55 void testAndThen_bothInvoked() throws IOException {
56 final AtomicReference<String> ref1 = new AtomicReference<>();
57 final AtomicReference<String> ref2 = new AtomicReference<>();
58 final FailableConsumer<String, IOException> first = ref1::set;
59 final FailableConsumer<String, IOException> second = ref2::set;
60 first.andThen(second).accept("value");
61 assertEquals("value", ref1.get());
62 assertEquals("value", ref2.get());
63 }
64
65 @Test
66 void testAndThen_firstThrows_secondNotInvoked() {
67 final IOException expected = new IOException("first");
68 final AtomicReference<String> ref = new AtomicReference<>();
69 final FailableConsumer<String, IOException> throwing = s -> {
70 throw expected;
71 };
72 final FailableConsumer<String, IOException> second = ref::set;
73 final IOException thrown = assertThrows(IOException.class, () -> throwing.andThen(second).accept("x"));
74 assertEquals(expected, thrown);
75 assertEquals(null, ref.get(), "Second consumer should not have been invoked");
76 }
77
78 @Test
79 void testAndThen_nullAfter_throwsNullPointerException() throws Throwable {
80 final FailableConsumer<String, IOException> consumer = s -> {
81 };
82 assertNullPointerException(() -> consumer.andThen(null));
83 }
84
85 @Test
86 void testAndThen_secondThrows_propagatesException() {
87 final IOException expected = new IOException("second");
88 final AtomicReference<String> ref = new AtomicReference<>();
89 final FailableConsumer<String, IOException> first = ref::set;
90 final FailableConsumer<String, IOException> throwing = s -> {
91 throw expected;
92 };
93 final IOException thrown = assertThrows(IOException.class, () -> first.andThen(throwing).accept("v"));
94 assertEquals(expected, thrown);
95 assertEquals("v", ref.get(), "First consumer should have been invoked");
96 }
97
98 @Test
99 void testNop_acceptDoesNothing() throws Throwable {
100 FailableConsumer.nop().accept("anything");
101 }
102
103 @Test
104 void testNop_returnsNonNull() {
105 assertNotNull(FailableConsumer.nop());
106 }
107
108 @Test
109 void testStaticAccept_consumerThrows_propagatesException() {
110 final IOException expected = new IOException("boom");
111 final FailableConsumer<String, IOException> throwing = s -> {
112 throw expected;
113 };
114 final IOException thrown = assertThrows(IOException.class, () -> FailableConsumer.accept(throwing, "x"));
115 assertEquals(expected, thrown);
116 }
117
118 @Test
119 void testStaticAccept_nonNullConsumer_invokesConsumer() throws Exception {
120 final AtomicReference<String> ref = new AtomicReference<>();
121 FailableConsumer.accept(ref::set, "hello");
122 assertEquals("hello", ref.get());
123 }
124
125 @Test
126 void testStaticAccept_nullConsumer_doesNothing() throws Exception {
127 FailableConsumer.accept(null, "value");
128 }
129 }