1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.io.euclidean.threed.obj;
18
19 import java.io.StringReader;
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.regex.Pattern;
23
24 import org.apache.commons.geometry.core.GeometryTestUtils;
25 import org.apache.commons.geometry.euclidean.EuclideanTestUtils;
26 import org.apache.commons.geometry.euclidean.threed.Vector3D;
27 import org.apache.commons.geometry.io.core.test.CloseCountReader;
28 import org.apache.commons.geometry.io.euclidean.EuclideanIOTestUtils;
29 import org.apache.commons.geometry.io.euclidean.threed.FacetDefinition;
30 import org.junit.jupiter.api.Assertions;
31 import org.junit.jupiter.api.Test;
32
33 class ObjFacetDefinitionReaderTest {
34
35 private static final double TEST_EPS = 1e-10;
36
37 @Test
38 void testDefaults() {
39
40 final ObjFacetDefinitionReader reader = reader("");
41
42
43 Assertions.assertFalse(reader.isFailOnNonPolygonKeywords());
44 }
45
46 @Test
47 void testClose() {
48
49 final CloseCountReader closeReader = new CloseCountReader(new StringReader(""));
50
51
52 try (ObjFacetDefinitionReader reader = new ObjFacetDefinitionReader(closeReader)) {
53 Assertions.assertEquals(0, closeReader.getCloseCount());
54 }
55
56 Assertions.assertEquals(1, closeReader.getCloseCount());
57 }
58
59 @Test
60 void testReadFacet_withNormal() {
61
62 final ObjFacetDefinitionReader reader = reader(
63 "o test\n\n" +
64 "v 0 0 0\r\n" +
65 "v 1 0 0\n" +
66 "v 1 1 0\r" +
67 "v 0 1 0\n" +
68 "vn 0 0 -1\n" +
69 "f 1//1 2//1 3//1 4//1\n" +
70 "curv non-polygon data\n");
71
72
73 final List<FacetDefinition> facets = EuclideanIOTestUtils.readAll(reader);
74
75
76 Assertions.assertEquals(1, facets.size());
77 EuclideanIOTestUtils.assertFacetVertices(facets.get(0), Arrays.asList(
78 Vector3D.ZERO, Vector3D.of(1, 0, 0), Vector3D.of(1, 1, 0), Vector3D.of(0, 1, 0)
79 ), TEST_EPS);
80 EuclideanTestUtils.assertCoordinatesEqual(Vector3D.Unit.MINUS_Z, facets.get(0).getNormal(), TEST_EPS);
81 }
82
83 @Test
84 void testReadFacet_withoutNormal() {
85
86 final ObjFacetDefinitionReader reader = reader(
87 "o test\n\n" +
88 "v 0 0 0\r\n" +
89 "v 1 0 0\n" +
90 "v 1 1 0\r" +
91 "f 1 2 3\n");
92
93
94 final List<FacetDefinition> facets = EuclideanIOTestUtils.readAll(reader);
95
96
97 Assertions.assertEquals(1, facets.size());
98 EuclideanIOTestUtils.assertFacetVertices(facets.get(0), Arrays.asList(
99 Vector3D.ZERO, Vector3D.of(1, 0, 0), Vector3D.of(1, 1, 0)
100 ), TEST_EPS);
101 Assertions.assertNull(facets.get(0).getNormal());
102 }
103
104 @Test
105 void testReadFacet_failOnNonPolygon() {
106
107 final ObjFacetDefinitionReader reader = reader(
108 "o test\n\n" +
109 "v 0 0 0\r\n" +
110 "v 1 0 0\n" +
111 "v 1 1 0\r" +
112 "v 0 1 0\n" +
113 "vn 0 0 1\n" +
114 "f 1//1 2//1 3//1\n" +
115 "curv non-polygon data\n");
116
117 reader.setFailOnNonPolygonKeywords(true);
118
119
120 GeometryTestUtils.assertThrowsWithMessage(
121 () -> EuclideanIOTestUtils.readAll(reader),
122 IllegalStateException.class, Pattern.compile("^Parsing failed.*"));
123 }
124
125 private static ObjFacetDefinitionReader reader(final String str) {
126 return new ObjFacetDefinitionReader(new StringReader(str));
127 }
128 }