@@ -53,6 +53,31 @@ TEST(TemporalUtilTest, ParseTimestampNsChecksInt64Bounds) {
5353 IsError (ErrorKind::kInvalidArgument ));
5454}
5555
56+ TEST (TemporalUtilTest, IsUtcOffset) {
57+ // UTC offsets: "Z", "+00:00" and "-00:00".
58+ ICEBERG_UNWRAP_OR_FAIL (auto z, TemporalUtils::IsUtcOffset (" 2024-06-27T00:00:00Z" ));
59+ EXPECT_TRUE (z);
60+ ICEBERG_UNWRAP_OR_FAIL (auto plus_zero,
61+ TemporalUtils::IsUtcOffset (" 2024-06-27T00:00:00+00:00" ));
62+ EXPECT_TRUE (plus_zero);
63+ ICEBERG_UNWRAP_OR_FAIL (auto minus_zero,
64+ TemporalUtils::IsUtcOffset (" 2024-06-27T00:00:00-00:00" ));
65+ EXPECT_TRUE (minus_zero);
66+
67+ // Non-UTC offsets.
68+ ICEBERG_UNWRAP_OR_FAIL (auto plus_five,
69+ TemporalUtils::IsUtcOffset (" 2024-06-27T05:00:00+05:00" ));
70+ EXPECT_FALSE (plus_five);
71+ ICEBERG_UNWRAP_OR_FAIL (auto minus_eight,
72+ TemporalUtils::IsUtcOffset (" 2024-06-27T00:00:00-08:00" ));
73+ EXPECT_FALSE (minus_eight);
74+
75+ // A missing or unparseable timezone suffix is an error.
76+ EXPECT_THAT (TemporalUtils::IsUtcOffset (" 2024-06-27T00:00:00" ),
77+ IsError (ErrorKind::kInvalidArgument ));
78+ EXPECT_THAT (TemporalUtils::IsUtcOffset (" " ), IsError (ErrorKind::kInvalidArgument ));
79+ }
80+
5681TEST (TemporalUtilTest, ParseTimestampNsRejectsMoreThanNineFractionalDigits) {
5782 EXPECT_THAT (TemporalUtils::ParseTimestampNs (" 2026-01-01T00:00:01.0000010011" ),
5883 IsError (ErrorKind::kInvalidArgument ));
0 commit comments