void testProximityFilter() { QLandmarkProximityFilter proximityFilter; proximityFilter.setCenter(QGeoCoordinate(30,30)); proximityFilter.setRadius( QGeoCoordinate(30,30).distanceTo(QGeoCoordinate(30,32)) ); //test landmark in the centre QLandmark lm; lm.setCoordinate(QGeoCoordinate(30,30)); QVERIFY(MockEngine::testFilter(proximityFilter, lm)); //test landmark just within the radius lm.setCoordinate(QGeoCoordinate(30,28.1)); QVERIFY(MockEngine::testFilter(proximityFilter, lm)); //test landmark on the edge the radius lm.setCoordinate(QGeoCoordinate(30,28.0)); QVERIFY(MockEngine::testFilter(proximityFilter, lm)); //test landmark just outside radius lm.setCoordinate(QGeoCoordinate(30,27.9)); QVERIFY(!MockEngine::testFilter(proximityFilter, lm)); //test landmark outside radius lm.setCoordinate(QGeoCoordinate(30,26)); QVERIFY(!MockEngine::testFilter(proximityFilter, lm)); }
void testUnionFilter() { QLandmarkCategoryId catId; catId.setLocalId("1"); catId.setManagerUri("qtlandmarks:mock:"); QLandmarkCategoryId catId2; catId2.setLocalId("2"); catId2.setManagerUri("qtlandmarks:mock:"); //test a match with the union filter QLandmarkUnionFilter unionFilter; QLandmarkNameFilter nameFilter("beach"); QLandmarkProximityFilter proximityFilter(QGeoCoordinate(30,30)); proximityFilter.setRadius(QGeoCoordinate(30,30).distanceTo(QGeoCoordinate(30,32))); QLandmarkCategoryFilter categoryFilter; categoryFilter.setCategoryId(catId); QLandmark lm; lm.setName("statue"); lm.setCoordinate(QGeoCoordinate(-30,-29)); lm.addCategoryId(catId); unionFilter << nameFilter << categoryFilter << proximityFilter; QVERIFY(MockEngine::testFilter(unionFilter,lm)); //test no match with union filter lm.removeCategoryId(catId); lm.addCategoryId(catId2); QVERIFY(!MockEngine::testFilter(unionFilter,lm)); //test empty union filter unionFilter.clear(); QVERIFY(!MockEngine::testFilter(unionFilter,lm)); }
void testFilterBox() { QLandmarkBoxFilter boxFilter(QGeoCoordinate(20,30),QGeoCoordinate(10,40)); //landmark is in box QLandmark lm; lm.setCoordinate(QGeoCoordinate(15,35)); QVERIFY(MockEngine::testFilter(boxFilter,lm)); //landmark is outside box lm.setCoordinate(QGeoCoordinate(50,50)); QVERIFY(!MockEngine::testFilter(boxFilter,lm)); //test landmark inside box when box crosses dateline QGeoBoundingBox box; box.setTopLeft(QGeoCoordinate(20,170)); box.setBottomRight(QGeoCoordinate(10,-170)); boxFilter.setBoundingBox(box); lm.setCoordinate(QGeoCoordinate(15,-175)); QVERIFY(MockEngine::testFilter(boxFilter, lm)); lm.setCoordinate(QGeoCoordinate(15, 175)); QVERIFY(MockEngine::testFilter(boxFilter, lm)); //test landmark outside box when box crosses dateline lm.setCoordinate(QGeoCoordinate(15, 160)); QVERIFY(!MockEngine::testFilter(boxFilter, lm)); lm.setCoordinate(QGeoCoordinate(15, -160)); QVERIFY(!MockEngine::testFilter(boxFilter, lm)); }
bool QLandmarkFileHandlerGpx::readWaypoint(QLandmark &landmark, const QString &elementName) { /* <xsd:complexType name="wptType"> <xsd:sequence> <xsd:element name="ele" type="xsd:decimal" minOccurs="0" /> <xsd:element name="time" type="xsd:dateTime" minOccurs="0" /> <xsd:element name="magvar" type="degreesType" minOccurs="0" /> <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0" /> <xsd:element name="name" type="xsd:string" minOccurs="0" /> <xsd:element name="cmt" type="xsd:string" minOccurs="0" /> <xsd:element name="desc" type="xsd:string" minOccurs="0" /> <xsd:element name="src" type="xsd:string" minOccurs="0" /> <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="sym" type="xsd:string" minOccurs="0" /> <xsd:element name="type" type="xsd:string" minOccurs="0" /> <xsd:element name="fix" type="fixType" minOccurs="0" /> <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0" /> <xsd:element name="hdop" type="xsd:decimal" minOccurs="0" /> <xsd:element name="vdop" type="xsd:decimal" minOccurs="0" /> <xsd:element name="pdop" type="xsd:decimal" minOccurs="0" /> <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0" /> <xsd:element name="dgpsid" type="dgpsStationType" minOccurs="0" /> <xsd:element name="extensions" type="extensionsType" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="lat" type="latitudeType" use="required" /> <xsd:attribute name="lon" type="longitudeType" use="required" /> </xsd:complexType> <xsd:simpleType name="latitudeType"> <xsd:restriction base="xsd:decimal"> <xsd:minInclusive value="-90.0"/> <xsd:maxInclusive value="90.0"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="longitudeType"> <xsd:restriction base="xsd:decimal"> <xsd:minInclusive value="-180.0"/> <xsd:maxExclusive value="180.0"/> </xsd:restriction> </xsd:simpleType> */ Q_ASSERT(m_reader->isStartElement() && (m_reader->name() == elementName)); QGeoCoordinate coord; if (m_reader->attributes().hasAttribute("lat")) { bool ok = false; QString s = m_reader->attributes().value("lat").toString(); if ((s == "INF") || (s == "-INF") || (s == "NaN")) { m_reader->raiseError(QString("The attribute \"lat\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } double lat = s.toDouble(&ok); if (!ok) { m_reader->raiseError(QString("The attribute \"lat\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } if (lat < -90.0 || 90.0 < lat) { m_reader->raiseError(QString("The attribute \"lat\" fell outside of the bounds -90.0 <= lat <= 90.0 (value was \"%1\").").arg(s)); return false; } coord.setLatitude(lat); } else { m_reader->raiseError(QString("The element \"%1\" did not have the required attribute \"lat\".").arg(elementName)); return false; } if (m_reader->attributes().hasAttribute("lon")) { bool ok = false; QString s = m_reader->attributes().value("lon").toString(); if ((s == "INF") || (s == "-INF") || (s == "NaN")) { m_reader->raiseError(QString("The attribute \"lon\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } double lon = s.toDouble(&ok); if (!ok) { m_reader->raiseError(QString("The attribute \"lon\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } if (lon < -180.0 || 180.0 <= lon) { m_reader->raiseError(QString("The attribute \"lon\" fell outside of the bounds -180.0 <= lat < 180.0 (value was \"%1\").").arg(s)); return false; } coord.setLongitude(lon); } else { m_reader->raiseError(QString("The element \"%1\" did not have the required attribute \"lon\".").arg(elementName)); return false; } landmark.setCoordinate(coord); if (!m_reader->readNextStartElement()) return true; if (m_reader->name() == "ele") { bool ok = false; QString s = m_reader->readElementText(); if ((s == "INF") || (s == "-INF") || (s == "NaN")) { m_reader->raiseError(QString("The element \"ele\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } double alt = s.toDouble(&ok); if (!ok) { m_reader->raiseError(QString("The element \"ele\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } coord.setAltitude(alt); landmark.setCoordinate(coord); if (!m_reader->readNextStartElement()) return true; } QList<QString> unusedNames1; unusedNames1 << "time"; unusedNames1 << "magvar"; unusedNames1 << "geoidheight"; for (int i = 0; i < unusedNames1.size(); ++i) { if (m_reader->name() == unusedNames1.at(i)) { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } } if (m_reader->name() == "name") { landmark.setName(m_reader->readElementText()); if (!m_reader->readNextStartElement()) return true; } if (m_reader->name() == "cmt") { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } if (m_reader->name() == "desc") { landmark.setDescription(m_reader->readElementText()); if (!m_reader->readNextStartElement()) return true; } if (m_reader->name() == "src") { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } while (m_reader->name() == "link") { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } QList<QString> unusedNames2; unusedNames2 << "sym"; unusedNames2 << "type"; unusedNames2 << "fix"; unusedNames2 << "sat"; unusedNames2 << "hdop"; unusedNames2 << "vdop"; unusedNames2 << "pdop"; unusedNames2 << "ageofdgpsdata"; unusedNames2 << "dgpsid"; unusedNames2 << "extensions"; for (int i = 0; i < unusedNames2.size(); ++i) { if (m_reader->name() == unusedNames2.at(i)) { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } } m_reader->raiseError(QString("The element \"%1\" did not expect a child element named \"%2\" at this point (unknown child element or child element out of order).").arg(elementName).arg(m_reader->name().toString())); return false; }
bool QLandmarkFileHandlerLmx::readCoordinates(QLandmark &landmark) { /* <xsd:complexType name="coordinatesType"> <xsd:sequence> <xsd:element name="latitude"> <xsd:simpleType> <xsd:restriction base="xsd:double"> <xsd:minInclusive value="-90"/> <xsd:maxInclusive value="90"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="longitude"> <xsd:simpleType> <xsd:restriction base="xsd:double"> <xsd:minInclusive value="-180"/> <xsd:maxExclusive value="180"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="altitude" type="xsd:float" minOccurs="0" /> <xsd:element name="horizontalAccuracy" minOccurs="0"> <xsd:simpleType> <xsd:restriction base="xsd:float"> <xsd:minInclusive value="0"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="verticalAccuracy" minOccurs="0"> <xsd:simpleType> <xsd:restriction base="xsd:float"> <xsd:minInclusive value="0"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="timeStamp" type="xsd:dateTime" minOccurs="0" /> </xsd:sequence> </xsd:complexType> */ Q_ASSERT(m_reader->isStartElement() && (m_reader->name() == "coordinates")); if (!m_reader->readNextStartElement()) { m_reader->raiseError("The element \"coordinates\" did not have the required child element \"latitude\"."); return false; } if (m_reader->name() == "latitude") { bool ok = false; QString s = m_reader->readElementText(); if ((s == "INF") || (s == "-INF") || (s == "NaN")) { m_reader->raiseError(QString("The element \"latitude\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } double lat = s.toDouble(&ok); if (!ok) { m_reader->raiseError(QString("The element \"latitude\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } if (lat < -90.0 || 90.0 < lat) { m_reader->raiseError(QString("The element \"latitude\" fell outside of the bounds -90.0 <= latitude <= 90.0 (value was \"%1\").").arg(s)); return false; } QGeoCoordinate coord = landmark.coordinate(); coord.setLatitude(lat); landmark.setCoordinate(coord); if (!m_reader->readNextStartElement()) { m_reader->raiseError("The element \"coordinates\" did not have the required child element \"longitude\"."); return false; } } else { m_reader->raiseError("The element \"coordinates\" did not have the required child element \"latitude\"."); return false; } if (m_reader->name() == "longitude") { bool ok = false; QString s = m_reader->readElementText(); if ((s == "INF") || (s == "-INF") || (s == "NaN")) { m_reader->raiseError(QString("The element \"longitude\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } double lon = s.toDouble(&ok); if (!ok) { m_reader->raiseError(QString("The element \"longitude\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } if (lon < -180.0 || 180.0 <= lon) { m_reader->raiseError(QString("The element \"longitude\" fell outside of the bounds -180.0 <= longitude < 180.0 (value was \"%1\").").arg(s)); return false; } QGeoCoordinate coord = landmark.coordinate(); coord.setLongitude(lon); landmark.setCoordinate(coord); if (!m_reader->readNextStartElement()) return true; } else { m_reader->raiseError("The element \"coordinates\" did not have the required child element \"longitude\"."); return false; } if (m_reader->name() == "altitude") { bool ok = false; QString s = m_reader->readElementText(); if ((s == "INF") || (s == "-INF") || (s == "NaN")) { m_reader->raiseError(QString("The element \"altitude\" expected a value convertable to type double (value was \"%1\").").arg(s)); return false; } double alt = s.toDouble(&ok); if (!ok) { m_reader->raiseError(QString("The element \"altitude\" expected a value convertable to type float (value was \"%1\").").arg(s)); return false; } QGeoCoordinate coord = landmark.coordinate(); coord.setAltitude(alt); landmark.setCoordinate(coord); if (!m_reader->readNextStartElement()) return true; } QList<QString> names; names << "horizontalAccuracy"; names << "verticalAccuracy"; names << "timeStamp"; for (int i = 0; i < names.size(); ++i) { // Not used outside of schema compliance check if (m_reader->name() == names.at(i)) { m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } } m_reader->raiseError(QString("The element \"coordinate\" did not expect a child element named \"%1\" at this point (unknown child element or child element out of order).").arg(m_reader->name().toString())); return false; }