add timeevent tests for state based rules

This commit is contained in:
Simon Stürz 2017-10-09 15:05:39 +02:00 committed by Michael Zanetti
parent 74397da6c1
commit 3e3bf83422
4 changed files with 89 additions and 3 deletions

View File

@ -481,7 +481,7 @@ void GuhCore::gotEvent(const Event &event)
QList<RuleAction> eventBasedActions;
foreach (const Rule &rule, m_ruleEngine->evaluateEvent(event)) {
// Event based
if (rule.eventDescriptors().count() > 0) {
if (!rule.eventDescriptors().isEmpty()) {
m_logger->logRuleTriggered(rule);
// check if we have an event based action or a normal action
foreach (const RuleAction &action, rule.actions()) {

View File

@ -350,7 +350,7 @@ QList<Rule> RuleEngine::evaluateEvent(const Event &event)
}
// If this rule does not base on an event, evaluate the rule
if (rule.eventDescriptors().isEmpty()) {
if (rule.eventDescriptors().isEmpty() && rule.timeDescriptor().timeEventItems().isEmpty()) {
if (rule.timeActive() && rule.statesActive()) {
if (!m_activeRules.contains(rule.id())) {
qCDebug(dcRuleEngine) << "Rule" << rule.id().toString() << "active.";
@ -409,7 +409,7 @@ QList<Rule> RuleEngine::evaluateTime(const QDateTime &dateTime)
rule.setTimeActive(rule.timeDescriptor().evaluate(m_lastEvaluationTime, dateTime));
m_rules[rule.id()] = rule;
if (rule.timeDescriptor().timeEventItems().isEmpty()) {
if (rule.timeDescriptor().timeEventItems().isEmpty() && rule.eventDescriptors().isEmpty()) {
if (rule.timeActive() && rule.statesActive()) {
if (!m_activeRules.contains(rule.id())) {

View File

@ -97,6 +97,7 @@ bool TimeEventItem::evaluate(const QDateTime &lastEvaluationTime, const QDateTim
switch (m_repeatingOption.mode()) {
// If there is no repeating option, we assume it is meant daily.
case RepeatingOption::RepeatingModeNone:
return lastEvaluationTime.time() < m_time && m_time <= dateTime.time();
case RepeatingOption::RepeatingModeDaily:
return lastEvaluationTime.time() < m_time && m_time <= dateTime.time();
case RepeatingOption::RepeatingModeHourly: {

View File

@ -97,6 +97,9 @@ private slots:
void testEventItemYearly_data();
void testEventItemYearly();
void testEventItemStates_data();
void testEventItemStates();
void testEnableDisableTimeRule();
private:
@ -1716,6 +1719,88 @@ void TestTimeManager::testEventItemYearly()
verifyRuleError(response);
}
void TestTimeManager::testEventItemStates_data()
{
initTimeManager();
GuhCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(7,59)));
// Action (without params)
QVariantMap action;
action.insert("actionTypeId", mockActionIdNoParams);
action.insert("deviceId", m_mockDeviceId);
action.insert("ruleActionParams", QVariantList());
// Time descriptor
QVariantMap timeEventItem1 = createTimeEventItem("08:00");
QVariantMap timeEventItem2 = createTimeEventItem("09:00");
QVariantMap timeDescriptor;
timeDescriptor.insert("timeEventItems", QVariantList() << timeEventItem1 << timeEventItem2);
// State evaluator
QVariantMap stateDescriptorBool;
stateDescriptorBool.insert("deviceId", m_mockDeviceId);
stateDescriptorBool.insert("operator", JsonTypes::valueOperatorToString(Types::ValueOperatorEquals));
stateDescriptorBool.insert("stateTypeId", mockBoolStateId);
stateDescriptorBool.insert("value", true);
QVariantMap stateEvaluator;
stateEvaluator.insert("stateDescriptor", stateDescriptorBool);
// The rule
QVariantMap ruleMap;
ruleMap.insert("name", "Time and state and event based daily calendar rule");
ruleMap.insert("actions", QVariantList() << action);
ruleMap.insert("stateEvaluator", stateEvaluator);
ruleMap.insert("timeDescriptor", timeDescriptor);
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);
QTest::addColumn<QDateTime>("dateTime");
QTest::addColumn<bool>("boolValue");
QTest::addColumn<bool>("trigger");
QTest::newRow("TimeEvent 07:59 | state false | not trigger") << QDateTime(QDate::currentDate(), QTime(7,59)) << false << false;
QTest::newRow("TimeEvent 07:59 | state true | not trigger") << QDateTime(QDate::currentDate(), QTime(7,59)) << true << false;
QTest::newRow("TimeEvent 08:00 | state false | not trigger") << QDateTime(QDate::currentDate(), QTime(8,0)) << false << false;
QTest::newRow("TimeEvent 07:59 | state true | not trigger") << QDateTime(QDate::currentDate(), QTime(7,59)) << true << false;
QTest::newRow("TimeEvent 08:00 | state true | trigger") << QDateTime(QDate::currentDate(), QTime(8,0)) << true << true;
QTest::newRow("TimeEvent 08:01 | state true | not trigger") << QDateTime(QDate::currentDate(), QTime(8,1)) << true << false;
QTest::newRow("TimeEvent 08:01 | state false | not trigger") << QDateTime(QDate::currentDate(), QTime(8,1)) << true << false;
QTest::newRow("TimeEvent 08:30 | state true | not trigger") << QDateTime(QDate::currentDate(), QTime(8,30)) << true << false;
QTest::newRow("TimeEvent 09:00 | state true | trigger") << QDateTime(QDate::currentDate(), QTime(9,0)) << true << true;
}
void TestTimeManager::testEventItemStates()
{
QFETCH(QDateTime, dateTime);
QFETCH(bool, boolValue);
QFETCH(bool, trigger);
// Set state
setBoolState(boolValue);
// Set time
GuhCore::instance()->timeManager()->setTime(dateTime);
if (trigger) {
verifyRuleExecuted(mockActionIdNoParams);
cleanupMockHistory();
} else {
verifyRuleNotExecuted();
}
}
void TestTimeManager::testEnableDisableTimeRule()
{
initTimeManager();