00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <iostream>
00011 #include "../road/RoadTest.h"
00012
00013 #include "QhullPoints.h"
00014 #include "RboxPoints.h"
00015 #include "Qhull.h"
00016
00017 using std::cout;
00018 using std::endl;
00019 using std::ostringstream;
00020
00021 namespace orgQhull {
00022
00023 class QhullPoints_test : public RoadTest
00024 {
00025 Q_OBJECT
00026
00027 #//Test slots
00028 private slots:
00029 void cleanup();
00030 void t_construct();
00031 void t_convert();
00032 void t_getset();
00033 void t_element();
00034 void t_iterator();
00035 void t_const_iterator();
00036 void t_search();
00037 void t_points_iterator();
00038 void t_io();
00039 };
00040
00041 void
00042 add_QhullPoints_test()
00043 {
00044 new QhullPoints_test();
00045 }
00046
00047
00048 void QhullPoints_test::
00049 cleanup()
00050 {
00051 UsingLibQhull::checkQhullMemoryEmpty();
00052 RoadTest::cleanup();
00053 }
00054
00055 void QhullPoints_test::
00056 t_construct()
00057 {
00058 QhullPoints ps;
00059 QCOMPARE(ps.dimension(), 0);
00060 QVERIFY(ps.isEmpty());
00061 QVERIFY(ps.empty());
00062 QCOMPARE(ps.count(), 0);
00063 QCOMPARE(ps.size(), 0u);
00064 QCOMPARE(ps.coordinateCount(), 0);
00065 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00066 QhullPoints ps2;
00067 ps2.defineAs(2, 6, c);
00068 QCOMPARE(ps2.dimension(), 2);
00069 QVERIFY(!ps2.isEmpty());
00070 QVERIFY(!ps2.empty());
00071 QCOMPARE(ps2.count(), 3);
00072 QCOMPARE(ps2.size(), 3u);
00073 QCOMPARE(ps2.coordinates(), c);
00074 QhullPoints ps7(3);
00075 QCOMPARE(ps7.dimension(), 3);
00076 QVERIFY(ps7.isEmpty());
00077 QhullPoints ps3(2, 6, c);
00078 QCOMPARE(ps3.dimension(), 2);
00079 QVERIFY(!ps3.isEmpty());
00080 QCOMPARE(ps3.coordinates(), ps2.coordinates());
00081 QVERIFY(ps3==ps2);
00082 QVERIFY(ps3!=ps);
00083 QhullPoints ps4= ps3;
00084 QVERIFY(ps4==ps3);
00085
00086 QhullPoints ps5(ps4);
00087 QVERIFY(ps5==ps4);
00088 QVERIFY(!(ps5!=ps4));
00089 coordT c2[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00090 QhullPoints ps6(2, 6, c2);
00091 QVERIFY(ps6==ps2);
00092 }
00093
00094 void QhullPoints_test::
00095 t_convert()
00096 {
00097
00098 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00099 QhullPoints ps(3, 6, c);
00100 QCOMPARE(ps.dimension(), 3);
00101 QCOMPARE(ps.size(), 2u);
00102 const coordT *c2= ps.constData();
00103 QCOMPARE(c, c2);
00104 const coordT *c3= ps.data();
00105 QCOMPARE(c, c3);
00106 coordT *c4= ps.data();
00107 QCOMPARE(c, c4);
00108 std::vector<QhullPoint> vs= ps.toStdVector();
00109 QCOMPARE(vs.size(), 2u);
00110 QhullPoint p= vs[1];
00111 QCOMPARE(p[2], 5.0);
00112 QList<QhullPoint> qs= ps.toQList();
00113 QCOMPARE(qs.size(), 2);
00114 QhullPoint p2= qs[1];
00115 QCOMPARE(p2[2], 5.0);
00116 }
00117
00118 void QhullPoints_test::
00119 t_getset()
00120 {
00121
00122 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00123 QhullPoints ps(3, 6, c);
00124 QhullPoints ps2(3, 6, c);
00125 QCOMPARE(ps2.dimension(), 3);
00126 QCOMPARE(ps2.coordinates(), c);
00127 QCOMPARE(ps2.count(), 2);
00128 QCOMPARE(ps2.coordinateCount(), 6);
00129 coordT c2[]= {-1.0, -2.0, -3.0, -4.0, -5.0, -6.0};
00130 ps2.defineAs(6, c2);
00131 QCOMPARE(ps2.coordinates(), c2);
00132 QCOMPARE(ps2.count(), 2);
00133 QCOMPARE(ps2.size(), 2u);
00134 QCOMPARE(ps2.dimension(), 3);
00135 QVERIFY(!ps2.isEmpty());
00136 QVERIFY(ps!=ps2);
00137
00138 ps2.defineAs(ps);
00139 QVERIFY(ps==ps2);
00140 ps2.setDimension(2);
00141 QCOMPARE(ps2.dimension(), 2);
00142 QCOMPARE(ps2.coordinates(), c);
00143 QVERIFY(!ps2.isEmpty());
00144 QCOMPARE(ps2.count(), 3);
00145 QCOMPARE(ps2.size(), 3u);
00146 QVERIFY(ps!=ps2);
00147 QhullPoints ps3(3);
00148 ps3.defineAs(5, c2);
00149 QCOMPARE(ps3.count(), 1);
00150 QCOMPARE(ps3.extraCoordinatesCount(), 2);
00151 QCOMPARE(ps3.extraCoordinates()[0], -4.0);
00152 QVERIFY(ps3.includesCoordinates(ps3.data()));
00153 QVERIFY(ps3.includesCoordinates(ps3.data()+ps3.count()-1));
00154 QVERIFY(!ps3.includesCoordinates(ps3.data()-1));
00155 QVERIFY(!ps3.includesCoordinates(ps3.data()+ps3.coordinateCount()));
00156 }
00157
00158
00159 void QhullPoints_test::
00160 t_element()
00161 {
00162 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00163 QhullPoints ps(2, 6, c);
00164 QhullPoint p(2, c);
00165 QCOMPARE(ps[0], p);
00166 QCOMPARE(ps.at(1), ps[1]);
00167 QCOMPARE(ps.first(), p);
00168 QCOMPARE(ps.front(), ps.first());
00169 QCOMPARE(ps.last(), ps.at(2));
00170 QCOMPARE(ps.back(), ps.last());
00171 QhullPoints ps2= ps.mid(2);
00172 QCOMPARE(ps2.count(), 1);
00173 QhullPoints ps3= ps.mid(3);
00174 QVERIFY(ps3.isEmpty());
00175 QVERIFY(ps3.empty());
00176 QhullPoints ps4= ps.mid(10);
00177 QVERIFY(ps4.isEmpty());
00178 QhullPoints ps5= ps.mid(-1);
00179 QVERIFY(ps5.isEmpty());
00180 QhullPoints ps6= ps.mid(1, 1);
00181 QCOMPARE(ps6.count(), 1);
00182 QCOMPARE(ps6[0], ps[1]);
00183 QhullPoints ps7= ps.mid(1, 10);
00184 QCOMPARE(ps7.count(), 2);
00185 QCOMPARE(ps7[1], ps[2]);
00186 QhullPoint p8;
00187 QCOMPARE(ps.value(2), ps[2]);
00188 QCOMPARE(ps.value(-1), p8);
00189 QCOMPARE(ps.value(3), p8);
00190 QCOMPARE(ps.value(3, p), p);
00191 QVERIFY(ps.value(1, p)!=p);
00192 foreach(QhullPoint p9, ps){
00193 QCOMPARE(p9.dimension(), 2);
00194 QVERIFY(p9[0]==0.0 || p9[0]==2.0 || p9[0]==4.0);
00195 }
00196 }
00197
00198 void QhullPoints_test::
00199 t_iterator()
00200 {
00201 coordT c[]= {0.0, 1.0, 2.0};
00202 QhullPoints ps(1, 3, c);
00203 QhullPoints::Iterator i(ps);
00204 QhullPoints::iterator i2= ps.begin();
00205 QVERIFY(i==i2);
00206 QVERIFY(i>=i2);
00207 QVERIFY(i<=i2);
00208 i= ps.begin();
00209 QVERIFY(i==i2);
00210 i2= ps.end();
00211 QVERIFY(i!=i2);
00212 QhullPoint p(i);
00213 QCOMPARE(p.dimension(), ps.dimension());
00214 QCOMPARE(p.coordinates(), ps.coordinates());
00215 i2--;
00216 QhullPoint p2= *i2;
00217 QCOMPARE(p[0], 0.0);
00218 QCOMPARE(p2[0], 2.0);
00219 QhullPoints::Iterator i5(i2);
00220 QCOMPARE(*i2, *i5);
00221 coordT c3[]= {0.0, -1.0, -2.0};
00222 QhullPoints::Iterator i3(1, c3);
00223 QVERIFY(i!=i3);
00224 QCOMPARE(*i, *i3);
00225
00226 (i3= i)++;
00227 QCOMPARE((*i3)[0], 1.0);
00228 QCOMPARE(i3->dimension(), 1);
00229 QCOMPARE(i3[0][0], 1.0);
00230 QCOMPARE(i3[0], ps[1]);
00231
00232 QVERIFY(i==i);
00233 QVERIFY(i!=i2);
00234 QVERIFY(i<i2);
00235 QVERIFY(i<=i2);
00236 QVERIFY(i2>i);
00237 QVERIFY(i2>=i);
00238
00239 QhullPoints::ConstIterator i4(1, c);
00240 QVERIFY(i==i4);
00241 QVERIFY(i<=i4);
00242 QVERIFY(i>=i4);
00243 QVERIFY(i4==i);
00244 QVERIFY(i4<=i);
00245 QVERIFY(i4>=i);
00246 QVERIFY(i>=i4);
00247 QVERIFY(i4<=i);
00248 QVERIFY(i2!=i4);
00249 QVERIFY(i2>i4);
00250 QVERIFY(i2>=i4);
00251 QVERIFY(i4!=i2);
00252 QVERIFY(i4<i2);
00253 QVERIFY(i4<=i2);
00254 ++i4;
00255 QVERIFY(i<i4);
00256 QVERIFY(i<=i4);
00257 QVERIFY(i4>i);
00258 QVERIFY(i4>=i);
00259
00260 i= ps.begin();
00261 i2= ps.begin();
00262 QCOMPARE(i, i2++);
00263 QCOMPARE(*i2, ps[1]);
00264 QCOMPARE(++i, i2);
00265 QCOMPARE(i, i2--);
00266 QCOMPARE(i2, ps.begin());
00267 QCOMPARE(--i, i2);
00268 QCOMPARE(i2+=3, ps.end());
00269 QCOMPARE(i2-=3, ps.begin());
00270 QCOMPARE(i2+0, ps.begin());
00271 QCOMPARE(i2+3, ps.end());
00272 i2 += 3;
00273 i= i2-0;
00274 QCOMPARE(i, i2);
00275 i= i2-3;
00276 QCOMPARE(i, ps.begin());
00277 QCOMPARE(i2-i, 3);
00278
00279
00280
00281
00282 }
00283
00284 void QhullPoints_test::
00285 t_const_iterator()
00286 {
00287 coordT c[]= {0.0, 1.0, 2.0};
00288 const QhullPoints ps(1, 3, c);
00289 QhullPoints::ConstIterator i(ps);
00290 QhullPoints::const_iterator i2= ps.begin();
00291 QVERIFY(i==i2);
00292 QVERIFY(i>=i2);
00293 QVERIFY(i<=i2);
00294 i= ps.begin();
00295 QVERIFY(i==i2);
00296 i2= ps.end();
00297 QVERIFY(i!=i2);
00298 QhullPoint p(i);
00299 QCOMPARE(p.dimension(), ps.dimension());
00300 QCOMPARE(p.coordinates(), ps.coordinates());
00301 i2--;
00302 QhullPoint p2= *i2;
00303 QCOMPARE(p[0], 0.0);
00304 QCOMPARE(p2[0], 2.0);
00305 QhullPoints::ConstIterator i5(i2);
00306 QCOMPARE(*i2, *i5);
00307 coordT c3[]= {0.0, -1.0, -2.0};
00308 QhullPoints::ConstIterator i3(1, c3);
00309 QVERIFY(i!=i3);
00310 QCOMPARE(*i, *i3);
00311
00312 (i3= i)++;
00313 QCOMPARE((*i3)[0], 1.0);
00314 QCOMPARE(i3->dimension(), 1);
00315 QCOMPARE(i3[0][0], 1.0);
00316 QCOMPARE(i3[0][0], 1.0);
00317 QCOMPARE(i3[0], ps[1]);
00318
00319 QVERIFY(i==i);
00320 QVERIFY(i!=i2);
00321 QVERIFY(i<i2);
00322 QVERIFY(i<=i2);
00323 QVERIFY(i2>i);
00324 QVERIFY(i2>=i);
00325
00326
00327
00328 i= ps.begin();
00329 i2= ps.constBegin();
00330 QCOMPARE(i, i2++);
00331 QCOMPARE(*i2, ps[1]);
00332 QCOMPARE(++i, i2);
00333 QCOMPARE(i, i2--);
00334 QCOMPARE(i2, ps.constBegin());
00335 QCOMPARE(--i, i2);
00336 QCOMPARE(i2+=3, ps.constEnd());
00337 QCOMPARE(i2-=3, ps.constBegin());
00338 QCOMPARE(i2+0, ps.constBegin());
00339 QCOMPARE(i2+3, ps.constEnd());
00340 i2 += 3;
00341 i= i2-0;
00342 QCOMPARE(i, i2);
00343 i= i2-3;
00344 QCOMPARE(i, ps.constBegin());
00345 QCOMPARE(i2-i, 3);
00346
00347
00348 }
00349
00350
00351 void QhullPoints_test::
00352 t_search()
00353 {
00354 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 0, 1};
00355 QhullPoints ps(2, 8, c);
00356 QhullPoint p= ps.first();
00357 QhullPoint p2= ps.last();
00358 QVERIFY(ps.contains(p));
00359 QVERIFY(ps.contains(p2));
00360 QVERIFY(p==p2);
00361 QhullPoint p5= ps[2];
00362 QVERIFY(p!=p5);
00363 QVERIFY(ps.contains(p5));
00364 coordT c2[]= {0.0, 1.0, 2.0, 3.0};
00365 QhullPoint p3(2, c2);
00366 QVERIFY(ps.contains(p3));
00367 QhullPoint p4(3, c2);
00368 QVERIFY(!ps.contains(p4));
00369 p4.defineAs(2, c);
00370 QVERIFY(ps.contains(p4));
00371 p4.defineAs(2, c+1);
00372 QVERIFY(!ps.contains(p4));
00373 QhullPoint p6(2, c2+2);
00374 QCOMPARE(ps.count(p), 2);
00375 QCOMPARE(ps.count(p2), 2);
00376 QCOMPARE(ps.count(p3), 2);
00377 QCOMPARE(ps.count(p4), 0);
00378 QCOMPARE(ps.count(p6), 1);
00379 QCOMPARE(ps.indexOf(&ps[0][0]), 0);
00380
00381 QCOMPARE(ps.indexOf(0), -1);
00382 QCOMPARE(ps.indexOf(&ps[3][0]), 3);
00383 QCOMPARE(ps.indexOf(&ps[3][1], QhullError::NOthrow), 3);
00384 QCOMPARE(ps.indexOf(ps.data()+ps.coordinateCount(), QhullError::NOthrow), -1);
00385 QCOMPARE(ps.indexOf(p), 0);
00386 QCOMPARE(ps.indexOf(p2), 0);
00387 QCOMPARE(ps.indexOf(p3), 0);
00388 QCOMPARE(ps.indexOf(p4), -1);
00389 QCOMPARE(ps.indexOf(p5), 2);
00390 QCOMPARE(ps.indexOf(p6), 1);
00391 QCOMPARE(ps.lastIndexOf(p), 3);
00392 QCOMPARE(ps.lastIndexOf(p4), -1);
00393 QCOMPARE(ps.lastIndexOf(p6), 1);
00394 QhullPoints ps2(3);
00395 QCOMPARE(ps2.indexOf(ps2.data()), -1);
00396 QCOMPARE(ps2.indexOf(ps2.data()+1, QhullError::NOthrow), -1);
00397 QCOMPARE(ps2.indexOf(p), -1);
00398 QCOMPARE(ps2.lastIndexOf(p), -1);
00399 QhullPoints ps3;
00400 QCOMPARE(ps3.indexOf(ps3.data()), -1);
00401 QCOMPARE(ps3.indexOf(ps3.data()+1, QhullError::NOthrow), -1);
00402 QCOMPARE(ps3.indexOf(p), -1);
00403 QCOMPARE(ps3.lastIndexOf(p), -1);
00404 QhullPoints ps4(2, 0, c);
00405 QCOMPARE(ps4.indexOf(p), -1);
00406 QCOMPARE(ps4.lastIndexOf(p), -1);
00407 }
00408
00409 void QhullPoints_test::
00410 t_points_iterator()
00411 {
00412 coordT c2[]= {0.0};
00413 QhullPoints ps2(0, 0, c2);
00414 QhullPointsIterator i2= ps2;
00415 QVERIFY(!i2.hasNext());
00416 QVERIFY(!i2.hasPrevious());
00417 i2.toBack();
00418 QVERIFY(!i2.hasNext());
00419 QVERIFY(!i2.hasPrevious());
00420
00421 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00422 QhullPoints ps(3, 6, c);
00423 QhullPointsIterator i(ps);
00424 i2= ps;
00425 QVERIFY(i2.hasNext());
00426 QVERIFY(!i2.hasPrevious());
00427 QVERIFY(i.hasNext());
00428 QVERIFY(!i.hasPrevious());
00429 i2.toBack();
00430 i.toFront();
00431 QVERIFY(!i2.hasNext());
00432 QVERIFY(i2.hasPrevious());
00433 QVERIFY(i.hasNext());
00434 QVERIFY(!i.hasPrevious());
00435
00436 QhullPoint p= ps[0];
00437 QhullPoint p2(ps[0]);
00438 QCOMPARE(p, p2);
00439 QVERIFY(p==p2);
00440 QhullPoint p3(ps[1]);
00441
00442 QVERIFY(p==p2);
00443 QCOMPARE(i2.peekPrevious(), p3);
00444 QCOMPARE(i2.previous(), p3);
00445 QCOMPARE(i2.previous(), p);
00446 QVERIFY(!i2.hasPrevious());
00447 QCOMPARE(i.peekNext(), p);
00448
00449 QCOMPARE(i.next(), p);
00450 QCOMPARE(i.peekNext(), p3);
00451 QCOMPARE(i.next(), p3);
00452 QVERIFY(!i.hasNext());
00453 i.toFront();
00454 QCOMPARE(i.next(), p);
00455 }
00456
00457 void QhullPoints_test::
00458 t_io()
00459 {
00460 QhullPoints ps;
00461 ostringstream os;
00462 os << "Empty QhullPoints\n" << ps << endl;
00463 coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
00464 QhullPoints ps2(3, 6, c);
00465 os << "QhullPoints from c[]\n" << ps2 << endl;
00466 RboxPoints rcube("c");
00467 Qhull q(rcube,"Qt QR0");
00468 QhullPoints ps3= q.points();
00469 os << "QhullPoints\n" << ps3;
00470 os << "RunId\n" << ps3.print(q.runId());
00471 os << ps3.print(q.runId(), "RunId w/ message\n");
00472 os << ps3.printWithIdentifier(q.runId(), "RunId w/ identifiers\n");
00473 cout << os.str();
00474 QString s= QString::fromStdString(os.str());
00475 QCOMPARE(s.count("p"), 3*8+3);
00476
00477 }
00478
00479 }
00480
00481 #include "moc/QhullPoints_test.moc"