diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.0) -set(PIM_VERSION "5.9.42") +set(PIM_VERSION "5.9.43") project(KItinerary VERSION ${PIM_VERSION}) set(KF5_VERSION "5.48.0") diff --git a/autotests/jsonlddocumenttest.cpp b/autotests/jsonlddocumenttest.cpp --- a/autotests/jsonlddocumenttest.cpp +++ b/autotests/jsonlddocumenttest.cpp @@ -107,6 +107,57 @@ qDebug().noquote() << QJsonDocument(obj).toJson(); auto undernameObj = obj.value(QLatin1String("underName")).toObject(); QCOMPARE(undernameObj.value(QLatin1String("name")), QLatin1String("John")); + + //Rental Car + RentalCarReservation rentalRes; + const QString reservationRentalNumber{QStringLiteral("OT1234567")}; + rentalRes.setReservationNumber(reservationRentalNumber); + Person personRentalCal; + const QString fullNameRentalCar{QStringLiteral("John2")}; + + personRentalCal.setName(fullNameRentalCar); + rentalRes.setUnderName(personRentalCal); + rentalRes.setPickupTime(QDateTime(QDate(2018, 3, 18), QTime(18, 44, 0), QTimeZone("Europe/Berlin"))); + rentalRes.setDropoffTime(QDateTime(QDate(2018, 3, 21), QTime(18, 44, 0), QTimeZone("Europe/Berlin"))); + + Place placeDropLocation; + placeDropLocation.setName(QStringLiteral("droplocation")); + KItinerary::PostalAddress placeDropPostalAddress; + placeDropPostalAddress.setStreeAddress(QStringLiteral("8 foo bla bla")); + placeDropPostalAddress.setAddressLocality(QStringLiteral("bli")); + placeDropLocation.setAddress(placeDropPostalAddress); + + rentalRes.setDropOffLocation(placeDropLocation); + + Place placePickupLocation; + placePickupLocation.setName(QStringLiteral("pickuplocation")); + KItinerary::PostalAddress placePickupPostalAddress; + placePickupPostalAddress.setStreeAddress(QStringLiteral("5 kde foo bla bla")); + placePickupPostalAddress.setAddressLocality(QStringLiteral("bli2")); + placePickupLocation.setAddress(placePickupPostalAddress); + + rentalRes.setPickUpLocation(placePickupLocation); + + array = JsonLdDocument::toJson({rentalRes}); + QCOMPARE(array.size(), 1); + obj = array.at(0).toObject(); + QCOMPARE(obj.value(QLatin1String("reservationNumber")).toString(), reservationRentalNumber); + + qDebug().noquote() << QJsonDocument(obj).toJson(); + undernameObj = obj.value(QLatin1String("underName")).toObject(); + QCOMPARE(undernameObj.value(QLatin1String("name")), fullNameRentalCar); + + auto pickupTimeObj = obj.value(QLatin1String("dropoffTime")).toObject(); + QCOMPARE(pickupTimeObj.value(QLatin1String("@value")).toString(), QLatin1String("2018-03-21T18:44:00+01:00")); + QCOMPARE(pickupTimeObj.value(QLatin1String("@type")).toString(), QLatin1String("QDateTime")); + QCOMPARE(pickupTimeObj.value(QLatin1String("timezone")).toString(), QLatin1String("Europe/Berlin")); + + auto droptimeObj = obj.value(QLatin1String("pickupTime")).toObject(); + QCOMPARE(droptimeObj.value(QLatin1String("@value")).toString(), QLatin1String("2018-03-18T18:44:00+01:00")); + QCOMPARE(droptimeObj.value(QLatin1String("@type")).toString(), QLatin1String("QDateTime")); + QCOMPARE(droptimeObj.value(QLatin1String("timezone")).toString(), QLatin1String("Europe/Berlin")); + + } void testDeserialization() @@ -169,6 +220,62 @@ QCOMPARE(res.reservationNumber(), QStringLiteral("0T44542")); QCOMPARE(res.underName().value().name(), QStringLiteral("John Smith")); QCOMPARE(res.underName().value().email(), QStringLiteral("foo@kde.org")); + + //RentalCar + b = QByteArray("[{" + "\"@context\": \"http://schema.org\"," + "\"@type\": \"RentalCarReservation\"," + "\"reservationNumber\": \"0T445424\"," + "\"underName\": {" + " \"@type\": \"Person\"," + " \"name\": \"John Smith\"," + " \"email\": \"foo@kde.org\"" + "}," + "\"pickUpLocation\": {" + " \"@type\": \"Place\"," + " \"address\": {" + " \"@type\": \"PostalAddress\"," + " \"addressLocality\": \"bli2\"," + " \"streetAddress\": \"5 kde foo bla bla\"" + "}," + "\"name\": \"pickuplocation\"" + "}," + "\"dropOffLocation\": {" + " \"@type\": \"Place\"," + " \"address\": {" + " \"@type\": \"PostalAddress\"," + " \"addressLocality\": \"bli3\"," + " \"streetAddress\": \"7 kde foo bla bla\"" + "}," + "\"name\": \"droplocation\"" + "}," + "\"pickupTime\": \"2018-03-18T18:44:00+01:00\"," + "\"dropoffTime\": \"2018-03-21T18:44:00+01:00\"" + "}]"); + + array = QJsonDocument::fromJson(b).array(); + datas = JsonLdDocument::fromJson(array); + QCOMPARE(datas.size(), 1); + data = datas.at(0); + QVERIFY(data.canConvert()); + auto resRentCar = data.value(); + QCOMPARE(resRentCar.reservationNumber(), QStringLiteral("0T445424")); + QCOMPARE(resRentCar.underName().value().name(), QStringLiteral("John Smith")); + QCOMPARE(resRentCar.underName().value().email(), QStringLiteral("foo@kde.org")); + QCOMPARE(resRentCar.pickupTime(), QDateTime(QDate(2018, 3, 18), QTime(18, 44, 0), QTimeZone("Europe/Berlin"))); + QCOMPARE(resRentCar.dropoffTime(), QDateTime(QDate(2018, 3, 21), QTime(18, 44, 0), QTimeZone("Europe/Berlin"))); + const auto dropOffLocation = resRentCar.dropOffLocation(); + QCOMPARE(dropOffLocation.name(), QStringLiteral("droplocation")); + const auto dropOffLocationAddress = dropOffLocation.address(); + QCOMPARE(dropOffLocationAddress.streetAddress(), QStringLiteral("7 kde foo bla bla")); + QCOMPARE(dropOffLocationAddress.addressLocality(), QStringLiteral("bli3")); + + const auto pickUpLocation = resRentCar.pickUpLocation(); + QCOMPARE(pickUpLocation.name(), QStringLiteral("pickuplocation")); + const auto pickupLocationAddress = pickUpLocation.address(); + QCOMPARE(pickupLocationAddress.streetAddress(), QStringLiteral("5 kde foo bla bla")); + QCOMPARE(pickupLocationAddress.addressLocality(), QStringLiteral("bli2")); + } void testApply() diff --git a/src/datatypes/datatypes.cpp b/src/datatypes/datatypes.cpp --- a/src/datatypes/datatypes.cpp +++ b/src/datatypes/datatypes.cpp @@ -34,6 +34,7 @@ qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); + qRegisterMetaType(); } }; diff --git a/src/datatypes/place.h b/src/datatypes/place.h --- a/src/datatypes/place.h +++ b/src/datatypes/place.h @@ -138,5 +138,4 @@ Q_DECLARE_METATYPE(KItinerary::BusStation) Q_DECLARE_METATYPE(KItinerary::TouristAttraction) - #endif // KITINERARY_PLACE_H diff --git a/src/datatypes/place.cpp b/src/datatypes/place.cpp --- a/src/datatypes/place.cpp +++ b/src/datatypes/place.cpp @@ -111,6 +111,7 @@ }; KITINERARY_MAKE_SUB_CLASS(TouristAttraction, Place) + } template <> diff --git a/src/datatypes/reservation.h b/src/datatypes/reservation.h --- a/src/datatypes/reservation.h +++ b/src/datatypes/reservation.h @@ -28,6 +28,7 @@ class ReservationPrivate; class Organization; +class Place; /** Abstract base class for reservations. * @see https://schema.org/Reservation @@ -126,14 +127,28 @@ KITINERARY_GADGET(EventReservation) }; +/** A Rental Car reservation. + * @see https://developers.google.com/gmail/markup/reference/rental-car + */ +class KITINERARY_EXPORT RentalCarReservation : public Reservation +{ + KITINERARY_GADGET(RentalCarReservation) + KITINERARY_PROPERTY(QDateTime, dropoffTime, setDropoffTime) + KITINERARY_PROPERTY(QDateTime, pickupTime, setPickupTime) + KITINERARY_PROPERTY(KItinerary::Place, pickUpLocation, setPickUpLocation) + KITINERARY_PROPERTY(KItinerary::Place, dropOffLocation, setDropOffLocation) +}; + + } Q_DECLARE_METATYPE(KItinerary::FlightReservation) Q_DECLARE_METATYPE(KItinerary::LodgingReservation) Q_DECLARE_METATYPE(KItinerary::TrainReservation) Q_DECLARE_METATYPE(KItinerary::BusReservation) Q_DECLARE_METATYPE(KItinerary::FoodEstablishmentReservation) Q_DECLARE_METATYPE(KItinerary::EventReservation) +Q_DECLARE_METATYPE(KItinerary::RentalCarReservation) #endif // KITINERARY_RESERVATION_H diff --git a/src/datatypes/reservation.cpp b/src/datatypes/reservation.cpp --- a/src/datatypes/reservation.cpp +++ b/src/datatypes/reservation.cpp @@ -113,6 +113,22 @@ }; KITINERARY_MAKE_SUB_CLASS(EventReservation, Reservation) +class RentalCarReservationPrivate : public ReservationPrivate +{ + KITINERARY_PRIVATE_GADGET(RentalCarReservation) +public: + QDateTime dropoffTime; + QDateTime pickupTime; + Place pickUpLocation; + Place dropOffLocation; +}; +KITINERARY_MAKE_SUB_CLASS(RentalCarReservation, Reservation) +KITINERARY_MAKE_PROPERTY(RentalCarReservation, QDateTime, dropoffTime, setDropoffTime) +KITINERARY_MAKE_PROPERTY(RentalCarReservation, QDateTime, pickupTime, setPickupTime) +KITINERARY_MAKE_PROPERTY(RentalCarReservation, Place, pickUpLocation, setPickUpLocation) +KITINERARY_MAKE_PROPERTY(RentalCarReservation, Place, dropOffLocation, setDropOffLocation) + + } template <> diff --git a/src/jsonlddocument.cpp b/src/jsonlddocument.cpp --- a/src/jsonlddocument.cpp +++ b/src/jsonlddocument.cpp @@ -172,6 +172,7 @@ MAKE_FACTORY(FlightReservation); MAKE_FACTORY(FoodEstablishment); MAKE_FACTORY(FoodEstablishmentReservation); + MAKE_FACTORY(RentalCarReservation); MAKE_FACTORY(GeoCoordinates); MAKE_FACTORY(LodgingBusiness); MAKE_FACTORY(LodgingReservation); @@ -187,7 +188,7 @@ MAKE_FACTORY(TrainStation); MAKE_FACTORY(TrainTrip); MAKE_FACTORY(UpdateAction); - MAKE_FACTORY(ViewAction); + MAKE_FACTORY(ViewAction); return {}; }