|
From: <tho...@us...> - 2012-03-04 22:03:01
|
Revision: 722
http://openautomation.svn.sourceforge.net/openautomation/?rev=722&view=rev
Author: thomas_s
Date: 2012-03-04 22:02:54 +0000 (Sun, 04 Mar 2012)
Log Message:
-----------
implemented dayCondition and timeCondition
implemented unittests for both classes
Modified Paths:
--------------
xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h
xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h
xPLHAL/branches/thomas_s_dev/src/determinatoritems.h
xPLHAL/branches/thomas_s_dev/test/test_determinator.cpp
xPLHAL/branches/thomas_s_dev/test/test_determinator_manager.cpp
Modified: xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp 2012-03-04 22:02:54 UTC (rev 722)
@@ -1,10 +1,34 @@
#include "dayCondition.h"
+#include <ctime>
+#include <chrono>
+#include <iostream>
using std::string;
+using std::chrono::time_point;
+using std::chrono::system_clock;
+using std::shared_ptr;
+using boost::regex;
+using std::cout;
+dayCondition::dayCondition(const BaseDeterminatorItem::attribute_t& attrlist)
+{
+ attributes = attrlist;
+}
+
dayCondition::dayCondition(const pugi::xml_node& basenode)
{
- attributes["dow"];
+ attributes["dow"] = {shared_ptr<regex>(new regex(R"(^[01]{7}$)"))};
parseFromXml(basenode);
}
+bool dayCondition::match() const
+{
+ std::time_t currentTime = std::time(0);
+ auto tm = std::localtime(¤tTime);
+ string dow_config = getAttribute("dow");
+
+ if (dow_config.length() == 7) {
+ return dow_config[tm->tm_wday] == '1';
+ }
+ return false;
+}
Modified: xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h 2012-03-04 22:02:54 UTC (rev 722)
@@ -5,6 +5,9 @@
{
public:
dayCondition() {}
+ dayCondition(const BaseDeterminatorItem::attribute_t& attrlist);
dayCondition(const pugi::xml_node& basenode);
+
+ bool match() const;
};
Modified: xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp 2012-03-04 22:02:54 UTC (rev 722)
@@ -1,22 +1,73 @@
#include "timeCondition.h"
-#include <boost/regex.hpp>
-#include <memory>
-#include <map>
+#include <chrono>
using std::string;
using std::shared_ptr;
-using std::map;
+using std::chrono::time_point;
+using std::chrono::duration;
+using std::chrono::system_clock;
using boost::regex;
using boost::regex_match;
+using boost::smatch;
+
+timeCondition::timeCondition(const BaseDeterminatorItem::attribute_t& attrlist, std::time_t fixTime)
+:mTestTime(fixTime)
+{
+ attributes["operator"] = {shared_ptr<regex>(new regex(R"(^(=|!=|<|>|<=|>=)$)"))};
+ attributes["value"] = {shared_ptr<regex>(new regex(R"(^(\d{1,2}):(\d{1,2})$)"))};
+
+ for (auto a : attrlist) {
+ attributes[a.first].value = a.second.value;
+ }
+
+ setCompareTime();
+}
+
timeCondition::timeCondition(const pugi::xml_node& basenode)
+:mTestTime(0)
{
attributes["operator"] = {shared_ptr<regex>(new regex(R"(^(=|!=|<|>|<=|>=)$)"))};
- attributes["value"] = {shared_ptr<regex>(new regex(R"(^\d{1,2}:\d{1,2}$)"))};
+ attributes["value"] = {shared_ptr<regex>(new regex(R"(^(\d{1,2}):(\d{1,2})$)"))};
parseFromXml(basenode);
+ setCompareTime();
}
+void timeCondition::setCompareTime()
+{
+ smatch res;
+
+ if (! regex_match(attributes["value"].value, res, *attributes["value"].re)) {
+ string error_text = "While creating timeCondition,";
+ error_text += " error getting value for attribute 'value': regex_match failed";
+ throw DeterminatorParseException(error_text);
+ }
+
+ mCompareHour = atoi(res.str(1).c_str());
+ mCompareMinute = atoi(res.str(2).c_str());
+}
+
bool timeCondition::match() const
{
+ /* for testing use mTestTime if != 0 */
+ std::time_t now = mTestTime ? mTestTime : std::time(0);
+ struct tm tm;
+ localtime_r(&now, &tm);
+
+ tm.tm_hour = mCompareHour;
+ tm.tm_min = mCompareMinute;
+
+ auto tp_now = system_clock::from_time_t(now);
+ auto tp_cmp = system_clock::from_time_t(std::mktime(&tm));
+
+ string op = getAttribute("operator");
+
+ if (op == "=") return tp_now == tp_cmp;
+ else if (op == "!=") return tp_now != tp_cmp;
+ else if (op == "<") return tp_now < tp_cmp;
+ else if (op == ">") return tp_now > tp_cmp;
+ else if (op == "<=") return tp_now <= tp_cmp;
+ else if (op == ">=") return tp_now >= tp_cmp;
+ return false;
}
Modified: xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h 2012-03-04 22:02:54 UTC (rev 722)
@@ -1,12 +1,21 @@
#pragma once
#include "determinatoritems.h"
+#include <ctime>
class timeCondition: public DeterminatorCondition<timeCondition>
{
public:
- timeCondition() {}
+ timeCondition():mTestTime(0) {}
+ timeCondition(const BaseDeterminatorItem::attribute_t& attrlist, std::time_t fixTime);
timeCondition(const pugi::xml_node& basenode);
virtual bool match() const;
+
+ private:
+ void setCompareTime();
+
+ std::time_t mTestTime;
+ int mCompareHour;
+ int mCompareMinute;
};
Modified: xPLHAL/branches/thomas_s_dev/src/determinatoritems.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinatoritems.h 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/src/determinatoritems.h 2012-03-04 22:02:54 UTC (rev 722)
@@ -26,6 +26,14 @@
class BaseDeterminatorItem
{
public:
+ struct di_attribute {
+ std::shared_ptr<boost::regex> re;
+ std::string value;
+ };
+
+ typedef std::map<std::string, struct di_attribute> attribute_t;
+
+ public:
BaseDeterminatorItem(const std::string& name);
BaseDeterminatorItem(const pugi::xml_node& basenode, const std::string& name);
@@ -35,20 +43,11 @@
virtual void parseFromXml(const pugi::xml_node& basenode);
virtual bool match() const;
virtual void execute() const;
+ std::string getAttribute(const std::string& attrname) const;
- struct di_attribute {
- std::shared_ptr<boost::regex> re;
- std::string value;
- };
-
std::string item_name;
+ attribute_t attributes;
- std::string getAttribute(const std::string& attrname) const;
-
- std::map<std::string, struct di_attribute> attributes;
-
-
-
//boost::signal2::signal<void ()> sigChanged;
};
Modified: xPLHAL/branches/thomas_s_dev/test/test_determinator.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/test/test_determinator.cpp 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/test/test_determinator.cpp 2012-03-04 22:02:54 UTC (rev 722)
@@ -2,6 +2,8 @@
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
#include <mockpp/visiting/CountedVisitableMethod.h>
+#include "../src/conditions/dayCondition.h"
+#include "../src/conditions/timeCondition.h"
using namespace mockpp;
@@ -137,4 +139,73 @@
d.execute();
}
+BOOST_AUTO_TEST_CASE( testdayConditon )
+{
+ dayCondition dc1({{"dow", {0, "1111111"}}});
+ BOOST_CHECK(dc1.match() == true);
+
+ dayCondition dc2({{"dow", {0, "0000000"}}});
+ BOOST_CHECK(dc2.match() == false);
+}
+
+BOOST_AUTO_TEST_CASE( testtimeCondition )
+{
+ // 1330895302 => So 4. Mär 22:08:23 CET 2012
+ {
+ // Equal
+ timeCondition tcEq1({{"operator", {0, "="}}, {"value", {0, "22:08"}}}, 1330895302);
+ BOOST_CHECK(tcEq1.match() == true);
+ timeCondition tcEq2({{"operator", {0, "="}}, {"value", {0, "22:09"}}}, 1330895302);
+ BOOST_CHECK(tcEq2.match() == false);
+ }
+
+ {
+ // Not Equal
+ timeCondition tcNEq1({{"operator", {0, "!="}}, {"value", {0, "22:08"}}}, 1330895302);
+ BOOST_CHECK(tcNEq1.match() == false);
+ timeCondition tcNEq2({{"operator", {0, "!="}}, {"value", {0, "22:09"}}}, 1330895302);
+ BOOST_CHECK(tcNEq2.match() == true);
+ }
+
+ {
+ // Greater
+ timeCondition tcGt1({{"operator", {0, ">"}}, {"value", {0, "20:00"}}}, 1330895302);
+ BOOST_CHECK(tcGt1.match() == true);
+ timeCondition tcGt2({{"operator", {0, ">"}}, {"value", {0, "23:00"}}}, 1330895302);
+ BOOST_CHECK(tcGt2.match() == false);
+ timeCondition tcGt3({{"operator", {0, ">"}}, {"value", {0, "22:08"}}}, 1330895302);
+ BOOST_CHECK(tcGt3.match() == false);
+ }
+
+ {
+ // Less
+ timeCondition tcLt1({{"operator", {0, "<"}}, {"value", {0, "20:00"}}}, 1330895302);
+ BOOST_CHECK(tcLt1.match() == false);
+ timeCondition tcLt2({{"operator", {0, "<"}}, {"value", {0, "23:00"}}}, 1330895302);
+ BOOST_CHECK(tcLt2.match() == true);
+ timeCondition tcLt3({{"operator", {0, "<"}}, {"value", {0, "22:08"}}}, 1330895302);
+ BOOST_CHECK(tcLt3.match() == false);
+ }
+
+ {
+ // Greater or Equal
+ timeCondition tcGoE1({{"operator", {0, ">="}}, {"value", {0, "20:00"}}}, 1330895302);
+ BOOST_CHECK(tcGoE1.match() == true);
+ timeCondition tcGoE2({{"operator", {0, ">="}}, {"value", {0, "23:00"}}}, 1330895302);
+ BOOST_CHECK(tcGoE2.match() == false);
+ timeCondition tcGoE3({{"operator", {0, ">="}}, {"value", {0, "22:08"}}}, 1330895302);
+ BOOST_CHECK(tcGoE3.match() == true);
+ }
+
+ {
+ // Less or Equal
+ timeCondition tcLoE1({{"operator", {0, "<="}}, {"value", {0, "20:00"}}}, 1330895302);
+ BOOST_CHECK(tcLoE1.match() == false);
+ timeCondition tcLoE2({{"operator", {0, "<="}}, {"value", {0, "23:00"}}}, 1330895302);
+ BOOST_CHECK(tcLoE2.match() == true);
+ timeCondition tcLoE3({{"operator", {0, "<="}}, {"value", {0, "22:08"}}}, 1330895302);
+ BOOST_CHECK(tcLoE3.match() == true);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END();
Modified: xPLHAL/branches/thomas_s_dev/test/test_determinator_manager.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/test/test_determinator_manager.cpp 2012-03-04 21:45:41 UTC (rev 721)
+++ xPLHAL/branches/thomas_s_dev/test/test_determinator_manager.cpp 2012-03-04 22:02:54 UTC (rev 722)
@@ -13,7 +13,6 @@
{
DeterminatorManager dm("determinators");
dm.loadDeterminators();
-
}
BOOST_AUTO_TEST_SUITE_END();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|