@@ -126,6 +126,39 @@ TEST_CASE("Valid timestamps") {
126126 }
127127}
128128
129+ TEST_CASE (" Valid timestamps with fractional seconds" ) {
130+ const std::vector<std::string> test_cases = {
131+ " 2016-03-31T23:59:59.123Z" ,
132+ " 2016-03-31T23:59:59,4Z" ,
133+ " 2016-03-31T23:59:59,000000000000000001Z" ,
134+ " 2016-03-31T23:59:59.99Z"
135+ };
136+
137+ for (const auto & tc : test_cases) {
138+ const osmium::Timestamp t{tc};
139+ REQUIRE (" 2016-03-31T23:59:59Z" == t.to_iso ());
140+ REQUIRE (" 2016-03-31T23:59:59Z" == t.to_iso_all ());
141+ }
142+ }
143+
144+ TEST_CASE (" Timestamp parsing leaves pointer after timestamp" ) {
145+ const std::vector<std::string> test_cases = {
146+ " 2016-03-31T23:59:59Z#" ,
147+ " 2016-03-31T23:59:59.123Z#" ,
148+ " 2016-03-31T23:59:59,4Z#" ,
149+ " 2016-03-31T23:59:59,000000000000000001Z#" ,
150+ " 2016-03-31T23:59:59.99Z#"
151+ };
152+
153+ for (const auto & tc : test_cases) {
154+ const char *s = tc.data ();
155+ const char **str = &s;
156+ auto const timestamp = osmium::detail::parse_timestamp (str);
157+ REQUIRE (**str == ' #' );
158+ REQUIRE (osmium::Timestamp (timestamp).to_iso () == " 2016-03-31T23:59:59Z" );
159+ }
160+ }
161+
129162TEST_CASE (" Invalid timestamps" ) {
130163 REQUIRE_THROWS_AS (osmium::Timestamp{" " }, std::invalid_argument);
131164 REQUIRE_THROWS_AS (osmium::Timestamp{" x" }, std::invalid_argument);
@@ -149,5 +182,11 @@ TEST_CASE("Invalid timestamps") {
149182 REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-01-32T00:00:00Z" }, std::invalid_argument);
150183 REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-02-30T00:00:00Z" }, std::invalid_argument);
151184 REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-32T00:00:00Z" }, std::invalid_argument);
185+ REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-01T00:00:00" }, std::invalid_argument);
186+ REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-01T00:00:00,Z" }, std::invalid_argument);
187+ REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-01T00:00:00,xZ" }, std::invalid_argument);
188+ REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-01T00:00:00,123mZ" }, std::invalid_argument);
189+ REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-01T00:00:00.@Z" }, std::invalid_argument);
190+ REQUIRE_THROWS_AS (osmium::Timestamp{" 2000-03-01T00:00:00.@" }, std::invalid_argument);
152191}
153192
0 commit comments