void QhullPoints_test:: t_convert() { Qhull q; //defineAs tested above coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0}; QhullPoints ps(q, 3, 6, c); QCOMPARE(ps.dimension(), 3); QCOMPARE(ps.size(), 2u); const coordT *c2= ps.constData(); QCOMPARE(c, c2); const coordT *c3= ps.data(); QCOMPARE(c, c3); coordT *c4= ps.data(); QCOMPARE(c, c4); std::vector<QhullPoint> vs= ps.toStdVector(); QCOMPARE(vs.size(), 2u); QhullPoint p= vs[1]; QCOMPARE(p[2], 5.0); QList<QhullPoint> qs= ps.toQList(); QCOMPARE(qs.size(), 2); QhullPoint p2= qs[1]; QCOMPARE(p2[2], 5.0); q.checkAndFreeQhullMemory(); }//t_convert
void QhullPoints_test:: t_construct_qh() { Qhull q; QhullQh *qh= q.qh(); QhullPoints ps(qh); QCOMPARE(ps.dimension(), 0); QVERIFY(ps.isEmpty()); QCOMPARE(ps.count(), 0); QCOMPARE(ps.size(), 0u); QCOMPARE(ps.coordinateCount(), 0); coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0}; QhullPoints ps2(qh); ps2.defineAs(2, 6, c); QCOMPARE(ps2.dimension(), 2); QVERIFY(!ps2.isEmpty()); QCOMPARE(ps2.count(), 3); QCOMPARE(ps2.size(), 3u); QCOMPARE(ps2.coordinates(), c); QhullPoints ps3(qh, 2, 6, c); QCOMPARE(ps3.dimension(), 2); QVERIFY(!ps3.isEmpty()); QCOMPARE(ps3.coordinates(), ps2.coordinates()); QVERIFY(ps3==ps2); QVERIFY(ps3!=ps); QhullPoints ps4= ps3; QVERIFY(ps4==ps3); // ps4= ps3; //compiler error QhullPoints ps5(ps4); QVERIFY(ps5==ps4); QVERIFY(!(ps5!=ps4)); coordT c2[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0}; QhullPoints ps6(qh, 2, 6, c2); QVERIFY(ps6==ps2); RboxPoints rbox("c D2"); Qhull q2(rbox, ""); QhullPoints ps8(q2.qh()); QCOMPARE(ps8.dimension(), 2); QCOMPARE(ps8.count(), 0); QCOMPARE(ps8.size(), 0u); QCOMPARE(ps8.coordinateCount(), 0); coordT c3[]= {10.0, 11.0, 12.0, 13.0, 14.0, 15.0}; QhullPoints ps9(q2.qh(), 6, c3); QCOMPARE(ps9.dimension(), 2); QCOMPARE(ps9.coordinateCount(), 6); QCOMPARE(ps9.count(), 3); QCOMPARE(ps9.coordinates(), c3); ps9.defineAs(6, c2); QCOMPARE(ps9.dimension(), 2); QCOMPARE(ps9.coordinateCount(), 6); QCOMPARE(ps9.count(), 3); QCOMPARE(ps9.coordinates(), c2); q2.checkAndFreeQhullMemory(); }//t_construct_qh
void Qhull_test:: t_getValue() { RboxPoints rcube("c"); { Qhull q; q.runQhull(rcube, ""); QCOMPARE(q.area(), 6.0); QCOMPARE(q.volume(), 1.0); } }//t_getValue
void QhullPoints_test:: t_getset() { Qhull q; //See t_construct for coordinates, count, defineAs, dimension, isempty, ==, !=, size coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0}; QhullPoints ps(q, 3, 6, c); QhullPoints ps2(q, 3, 6, c); QCOMPARE(ps2.dimension(), 3); QCOMPARE(ps2.coordinates(), c); QCOMPARE(ps2.count(), 2); QCOMPARE(ps2.coordinateCount(), 6); coordT c2[]= {-1.0, -2.0, -3.0, -4.0, -5.0, -6.0}; ps2.defineAs(6, c2); QCOMPARE(ps2.coordinates(), c2); QCOMPARE(ps2.count(), 2); QCOMPARE(ps2.size(), 2u); QCOMPARE(ps2.dimension(), 3); QVERIFY(!ps2.isEmpty()); QVERIFY(ps!=ps2); // ps2= ps; // assignment not available, compiler error ps2.defineAs(ps); QVERIFY(ps==ps2); ps2.setDimension(2); QCOMPARE(ps2.dimension(), 2); QCOMPARE(ps2.coordinates(), c); QVERIFY(!ps2.isEmpty()); QCOMPARE(ps2.count(), 3); QCOMPARE(ps2.size(), 3u); QVERIFY(ps!=ps2); QhullPoints ps3(ps2); ps3.setDimension(3); ps3.defineAs(5, c2); QCOMPARE(ps3.count(), 1); QCOMPARE(ps3.extraCoordinatesCount(), 2); QCOMPARE(ps3.extraCoordinates()[0], -4.0); QVERIFY(ps3.includesCoordinates(ps3.data())); QVERIFY(ps3.includesCoordinates(ps3.data()+ps3.count()-1)); QVERIFY(!ps3.includesCoordinates(ps3.data()-1)); QVERIFY(!ps3.includesCoordinates(ps3.data()+ps3.coordinateCount())); q.checkAndFreeQhullMemory(); }//t_getset
void Qhull_test:: t_attribute() { RboxPoints rcube("c"); { double normals[] = { 0, -1, -0.5, -1, 0, -0.5, 1, 0, -0.5, 0, 1, -0.5 }; Qhull q; q.feasiblePoint << 0.0 << 0.0; Coordinates c(std::vector<double>(2, 0.0)); QVERIFY(q.feasiblePoint==c); q.setOutputStream(&cout); q.runQhull("normals of square", 3, 4, normals, "H"); // halfspace intersect QCOMPARE(q.facetList().count(), 4); // Vertices of square cout << "Expecting summary of halfspace intersect\n"; q.outputQhull(); q.useOutputStream= false; cout << "Expecting no output from qh_fprintf() in Qhull.cpp\n"; q.outputQhull(); } }//t_attribute
void Qhull_test:: t_construct() { { Qhull q; QCOMPARE(q.dimension(),0); QVERIFY(q.qhullQh()!=0); QVERIFY(q.runId()!=0); QCOMPARE(QString(q.qhullCommand()),QString("")); QCOMPARE(QString(q.rboxCommand()),QString("")); try{ QCOMPARE(q.area(),0.0); QFAIL("area() did not fail."); }catch (const std::exception &e) { cout << "INFO : Caught " << e.what(); } Qhull q2(q); // Copy constructor and copy assignment OK if not q.initialized() QCOMPARE(q2.dimension(),0); q= q2; QCOMPARE(q.dimension(),0); } { RboxPoints rbox("10000"); Qhull q(rbox, "QR0"); // Random points in a randomly rotated cube. QCOMPARE(q.dimension(),3); QVERIFY(q.volume() < 1.0); QVERIFY(q.volume() > 0.99); try{ Qhull q2(q); QFAIL("Copy constructor did not fail for initialized Qhull."); }catch (const std::exception &e) { cout << "INFO : Caught " << e.what(); } try{ Qhull q3; q3= q; QFAIL("Copy assignment did not fail for initialized Qhull source."); }catch (const std::exception &e) { cout << "INFO : Caught " << e.what(); } QCOMPARE(q.dimension(),3); try{ Qhull q4; q= q4; QFAIL("Copy assignment did not fail for initialized Qhull destination."); }catch (const std::exception &e) { cout << "INFO : Caught " << e.what(); } QCOMPARE(q.dimension(),3); } { double points[] = { 0, 0, 1, 0, 1, 1 }; Qhull q("triangle", 2, 3, points, ""); QCOMPARE(q.dimension(),2); QCOMPARE(q.facetCount(),3); QCOMPARE(q.vertexCount(),3); QCOMPARE(q.dimension(),2); QCOMPARE(q.area(), 2.0+sqrt(2.0)); // length of boundary QCOMPARE(q.volume(), 0.5); // the 2-d area } }//t_construct
void Qhull_test:: t_foreach() { RboxPoints rcube("c"); { Qhull q; QCOMPARE(q.beginFacet(),q.endFacet()); QCOMPARE(q.beginVertex(),q.endVertex()); q.runQhull(rcube, ""); QCOMPARE(q.facetList().count(), 6); // defineVertexNeighborFacets() tested in QhullVertex_test::t_io() QhullFacetList facets(q.beginFacet(), q.endFacet()); QCOMPARE(facets.count(), 6); QCOMPARE(q.firstFacet(), q.beginFacet()); QhullVertexList vertices(q.beginVertex(), q.endVertex()); QCOMPARE(vertices.count(), 8); QCOMPARE(q.firstVertex(), q.beginVertex()); QhullPoints ps= q.points(); QCOMPARE(ps.count(), 8); QhullPointSet ps2= q.otherPoints(); QCOMPARE(ps2.count(), 0); // ps2= q.otherPoints(); //disabled, would not copy the points QCOMPARE(q.facetCount(), 6); QCOMPARE(q.vertexCount(), 8); coordT *c= q.pointCoordinateBegin(); // of q.points() QVERIFY(*c==0.5 || *c==-0.5); coordT *c3= q.pointCoordinateEnd(); QVERIFY(c3[-1]==0.5 || c3[-1]==-0.5); QCOMPARE(c3-c, 8*3); QCOMPARE(q.vertexList().count(), 8); } }//t_foreach
void Qhull_test:: t_getQh() { RboxPoints rcube("c"); { Qhull q; q.runQhull(rcube, "s"); QCOMPARE(QString(q.qhullCommand()), QString("qhull s")); QCOMPARE(QString(q.rboxCommand()), QString("rbox \"c\"")); QCOMPARE(q.facetCount(), 6); QCOMPARE(q.vertexCount(), 8); // Sample fields from Qhull's qhT [libqhull.h] QCOMPARE(q.qhullQh()->ALLpoints, 0u); QCOMPARE(q.qhullQh()->GOODpoint, 0); QCOMPARE(q.qhullQh()->IStracing, 0); QCOMPARE(q.qhullQh()->MAXcoplanar+1.0, 1.0); // fuzzy compare QCOMPARE(q.qhullQh()->MERGING, 1u); QCOMPARE(q.qhullQh()->input_dim, 3); QCOMPARE(QString(q.qhullQh()->qhull_options).left(8), QString(" run-id")); QCOMPARE(q.qhullQh()->run_id, q.runId()); QCOMPARE(q.qhullQh()->num_facets, 6); QCOMPARE(q.qhullQh()->hasTriangulation, 0u); QCOMPARE(q.qhullQh()->max_outside - q.qhullQh()->min_vertex + 1.0, 1.0); // fuzzy compare QCOMPARE(*q.qhullQh()->gm_matrix+1.0, 1.0); // fuzzy compare } }//t_getQh
void Qhull_test:: t_getSet() { RboxPoints rcube("c"); { Qhull q; QVERIFY(!q.initialized()); q.runQhull(rcube, "s"); QVERIFY(q.initialized()); QCOMPARE(q.dimension(), 3); QhullPoint p= q.origin(); QCOMPARE(p.dimension(), 3); QCOMPARE(p[0]+p[1]+p[2], 0.0); QVERIFY(q.runId()!=0); q.setErrorStream(&cout); q.outputQhull(); } { Qhull q; q.runQhull(rcube, ""); q.setOutputStream(&cout); q.outputQhull(); } // qhullQh -- UsingLibQhull [Qhull.cpp] // runId -- UsingLibQhull [Qhull.cpp] }//t_getSet
//! No QhullMessage for errors outside of qhull void Qhull_test:: t_message() { RboxPoints rcube("c"); { Qhull q; QCOMPARE(q.qhullMessage(), string("")); QCOMPARE(q.qhullStatus(), qh_ERRnone); QVERIFY(!q.hasQhullMessage()); try{ q.runQhull(rcube, "Fd"); QFAIL("runQhull Fd did not fail."); }catch (const std::exception &e) { const char *s= e.what(); cout << "INFO : Caught " << s; QCOMPARE(QString::fromStdString(s).left(6), QString("QH6029")); // FIXUP QH11025 -- review decision to clearQhullMessage at QhullError() // Cleared when copied to QhullError QVERIFY(!q.hasQhullMessage()); // QCOMPARE(q.qhullMessage(), QString::fromStdString(s).remove(0, 7)); // QCOMPARE(q.qhullStatus(), 6029); q.clearQhullMessage(); QVERIFY(!q.hasQhullMessage()); } q.appendQhullMessage("Append 1"); QVERIFY(q.hasQhullMessage()); QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("Append 1")); q.appendQhullMessage("\nAppend 2\n"); QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("Append 1\nAppend 2\n")); q.clearQhullMessage(); QVERIFY(!q.hasQhullMessage()); QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("")); } { cout << "INFO : Error stream without output stream\n"; Qhull q; q.setErrorStream(&cout); q.setOutputStream(0); try{ q.runQhull(rcube, "Fd"); QFAIL("runQhull Fd did not fail."); }catch (const QhullError &e) { cout << "INFO : Caught " << e; QCOMPARE(e.errorCode(), 6029); } //FIXUP QH11026 Qhullmessage cleared when QhullError thrown. Switched to e //QVERIFY(q.hasQhullMessage()); //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(6), QString("QH6029")); q.clearQhullMessage(); QVERIFY(!q.hasQhullMessage()); } { cout << "INFO : Error output sent to output stream without error stream\n"; Qhull q; q.setErrorStream(0); q.setOutputStream(&cout); try{ q.runQhull(rcube, "Tz H0"); QFAIL("runQhull TZ did not fail."); }catch (const std::exception &e) { const char *s= e.what(); cout << "INFO : Caught " << s; QCOMPARE(QString::fromAscii(s).left(6), QString("QH6023")); } //FIXUP QH11026 Qhullmessage cleared when QhullError thrown. Switched to e //QVERIFY(q.hasQhullMessage()); //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(17), QString("qhull: no message")); //QCOMPARE(q.qhullStatus(), 6023); q.clearQhullMessage(); QVERIFY(!q.hasQhullMessage()); } { cout << "INFO : No error stream or output stream\n"; Qhull q; q.setErrorStream(0); q.setOutputStream(0); try{ q.runQhull(rcube, "Fd"); QFAIL("outputQhull did not fail."); }catch (const std::exception &e) { const char *s= e.what(); cout << "INFO : Caught " << s; QCOMPARE(QString::fromAscii(s).left(6), QString("QH6029")); } //FIXUP QH11026 Qhullmessage cleared when QhullError thrown. Switched to e //QVERIFY(q.hasQhullMessage()); //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(9), QString("qhull err")); //QCOMPARE(q.qhullStatus(), 6029); q.clearQhullMessage(); QVERIFY(!q.hasQhullMessage()); } }//t_message
QhullVertex::QhullVertex(const Qhull &q, vertexT *v) : qh_vertex(v ? v : &s_empty_vertex) , qh_qh(q.qh()) { }//vertexT
QhullVertex::QhullVertex(const Qhull &q) : qh_vertex(&s_empty_vertex) , qh_qh(q.qh()) { }//Default
QhullRidge::QhullRidge(const Qhull &q, ridgeT *r) : qh_ridge(r ? r : &s_empty_ridge) , qh_qh(q.qh()) { }//ridgeT
QhullRidge::QhullRidge(const Qhull &q) : qh_ridge(&s_empty_ridge) , qh_qh(q.qh()) { }//Default
QhullSetBase:: QhullSetBase(const Qhull &q, setT *s) : qh_set(s ? s : &s_empty_set) , qh_qh(q.qh()) { }