From 2f648d65387d62a61e36d8b913a9fc7c70fc4d6f Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Thu, 18 May 2017 16:45:18 +0300 Subject: Opening hours twenty four hours fix --- 3party/opening_hours/opening_hours.cpp | 39 ++++++++++++++++++++++ 3party/opening_hours/opening_hours.hpp | 9 ++++- .../opening_hours_tests/opening_hours_tests.cpp | 36 ++++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) (limited to '3party') diff --git a/3party/opening_hours/opening_hours.cpp b/3party/opening_hours/opening_hours.cpp index cac81f87d8..441cc6a776 100644 --- a/3party/opening_hours/opening_hours.cpp +++ b/3party/opening_hours/opening_hours.cpp @@ -277,6 +277,16 @@ std::ostream & operator<<(std::ostream & ost, Time const & time) return ost; } +bool operator==(Time const & lhs, Time const & rhs) +{ + if (lhs.IsEmpty() && rhs.IsEmpty()) + return true; + + return lhs.GetType() == rhs.GetType() && + lhs.GetHours() == rhs.GetHours() && + lhs.GetMinutes() == rhs.GetMinutes(); +} + // TimespanPeriod ---------------------------------------------------------------------------------- TimespanPeriod::TimespanPeriod(HourMinutes const & hm): m_hourMinutes(hm), @@ -301,6 +311,16 @@ std::ostream & operator<<(std::ostream & ost, TimespanPeriod const p) return ost; } +bool operator==(TimespanPeriod const & lhs, TimespanPeriod const & rhs) +{ + if (lhs.IsEmpty() && rhs.IsEmpty()) + return true; + + return lhs.GetType() == rhs.GetType() && + lhs.GetHourMinutes() == rhs.GetHourMinutes() && + lhs.GetMinutes() == rhs.GetMinutes(); +} + // Timespan ---------------------------------------------------------------------------------------- bool Timespan::HasExtendedHours() const { @@ -349,6 +369,25 @@ std::ostream & operator<<(std::ostream & ost, osmoh::TTimespans const & timespan return ost; } +bool operator==(Timespan const & lhs, Timespan const & rhs) +{ + if (lhs.IsEmpty() && rhs.IsEmpty()) + return true; + + if (lhs.IsEmpty() != rhs.IsEmpty() || + lhs.HasStart() != rhs.HasStart() || + lhs.HasEnd() != rhs.HasEnd() || + lhs.HasPlus() != rhs.HasPlus() || + lhs.HasPeriod() != rhs.HasPeriod()) + { + return false; + } + + return lhs.GetStart() == rhs.GetStart() && + lhs.GetEnd() == rhs.GetEnd() && + lhs.GetPeriod() == lhs.GetPeriod(); +} + // NthWeekdayOfTheMonthEntry ----------------------------------------------------------------------- std::ostream & operator<<(std::ostream & ost, NthWeekdayOfTheMonthEntry const entry) { diff --git a/3party/opening_hours/opening_hours.hpp b/3party/opening_hours/opening_hours.hpp index df4b9c5a9b..faf3119121 100644 --- a/3party/opening_hours/opening_hours.hpp +++ b/3party/opening_hours/opening_hours.hpp @@ -30,9 +30,11 @@ #include #include +// Implemented in accordance with the specification +// http://wiki.openstreetmap.org/wiki/Key:opening_hours/specification + namespace osmoh { - class HourMinutes { public: @@ -170,6 +172,7 @@ inline constexpr Time::TMinutes operator ""_min(unsigned long long int m) } std::ostream & operator<<(std::ostream & ost, Time const & time); +bool operator==(Time const & lhs, Time const & rhs); class TimespanPeriod { @@ -189,6 +192,8 @@ public: bool IsHoursMinutes() const { return m_type == Type::HourMinutes; } bool IsMinutes() const { return m_type == Type::Minutes; } + Type GetType() const { return m_type; } + HourMinutes const & GetHourMinutes() const { return m_hourMinutes; } HourMinutes::TMinutes GetMinutes() const { return m_minutes; } HourMinutes::TMinutes::rep GetMinutesCount() const { return GetMinutes().count(); } @@ -201,6 +206,7 @@ private: }; std::ostream & operator<<(std::ostream & ost, TimespanPeriod const p); +bool operator==(TimespanPeriod const & lhs, TimespanPeriod const & rhs); class Timespan { @@ -244,6 +250,7 @@ using TTimespans = std::vector; std::ostream & operator<<(std::ostream & ost, Timespan const & span); std::ostream & operator<<(std::ostream & ost, osmoh::TTimespans const & timespans); +bool operator==(Timespan const & lhs, Timespan const & rhs); class NthWeekdayOfTheMonthEntry { diff --git a/3party/opening_hours/opening_hours_tests/opening_hours_tests.cpp b/3party/opening_hours/opening_hours_tests/opening_hours_tests.cpp index d59b7ba6a9..6ef034e938 100644 --- a/3party/opening_hours/opening_hours_tests/opening_hours_tests.cpp +++ b/3party/opening_hours/opening_hours_tests/opening_hours_tests.cpp @@ -1074,6 +1074,12 @@ BOOST_AUTO_TEST_CASE(OpeningHoursRuleSequence_TestParseUnparse) { auto const rule = "Sa; Su"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "Sa-Su 00:00-24:00"; + auto const parsedUnparsed = ParseAndUnparse(rule); BOOST_CHECK_EQUAL(parsedUnparsed, rule); } @@ -1426,6 +1432,26 @@ BOOST_AUTO_TEST_CASE(OpeningHours_TestIsActive) BOOST_CHECK(GetTimeTuple("2015-11-11 06:01", kDateTimeFmt, time)); BOOST_CHECK(!IsActive(rules[0], time)); } + { + TRuleSequences rules; + BOOST_CHECK(Parse("Mo-We 00:00-24:00", rules)); + + std::tm time{}; + BOOST_CHECK(GetTimeTuple("2016-10-03 05:35", kDateTimeFmt, time)); + BOOST_CHECK(IsActive(rules[0], time)); + + BOOST_CHECK(GetTimeTuple("2017-01-17 15:35", kDateTimeFmt, time)); + BOOST_CHECK(IsActive(rules[0], time)); + + BOOST_CHECK(GetTimeTuple("2017-05-31 23:35", kDateTimeFmt, time)); + BOOST_CHECK(IsActive(rules[0], time)); + + BOOST_CHECK(GetTimeTuple("2017-02-10 05:35", kDateTimeFmt, time)); + BOOST_CHECK(!IsActive(rules[0], time)); + + BOOST_CHECK(GetTimeTuple("2017-05-21 06:01", kDateTimeFmt, time)); + BOOST_CHECK(!IsActive(rules[0], time)); + } } BOOST_AUTO_TEST_CASE(OpeningHours_TestIsOpen) @@ -1541,6 +1567,16 @@ BOOST_AUTO_TEST_CASE(OpeningHours_TestIsOpen) BOOST_CHECK(IsOpen(rules, "2016-06-05 13:06")); BOOST_CHECK(IsOpen(rules, "2016-05-31 18:28")); } + { + TRuleSequences rules; + BOOST_CHECK(Parse("Mo-We 00:00-24:00", rules)); + + BOOST_CHECK(IsOpen(rules, "2016-10-03 05:35")); + BOOST_CHECK(IsOpen(rules, "2017-01-17 15:35")); + BOOST_CHECK(IsOpen(rules, "2017-05-31 23:35")); + BOOST_CHECK(!IsOpen(rules, "2017-02-10 05:35")); + BOOST_CHECK(!IsOpen(rules, "2017-05-21 06:01")); + } } -- cgit v1.2.3