View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.commons.function;
18  
19  import static org.junit.jupiter.api.Assertions.*;
20  
21  import java.util.concurrent.atomic.AtomicInteger;
22  
23  import org.apache.juneau.*;
24  import org.junit.jupiter.api.*;
25  
26  class Consumer5_Test extends TestBase {
27  
28  	//------------------------------------------------------------------------------------------------------------------
29  	// Basic tests.
30  	//------------------------------------------------------------------------------------------------------------------
31  	@Test void a01_basic() {
32  		var callCount = new AtomicInteger();
33  		var receivedA = new StringBuilder();
34  		var receivedB = new StringBuilder();
35  		var receivedC = new StringBuilder();
36  		var receivedD = new StringBuilder();
37  		var receivedE = new StringBuilder();
38  
39  		Consumer5<String,Integer,Boolean,Double,Character> x = (a, b, c, d, e) -> {
40  			callCount.incrementAndGet();
41  			receivedA.append(a);
42  			receivedB.append(b);
43  			receivedC.append(c);
44  			receivedD.append(d);
45  			receivedE.append(e);
46  		};
47  
48  		x.apply("foo", 42, true, 3.14, 'X');
49  		assertEquals(1, callCount.get());
50  		assertEquals("foo", receivedA.toString());
51  		assertEquals("42", receivedB.toString());
52  		assertEquals("true", receivedC.toString());
53  		assertEquals("3.14", receivedD.toString());
54  		assertEquals("X", receivedE.toString());
55  	}
56  
57  	@Test void a02_withNullValues() {
58  		var callCount = new AtomicInteger();
59  		var receivedA = new Object[1];
60  		var receivedB = new Object[1];
61  		var receivedC = new Object[1];
62  		var receivedD = new Object[1];
63  		var receivedE = new Object[1];
64  
65  		Consumer5<String,Integer,Boolean,Double,Character> x = (a, b, c, d, e) -> {
66  			callCount.incrementAndGet();
67  			receivedA[0] = a;
68  			receivedB[0] = b;
69  			receivedC[0] = c;
70  			receivedD[0] = d;
71  			receivedE[0] = e;
72  		};
73  
74  		x.apply(null, null, null, null, null);
75  		assertEquals(1, callCount.get());
76  		assertNull(receivedA[0]);
77  		assertNull(receivedB[0]);
78  		assertNull(receivedC[0]);
79  		assertNull(receivedD[0]);
80  		assertNull(receivedE[0]);
81  	}
82  
83  	//------------------------------------------------------------------------------------------------------------------
84  	// andThen tests.
85  	//------------------------------------------------------------------------------------------------------------------
86  	@Test void b01_andThen_bothCalled() {
87  		var firstCallCount = new AtomicInteger();
88  		var secondCallCount = new AtomicInteger();
89  
90  		Consumer5<String,Integer,Boolean,Double,Character> first = (a, b, c, d, e) -> firstCallCount.incrementAndGet();
91  		Consumer5<String,Integer,Boolean,Double,Character> second = (a, b, c, d, e) -> secondCallCount.incrementAndGet();
92  
93  		var composed = first.andThen(second);
94  		composed.apply("test", 123, false, 2.5, 'Y');
95  
96  		assertEquals(1, firstCallCount.get());
97  		assertEquals(1, secondCallCount.get());
98  	}
99  
100 	@Test void b02_andThen_calledInOrder() {
101 		var callOrder = new StringBuilder();
102 
103 		Consumer5<String,Integer,Boolean,Double,Character> first = (a, b, c, d, e) -> callOrder.append("first");
104 		Consumer5<String,Integer,Boolean,Double,Character> second = (a, b, c, d, e) -> callOrder.append("second");
105 
106 		var composed = first.andThen(second);
107 		composed.apply("test", 123, false, 2.5, 'Y');
108 
109 		assertEquals("firstsecond", callOrder.toString());
110 	}
111 
112 	@Test void b03_andThen_sameArgumentsPassed() {
113 		var firstArgs = new Object[5];
114 		var secondArgs = new Object[5];
115 
116 		Consumer5<String,Integer,Boolean,Double,Character> first = (a, b, c, d, e) -> {
117 			firstArgs[0] = a;
118 			firstArgs[1] = b;
119 			firstArgs[2] = c;
120 			firstArgs[3] = d;
121 			firstArgs[4] = e;
122 		};
123 		Consumer5<String,Integer,Boolean,Double,Character> second = (a, b, c, d, e) -> {
124 			secondArgs[0] = a;
125 			secondArgs[1] = b;
126 			secondArgs[2] = c;
127 			secondArgs[3] = d;
128 			secondArgs[4] = e;
129 		};
130 
131 		var composed = first.andThen(second);
132 		composed.apply("foo", 42, true, 3.14, 'X');
133 
134 		assertEquals("foo", firstArgs[0]);
135 		assertEquals(42, firstArgs[1]);
136 		assertEquals(true, firstArgs[2]);
137 		assertEquals(3.14, firstArgs[3]);
138 		assertEquals('X', firstArgs[4]);
139 		assertEquals("foo", secondArgs[0]);
140 		assertEquals(42, secondArgs[1]);
141 		assertEquals(true, secondArgs[2]);
142 		assertEquals(3.14, secondArgs[3]);
143 		assertEquals('X', secondArgs[4]);
144 	}
145 
146 	@Test void b04_andThen_chaining() {
147 		var callCount = new AtomicInteger();
148 
149 		Consumer5<String,Integer,Boolean,Double,Character> first = (a, b, c, d, e) -> callCount.addAndGet(1);
150 		Consumer5<String,Integer,Boolean,Double,Character> second = (a, b, c, d, e) -> callCount.addAndGet(10);
151 		Consumer5<String,Integer,Boolean,Double,Character> third = (a, b, c, d, e) -> callCount.addAndGet(100);
152 
153 		var composed = first.andThen(second).andThen(third);
154 		composed.apply("test", 123, false, 2.5, 'Y');
155 
156 		assertEquals(111, callCount.get());
157 	}
158 }
159