|
|
|
|
@ -16,20 +16,34 @@
@@ -16,20 +16,34 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.util; |
|
|
|
|
|
|
|
|
|
import java.io.File; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
import java.math.BigInteger; |
|
|
|
|
import java.net.InetAddress; |
|
|
|
|
import java.net.URI; |
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.net.UnknownHostException; |
|
|
|
|
import java.nio.charset.Charset; |
|
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
|
import java.nio.file.Path; |
|
|
|
|
import java.sql.SQLException; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.time.ZoneId; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Collections; |
|
|
|
|
import java.util.Currency; |
|
|
|
|
import java.util.Date; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
import java.util.HashSet; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Locale; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.Optional; |
|
|
|
|
import java.util.Set; |
|
|
|
|
import java.util.TimeZone; |
|
|
|
|
import java.util.UUID; |
|
|
|
|
import java.util.regex.Pattern; |
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Nested; |
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
@ -232,7 +246,7 @@ class ObjectUtilsTests {
@@ -232,7 +246,7 @@ class ObjectUtilsTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void addObjectToNullArray() throws Exception { |
|
|
|
|
void addObjectToNullArray() { |
|
|
|
|
String newElement = "foo"; |
|
|
|
|
String[] newArray = ObjectUtils.addObjectToArray(null, newElement); |
|
|
|
|
assertThat(newArray).hasSize(1); |
|
|
|
|
@ -240,14 +254,14 @@ class ObjectUtilsTests {
@@ -240,14 +254,14 @@ class ObjectUtilsTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void addNullObjectToNullArray() throws Exception { |
|
|
|
|
void addNullObjectToNullArray() { |
|
|
|
|
Object[] newArray = ObjectUtils.addObjectToArray(null, null); |
|
|
|
|
assertThat(newArray).hasSize(1); |
|
|
|
|
assertThat(newArray[0]).isNull(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeEqualsWithArrays() throws Exception { |
|
|
|
|
void nullSafeEqualsWithArrays() { |
|
|
|
|
assertThat(ObjectUtils.nullSafeEquals(new String[] {"a", "b", "c"}, new String[] {"a", "b", "c"})).isTrue(); |
|
|
|
|
assertThat(ObjectUtils.nullSafeEquals(new int[] {1, 2, 3}, new int[] {1, 2, 3})).isTrue(); |
|
|
|
|
} |
|
|
|
|
@ -823,6 +837,41 @@ class ObjectUtilsTests {
@@ -823,6 +837,41 @@ class ObjectUtilsTests {
|
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(null)).isEqualTo("null"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForEmptyOptional() { |
|
|
|
|
Optional<String> optional = Optional.empty(); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(optional)).isEqualTo("Optional.empty"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForNonEmptyOptionals() { |
|
|
|
|
Optional<Tropes> optionalEnum = Optional.of(Tropes.BAR); |
|
|
|
|
String expected = "Optional[BAR]"; |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(optionalEnum)).isEqualTo(expected); |
|
|
|
|
|
|
|
|
|
String repeat100 = "X".repeat(100); |
|
|
|
|
String repeat101 = "X".repeat(101); |
|
|
|
|
|
|
|
|
|
Optional<String> optionalString = Optional.of(repeat100); |
|
|
|
|
expected = "Optional[%s]".formatted(repeat100); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(optionalString)).isEqualTo(expected); |
|
|
|
|
|
|
|
|
|
optionalString = Optional.of(repeat101); |
|
|
|
|
expected = "Optional[%s]".formatted(repeat100 + truncated); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(optionalString)).isEqualTo(expected); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForNonEmptyOptionalCustomType() { |
|
|
|
|
class CustomType { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CustomType customType = new CustomType(); |
|
|
|
|
Optional<CustomType> optional = Optional.of(customType); |
|
|
|
|
String expected = "Optional[%s]".formatted(ObjectUtils.nullSafeConciseToString(customType)); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(optional)).isEqualTo(expected); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForClass() { |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(String.class)).isEqualTo("java.lang.String"); |
|
|
|
|
@ -855,11 +904,19 @@ class ObjectUtilsTests {
@@ -855,11 +904,19 @@ class ObjectUtilsTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForNumber() { |
|
|
|
|
void nullSafeConciseToStringForPrimitivesAndWrappers() { |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(true)).isEqualTo("true"); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString('X')).isEqualTo("X"); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(42L)).isEqualTo("42"); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(99.1234D)).isEqualTo("99.1234"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForBigNumbers() { |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(BigInteger.valueOf(42L))).isEqualTo("42"); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(BigDecimal.valueOf(99.1234D))).isEqualTo("99.1234"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForDate() { |
|
|
|
|
Date date = new Date(); |
|
|
|
|
@ -878,6 +935,30 @@ class ObjectUtilsTests {
@@ -878,6 +935,30 @@ class ObjectUtilsTests {
|
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(id)).isEqualTo(id.toString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForFile() { |
|
|
|
|
String path = "/tmp/file.txt"; |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(new File(path))).isEqualTo(path); |
|
|
|
|
|
|
|
|
|
path = "/tmp/" + "xyz".repeat(32); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(new File(path))) |
|
|
|
|
.hasSize(truncatedLength) |
|
|
|
|
.startsWith(path.subSequence(0, 100)) |
|
|
|
|
.endsWith(truncated); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForPath() { |
|
|
|
|
String path = "/tmp/file.txt"; |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(Path.of(path))).isEqualTo(path); |
|
|
|
|
|
|
|
|
|
path = "/tmp/" + "xyz".repeat(32); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(Path.of(path))) |
|
|
|
|
.hasSize(truncatedLength) |
|
|
|
|
.startsWith(path.subSequence(0, 100)) |
|
|
|
|
.endsWith(truncated); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForURI() { |
|
|
|
|
String uri = "https://www.example.com/?foo=1&bar=2&baz=3"; |
|
|
|
|
@ -902,11 +983,56 @@ class ObjectUtilsTests {
@@ -902,11 +983,56 @@ class ObjectUtilsTests {
|
|
|
|
|
.endsWith(truncated); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForInetAddress() { |
|
|
|
|
InetAddress localhost = getLocalhost(); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(localhost)).isEqualTo(localhost.toString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static InetAddress getLocalhost() { |
|
|
|
|
try { |
|
|
|
|
return InetAddress.getLocalHost(); |
|
|
|
|
} |
|
|
|
|
catch (UnknownHostException ex) { |
|
|
|
|
return InetAddress.getLoopbackAddress(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForCharset() { |
|
|
|
|
Charset charset = StandardCharsets.UTF_8; |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(charset)).isEqualTo(charset.name()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForCurrency() { |
|
|
|
|
Currency currency = Currency.getInstance(Locale.US); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(currency)).isEqualTo(currency.toString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForLocale() { |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(Locale.GERMANY)).isEqualTo("de_DE"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForRegExPattern() { |
|
|
|
|
Pattern pattern = Pattern.compile("^(foo|bar)$"); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(pattern)).isEqualTo(pattern.toString()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForTimeZone() { |
|
|
|
|
TimeZone timeZone = TimeZone.getDefault(); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(timeZone)).isEqualTo(timeZone.getID()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForZoneId() { |
|
|
|
|
ZoneId zoneId = ZoneId.systemDefault(); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(zoneId)).isEqualTo(zoneId.getId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForArraysAndCollections() { |
|
|
|
|
List<String> list = List.of("a", "b", "c"); |
|
|
|
|
@ -917,6 +1043,12 @@ class ObjectUtilsTests {
@@ -917,6 +1043,12 @@ class ObjectUtilsTests {
|
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(new HashSet<>(list))).startsWith(prefix(HashSet.class)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForMaps() { |
|
|
|
|
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3); |
|
|
|
|
assertThat(ObjectUtils.nullSafeConciseToString(map)).startsWith(prefix(map.getClass())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nullSafeConciseToStringForCustomTypes() { |
|
|
|
|
class ExplosiveType { |
|
|
|
|
|