From ec2f2e3a22a8f9efbab70fdf0673d7d7b9e22d5e Mon Sep 17 00:00:00 2001 From: Andreas Hufler Date: Tue, 12 Aug 2025 08:58:45 +0200 Subject: [PATCH 1/4] add support for charsequences and maps --- .../source/SizeGreaterThanValueSource.java | 32 +++++++++++++++++ .../source/SizeLessThanValueSource.java | 36 +++++++++++++++++++ .../validation/ValidationAssertTest.java | 36 ++++++++++++++++++- 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java index 591dd00..3f8c806 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeGreaterThanValueSource.java @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; import java.util.function.LongFunction; import java.util.stream.Stream; @@ -23,6 +24,7 @@ public class SizeGreaterThanValueSource implements ValueSource { static { TYPE_SOURCES.put(String.class, SizeGreaterThanValueSource::getStringStream); + TYPE_SOURCES.put(CharSequence.class, SizeGreaterThanValueSource::getStringStream); TYPE_SOURCES.put(Collection.class, SizeGreaterThanValueSource::getArrayListStream); TYPE_SOURCES.put(List.class, SizeGreaterThanValueSource::getArrayListStream); TYPE_SOURCES.put(ArrayList.class, SizeGreaterThanValueSource::getArrayListStream); @@ -30,6 +32,9 @@ public class SizeGreaterThanValueSource implements ValueSource { TYPE_SOURCES.put(Set.class, SizeGreaterThanValueSource::getHashSetStream); TYPE_SOURCES.put(HashSet.class, SizeGreaterThanValueSource::getHashSetStream); TYPE_SOURCES.put(TreeSet.class, SizeGreaterThanValueSource::getTreeSetStream); + TYPE_SOURCES.put(Map.class, SizeGreaterThanValueSource::getHashMapStream); + TYPE_SOURCES.put(HashMap.class, SizeGreaterThanValueSource::getHashMapStream); + TYPE_SOURCES.put(TreeMap.class, SizeGreaterThanValueSource::getTreeMapStream); } @SuppressWarnings("unused") @@ -112,6 +117,26 @@ private static Stream> getLinkedListStream(long value) { )); } + @NonNull + private static Stream> getHashMapStream(long value) { + return getTestSizes(value) + .stream() + .map(size -> generateMap( + Math.toIntExact(size), + new HashMap<>() + )); + } + + @NonNull + private static Stream> getTreeMapStream(long value) { + return getTestSizes(value) + .stream() + .map(size -> generateMap( + Math.toIntExact(size), + new TreeMap<>() + )); + } + private static List getTestSizes(long value) { var sizes = new ArrayList(); @@ -136,6 +161,13 @@ private static Collection generateCollection(int size, Collection generateMap(int size, Map map) { + for (int i = 0; i < size; i++) { + map.put(i, "dummy_" + i); // Add dummy elements, content doesn't matter + } + return map; + } + private static Object generateArray(int size, Class arrayClass) { var componentType = arrayClass.getComponentType(); return Array.newInstance(componentType, size); diff --git a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java index d934663..fa81e8e 100644 --- a/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java +++ b/src/main/java/it/aboutbits/springboot/testing/validation/source/SizeLessThanValueSource.java @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; import java.util.function.LongFunction; import java.util.stream.Stream; @@ -23,6 +24,7 @@ public class SizeLessThanValueSource implements ValueSource { static { TYPE_SOURCES.put(String.class, SizeLessThanValueSource::getStringStream); + TYPE_SOURCES.put(CharSequence.class, SizeLessThanValueSource::getStringStream); TYPE_SOURCES.put(Collection.class, SizeLessThanValueSource::getArrayListStream); TYPE_SOURCES.put(List.class, SizeLessThanValueSource::getArrayListStream); TYPE_SOURCES.put(ArrayList.class, SizeLessThanValueSource::getArrayListStream); @@ -30,6 +32,9 @@ public class SizeLessThanValueSource implements ValueSource { TYPE_SOURCES.put(Set.class, SizeLessThanValueSource::getHashSetStream); TYPE_SOURCES.put(HashSet.class, SizeLessThanValueSource::getHashSetStream); TYPE_SOURCES.put(TreeSet.class, SizeLessThanValueSource::getTreeSetStream); + TYPE_SOURCES.put(Map.class, SizeLessThanValueSource::getHashMapStream); + TYPE_SOURCES.put(HashMap.class, SizeLessThanValueSource::getHashMapStream); + TYPE_SOURCES.put(TreeMap.class, SizeLessThanValueSource::getTreeMapStream); } @SuppressWarnings("unused") @@ -130,6 +135,30 @@ private static Stream> getTreeSetStream(long value) { ); } + @NonNull + private static Stream> getHashMapStream(long value) { + return Stream.concat( + Stream.of(new HashMap<>()), + Stream.iterate(1L, i -> i < value, i -> i + 1) + .map(size -> generateMap( + Math.toIntExact(size), + new HashMap<>() + )) + ); + } + + @NonNull + private static Stream> getTreeMapStream(long value) { + return Stream.concat( + Stream.of(new TreeMap<>()), + Stream.iterate(1L, i -> i < value, i -> i + 1) + .map(size -> generateMap( + Math.toIntExact(size), + new TreeMap<>() + )) + ); + } + private static String generateRandomString(int length) { // Include printable ASCII characters (32-126) which includes space and common characters return RANDOM.ints(length, 32, 127) @@ -144,6 +173,13 @@ private static Collection generateCollection(int size, Collection generateMap(int size, Map map) { + for (int i = 0; i < size; i++) { + map.put(i, "dummy_" + i); // Add dummy elements, content doesn't matter + } + return map; + } + private static Object generateArray(int size, Class arrayClass) { var componentType = arrayClass.getComponentType(); return Array.newInstance(componentType, size); diff --git a/src/test/java/it/aboutbits/springboot/testing/validation/ValidationAssertTest.java b/src/test/java/it/aboutbits/springboot/testing/validation/ValidationAssertTest.java index 763083b..23a4756 100644 --- a/src/test/java/it/aboutbits/springboot/testing/validation/ValidationAssertTest.java +++ b/src/test/java/it/aboutbits/springboot/testing/validation/ValidationAssertTest.java @@ -34,8 +34,11 @@ import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.UUID; import java.util.function.Consumer; @@ -158,16 +161,19 @@ public record SomeValidParameter( @Size(min = 3) String minSizeString, @Size(min = 3) Set minSizeCollection, @Size(min = 3) UUID[] minSizeArray, + @Size(min = 3) Map minSizeMap, // Size - Max - @Size(max = 10) String maxSizeString, + @Size(max = 10) CharSequence maxSizeString, @Size(max = 10) Collection maxSizeCollection, @Size(max = 10) String[] maxSizeArray, + @Size(max = 10) HashMap maxSizeMap, // Size - Min/Max @Size(min = 2, max = 8) String minMaxSizeString, @Size(min = 2, max = 8) Collection minMaxSizeCollection, @Size(min = 2, max = 8) String[] minMaxSizeArray, + @Size(min = 2, max = 8) TreeMap minMaxSizeMap, // Nullable @Nullable Object nullable, @@ -297,16 +303,19 @@ void testWithBeanValidation() { .size("minSizeString").min(3) .size("minSizeCollection").min(3) .size("minSizeArray").min(3) + .size("minSizeMap").min(3) // Size - Max .size("maxSizeString").max(10) .size("maxSizeCollection").max(10) .size("maxSizeArray").max(10) + .size("maxSizeMap").max(10) // Size - Min/Max .size("minMaxSizeString").minMax(2, 8) .size("minMaxSizeCollection").minMax(2, 8) .size("minMaxSizeArray").minMax(2, 8) + .size("minMaxSizeMap").minMax(2, 8) // Nullable .nullable("nullable") @@ -575,16 +584,19 @@ void propertyMissingRule_shouldFail() { .size("minSizeString").min(3) .size("minSizeCollection").min(3) .size("minSizeArray").min(3) + .size("minSizeMap").min(3) // Size - Max .size("maxSizeString").max(10) .size("maxSizeCollection").max(10) .size("maxSizeArray").max(10) + .size("maxSizeMap").max(10) // Size - Min/Max .size("minMaxSizeString").minMax(2, 8) .size("minMaxSizeCollection").minMax(2, 8) .size("minMaxSizeArray").minMax(2, 8) + .size("minMaxSizeMap").minMax(2, 8) // Nullable .nullable("nullable") @@ -852,16 +864,38 @@ private static SomeValidParameter getSomeValidParameter() { UUID.randomUUID(), UUID.randomUUID() }, // 4 elements, > 3 min + Map.of( + "ka", "a", + "kb", "b", + "kc", "c", + "kd", "d" + ), // Size - Max "small", // 5 characters, < 10 max List.of("a", "b", "c"), // 3 elements, < 10 max new String[]{"a", "b", "c"}, // 3 elements, < 10 max + new HashMap<>( + Map.of( + "ka", "a", + "kb", "b", + "kc", "c", + "kd", "d" + ) + ), // Size - Min/Max "medium", // 6 characters, between 2-8 List.of("a", "b", "c", "d", "e"), // 5 elements, between 2-8 new String[]{"a", "b", "c", "d", "e"}, // 5 elements, between 2-8 + new TreeMap<>( + Map.of( + "ka", UUID.randomUUID(), + "kb", UUID.randomUUID(), + "kc", UUID.randomUUID(), + "kd", UUID.randomUUID() + ) + ), // Nullable null, From c087b1912468069079b2f2cabb710af1b73ddb35 Mon Sep 17 00:00:00 2001 From: Andreas Hufler Date: Tue, 12 Aug 2025 09:31:24 +0200 Subject: [PATCH 2/4] fix checkstyle config to also include tests --- .idea/checkstyle-idea.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml index cd93c1e..58eacc9 100644 --- a/.idea/checkstyle-idea.xml +++ b/.idea/checkstyle-idea.xml @@ -1,8 +1,8 @@ - 10.18.1 - JavaOnly + 10.26.1 + JavaOnlyWithTests