diff --git a/src/main/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapter.java b/src/main/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapter.java index 433e75f..54894b7 100644 --- a/src/main/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapter.java +++ b/src/main/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapter.java @@ -25,7 +25,7 @@ public class LocalDateTimeISO8601XmlAdapter extends XmlAdapter { private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss") - .optionalStart().appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true).optionalEnd() + .optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).optionalEnd() .optionalStart().appendPattern("XXXXX") .optionalEnd() diff --git a/src/main/java/org/rutebanken/util/LocalTimeISO8601XmlAdapter.java b/src/main/java/org/rutebanken/util/LocalTimeISO8601XmlAdapter.java index f066b9e..bdde2eb 100644 --- a/src/main/java/org/rutebanken/util/LocalTimeISO8601XmlAdapter.java +++ b/src/main/java/org/rutebanken/util/LocalTimeISO8601XmlAdapter.java @@ -27,7 +27,7 @@ public class LocalTimeISO8601XmlAdapter extends XmlAdapter { private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("HH:mm:ss") - .optionalStart().appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true).optionalEnd() + .optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).optionalEnd() .optionalStart().appendPattern("XXXXX") .optionalEnd() diff --git a/src/test/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapterTest.java b/src/test/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapterTest.java new file mode 100644 index 0000000..3abd18a --- /dev/null +++ b/src/test/java/org/rutebanken/util/LocalDateTimeISO8601XmlAdapterTest.java @@ -0,0 +1,77 @@ +package org.rutebanken.util; + +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; + +class LocalDateTimeISO8601XmlAdapterTest { + + private final LocalDateTimeISO8601XmlAdapter adapter = new LocalDateTimeISO8601XmlAdapter(); + + @Test + void testUnmarshalBasicDateTime() { + LocalDateTime result = adapter.unmarshal("2026-08-31T00:00:00"); + assertEquals(LocalDateTime.of(2026, 8, 31, 0, 0, 0), result); + } + + @Test + void testUnmarshalDateTimeWithMilliseconds() { + LocalDateTime result = adapter.unmarshal("2026-05-03T23:30:09.398"); + assertEquals(LocalDateTime.of(2026, 5, 3, 23, 30, 9, 398_000_000), result); + } + + @Test + void testUnmarshalDateTimeWithOffset() { + LocalDateTime result = adapter.unmarshal("2026-05-03T23:30:09+02:00"); + assertEquals(LocalDateTime.of(2026, 5, 3, 23, 30, 9), result); + } + + @Test + void testUnmarshalDateTimeWithMicroseconds() { + LocalDateTime result = adapter.unmarshal("2026-05-03T23:30:09.398629"); + assertEquals(LocalDateTime.of(2026, 5, 3, 23, 30, 9, 398_629_000), result); + } + + @Test + void testUnmarshalDateTimeWithMicrosecondsAndOffset() { + LocalDateTime result = adapter.unmarshal("2026-05-03T23:30:09.398629+02:00"); + assertEquals(LocalDateTime.of(2026, 5, 3, 23, 30, 9, 398_629_000), result); + } + + @Test + void testUnmarshalDateTimeWithNanoseconds() { + LocalDateTime result = adapter.unmarshal("2026-05-03T23:30:09.123456789+02:00"); + assertEquals(LocalDateTime.of(2026, 5, 3, 23, 30, 9, 123_456_789), result); + } + + @Test + void testMarshalBasicDateTime() { + String result = adapter.marshal(LocalDateTime.of(2026, 8, 31, 0, 0, 0)); + assertEquals("2026-08-31T00:00:00", result); + } + + @Test + void testMarshalDateTimeWithMilliseconds() { + String result = adapter.marshal(LocalDateTime.of(2026, 5, 3, 23, 30, 9, 398_000_000)); + assertEquals("2026-05-03T23:30:09.398", result); + } + + @Test + void testMarshalDateTimeWithMicroseconds() { + String result = adapter.marshal(LocalDateTime.of(2026, 5, 3, 23, 30, 9, 398_629_000)); + assertEquals("2026-05-03T23:30:09.398629", result); + } + + @Test + void testMarshalNull() { + assertNull(adapter.marshal(null)); + } + + @Test + void testRoundTripWithMicroseconds() { + LocalDateTime original = LocalDateTime.of(2026, 5, 3, 23, 30, 9, 398_629_000); + assertEquals(original, adapter.unmarshal(adapter.marshal(original))); + } +} diff --git a/src/test/java/org/rutebanken/util/LocalTimeISO8601XmlAdapterTest.java b/src/test/java/org/rutebanken/util/LocalTimeISO8601XmlAdapterTest.java index 3003ccb..f32e1af 100644 --- a/src/test/java/org/rutebanken/util/LocalTimeISO8601XmlAdapterTest.java +++ b/src/test/java/org/rutebanken/util/LocalTimeISO8601XmlAdapterTest.java @@ -36,6 +36,24 @@ public void testUnmarshalTimeWithMillisecondsAndOffset() { assertEquals(LocalTime.of(14, 30, 0, 456_000_000), result); } + @Test + public void testUnmarshalTimeWithMicroseconds() { + LocalTime result = adapter.unmarshal("07:55:00.398629"); + assertEquals(LocalTime.of(7, 55, 0, 398_629_000), result); + } + + @Test + public void testUnmarshalTimeWithMicrosecondsAndOffset() { + LocalTime result = adapter.unmarshal("07:55:00.398629+02:00"); + assertEquals(LocalTime.of(7, 55, 0, 398_629_000), result); + } + + @Test + public void testUnmarshalTimeWithNanoseconds() { + LocalTime result = adapter.unmarshal("07:55:00.123456789+02:00"); + assertEquals(LocalTime.of(7, 55, 0, 123_456_789), result); + } + @Test public void testUnmarshalMidnight() { LocalTime result = adapter.unmarshal("00:00:00"); @@ -66,6 +84,12 @@ public void testMarshalTimeWithNanoseconds() { assertEquals("14:30:00.123", result); } + @Test + public void testMarshalTimeWithMicroseconds() { + String result = adapter.marshal(LocalTime.of(7, 55, 0, 398_629_000)); + assertEquals("07:55:00.398629", result); + } + @Test public void testMarshalMidnight() { String result = adapter.marshal(LocalTime.MIDNIGHT); @@ -92,6 +116,12 @@ public void testRoundTrip() { assertEquals(original, unmarshalled); } + @Test + public void testRoundTripWithMicroseconds() { + LocalTime original = LocalTime.of(7, 55, 0, 398_629_000); + assertEquals(original, adapter.unmarshal(adapter.marshal(original))); + } + @Test public void testCaching() { String timeString = "10:20:30";