Rewrote Week::get_displaystring() and wrote unit test for it (before rewrite).
authorThomas Jarosch <thomas.jarosch@intra2net.com>
Wed, 28 Jan 2009 16:22:38 +0000 (17:22 +0100)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Wed, 28 Jan 2009 16:22:38 +0000 (17:22 +0100)
libi2ncommon.lnt [new file with mode: 0644]
src/week.cpp
test/test_timefunc.cpp

diff --git a/libi2ncommon.lnt b/libi2ncommon.lnt
new file mode 100644 (file)
index 0000000..ce89146
--- /dev/null
@@ -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
index ed9d480..4ba244f 100644 (file)
@@ -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<size_t>(day), value);          //lint !e534
+    Days.set(static_cast<size_t>(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<WeekDay>(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<WeekDay>(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<WeekDay>(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<WeekDay>(i+1));
+        }
+    } /*lint --e(850) */
 
     return weekdays_str;
 }
index bc2aaed..53238b6 100644 (file)
@@ -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);