diff --git a/src/qcronfield.cpp b/src/qcronfield.cpp index 48d120e..cd202d9 100644 --- a/src/qcronfield.cpp +++ b/src/qcronfield.cpp @@ -140,7 +140,8 @@ _parseNode(QString & str) } else if ('f' == c) { - + str.remove(0, 1); + node = new QCronNotHolidayNode(); } } if (NULL == node) diff --git a/src/qcronnode.cpp b/src/qcronnode.cpp index 652d9ab..6e3f23d 100644 --- a/src/qcronnode.cpp +++ b/src/qcronnode.cpp @@ -335,7 +335,6 @@ QCronHolidayNode:: next(int t) const { Q_UNUSED(t) - //return Holiday::next(t); return -1; } @@ -374,3 +373,43 @@ match(const QDateTime & dt) const /******************************************************************************/ /******************************************************************************/ + +int +QCronNotHolidayNode:: +next(int t) const +{ + Q_UNUSED(t) + return -1; +} + +/******************************************************************************/ + +void +QCronNotHolidayNode:: +process(QCron * cron, + QDateTime & dt, + EField field) +{ + Q_UNUSED(cron); + if (DOM != field) + { + qFatal("Should not be in a NotHoliday node."); + } + if (Holiday::isHoliday(dt.date())) + { + dt = dt.addDays(1); + dt.setTime(QTime(0, 0, 0)); + } +} + +/******************************************************************************/ + +bool +QCronNotHolidayNode:: +match(const QDateTime & dt) const +{ + return !Holiday::isHoliday(dt.date()); +} + +/******************************************************************************/ +/******************************************************************************/ diff --git a/src/qcronnode.hpp b/src/qcronnode.hpp index ce44c89..df01696 100644 --- a/src/qcronnode.hpp +++ b/src/qcronnode.hpp @@ -151,4 +151,18 @@ public: /******************************************************************************/ +class QCronNotHolidayNode : public QCronNode +{ +public: + virtual int next(int t) const; + + virtual bool match(const QDateTime & dt) const; + virtual void process(QCron * cron, + QDateTime & dt, + EField field); +}; + +/******************************************************************************/ + + #endif diff --git a/test/qcron_test.cpp b/test/qcron_test.cpp index 4af055e..fa7e4f6 100644 --- a/test/qcron_test.cpp +++ b/test/qcron_test.cpp @@ -376,8 +376,18 @@ holidays() QCOMPARE(actual(pattern), now().addSecs(3600 * 2)); _tnow.setHMS(23, 59, 59); QCOMPARE(actual(pattern), QDateTime(QDate(2017, 1, 1), QTime(2, 0, 0))); +} +/******************************************************************************/ +void +QCronTest:: +excludeHolidays() +{ + QString pattern = "* 2 f * * *"; + _dnow.setDate(2016, 12, 24); + _tnow.setHMS(3, 0, 0); + QCOMPARE(actual(pattern), QDateTime(QDate(2016, 12, 26), QTime(2, 0, 0))); } /******************************************************************************/ diff --git a/test/qcron_test.hpp b/test/qcron_test.hpp index 516d864..8c87eec 100644 --- a/test/qcron_test.hpp +++ b/test/qcron_test.hpp @@ -16,6 +16,7 @@ private slots: void minutes(); void realLife(); void holidays(); + void excludeHolidays(); private: QDate _dnow;