From d01ee95eccb6027d86242367a9906344ff223a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Sat, 2 Apr 2016 01:41:13 +0200 Subject: [PATCH] fix daily calendaritem --- server/time/calendaritem.cpp | 24 +- tests/auto/timemanager/testtimemanager.cpp | 255 ++++++++++++++++++++- 2 files changed, 251 insertions(+), 28 deletions(-) diff --git a/server/time/calendaritem.cpp b/server/time/calendaritem.cpp index 77437645..f38b5edf 100644 --- a/server/time/calendaritem.cpp +++ b/server/time/calendaritem.cpp @@ -135,8 +135,6 @@ bool CalendarItem::evaluate(const QDateTime &dateTime) const bool CalendarItem::evaluateHourly(const QDateTime &dateTime) const { - qCDebug(dcRuleEngine()) << "Evaluate CalendarItem Hourly"; - // If the duration is longer than a hour, this calendar item is always true // 1 hour has 60 minutes if (duration() >= 60) @@ -145,10 +143,6 @@ bool CalendarItem::evaluateHourly(const QDateTime &dateTime) const QDateTime startDateTime = QDateTime(dateTime.date(), QTime(dateTime.time().hour(), startTime().minute())); QDateTime endDateTime = startDateTime.addSecs(duration() * 60); - qCDebug(dcRuleEngine()) << "current time" << dateTime.toString("hh:mm"); - qCDebug(dcRuleEngine()) << "startTime" << startDateTime.toString("hh:mm"); - qCDebug(dcRuleEngine()) << "endTime" << endDateTime.toString("hh:mm"); - bool timeValid = dateTime >= startDateTime && dateTime < endDateTime; bool weekdayValid = repeatingOption().evaluateWeekDay(dateTime); bool monthdayValid = repeatingOption().evaluateMonthDay(dateTime); @@ -158,27 +152,23 @@ bool CalendarItem::evaluateHourly(const QDateTime &dateTime) const bool CalendarItem::evaluateDaily(const QDateTime &dateTime) const { - qCDebug(dcRuleEngine()) << "Evaluate CalendarItem Hourly"; - // If the duration is longer than a day, this calendar item is always true // 1 day has 1440 minutes if (duration() >= 1440) return true; + // get todays startTime QDateTime startDateTime = QDateTime(dateTime.date(), startTime()); QDateTime endDateTime = startDateTime.addSecs(duration() * 60); - bool timeValid = false; + // get todays startTime + QDateTime startDateTimeYesterday = QDateTime(dateTime.date().addDays(-1), startTime()); + QDateTime endDateTimeYesterday = startDateTimeYesterday.addSecs(duration() * 60); - if (startDateTime.date() == endDateTime.date()) { - timeValid = dateTime >= startDateTime && dateTime < endDateTime; - } else { - // If the time duration changes the date, - // check only if the time is smaler than the overlapping time - timeValid = dateTime.time() < endDateTime.time(); - } + bool todayValid = dateTime >= startDateTime && dateTime < endDateTime; + bool yesterdayValid = dateTime >= startDateTimeYesterday && dateTime < endDateTimeYesterday; - return timeValid; + return todayValid || yesterdayValid; } bool CalendarItem::evaluateWeekly(const QDateTime &dateTime) const diff --git a/tests/auto/timemanager/testtimemanager.cpp b/tests/auto/timemanager/testtimemanager.cpp index 50a1266d..99195276 100644 --- a/tests/auto/timemanager/testtimemanager.cpp +++ b/tests/auto/timemanager/testtimemanager.cpp @@ -48,7 +48,15 @@ private slots: void testCalendarItemHourly(); + void testCalendarItemDaily_data(); + void testCalendarItemDaily(); + + void testCalendarItemWeekly_data(); + void testCalendarItemWeekly(); + private: + void initTimeManager(); + void verifyRuleExecuted(const ActionTypeId &actionTypeId); void verifyRuleNotExecuted(); @@ -236,10 +244,7 @@ void TestTimeManager::addTimeDescriptor() void TestTimeManager::testCalendarItemHourly() { - GuhCore::instance()->timeManager()->stopTimer(); - qDebug() << GuhCore::instance()->timeManager()->currentDate().toString(); - qDebug() << GuhCore::instance()->timeManager()->currentTime().toString(); - qDebug() << GuhCore::instance()->timeManager()->currentDateTime().toString(); + initTimeManager(); QVariantMap ruleMap; QVariantMap action; QVariantMap exitAction; QVariantMap repeatingOptionHourly; repeatingOptionHourly.insert("mode", "RepeatingModeHourly"); @@ -250,7 +255,7 @@ void TestTimeManager::testCalendarItemHourly() QVariantList actionParams; QVariantMap param1; param1.insert("name", "mockActionParam1"); - param1.insert("value", 5); + param1.insert("value", 7); actionParams.append(param1); QVariantMap param2; param2.insert("name", "mockActionParam2"); @@ -259,7 +264,7 @@ void TestTimeManager::testCalendarItemHourly() exitAction.insert("deviceId", m_mockDeviceId); exitAction.insert("ruleActionParams", actionParams); ruleMap.insert("name", "Time based hourly calendar rule"); - ruleMap.insert("timeDescriptor", createTimeDescriptorCalendar(createCalendarItem("08:05", 5))); + ruleMap.insert("timeDescriptor", createTimeDescriptorCalendar(createCalendarItem("08:05", 5, repeatingOptionHourly))); ruleMap.insert("actions", QVariantList() << action); ruleMap.insert("exitActions", QVariantList() << exitAction); @@ -267,11 +272,15 @@ void TestTimeManager::testCalendarItemHourly() verifyRuleError(response); RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); + QVariantMap params; + params.insert("ruleId", ruleId); + response = injectAndWait("Rules.GetRuleDetails", params); + QDateTime currentDateTime = GuhCore::instance()->timeManager()->currentDateTime(); // check the next 24 hours QDateTime future = QDateTime(currentDateTime.date(), QTime(8, 4)); - //for (int i = 0; i < 24; i++) { + for (int i = 0; i < 24; i+=3) { // inactive GuhCore::instance()->timeManager()->setTime(future); verifyRuleNotExecuted(); @@ -291,8 +300,8 @@ void TestTimeManager::testCalendarItemHourly() verifyRuleNotExecuted(); // One hour "Back to the future" - future = future.addSecs(60*60); - //} + future = future.addSecs(3*60*60); + } // REMOVE rule QVariantMap removeParams; @@ -301,6 +310,232 @@ void TestTimeManager::testCalendarItemHourly() verifyRuleError(response); } +void TestTimeManager::testCalendarItemDaily_data() +{ + QVariantMap repeatingOptionDaily; + repeatingOptionDaily.insert("mode", "RepeatingModeDaily"); + + QTest::addColumn("timeDescriptor"); + QTest::addColumn("time"); + QTest::addColumn("duration"); + + QTest::newRow("daily") << createTimeDescriptorCalendar(createCalendarItem("06:55", 10, repeatingOptionDaily)) << "06:55" << 10; + QTest::newRow("daily jump date") << createTimeDescriptorCalendar(createCalendarItem("23:55", 10, repeatingOptionDaily)) << "23:55" << 10; +} + +void TestTimeManager::testCalendarItemDaily() +{ + QFETCH(QVariantMap, timeDescriptor); + QFETCH(QString, time); + + initTimeManager(); + + QVariantMap ruleMap; QVariantMap action; QVariantMap exitAction; + action.insert("actionTypeId", mockActionIdNoParams); + action.insert("deviceId", m_mockDeviceId); + action.insert("ruleActionParams", QVariantList()); + exitAction.insert("actionTypeId", mockActionIdWithParams); + QVariantList actionParams; + QVariantMap param1; + param1.insert("name", "mockActionParam1"); + param1.insert("value", 12); + actionParams.append(param1); + QVariantMap param2; + param2.insert("name", "mockActionParam2"); + param2.insert("value", true); + actionParams.append(param2); + exitAction.insert("deviceId", m_mockDeviceId); + exitAction.insert("ruleActionParams", actionParams); + ruleMap.insert("name", "Time based hourly calendar rule"); + ruleMap.insert("timeDescriptor", timeDescriptor); + ruleMap.insert("actions", QVariantList() << action); + ruleMap.insert("exitActions", QVariantList() << exitAction); + + QVariant response = injectAndWait("Rules.AddRule", ruleMap); + verifyRuleError(response); + RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); + + QVariantMap params; + params.insert("ruleId", ruleId); + response = injectAndWait("Rules.GetRuleDetails", params); + + qDebug() << QJsonDocument::fromVariant(response.toMap().value("params").toMap()).toJson(); + + QDateTime currentDateTime = GuhCore::instance()->timeManager()->currentDateTime(); + + // start with one minute before starttime today + QDateTime future = QDateTime(currentDateTime.date(), QTime::fromString(time, "hh:mm").addSecs(-60)); + + // check the next 7 days + for (int i = 0; i < 7; i++) { + // inactive + GuhCore::instance()->timeManager()->setTime(future); + verifyRuleNotExecuted(); + // active + GuhCore::instance()->timeManager()->setTime(future.addSecs(60)); + verifyRuleExecuted(mockActionIdNoParams); + cleanupMockHistory(); + // active unchanged + GuhCore::instance()->timeManager()->setTime(future.addSecs(6* 60)); + verifyRuleNotExecuted(); + // inactive + GuhCore::instance()->timeManager()->setTime(future.addSecs(11 * 60)); + verifyRuleExecuted(mockActionIdWithParams); + cleanupMockHistory(); + // inactive unchanged + GuhCore::instance()->timeManager()->setTime(future.addSecs(12 * 60)); + verifyRuleNotExecuted(); + // One day "Back to the future" + future = future.addDays(1); + } + // REMOVE rule + QVariantMap removeParams; + removeParams.insert("ruleId", ruleId); + response = injectAndWait("Rules.RemoveRule", removeParams); + verifyRuleError(response); +} + +void TestTimeManager::testCalendarItemWeekly_data() +{ +// QVariantMap repeatingOptionDaily; +// repeatingOptionDaily.insert("mode", "RepeatingModeDaily"); + +// QVariantMap repeatingOptionDailyWeekDays; +// repeatingOptionDailyWeekDays.insert("mode", "RepeatingModeDaily"); +// repeatingOptionDailyWeekDays.insert("weekDays", QVariantList() << 1 << 4 << 7); + +// QTest::addColumn("timeDescriptor"); +// QTest::addColumn("time"); +// QTest::addColumn("duration"); + +// QTest::newRow("daily") << createTimeDescriptorCalendar(createCalendarItem("06:55", 10, repeatingOptionDaily)) << "06:55" << 10; +// QTest::newRow("daily jump date") << createTimeDescriptorCalendar(createCalendarItem("23:55", 10, repeatingOptionDaily)) << "23:55" << 10; + +} + +void TestTimeManager::testCalendarItemWeekly() +{ +// QFETCH(QVariantMap, timeDescriptor); +// QFETCH(QString, time); + +// initTimeManager(); + +// QVariantMap ruleMap; QVariantMap action; QVariantMap exitAction; +// action.insert("actionTypeId", mockActionIdNoParams); +// action.insert("deviceId", m_mockDeviceId); +// action.insert("ruleActionParams", QVariantList()); +// exitAction.insert("actionTypeId", mockActionIdWithParams); +// QVariantList actionParams; +// QVariantMap param1; +// param1.insert("name", "mockActionParam1"); +// param1.insert("value", 12); +// actionParams.append(param1); +// QVariantMap param2; +// param2.insert("name", "mockActionParam2"); +// param2.insert("value", true); +// actionParams.append(param2); +// exitAction.insert("deviceId", m_mockDeviceId); +// exitAction.insert("ruleActionParams", actionParams); +// ruleMap.insert("name", "Time based hourly calendar rule"); +// ruleMap.insert("timeDescriptor", timeDescriptor); +// ruleMap.insert("actions", QVariantList() << action); +// ruleMap.insert("exitActions", QVariantList() << exitAction); + +// QVariant response = injectAndWait("Rules.AddRule", ruleMap); +// verifyRuleError(response); +// RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); + +// QVariantMap params; +// params.insert("ruleId", ruleId); +// response = injectAndWait("Rules.GetRuleDetails", params); + +// qDebug() << QJsonDocument::fromVariant(response.toMap().value("params").toMap()).toJson(); + +// QDateTime currentDateTime = GuhCore::instance()->timeManager()->currentDateTime(); + +// // start with one minute before starttime today +// QDateTime future = QDateTime(currentDateTime.date(), QTime::fromString(time, "hh:mm").addSecs(-60)); + +// // check the next 7 days +// for (int i = 0; i < 7; i++) { +// // inactive +// GuhCore::instance()->timeManager()->setTime(future); +// verifyRuleNotExecuted(); + +// if (!timeDescriptor.value("calendarItems").toList().first().toMap().contains("weekDays")) { +// // active +// GuhCore::instance()->timeManager()->setTime(future.addSecs(60)); +// verifyRuleExecuted(mockActionIdNoParams); +// cleanupMockHistory(); +// // active unchanged +// GuhCore::instance()->timeManager()->setTime(future.addSecs(6* 60)); +// verifyRuleNotExecuted(); +// // inactive +// GuhCore::instance()->timeManager()->setTime(future.addSecs(11 * 60)); +// verifyRuleExecuted(mockActionIdWithParams); +// cleanupMockHistory(); +// // inactive unchanged +// GuhCore::instance()->timeManager()->setTime(future.addSecs(12 * 60)); +// verifyRuleNotExecuted(); +// // One day "Back to the future" +// future = future.addDays(1); +// } else { +// // Check if today is a weekday +// QVariantList weekDays = timeDescriptor.value("calendarItems").toList().first().toMap().value("weekDays").toList(); +// QDateTime todaysStartTime = QDateTime(currentDateTime.date(), QTime::fromString(time, "hh:mm")); +// if (weekDays.contains(QVariant(todaysStartTime.date().dayOfWeek()))) { +// // should trigger today +// // active +// GuhCore::instance()->timeManager()->setTime(future); +// verifyRuleExecuted(mockActionIdNoParams); +// cleanupMockHistory(); +// // active unchanged +// GuhCore::instance()->timeManager()->setTime(future.addSecs(6* 60)); +// verifyRuleNotExecuted(); +// // inactive +// GuhCore::instance()->timeManager()->setTime(future.addSecs(11 * 60)); +// verifyRuleExecuted(mockActionIdWithParams); +// cleanupMockHistory(); +// // inactive unchanged +// GuhCore::instance()->timeManager()->setTime(future.addSecs(12 * 60)); +// verifyRuleNotExecuted(); + +// // One day "Back to the future" +// future = future.addDays(1); +// } else { +// // should not trigger today +// // inactive +// GuhCore::instance()->timeManager()->setTime(future); +// verifyRuleNotExecuted(); +// // inactive +// GuhCore::instance()->timeManager()->setTime(future.addSecs(6* 60)); +// verifyRuleNotExecuted(); +// // inactive +// GuhCore::instance()->timeManager()->setTime(future.addSecs(11 * 60)); +// verifyRuleNotExecuted(); +// // inactive +// GuhCore::instance()->timeManager()->setTime(future.addSecs(12 * 60)); +// verifyRuleNotExecuted(); + +// // One day "Back to the future" +// future = future.addDays(1); +// } +// } +// } +// // REMOVE rule +// QVariantMap removeParams; +// removeParams.insert("ruleId", ruleId); +// response = injectAndWait("Rules.RemoveRule", removeParams); +// verifyRuleError(response); +} + +void TestTimeManager::initTimeManager() +{ + GuhCore::instance()->timeManager()->stopTimer(); + qDebug() << GuhCore::instance()->timeManager()->currentTime().toString(); + qDebug() << GuhCore::instance()->timeManager()->currentDateTime().toString(); +} + void TestTimeManager::verifyRuleExecuted(const ActionTypeId &actionTypeId) { // Verify rule got executed @@ -312,7 +547,6 @@ void TestTimeManager::verifyRuleExecuted(const ActionTypeId &actionTypeId) QCOMPARE(spy.count(), 1); QByteArray actionHistory = reply->readAll(); - qDebug() << "have action history" << actionHistory; QVERIFY2(actionTypeId == ActionTypeId(actionHistory), "Action not triggered"); reply->deleteLater(); } @@ -327,7 +561,6 @@ void TestTimeManager::verifyRuleNotExecuted() QCOMPARE(spy.count(), 1); QByteArray actionHistory = reply->readAll(); - qDebug() << "have action history" << actionHistory; QVERIFY2(actionHistory.isEmpty(), "Action is triggered while it should not have been."); reply->deleteLater(); }