1 package civitas.util.tests;
2
3 import java.io.IOException;
4 import java.io.Reader;
5 import java.util.Comparator;
6 import java.util.Map;
7 import java.util.Map.Entry;
8
9 import org.mockito.invocation.InvocationOnMock;
10 import org.mockito.stubbing.Answer;
11
12 public class ReaderAnswer<T> implements Answer<T> {
13
14 private final Map<String, T> mockingMap;
15
16 public ReaderAnswer(final Map<String, T> mockingMap) {
17 this.mockingMap = mockingMap;
18 }
19
20 @Override
21 public T answer(final InvocationOnMock invocation) throws IOException {
22 Reader reader = (Reader) invocation.getArguments()[0];
23 for (Entry<String, T> entry : mockingMap.entrySet().stream()
24 .sorted(Comparator.comparingInt(o -> o.getKey().length()))
25 .toList()) {
26 T value = mockValueFromStream(reader, entry.getKey(), entry.getValue());
27 if (null != value) {
28 return value;
29 }
30 }
31 return null;
32 }
33
34 T mockValueFromStream(final Reader reader, final String theString, final T theValue) throws IOException {
35 int len = theString.length();
36 reader.mark(len + 1);
37 char[] buf = new char[len];
38 reader.read(buf);
39 if (new String(buf).equals(theString)) {
40 return theValue;
41 } else {
42 reader.reset();
43 return null;
44 }
45 }
46 }