Add Holiday management (France only).
This commit is contained in:
parent
8d1351064e
commit
b477e59d2d
@ -2,6 +2,7 @@ set(${PROJECT}_SRC_FILES
|
||||
qcron.cpp
|
||||
qcronfield.cpp
|
||||
qcronnode.cpp
|
||||
holiday.cpp
|
||||
)
|
||||
|
||||
set(${PROJECT}_HEADERS
|
||||
|
56
src/holiday.cpp
Normal file
56
src/holiday.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
#include "holiday.hpp"
|
||||
|
||||
#include <QList>
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
bool
|
||||
Holiday::
|
||||
isHoliday(const QDate & today)
|
||||
{
|
||||
int y = today.year();
|
||||
QList<QDate> holidays = QList<QDate>()
|
||||
<< QDate(y, 1, 1) // Jour de l'an
|
||||
<< QDate(y, 5, 1) // Fete du travail
|
||||
<< QDate(y, 5, 8) // Fete de la victoire
|
||||
<< QDate(y, 7, 14) // Fete nationale
|
||||
<< QDate(y, 8, 15) // Assomption
|
||||
<< QDate(y, 11, 1) // Toussaint
|
||||
<< QDate(y, 11, 11) // Armistice de 1918
|
||||
<< QDate(y, 12, 25) // Noel
|
||||
;
|
||||
QDate easter = Holiday::easter(y);
|
||||
|
||||
return holidays.contains(today) ||
|
||||
today == easter.addDays(1) || // Lundi de Paques
|
||||
today == easter.addDays(39) || // Jeaudi de l'Ascension
|
||||
today == easter.addDays(50) // Lundi de Pentecote
|
||||
;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
QDate
|
||||
Holiday::
|
||||
easter(int y)
|
||||
{
|
||||
/* Many thanks to http://www.henk-reints.nl/easter/index.htm */
|
||||
int a = y % 19 + 1;
|
||||
int b = y / 100 + 1;
|
||||
int c = (3 * b) / 4 - 12;
|
||||
int d = (8 * b + 5) / 25 - 5;
|
||||
int e = (y * 5) / 4 - 10 - c;
|
||||
int f = ((11 * a + 20 + d - c) % 30 + 30) % 30;
|
||||
if (24 == f || (25 == f && a > 11))
|
||||
{
|
||||
++f;
|
||||
}
|
||||
int g = 44 - f;
|
||||
if (g < 21)
|
||||
{
|
||||
g += 30;
|
||||
}
|
||||
return QDate(y, 3, 1).addDays(g + 7 - (e + g) % 7 - 1);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
13
src/holiday.hpp
Normal file
13
src/holiday.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef _HOLIDAY_HPP
|
||||
#define _HOLIDAY_HPP
|
||||
|
||||
#include <QDate>
|
||||
|
||||
class Holiday
|
||||
{
|
||||
public:
|
||||
static bool isHoliday(const QDate & date);
|
||||
static QDate easter(int year);
|
||||
};
|
||||
|
||||
#endif
|
@ -7,6 +7,7 @@ set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/test)
|
||||
set(TESTS
|
||||
qcron_test
|
||||
syntax_test
|
||||
holiday_test
|
||||
)
|
||||
|
||||
foreach(test ${TESTS})
|
||||
|
69
test/holiday_test.cpp
Normal file
69
test/holiday_test.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
#include "holiday_test.hpp"
|
||||
|
||||
#include <holiday.hpp>
|
||||
|
||||
#include <QTest>
|
||||
|
||||
void
|
||||
HolidayTest::
|
||||
easter()
|
||||
{
|
||||
QCOMPARE(Holiday::easter(2000), QDate(2000, 4, 23));
|
||||
QCOMPARE(Holiday::easter(2001), QDate(2001, 4, 15));
|
||||
QCOMPARE(Holiday::easter(2002), QDate(2002, 3, 31));
|
||||
QCOMPARE(Holiday::easter(2003), QDate(2003, 4, 20));
|
||||
QCOMPARE(Holiday::easter(2004), QDate(2004, 4, 11));
|
||||
QCOMPARE(Holiday::easter(2005), QDate(2005, 3, 27));
|
||||
QCOMPARE(Holiday::easter(2006), QDate(2006, 4, 16));
|
||||
QCOMPARE(Holiday::easter(2007), QDate(2007, 4, 8));
|
||||
QCOMPARE(Holiday::easter(2008), QDate(2008, 3, 23));
|
||||
QCOMPARE(Holiday::easter(2009), QDate(2009, 4, 12));
|
||||
QCOMPARE(Holiday::easter(2010), QDate(2010, 4, 4));
|
||||
QCOMPARE(Holiday::easter(2011), QDate(2011, 4, 24));
|
||||
QCOMPARE(Holiday::easter(2012), QDate(2012, 4, 8));
|
||||
QCOMPARE(Holiday::easter(2013), QDate(2013, 3, 31));
|
||||
QCOMPARE(Holiday::easter(2014), QDate(2014, 4, 20));
|
||||
QCOMPARE(Holiday::easter(2015), QDate(2015, 4, 5));
|
||||
QCOMPARE(Holiday::easter(2016), QDate(2016, 3, 27));
|
||||
QCOMPARE(Holiday::easter(2017), QDate(2017, 4, 16));
|
||||
QCOMPARE(Holiday::easter(2018), QDate(2018, 4, 1));
|
||||
QCOMPARE(Holiday::easter(2019), QDate(2019, 4, 21));
|
||||
QCOMPARE(Holiday::easter(2020), QDate(2020, 4, 12));
|
||||
QCOMPARE(Holiday::easter(2021), QDate(2021, 4, 4));
|
||||
QCOMPARE(Holiday::easter(2022), QDate(2022, 4, 17));
|
||||
QCOMPARE(Holiday::easter(2023), QDate(2023, 4, 9));
|
||||
QCOMPARE(Holiday::easter(2024), QDate(2024, 3, 31));
|
||||
QCOMPARE(Holiday::easter(2025), QDate(2025, 4, 20));
|
||||
QCOMPARE(Holiday::easter(2026), QDate(2026, 4, 5));
|
||||
QCOMPARE(Holiday::easter(2027), QDate(2027, 3, 28));
|
||||
QCOMPARE(Holiday::easter(2028), QDate(2028, 4, 16));
|
||||
QCOMPARE(Holiday::easter(2029), QDate(2029, 4, 1));
|
||||
QCOMPARE(Holiday::easter(2030), QDate(2030, 4, 21));
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void
|
||||
HolidayTest::
|
||||
holiday()
|
||||
{
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 1, 1)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 5, 1)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 5, 8)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 7, 14)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 8, 15)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 11, 1)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 11, 11)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 12, 25)));
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 3, 28))); // Lundi de Paques
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 5, 5))); // Jeudi de l'Ascension
|
||||
QVERIFY(Holiday::isHoliday( QDate(2016, 5, 16))); // Lundi de Pentecote
|
||||
|
||||
// Chuck Norris' birthday (should be a holiday though).
|
||||
QVERIFY(!Holiday::isHoliday(QDate(2016, 3, 10)));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
QTEST_MAIN(HolidayTest)
|
15
test/holiday_test.hpp
Normal file
15
test/holiday_test.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef _HOLIDAY_TEST_HPP
|
||||
#define _HOLIDAY_TEST_HPP
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class HolidayTest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void easter();
|
||||
void holiday();
|
||||
};
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user