1 /****************************************************************************
2 **
3 ** Copyright (c) 2008-2019 C.B. Barber. All rights reserved.
4 ** $Id: //main/2019/qhull/src/qhulltest/QhullFacetList_test.cpp#1 $$Change: 2661 $
5 ** $DateTime: 2019/05/24 20:09:58 $$Author: bbarber $
6 **
7 ****************************************************************************/
8
9 //pre-compiled headers
10 #include <iostream>
11 #include "qhulltest/RoadTest.h" // QT_VERSION
12
13 #include "libqhullcpp/QhullFacetList.h"
14 #include "libqhullcpp/QhullError.h"
15 #include "libqhullcpp/QhullFacet.h"
16 #include "libqhullcpp/QhullVertex.h"
17 #include "libqhullcpp/QhullVertexSet.h"
18 #include "libqhullcpp/Qhull.h"
19 #include "libqhullcpp/RboxPoints.h"
20
21 using std::cout;
22 using std::endl;
23 using std::ostringstream;
24 using std::ostream;
25 using std::string;
26
27 namespace orgQhull {
28
29 class QhullFacetList_test : public RoadTest
30 {
31 Q_OBJECT
32
33 #//!\name Test slots
34 private slots:
35 void cleanup();
36 void t_construct_qh();
37 void t_construct_q();
38 void t_convert();
39 void t_readonly();
40 void t_foreach();
41 void t_io();
42 };//QhullFacetList_test
43
44 void
add_QhullFacetList_test()45 add_QhullFacetList_test()
46 {
47 new QhullFacetList_test(); // RoadTest::s_testcases
48 }
49
50 //Executed after each testcase
51 void QhullFacetList_test::
cleanup()52 cleanup()
53 {
54 RoadTest::cleanup();
55 }
56
57 void QhullFacetList_test::
t_construct_qh()58 t_construct_qh()
59 {
60 RboxPoints rcube("c");
61 Qhull q(rcube,"QR0"); // rotated unit cube
62 QhullFacetList fs2= q.facetList();
63 QVERIFY(!fs2.isEmpty());
64 QCOMPARE(fs2.count(),6);
65 QhullFacetList fs3(q.endFacet(), q.endFacet());
66 QVERIFY(fs3.isEmpty());
67 QhullFacetList fs4(q.endFacet().previous(), q.endFacet());
68 QCOMPARE(fs4.count(), 1);
69 QhullFacetList fs5(q.beginFacet(), q.endFacet());
70 QCOMPARE(fs2.count(), fs5.count());
71 QVERIFY(fs2==fs5);
72 QhullFacetList fs6= fs2; // copy constructor
73 QVERIFY(fs6==fs2);
74 std::vector<QhullFacet> fv= fs2.toStdVector();
75 QCOMPARE(fv.size(), 6u);
76 }//t_construct_qh
77
78 void QhullFacetList_test::
t_construct_q()79 t_construct_q()
80 {
81 RboxPoints rcube("c");
82 Qhull q(rcube,"QR0"); // rotated unit cube
83 QhullFacetList fs2= q.facetList();
84 QVERIFY(!fs2.isEmpty());
85 QCOMPARE(fs2.count(),6);
86 QhullFacetList fs3(q.endFacet(), q.endFacet());
87 QVERIFY(fs3.isEmpty());
88 QhullFacetList fs4(q.endFacet().previous(), q.endFacet());
89 QCOMPARE(fs4.count(), 1);
90 QhullFacetList fs5(q.beginFacet(), q.endFacet());
91 QCOMPARE(fs2.count(), fs5.count());
92 QVERIFY(fs2==fs5);
93 QhullFacetList fs6= fs2; // copy constructor
94 QVERIFY(fs6==fs2);
95 std::vector<QhullFacet> fv= fs2.toStdVector();
96 QCOMPARE(fv.size(), 6u);
97 }//t_construct_q
98
99 void QhullFacetList_test::
t_convert()100 t_convert()
101 {
102 RboxPoints rcube("c");
103 Qhull q(rcube,"QR0 QV2"); // rotated unit cube
104 QhullFacetList fs2= q.facetList();
105 QVERIFY(!fs2.isSelectAll());
106 QVERIFY(!fs2.isEmpty());
107 QCOMPARE(fs2.count(),3);
108 std::vector<QhullFacet> fv= fs2.toStdVector();
109 QCOMPARE(fv.size(), 3u);
110 QList<QhullFacet> fv2= fs2.toQList();
111 QCOMPARE(fv2.size(), 3);
112 std::vector<QhullVertex> fv5= fs2.vertices_toStdVector();
113 QCOMPARE(fv5.size(), 7u);
114 QList<QhullVertex> fv6= fs2.vertices_toQList();
115 QCOMPARE(fv6.size(), 7);
116 fs2.selectAll();
117 QVERIFY(fs2.isSelectAll());
118 std::vector<QhullFacet> fv3= fs2.toStdVector();
119 QCOMPARE(fv3.size(), 6u);
120 QList<QhullFacet> fv4= fs2.toQList();
121 QCOMPARE(fv4.size(), 6);
122 std::vector<QhullVertex> fv7= fs2.vertices_toStdVector();
123 QCOMPARE(fv7.size(), 8u);
124 QList<QhullVertex> fv8= fs2.vertices_toQList();
125 QCOMPARE(fv8.size(), 8);
126 }//t_convert
127
128 //! Spot check properties and read-only. See QhullLinkedList_test
129 void QhullFacetList_test::
t_readonly()130 t_readonly()
131 {
132 RboxPoints rcube("c");
133 Qhull q(rcube,"QV0"); // good facets are adjacent to point 0
134 QhullFacetList fs= q.facetList();
135 QVERIFY(!fs.isSelectAll());
136 QCOMPARE(fs.count(), 3);
137 QCOMPARE(fs.first(), q.firstFacet());
138 fs.selectAll();
139 QVERIFY(fs.isSelectAll());
140 QCOMPARE(fs.count(), 6);
141 fs.selectGood();
142 QVERIFY(!fs.isSelectAll());
143 QCOMPARE(fs.count(), 3);
144 fs.selectAll();
145 QVERIFY(fs.isSelectAll());
146 QCOMPARE(fs.count(), 6);
147 QhullFacet f= fs.first();
148 QhullFacet f2= fs.last();
149 fs.selectAll();
150 QVERIFY(fs.contains(f));
151 QVERIFY(fs.contains(f2));
152 QVERIFY(f.isGood());
153 QVERIFY(!f2.isGood());
154 fs.selectGood();
155 QVERIFY(fs.contains(f));
156 QVERIFY(!fs.contains(f2));
157 }//t_readonly
158
159 void QhullFacetList_test::
t_foreach()160 t_foreach()
161 {
162 RboxPoints rcube("c");
163 // Spot check predicates and accessors. See QhullLinkedList_test
164 Qhull q(rcube,"Qt QR0"); // triangulation of rotated unit cube
165 QhullFacetList fs= q.facetList();
166 QVERIFY(fs.contains(q.firstFacet()));
167 QhullFacet f= q.firstFacet().next();
168 QVERIFY(fs.contains(f));
169 QCOMPARE(fs.first(), *fs.begin());
170 QCOMPARE(*(fs.end()-1), fs.last());
171 QCOMPARE(fs.first(), q.firstFacet());
172 QCOMPARE(*fs.begin(), q.beginFacet());
173 QCOMPARE(*fs.end(), q.endFacet());
174 }//t_foreach
175
176 void QhullFacetList_test::
t_io()177 t_io()
178 {
179 RboxPoints rcube("c");
180 {
181 Qhull q(rcube,"QR0 QV0"); // good facets are adjacent to point 0
182 QhullFacetList fs= q.facetList();
183 ostringstream os;
184 os << fs.print("Show all of FacetList\n");
185 os << "\nFacets only\n" << fs;
186 os << "\nVertices only\n" << fs.printVertices();
187 cout << os.str();
188 QString facets= QString::fromStdString(os.str());
189 QCOMPARE(facets.count("(v"), 2*7+12*3*2);
190 QCOMPARE(facets.count(QRegExp("f\\d")), 2*3*7 + 13*3*2);
191 }
192 }//t_io
193
194 }//orgQhull
195
196 #include "moc/QhullFacetList_test.moc"
197