allow creating Time objects from formatted timestamps
[libi2ncommon] / test / test_timefunc.cpp
index e5b4adf..08ac8ef 100644 (file)
@@ -1051,6 +1051,62 @@ BOOST_AUTO_TEST_SUITE(Clock)
         BOOST_CHECK_EQUAL("11.11.2018", *s);
     }
 
+    BOOST_AUTO_TEST_CASE(FromString_iso8601_full)
+    {
+        const std::string in1 ("0001-01-01T00:00:00Z+0000");
+        const std::string in2 ("2018-11-11T11:11:11Z+0000");
+
+        boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
+        boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
+
+        BOOST_CHECK(t1);
+        BOOST_CHECK(t2);
+
+        BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
+        BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
+    }
+
+    BOOST_AUTO_TEST_CASE(FromString_iso8601_full_negyear)
+    {
+        const std::string in1 ("-0001-01-01T00:00:00Z+0000");
+        const std::string in2 ("-2018-11-11T11:11:11Z+0000");
+
+        boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
+        boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
+
+        BOOST_CHECK(t1);
+        BOOST_CHECK(t2);
+
+        BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
+        BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
+    }
+
+    BOOST_AUTO_TEST_CASE(FromString_iso8601_partial)
+    {
+        const std::string in1 ("2018-11-11T11:11:11");
+        const std::string in2 ("2018-11-11");
+        const std::string in3 ("11:11:11");
+
+        boost::optional<I2n::clock::Time> t1 =
+            I2n::clock::time_of_iso8601 (in1, true, true, false);
+        boost::optional<I2n::clock::Time> t2 =
+            I2n::clock::time_of_iso8601 (in2, true, false, false);
+        boost::optional<I2n::clock::Time> t3 =
+            I2n::clock::time_of_iso8601 (in3, false, true, false);
+
+        BOOST_CHECK(t1);
+        BOOST_CHECK(t2);
+        BOOST_CHECK(t3);
+        /*
+         * We test for the difference here which is zero if the number is
+         * correct but causes the difference from the expected value to be
+         * printed in case the test fails.
+         */
+        BOOST_CHECK_EQUAL(*t1->format_iso8601 (true,  true,  true, false), in1);
+        BOOST_CHECK_EQUAL(*t2->format_iso8601 (true,  true, false, false), in2);
+        BOOST_CHECK_EQUAL(*t3->format_iso8601 (true, false,  true, false), in3);
+    }
+
 BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
 
 BOOST_AUTO_TEST_SUITE_END()