From 80c78a407205f23094ba2d0c8a923f84fed9d9a4 Mon Sep 17 00:00:00 2001 From: John DeRegnaucourt Date: Tue, 12 Mar 2024 00:01:50 -0400 Subject: [PATCH] Many more tests written. --- .../cedarsoftware/util/convert/Converter.java | 10 ++- .../util/convert/LocalDateConversions.java | 24 ++++--- .../convert/ZonedDateTimeConversions.java | 3 +- .../util/convert/ConverterEverythingTest.java | 72 ++++++++++++++++--- 4 files changed, 83 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/cedarsoftware/util/convert/Converter.java b/src/main/java/com/cedarsoftware/util/convert/Converter.java index 31da7c1a..1749d565 100644 --- a/src/main/java/com/cedarsoftware/util/convert/Converter.java +++ b/src/main/java/com/cedarsoftware/util/convert/Converter.java @@ -388,8 +388,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(AtomicBoolean.class, AtomicInteger.class), AtomicBooleanConversions::toAtomicInteger); CONVERSION_DB.put(pair(AtomicLong.class, AtomicInteger.class), NumberConversions::toAtomicInteger); CONVERSION_DB.put(pair(LocalTime.class, AtomicInteger.class), LocalTimeConversions::toAtomicInteger); - CONVERSION_DB.put(pair(LocalDate.class, AtomicInteger.class), LocalDateConversions::toAtomicLong); - CONVERSION_DB.put(pair(Number.class, AtomicBoolean.class), NumberConversions::toAtomicInteger); + CONVERSION_DB.put(pair(Number.class, AtomicInteger.class), NumberConversions::toAtomicInteger); CONVERSION_DB.put(pair(Map.class, AtomicInteger.class), MapConversions::toAtomicInteger); CONVERSION_DB.put(pair(String.class, AtomicInteger.class), StringConversions::toAtomicInteger); CONVERSION_DB.put(pair(Year.class, AtomicInteger.class), YearConversions::toAtomicInteger); @@ -538,7 +537,7 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Timestamp.class, LocalDate.class), DateConversions::toLocalDate); CONVERSION_DB.put(pair(Date.class, LocalDate.class), DateConversions::toLocalDate); CONVERSION_DB.put(pair(Instant.class, LocalDate.class), InstantConversions::toLocalDate); - CONVERSION_DB.put(pair(LocalDate.class, LocalDate.class), LocalDateConversions::toLocalDate); + CONVERSION_DB.put(pair(LocalDate.class, LocalDate.class), Converter::identity); CONVERSION_DB.put(pair(LocalDateTime.class, LocalDate.class), LocalDateTimeConversions::toLocalDate); CONVERSION_DB.put(pair(ZonedDateTime.class, LocalDate.class), ZonedDateTimeConversions::toLocalDate); CONVERSION_DB.put(pair(OffsetDateTime.class, LocalDate.class), OffsetDateTimeConversions::toLocalDate); @@ -587,7 +586,6 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Date.class, LocalTime.class), DateConversions::toLocalTime); CONVERSION_DB.put(pair(Instant.class, LocalTime.class), InstantConversions::toLocalTime); CONVERSION_DB.put(pair(LocalDateTime.class, LocalTime.class), LocalDateTimeConversions::toLocalTime); - CONVERSION_DB.put(pair(LocalDate.class, LocalTime.class), LocalDateConversions::toLocalTime); CONVERSION_DB.put(pair(LocalTime.class, LocalTime.class), Converter::identity); CONVERSION_DB.put(pair(ZonedDateTime.class, LocalTime.class), ZonedDateTimeConversions::toLocalTime); CONVERSION_DB.put(pair(OffsetDateTime.class, LocalTime.class), OffsetDateTimeConversions::toLocalTime); @@ -893,9 +891,9 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(AtomicInteger.class, Map.class), MapConversions::initMap); CONVERSION_DB.put(pair(AtomicLong.class, Map.class), MapConversions::initMap); CONVERSION_DB.put(pair(Date.class, Map.class), DateConversions::toMap); - CONVERSION_DB.put(pair(java.sql.Date.class, Map.class), MapConversions::initMap); + CONVERSION_DB.put(pair(java.sql.Date.class, Map.class), DateConversions::toMap); CONVERSION_DB.put(pair(Timestamp.class, Map.class), MapConversions::initMap); - CONVERSION_DB.put(pair(LocalDate.class, Map.class), MapConversions::initMap); + CONVERSION_DB.put(pair(LocalDate.class, Map.class), LocalDateConversions::toMap); CONVERSION_DB.put(pair(LocalDateTime.class, Map.class), MapConversions::initMap); CONVERSION_DB.put(pair(ZonedDateTime.class, Map.class), MapConversions::initMap); CONVERSION_DB.put(pair(Duration.class, Map.class), DurationConversions::toMap); diff --git a/src/main/java/com/cedarsoftware/util/convert/LocalDateConversions.java b/src/main/java/com/cedarsoftware/util/convert/LocalDateConversions.java index a5a17bc9..3d03ae13 100644 --- a/src/main/java/com/cedarsoftware/util/convert/LocalDateConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/LocalDateConversions.java @@ -6,14 +6,18 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; +import java.util.Map; import java.util.concurrent.atomic.AtomicLong; +import com.cedarsoftware.util.CompactLinkedMap; + +import static com.cedarsoftware.util.convert.Converter.VALUE; + /** * @author Kenny Partlow (kpartlow@gmail.com) *
@@ -47,14 +51,6 @@ static LocalDateTime toLocalDateTime(Object from, Converter converter) { return toZonedDateTime(from, converter).toLocalDateTime(); } - static LocalDate toLocalDate(Object from, Converter converter) { - return toZonedDateTime(from, converter).toLocalDate(); - } - - static LocalTime toLocalTime(Object from, Converter converter) { - return toZonedDateTime(from, converter).toLocalTime(); - } - static ZonedDateTime toZonedDateTime(Object from, Converter converter) { ZoneId zoneId = converter.getOptions().getZoneId(); return ((LocalDate) from).atStartOfDay(zoneId); @@ -69,7 +65,8 @@ static AtomicLong toAtomicLong(Object from, Converter converter) { } static Timestamp toTimestamp(Object from, Converter converter) { - return new Timestamp(toLong(from, converter)); + LocalDate localDate = (LocalDate) from; + return new Timestamp(localDate.toEpochDay() * 86400 * 1000); } static Calendar toCalendar(Object from, Converter converter) { @@ -101,4 +98,11 @@ static String toString(Object from, Converter converter) { LocalDate localDate = (LocalDate) from; return localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); } + + static Map toMap(Object from, Converter converter) { + LocalDate localDate = (LocalDate) from; + Map target = new CompactLinkedMap<>(); + target.put(VALUE, localDate.toString()); + return target; + } } diff --git a/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java b/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java index 750d611f..60bc1fc8 100644 --- a/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/ZonedDateTimeConversions.java @@ -74,7 +74,8 @@ static AtomicLong toAtomicLong(Object from, Converter converter) { } static Timestamp toTimestamp(Object from, Converter converter) { - return new Timestamp(toLong(from, converter)); + ZonedDateTime zdt = (ZonedDateTime) from; + return Timestamp.from(zdt.toInstant()); } static Calendar toCalendar(Object from, Converter converter) { diff --git a/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java b/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java index eefe3f6f..799ddd4e 100644 --- a/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java +++ b/src/test/java/com/cedarsoftware/util/convert/ConverterEverythingTest.java @@ -238,6 +238,17 @@ private static void loadMapTests() { { new Date(now), mapOf(VALUE, now), true}, { new Date(1L), mapOf(VALUE, 1L), true}, }); + TEST_DB.put(pair(LocalDate.class, Map.class), new Object[][] { + {LocalDate.parse("1969-12-31"), mapOf(VALUE, "1969-12-31"), true}, + {LocalDate.parse("1970-01-01"), mapOf(VALUE, "1970-01-01"), true}, + {LocalDate.parse("1970-01-02"), mapOf(VALUE, "1970-01-02"), true}, + }); + TEST_DB.put(pair(java.sql.Date.class, Map.class), new Object[][] { + { new java.sql.Date(-1L), mapOf(VALUE, -1L), true}, + { new java.sql.Date(0L), mapOf(VALUE, 0L), true}, + { new java.sql.Date(now), mapOf(VALUE, now), true}, + { new java.sql.Date(1L), mapOf(VALUE, 1L), true}, + }); TEST_DB.put(pair(Duration.class, Map.class), new Object[][] { { Duration.ofMillis(-1), mapOf("seconds", -1L, "nanos", 999000000)}, }); @@ -747,6 +758,12 @@ private static void loadLocalDateTimeTests() { {Instant.parse("1970-01-01T00:00:00Z"), ZonedDateTime.parse("1970-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z).toLocalDateTime(), true}, {Instant.parse("1970-01-01T00:00:00.000000001Z"), ZonedDateTime.parse("1970-01-01T00:00:00.000000001Z").withZoneSameInstant(TOKYO_Z).toLocalDateTime(), true}, }); + TEST_DB.put(pair(LocalDate.class, LocalDateTime.class), new Object[][] { + {LocalDate.parse("0000-01-01"), ZonedDateTime.parse("0000-01-01T00:00:00Z").toLocalDateTime(), true}, + {LocalDate.parse("1969-12-31"), ZonedDateTime.parse("1969-12-31T00:00:00Z").toLocalDateTime(), true}, + {LocalDate.parse("1970-01-01"), ZonedDateTime.parse("1970-01-01T00:00:00Z").toLocalDateTime(), true}, + {LocalDate.parse("1970-01-02"), ZonedDateTime.parse("1970-01-02T00:00:00Z").toLocalDateTime(), true}, + }); } /** @@ -830,6 +847,14 @@ private static void loadLocalTimeTests() { { new Date(86399999L), LocalTime.parse("08:59:59.999")}, { new Date(86400000L), LocalTime.parse("09:00:00")}, }); + TEST_DB.put(pair(java.sql.Date.class, LocalTime.class), new Object[][]{ + { new java.sql.Date(-1L), LocalTime.parse("08:59:59.999")}, + { new java.sql.Date(0L), LocalTime.parse("09:00:00")}, + { new java.sql.Date(1L), LocalTime.parse("09:00:00.001")}, + { new java.sql.Date(1001L), LocalTime.parse("09:00:01.001")}, + { new java.sql.Date(86399999L), LocalTime.parse("08:59:59.999")}, + { new java.sql.Date(86400000L), LocalTime.parse("09:00:00")}, + }); TEST_DB.put(pair(Instant.class, LocalTime.class), new Object[][]{ // no reverse option (Time local to Tokyo) { Instant.parse("1969-12-31T23:59:59.999999999Z"), LocalTime.parse("08:59:59.999999999")}, { Instant.parse("1970-01-01T00:00:00Z"), LocalTime.parse("09:00:00")}, @@ -938,6 +963,13 @@ private static void loadTimestampTests() { return cal; }, new Timestamp(now), true}, }); + TEST_DB.put(pair(LocalDate.class, Timestamp.class), new Object[][] { + {LocalDate.parse("0000-01-01"), Timestamp.from(Instant.parse("0000-01-01T00:00:00Z")), true }, + {LocalDate.parse("0000-01-02"), Timestamp.from(Instant.parse("0000-01-02T00:00:00Z")), true }, + {LocalDate.parse("1969-12-31"), Timestamp.from(Instant.parse("1969-12-31T00:00:00Z")), true }, + {LocalDate.parse("1970-01-01"), Timestamp.from(Instant.parse("1970-01-01T00:00:00Z")), true }, + {LocalDate.parse("1970-01-02"), Timestamp.from(Instant.parse("1970-01-02T00:00:00Z")), true }, + }); TEST_DB.put(pair(Duration.class, Timestamp.class), new Object[][]{ {Duration.ofSeconds(-62167219200L), Timestamp.from(Instant.parse("0000-01-01T00:00:00Z")), true}, {Duration.ofSeconds(-62167219200L, 1), Timestamp.from(Instant.parse("0000-01-01T00:00:00.000000001Z")), true}, @@ -1266,6 +1298,19 @@ private static void loadSqlDateTests() { {new Date(1), new java.sql.Date(1), true }, {new Date(Long.MAX_VALUE), new java.sql.Date(Long.MAX_VALUE), true }, }); + TEST_DB.put(pair(Timestamp.class, java.sql.Date.class), new Object[][]{ + {new Timestamp(Long.MIN_VALUE), new java.sql.Date(Long.MIN_VALUE), true}, + {new Timestamp(Integer.MIN_VALUE), new java.sql.Date(Integer.MIN_VALUE), true}, + {new Timestamp(now), new java.sql.Date(now), true}, + {new Timestamp(-1), new java.sql.Date(-1), true}, + {new Timestamp(0), new java.sql.Date(0), true}, + {new Timestamp(1), new java.sql.Date(1), true}, + {new Timestamp(Integer.MAX_VALUE), new java.sql.Date(Integer.MAX_VALUE), true}, + {new Timestamp(Long.MAX_VALUE), new java.sql.Date(Long.MAX_VALUE), true}, + {Timestamp.from(Instant.parse("1969-12-31T23:59:59.999Z")), new java.sql.Date(-1), true}, + {Timestamp.from(Instant.parse("1970-01-01T00:00:00.000Z")), new java.sql.Date(0), true}, + {Timestamp.from(Instant.parse("1970-01-01T00:00:00.001Z")), new java.sql.Date(1), true}, + }); TEST_DB.put(pair(LocalDate.class, java.sql.Date.class), new Object[][] { {ZonedDateTime.parse("0000-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z).toLocalDate(), new java.sql.Date(-62167252739000L), true}, {ZonedDateTime.parse("0000-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z).toLocalDate(), new java.sql.Date(-62167252739000L), true}, @@ -1298,6 +1343,15 @@ private static void loadSqlDateTests() { {Instant.parse("1970-01-01T00:00:00.001Z"), new java.sql.Date(1L), true}, {Instant.parse("1970-01-01T00:00:00.999Z"), new java.sql.Date(999L), true}, }); + TEST_DB.put(pair(ZonedDateTime.class, java.sql.Date.class), new Object[][]{ + {ZonedDateTime.parse("0000-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(-62167219200000L), true}, + {ZonedDateTime.parse("0000-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(-62167219199999L), true}, + {ZonedDateTime.parse("1969-12-31T23:59:59Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(-1000), true}, + {ZonedDateTime.parse("1969-12-31T23:59:59.999Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(-1), true}, + {ZonedDateTime.parse("1970-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(0), true}, + {ZonedDateTime.parse("1970-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(1), true}, + {ZonedDateTime.parse("1970-01-01T00:00:00.999Z").withZoneSameInstant(TOKYO_Z), new java.sql.Date(999), true}, + }); } /** @@ -1357,6 +1411,15 @@ private static void loadDateTests() { {ZonedDateTime.parse("1970-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z).toLocalDateTime(), new Date(1L), true}, {ZonedDateTime.parse("1970-01-01T00:00:00.999Z").withZoneSameInstant(TOKYO_Z).toLocalDateTime(), new Date(999L), true}, }); + TEST_DB.put(pair(ZonedDateTime.class, Date.class), new Object[][]{ + {ZonedDateTime.parse("0000-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z), new Date(-62167219200000L), true}, + {ZonedDateTime.parse("0000-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), new Date(-62167219199999L), true}, + {ZonedDateTime.parse("1969-12-31T23:59:59Z").withZoneSameInstant(TOKYO_Z), new Date(-1000), true}, + {ZonedDateTime.parse("1969-12-31T23:59:59.999Z").withZoneSameInstant(TOKYO_Z), new Date(-1), true}, + {ZonedDateTime.parse("1970-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z), new Date(0), true}, + {ZonedDateTime.parse("1970-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), new Date(1), true}, + {ZonedDateTime.parse("1970-01-01T00:00:00.999Z").withZoneSameInstant(TOKYO_Z), new Date(999), true}, + }); } /** @@ -2550,15 +2613,6 @@ private static void loadLongTests() { {ZonedDateTime.parse("1970-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), 1L, true}, {ZonedDateTime.parse("1970-01-01T00:00:00.999Z").withZoneSameInstant(TOKYO_Z), 999L, true}, }); - TEST_DB.put(pair(ZonedDateTime.class, Date.class), new Object[][]{ - {ZonedDateTime.parse("0000-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z), new Date(-62167219200000L), true}, - {ZonedDateTime.parse("0000-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), new Date(-62167219199999L), true}, - {ZonedDateTime.parse("1969-12-31T23:59:59Z").withZoneSameInstant(TOKYO_Z), new Date(-1000), true}, - {ZonedDateTime.parse("1969-12-31T23:59:59.999Z").withZoneSameInstant(TOKYO_Z), new Date(-1), true}, - {ZonedDateTime.parse("1970-01-01T00:00:00Z").withZoneSameInstant(TOKYO_Z), new Date(0), true}, - {ZonedDateTime.parse("1970-01-01T00:00:00.001Z").withZoneSameInstant(TOKYO_Z), new Date(1), true}, - {ZonedDateTime.parse("1970-01-01T00:00:00.999Z").withZoneSameInstant(TOKYO_Z), new Date(999), true}, - }); TEST_DB.put(pair(Calendar.class, Long.class), new Object[][]{ {(Supplier) () -> { Calendar cal = Calendar.getInstance(TOKYO_TZ);