fix daily calendaritem
This commit is contained in:
parent
efa965c137
commit
d01ee95ecc
@ -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
|
||||
|
||||
@ -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<QVariantMap>("timeDescriptor");
|
||||
QTest::addColumn<QString>("time");
|
||||
QTest::addColumn<int>("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<QVariantMap>("timeDescriptor");
|
||||
// QTest::addColumn<QString>("time");
|
||||
// QTest::addColumn<int>("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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user