From: Thomas Jarosch Date: Wed, 28 Jan 2009 16:22:38 +0000 (+0100) Subject: Rewrote Week::get_displaystring() and wrote unit test for it (before rewrite). X-Git-Tag: v2.6~136^2~14^2 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=8047e088aed2db2dee5aa8d92c27c20ade005c4e;p=libi2ncommon Rewrote Week::get_displaystring() and wrote unit test for it (before rewrite). --- diff --git a/libi2ncommon.lnt b/libi2ncommon.lnt new file mode 100644 index 0000000..ce89146 --- /dev/null +++ b/libi2ncommon.lnt @@ -0,0 +1,8 @@ +// PC-Lint 9.00 settings + +// Don't complain about bitset<7>::set return value +-esym(534, std::bitset<*>::set) +-esym(534, std::bitset<*>::reset) + +// Allow enum to int conversion ++fie diff --git a/src/week.cpp b/src/week.cpp index ed9d480..4ba244f 100644 --- a/src/week.cpp +++ b/src/week.cpp @@ -51,7 +51,7 @@ bool Week::is_valid() const */ void Week::clear() { - Days.reset(); //lint !e534 + Days.reset(); IsValid = true; } @@ -81,7 +81,7 @@ bool Week::set(const std::string& daystring) return IsValid; } - new_days.set(wnr); //lint !e534 + new_days.set(wnr); } // Atomic switch-over Days = new_days; @@ -103,7 +103,7 @@ bool Week::set(const WeekDay day, bool value) return IsValid; } - Days.set(static_cast(day), value); //lint !e534 + Days.set(static_cast(day), value); return IsValid; } @@ -219,47 +219,35 @@ std::string Week::get_displaystring() const { string weekdays_str; - // From Monday to Saturday - int j = 0; - for (int i = 1; i < 7; i++) - { - if (Days[i]) - { - if (!weekdays_str.empty()) - weekdays_str += ", "; - - weekdays_str += get_day_display(static_cast(i)); - - // check if we can group two or more days - j = i; - while (Days[j] && j < 7) - j++; - j--; - - // Sunday end of week? j -> 7 - if (j-i > 0 && j == 6 && Days[0]) - j++; - - if (j-i > 1) - { - if (j == 7) - weekdays_str += "-" + get_day_display(Su); - else - weekdays_str += "-" + get_day_display(static_cast(j)); - - i = j; - } - } - } + // We want to display from Monday to Sunday so reorder + // the bitset and make monday bit 0 and sunday bit 6. + bitset<7> reordered = Days >> 1; + reordered.set(6, Days[0]); - // special: sunday - if (Days[0] && j != 7) + for (unsigned int i = 0; i < 7; ++i) { + // day active? + if (!reordered.test(i)) + continue; + if (!weekdays_str.empty()) weekdays_str += ", "; - weekdays_str += get_day_display(Su); - } + // get day string (revert the reorder) + weekdays_str += get_day_display(i == 6 ? Su : static_cast(i+1)); + + // check if we can group two or more days + unsigned int group_days = i; + while (group_days < 6 && reordered.test(group_days+1)) + group_days++; + + // Were we able to group two or more days? + if (group_days > i+1) + { + i = group_days; + weekdays_str += "-" + get_day_display(i == 6 ? Su : static_cast(i+1)); + } + } /*lint --e(850) */ return weekdays_str; } diff --git a/test/test_timefunc.cpp b/test/test_timefunc.cpp index bc2aaed..53238b6 100644 --- a/test/test_timefunc.cpp +++ b/test/test_timefunc.cpp @@ -19,6 +19,7 @@ using namespace std; using namespace I2n; +using namespace I2n::Time; using namespace CppUnit; namespace @@ -50,6 +51,21 @@ class TestTimeFunc : public TestFixture CPPUNIT_TEST(MonotonicClock); + CPPUNIT_TEST(WeekInvalid); + CPPUNIT_TEST(WeekDisplayString1); + CPPUNIT_TEST(WeekDisplayString2); + CPPUNIT_TEST(WeekDisplayString3); + CPPUNIT_TEST(WeekDisplayString4); + CPPUNIT_TEST(WeekDisplayString5); + CPPUNIT_TEST(WeekDisplayString6); + CPPUNIT_TEST(WeekDisplayString7); + CPPUNIT_TEST(WeekDisplayString8); + CPPUNIT_TEST(WeekDisplayString9); + CPPUNIT_TEST(WeekDisplayString10); + CPPUNIT_TEST(WeekDisplayString11); + CPPUNIT_TEST(WeekDisplayString12); + CPPUNIT_TEST(WeekDisplayString13); + CPPUNIT_TEST_SUITE_END(); protected: @@ -367,8 +383,103 @@ public: CPPUNIT_ASSERT( delta_millisec < 300 ); } // eo MonotonicClock() + void WeekInvalid() + { + Week week("99999999"); + CPPUNIT_ASSERT_EQUAL(false, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string(""), week.get_displaystring()); + } + + void WeekDisplayString1() + { + Week week(""); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string(""), week.get_displaystring()); + } + + void WeekDisplayString2() + { + Week week("0123456"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon-Sun"), week.get_displaystring()); + } + + void WeekDisplayString3() + { + Week week("123456"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon-Sat"), week.get_displaystring()); + } + + void WeekDisplayString4() + { + Week week("012345"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring()); + } + + void WeekDisplayString5() + { + Week week("1256"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring()); + } + + void WeekDisplayString6() + { + Week week("0246"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring()); + } - -}; // eo class TestTimeFunc + void WeekDisplayString7() + { + Week week("135"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring()); + } + + void WeekDisplayString8() + { + Week week("15"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon, Fri"), week.get_displaystring()); + } + + void WeekDisplayString9() + { + Week week("06"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Sat, Sun"), week.get_displaystring()); + } + + void WeekDisplayString10() + { + Week week("056"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Fri-Sun"), week.get_displaystring()); + } + + void WeekDisplayString11() + { + Week week("0"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Sun"), week.get_displaystring()); + } + + void WeekDisplayString12() + { + Week week("6"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Sat"), week.get_displaystring()); + } + + void WeekDisplayString13() + { + Week week("123"); + CPPUNIT_ASSERT_EQUAL(true, week.is_valid()); + CPPUNIT_ASSERT_EQUAL(string("Mon-Wed"), week.get_displaystring()); + } +}; CPPUNIT_TEST_SUITE_REGISTRATION(TestTimeFunc);