1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.examples.io.threed;
18
19 import java.io.ByteArrayInputStream;
20 import java.io.ByteArrayOutputStream;
21 import java.io.File;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.util.Arrays;
25 import java.util.List;
26
27 import org.apache.commons.geometry.core.GeometryTestUtils;
28 import org.apache.commons.geometry.core.precision.DoublePrecisionContext;
29 import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext;
30 import org.apache.commons.geometry.euclidean.threed.BoundarySource3D;
31 import org.junit.Assert;
32 import org.junit.Test;
33
34 public class ModelIOHandlerRegistryTest {
35
36 private static final double TEST_EPS = 1e-10;
37
38 private static final DoublePrecisionContext TEST_PRECISION =
39 new EpsilonDoublePrecisionContext(TEST_EPS);
40
41 private static final BoundarySource3D SRC_A = BoundarySource3D.from();
42
43 private static final BoundarySource3D SRC_B = BoundarySource3D.from();
44
45 private ModelIOHandlerRegistry registry = new ModelIOHandlerRegistry();
46
47 @Test
48 public void testGetSetHandlers() {
49
50 StubHandler handlerA = new StubHandler("a", SRC_A);
51 StubHandler handlerB = new StubHandler("b", SRC_B);
52
53 List<ModelIOHandler> handlers = Arrays.asList(handlerA, handlerB);
54
55
56 registry.setHandlers(handlers);
57
58
59 List<ModelIOHandler> resultHandlers = registry.getHandlers();
60 Assert.assertNotSame(handlers, resultHandlers);
61 Assert.assertEquals(2, resultHandlers.size());
62
63 Assert.assertSame(handlerA, resultHandlers.get(0));
64 Assert.assertSame(handlerB, resultHandlers.get(1));
65 }
66
67 @Test
68 public void testSetHandlers_null() {
69
70 StubHandler handlerA = new StubHandler("a", SRC_A);
71 StubHandler handlerB = new StubHandler("b", SRC_B);
72
73 registry.setHandlers(Arrays.asList(handlerA, handlerB));
74
75
76 registry.setHandlers(null);
77
78
79 Assert.assertEquals(0, registry.getHandlers().size());
80 }
81
82 @Test
83 public void testGetHandlerForType() {
84
85 StubHandler handlerA = new StubHandler("a", SRC_A);
86 StubHandler handlerB = new StubHandler("b", SRC_B);
87
88 registry.setHandlers(Arrays.asList(handlerA, handlerB));
89
90
91 Assert.assertSame(handlerA, registry.getHandlerForType("a"));
92 Assert.assertSame(handlerB, registry.getHandlerForType("b"));
93
94 Assert.assertNull(registry.getHandlerForType(null));
95 Assert.assertNull(registry.getHandlerForType(""));
96 Assert.assertNull(registry.getHandlerForType(" "));
97 Assert.assertNull(registry.getHandlerForType("nope"));
98 }
99
100 @Test
101 public void testHandlesType() {
102
103 StubHandler handlerA = new StubHandler("a", SRC_A);
104 StubHandler handlerB = new StubHandler("b", SRC_B);
105
106 registry.setHandlers(Arrays.asList(handlerA, handlerB));
107
108
109 Assert.assertTrue(registry.handlesType("a"));
110 Assert.assertTrue(registry.handlesType("b"));
111
112 Assert.assertFalse(registry.handlesType(null));
113 Assert.assertFalse(registry.handlesType(""));
114 Assert.assertFalse(registry.handlesType(" "));
115 Assert.assertFalse(registry.handlesType("nope"));
116 }
117
118 @Test
119 public void testRead_typeFromFileExtension() {
120
121 StubHandler handlerA = new StubHandler("a", SRC_A);
122 StubHandler handlerB = new StubHandler("b", SRC_B);
123
124 registry.setHandlers(Arrays.asList(handlerA, handlerB));
125
126 File file = new File("file.B");
127
128
129 BoundarySource3D src = registry.read(file, TEST_PRECISION);
130
131
132 Assert.assertSame(SRC_B, src);
133 }
134
135 @Test
136 public void testRead_typeFromFileExtension_unknownType() {
137
138 File file = new File("file.B");
139
140
141 GeometryTestUtils.assertThrows(() -> {
142 registry.read(file, TEST_PRECISION);
143 }, IllegalArgumentException.class, "No handler found for type \"b\"");
144 }
145
146 @Test
147 public void testRead_typeFromFileExtension_noFileExtension() {
148
149 File file = new File("file");
150
151
152 GeometryTestUtils.assertThrows(() -> {
153 registry.read(file, TEST_PRECISION);
154 }, IllegalArgumentException.class,
155 "Cannot determine target file type: \"file\" does not have a file extension");
156 }
157
158 @Test
159 public void testRead_typeAndFile() {
160
161 StubHandler handlerA = new StubHandler("a", SRC_A);
162 StubHandler handlerB = new StubHandler("b", SRC_B);
163
164 registry.setHandlers(Arrays.asList(handlerA, handlerB));
165
166
167 BoundarySource3D src = registry.read("a", new File("file"), TEST_PRECISION);
168
169
170 Assert.assertSame(SRC_A, src);
171 }
172
173 @Test
174 public void testRead_typeAndFile_unknownType() {
175
176 File file = new File("file");
177
178
179 GeometryTestUtils.assertThrows(() -> {
180 registry.read("nope", file, TEST_PRECISION);
181 }, IllegalArgumentException.class, "No handler found for type \"nope\"");
182 }
183
184 @Test
185 public void testRead_typeAndInputStream() {
186
187 StubHandler handlerA = new StubHandler("a", SRC_A);
188 StubHandler handlerB = new StubHandler("b", SRC_B);
189
190 registry.setHandlers(Arrays.asList(handlerA, handlerB));
191
192
193 BoundarySource3D src = registry.read("a", new ByteArrayInputStream(new byte[0]), TEST_PRECISION);
194
195
196 Assert.assertSame(SRC_A, src);
197 }
198
199 @Test
200 public void testRead_typeAndInputStream_unknownType() {
201
202 GeometryTestUtils.assertThrows(() -> {
203 registry.read("nope", new ByteArrayInputStream(new byte[0]), TEST_PRECISION);
204 }, IllegalArgumentException.class, "No handler found for type \"nope\"");
205 }
206
207 @Test
208 public void testWrite_typeFromFileExtension() {
209
210 StubHandler handlerA = new StubHandler("a", SRC_A);
211 StubHandler handlerB = new StubHandler("b", SRC_B);
212
213 registry.setHandlers(Arrays.asList(handlerA, handlerB));
214
215 File file = new File("file.B");
216
217
218 registry.write(SRC_B, file);
219
220
221 Assert.assertNull(handlerA.outputBoundarySrc);
222 Assert.assertSame(SRC_B, handlerB.outputBoundarySrc);
223 }
224
225 @Test
226 public void testWrite_typeFromFileExtension_unknownType() {
227
228 File file = new File("file.B");
229
230
231 GeometryTestUtils.assertThrows(() -> {
232 registry.write(SRC_A, file);
233 }, IllegalArgumentException.class, "No handler found for type \"b\"");
234 }
235
236 @Test
237 public void testWrite_typeFromFileExtension_noFileExtension() {
238
239 File file = new File("file");
240
241
242 GeometryTestUtils.assertThrows(() -> {
243 registry.write(SRC_A, file);
244 }, IllegalArgumentException.class,
245 "Cannot determine target file type: \"file\" does not have a file extension");
246 }
247
248 @Test
249 public void testWrite_typeAndFile() {
250
251 StubHandler handlerA = new StubHandler("a", SRC_A);
252 StubHandler handlerB = new StubHandler("b", SRC_B);
253
254 registry.setHandlers(Arrays.asList(handlerA, handlerB));
255
256 File file = new File("file.B");
257
258
259 registry.write(SRC_B, "a", file);
260
261
262 Assert.assertSame(SRC_B, handlerA.outputBoundarySrc);
263 Assert.assertNull(handlerB.outputBoundarySrc);
264 }
265
266 @Test
267 public void testWrite_typeAndFile_unknownType() {
268
269 File file = new File("file");
270
271
272 GeometryTestUtils.assertThrows(() -> {
273 registry.write(SRC_A, "nope", file);
274 }, IllegalArgumentException.class, "No handler found for type \"nope\"");
275 }
276
277 @Test
278 public void testWrite_typeAndOutputStream() {
279
280 StubHandler handlerA = new StubHandler("a", SRC_A);
281 StubHandler handlerB = new StubHandler("b", SRC_B);
282
283 registry.setHandlers(Arrays.asList(handlerA, handlerB));
284
285
286 registry.write(SRC_B, "a", new ByteArrayOutputStream());
287
288
289 Assert.assertSame(SRC_B, handlerA.outputBoundarySrc);
290 Assert.assertNull(handlerB.outputBoundarySrc);
291 }
292
293 @Test
294 public void testWrite_typeAndOutputStream_unknownType() {
295
296 GeometryTestUtils.assertThrows(() -> {
297 registry.write(SRC_A, "nope", new ByteArrayOutputStream());
298 }, IllegalArgumentException.class, "No handler found for type \"nope\"");
299 }
300
301 private static final class StubHandler implements ModelIOHandler {
302
303 private final String handlerType;
304
305 private final BoundarySource3D boundarySrc;
306
307 private BoundarySource3D outputBoundarySrc;
308
309 StubHandler(final String type, final BoundarySource3D boundarySrc) {
310 this.handlerType = type;
311 this.boundarySrc = boundarySrc;
312 }
313
314 @Override
315 public boolean handlesType(String type) {
316 return this.handlerType.equals(type);
317 }
318
319 @Override
320 public BoundarySource3D read(String type, File in, DoublePrecisionContext precision) {
321 return boundarySrc;
322 }
323
324 @Override
325 public BoundarySource3D read(String type, InputStream in, DoublePrecisionContext precision) {
326 return boundarySrc;
327 }
328
329 @Override
330 public void write(BoundarySource3D model, String type, File out) {
331 outputBoundarySrc = model;
332 }
333
334 @Override
335 public void write(BoundarySource3D model, String type, OutputStream out) {
336 outputBoundarySrc = model;
337 }
338 }
339 }