diff --git a/editor/editor_tests/opening_hours_ui_test.cpp b/editor/editor_tests/opening_hours_ui_test.cpp index b851526ceb..f2966175f7 100644 --- a/editor/editor_tests/opening_hours_ui_test.cpp +++ b/editor/editor_tests/opening_hours_ui_test.cpp @@ -157,33 +157,38 @@ UNIT_TEST(TestAppendTimeTable) { { TimeTableSet tts; - TEST(!tts.empty(), ()); + TEST(!tts.Empty(), ()); - auto tt = tts.back(); + { + auto tt = tts.Back(); - TEST(tt.RemoveWorkingDay(osmoh::Weekday::Sunday), ()); - TEST(tt.RemoveWorkingDay(osmoh::Weekday::Saturday), ()); - TEST(tts.Replace(tt, 0), ()); + TEST(tt.RemoveWorkingDay(osmoh::Weekday::Sunday), ()); + TEST(tt.RemoveWorkingDay(osmoh::Weekday::Saturday), ()); + TEST(tt.Commit(), ()); + + TEST(tts.Append(tts.GetComplementTimeTable()), ()); + TEST_EQUAL(tts.Back().GetWorkingDays(), (set{osmoh::Weekday::Sunday, + osmoh::Weekday::Saturday}), ()); + } + + { + auto tt = tts.Front(); + TEST(tt.RemoveWorkingDay(osmoh::Weekday::Monday), ()); + TEST(tt.RemoveWorkingDay(osmoh::Weekday::Tuesday), ()); + TEST(tt.Commit(), ()); + } TEST(tts.Append(tts.GetComplementTimeTable()), ()); - TEST_EQUAL(tts.back().GetWorkingDays(), (set{osmoh::Weekday::Sunday, - osmoh::Weekday::Saturday}), ()); - tt = tts.front(); - TEST(tt.RemoveWorkingDay(osmoh::Weekday::Monday), ()); - TEST(tt.RemoveWorkingDay(osmoh::Weekday::Tuesday), ()); - TEST(tts.Replace(tt, 0), ()); - - TEST(tts.Append(tts.GetComplementTimeTable()), ()); - TEST_EQUAL(tts.back().GetWorkingDays(), (set{osmoh::Weekday::Monday, + TEST_EQUAL(tts.Back().GetWorkingDays(), (set{osmoh::Weekday::Monday, osmoh::Weekday::Tuesday}), ()); TEST(!tts.GetComplementTimeTable().IsValid(), ()); TEST(!tts.Append(tts.GetComplementTimeTable()), ()); - TEST_EQUAL(tts.size(), 3, ()); + TEST_EQUAL(tts.Size(), 3, ()); TEST(!tts.Remove(0), ()); TEST(tts.Remove(1), ()); - TEST_EQUAL(tts.size(), 2, ()); + TEST_EQUAL(tts.Size(), 2, ()); TEST_EQUAL(tts.GetUnhandledDays(), (set{osmoh::Weekday::Sunday, osmoh::Weekday::Saturday}), ()); } @@ -196,9 +201,9 @@ UNIT_TEST(TestAppendTimeTable) TEST(tts.Append(tt), ()); - TEST_EQUAL(tts.size(), 2, ()); - TEST_EQUAL(tts.front().GetWorkingDays().size(), 4, ()); - TEST_EQUAL(tts.back().GetWorkingDays().size(), 3, ()); + TEST_EQUAL(tts.Size(), 2, ()); + TEST_EQUAL(tts.Front().GetWorkingDays().size(), 4, ()); + TEST_EQUAL(tts.Back().GetWorkingDays().size(), 3, ()); TEST(!tts.GetComplementTimeTable().IsValid(), ()); } @@ -209,16 +214,33 @@ UNIT_TEST(TestAppendTimeTable) TEST(tts.Append(tt), ()); - TEST_EQUAL(tts.size(), 2, ()); - TEST_EQUAL(tts.front().GetWorkingDays().size(), 6, ()); - TEST_EQUAL(tts.back().GetWorkingDays().size(), 1, ()); + TEST_EQUAL(tts.Size(), 2, ()); + TEST_EQUAL(tts.Front().GetWorkingDays().size(), 6, ()); + TEST_EQUAL(tts.Back().GetWorkingDays().size(), 1, ()); TEST(!tts.GetComplementTimeTable().IsValid(), ()); - tt = tts[0]; + tt = tts.Front(); tt.AddWorkingDay(osmoh::Weekday::Friday); TEST(!tts.Append(tt), ()); - TEST_EQUAL(tts.front().GetWorkingDays().size(), 6, ()); - TEST_EQUAL(tts.back().GetWorkingDays().size(), 1, ()); + TEST_EQUAL(tts.Front().GetWorkingDays().size(), 6, ()); + TEST_EQUAL(tts.Back().GetWorkingDays().size(), 1, ()); + } + { + TimeTableSet tts; + + { + auto tt = tts.GetComplementTimeTable(); + tt.AddWorkingDay(osmoh::Weekday::Friday); + TEST(tts.Append(tt), ()); + } + + TEST_EQUAL(tts.Size(), 2, ()); + TEST_EQUAL(tts.Front().GetWorkingDays().size(), 6, ()); + TEST_EQUAL(tts.Back().GetWorkingDays().size(), 1, ()); + + auto tt = tts.Front(); + tt.AddWorkingDay(osmoh::Weekday::Friday); + TEST(!tt.Commit(), ()); } } diff --git a/editor/opening_hours_ui.hpp b/editor/opening_hours_ui.hpp index bdfb00cb7c..2dd3543b0f 100644 --- a/editor/opening_hours_ui.hpp +++ b/editor/opening_hours_ui.hpp @@ -47,7 +47,28 @@ private: osmoh::TTimespans m_excludeTime; }; -class TimeTableSet : public vector +template +class TimeTableProxyBase : public TimeTable +{ +public: + TimeTableProxyBase(TTimeTableSet & tts, size_t const index, TimeTable const & tt): + TimeTable(tt), + m_index(index), + m_tts(tts) + { + } + + bool Commit() { return m_tts.Replace(*this, m_index); } // Slice base class on copy. + +private: + size_t const m_index; + TTimeTableSet & m_tts; +}; + +class TimeTableSet; +using TTimeTableProxy = TimeTableProxyBase; + +class TimeTableSet : vector { public: using vector::vector; @@ -58,6 +79,13 @@ public: TimeTable GetComplementTimeTable() const; + TTimeTableProxy Get(size_t const index) { return TTimeTableProxy(*this, index, (*this)[index]); } + TTimeTableProxy Front() { return Get(0); } + TTimeTableProxy Back() { return Get(Size() - 1); } + + size_t Size() const { return size(); } + bool Empty() const { return empty(); } + bool Append(TimeTable const & tt); bool Remove(size_t const index); @@ -65,6 +93,7 @@ public: private: static bool UpdateByIndex(TimeTableSet & ttSet, size_t const index); + }; } // namespace ui } // namespace editor