From cb2b490bd0aed2579281aba186b784dc46db21e4 Mon Sep 17 00:00:00 2001 From: ShivKJ Date: Thu, 27 Feb 2025 18:20:19 +0530 Subject: [PATCH 1/3] adding allOf validation and test cases --- .../yavi/constraint/CollectionConstraint.java | 17 +++++++++++++++++ .../java/am/ik/yavi/core/ViolationMessage.java | 1 + .../constraint/CollectionConstraintTest.java | 12 ++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java b/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java index d208a0b5..47e3b1b0 100644 --- a/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java @@ -29,6 +29,7 @@ import static am.ik.yavi.core.NullAs.VALID; import static am.ik.yavi.core.ViolationMessage.Default.COLLECTION_CONTAINS; import static am.ik.yavi.core.ViolationMessage.Default.COLLECTION_UNIQUE; +import static am.ik.yavi.core.ViolationMessage.Default.OBJECT_ALL_OF; public class CollectionConstraint, E> extends ContainerConstraintBase> { @@ -69,6 +70,22 @@ public CollectionConstraint unique() { return this; } + public CollectionConstraint allOf(Collection values) { + this.predicates().add(ConstraintPredicate.withViolatedValue(collection -> { + final Set missingValues = new HashSet<>(values); + + if (collection instanceof Set) + missingValues.removeAll(collection); + else + missingValues.removeAll(new HashSet<>(collection)); + + return missingValues.isEmpty() ? Optional.empty() : Optional.of(new ViolatedValue(missingValues)); + }, OBJECT_ALL_OF, () -> new Object[]{values.toString()}, VALID)); + + return this; + } + + @Override protected ToIntFunction size() { return Collection::size; diff --git a/src/main/java/am/ik/yavi/core/ViolationMessage.java b/src/main/java/am/ik/yavi/core/ViolationMessage.java index 57d459fc..ef52adc0 100644 --- a/src/main/java/am/ik/yavi/core/ViolationMessage.java +++ b/src/main/java/am/ik/yavi/core/ViolationMessage.java @@ -42,6 +42,7 @@ enum Default implements ViolationMessage { OBJECT_EQUAL_TO("object.equalTo", "\"{0}\" must be equal to {1}"), // OBJECT_ONE_OF("object.oneOf", "\"{0}\" must be one of the following values: {1}"), // OBJECT_NOT_ONE_OF("object.notOneOf", "\"{0}\" must not be one of the following values: {1}"), // + OBJECT_ALL_OF("object.allOf", "\"{0}\" must be have of all of the following values: {1}, missing values: {2}"), // CONTAINER_NOT_EMPTY("container.notEmpty", "\"{0}\" must not be empty"), // CONTAINER_LESS_THAN("container.lessThan", "The size of \"{0}\" must be less than {1}. The given size is {2}"), // CONTAINER_LESS_THAN_OR_EQUAL("container.lessThanOrEqual", diff --git a/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java b/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java index f26451a7..fcffb636 100644 --- a/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java @@ -86,6 +86,18 @@ void unique() { assertThat(predicate.test(Arrays.asList("a", "b", "c", "b"))).isFalse(); } + @Test + void allOf() { + Predicate> predicate = retrievePredicate(c -> c.allOf(Arrays.asList("a", "b", "c"))); + assertThat(predicate.test(Arrays.asList("a", "b", "c", "d"))).isTrue(); + assertThat(predicate.test(Arrays.asList("a", "b", "c"))).isTrue(); + assertThat(predicate.test(Arrays.asList("a", "b"))).isFalse(); + assertThat(predicate.test(Arrays.asList("a"))).isFalse(); + assertThat(predicate.test(Arrays.asList("a", "b", "d"))).isFalse(); + assertThat(predicate.test(Arrays.asList("x", "y"))).isFalse(); + assertThat(predicate.test(Arrays.asList())).isFalse(); + } + private static Predicate> retrievePredicate( Function, List, String>, CollectionConstraint, List, String>> constraint) { return constraint.apply(new CollectionConstraint<>()).predicates().peekFirst().predicate(); From 41624409e68bdaa914cb54963b52e14285cc81b7 Mon Sep 17 00:00:00 2001 From: ShivKJ Date: Sat, 1 Mar 2025 10:10:50 +0530 Subject: [PATCH 2/3] incorporating pr comments --- .../yavi/constraint/CollectionConstraint.java | 11 ++++--- .../am/ik/yavi/core/ViolationMessage.java | 2 +- .../constraint/CollectionConstraintTest.java | 33 ++++++++++++++----- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java b/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java index 47e3b1b0..cb8820a7 100644 --- a/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java @@ -29,7 +29,7 @@ import static am.ik.yavi.core.NullAs.VALID; import static am.ik.yavi.core.ViolationMessage.Default.COLLECTION_CONTAINS; import static am.ik.yavi.core.ViolationMessage.Default.COLLECTION_UNIQUE; -import static am.ik.yavi.core.ViolationMessage.Default.OBJECT_ALL_OF; +import static am.ik.yavi.core.ViolationMessage.Default.COLLECTION_CONTAINS_ALL; public class CollectionConstraint, E> extends ContainerConstraintBase> { @@ -70,17 +70,18 @@ public CollectionConstraint unique() { return this; } - public CollectionConstraint allOf(Collection values) { + public CollectionConstraint containsAll(Collection values) { this.predicates().add(ConstraintPredicate.withViolatedValue(collection -> { final Set missingValues = new HashSet<>(values); - if (collection instanceof Set) + if (collection instanceof Set) { missingValues.removeAll(collection); - else + } else { missingValues.removeAll(new HashSet<>(collection)); + } return missingValues.isEmpty() ? Optional.empty() : Optional.of(new ViolatedValue(missingValues)); - }, OBJECT_ALL_OF, () -> new Object[]{values.toString()}, VALID)); + }, COLLECTION_CONTAINS_ALL, () -> new Object[]{values.toString()}, VALID)); return this; } diff --git a/src/main/java/am/ik/yavi/core/ViolationMessage.java b/src/main/java/am/ik/yavi/core/ViolationMessage.java index ef52adc0..1c9f408f 100644 --- a/src/main/java/am/ik/yavi/core/ViolationMessage.java +++ b/src/main/java/am/ik/yavi/core/ViolationMessage.java @@ -42,7 +42,6 @@ enum Default implements ViolationMessage { OBJECT_EQUAL_TO("object.equalTo", "\"{0}\" must be equal to {1}"), // OBJECT_ONE_OF("object.oneOf", "\"{0}\" must be one of the following values: {1}"), // OBJECT_NOT_ONE_OF("object.notOneOf", "\"{0}\" must not be one of the following values: {1}"), // - OBJECT_ALL_OF("object.allOf", "\"{0}\" must be have of all of the following values: {1}, missing values: {2}"), // CONTAINER_NOT_EMPTY("container.notEmpty", "\"{0}\" must not be empty"), // CONTAINER_LESS_THAN("container.lessThan", "The size of \"{0}\" must be less than {1}. The given size is {2}"), // CONTAINER_LESS_THAN_OR_EQUAL("container.lessThanOrEqual", @@ -95,6 +94,7 @@ enum Default implements ViolationMessage { BYTE_SIZE_FIXED_SIZE("byteSize.fixedSize", "The byte size of \"{0}\" must be {1}. The given size is {2}"), // COLLECTION_CONTAINS("collection.contains", "\"{0}\" must contain {1}"), // COLLECTION_UNIQUE("collection.unique", "\"{0}\" must be unique. {1} is/are duplicated."), // + COLLECTION_CONTAINS_ALL("collection.containsAll", "\"{0}\" must be have of all of the following values: {1}, missing values: {2}"), // MAP_CONTAINS_VALUE("map.containsValue", "\"{0}\" must contain value {1}"), // MAP_CONTAINS_KEY("map.containsKey", "\"{0}\" must contain key {1}"), // ARRAY_CONTAINS("array.contains", "\"{0}\" must contain {1}"), // diff --git a/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java b/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java index fcffb636..2a592a86 100644 --- a/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java +++ b/src/test/java/am/ik/yavi/constraint/CollectionConstraintTest.java @@ -87,15 +87,30 @@ void unique() { } @Test - void allOf() { - Predicate> predicate = retrievePredicate(c -> c.allOf(Arrays.asList("a", "b", "c"))); - assertThat(predicate.test(Arrays.asList("a", "b", "c", "d"))).isTrue(); - assertThat(predicate.test(Arrays.asList("a", "b", "c"))).isTrue(); - assertThat(predicate.test(Arrays.asList("a", "b"))).isFalse(); - assertThat(predicate.test(Arrays.asList("a"))).isFalse(); - assertThat(predicate.test(Arrays.asList("a", "b", "d"))).isFalse(); - assertThat(predicate.test(Arrays.asList("x", "y"))).isFalse(); - assertThat(predicate.test(Arrays.asList())).isFalse(); + void containsAll() { + List mustVisitCities = Arrays.asList("a", "b", "c"); + Predicate> predicate = retrievePredicate(c -> c.containsAll(mustVisitCities)); + + List visitingCities = Arrays.asList("a", "b", "c", "d"); + assertThat(predicate.test(visitingCities)).isTrue(); + + visitingCities = Arrays.asList("a", "b", "c"); + assertThat(predicate.test(visitingCities)).isTrue(); + + visitingCities = Arrays.asList("a", "b"); + assertThat(predicate.test(visitingCities)).isFalse(); + + visitingCities = Arrays.asList("a"); + assertThat(predicate.test(visitingCities)).isFalse(); + + visitingCities = Arrays.asList(); + assertThat(predicate.test(visitingCities)).isFalse(); + + visitingCities = Arrays.asList("a", "b", "d"); + assertThat(predicate.test(visitingCities)).isFalse(); + + visitingCities = Arrays.asList("x", "y"); + assertThat(predicate.test(visitingCities)).isFalse(); } private static Predicate> retrievePredicate( From 0ceef7e17be8d48b8ed9a63863e7aaa831e01e99 Mon Sep 17 00:00:00 2001 From: ShivKJ Date: Fri, 7 Mar 2025 10:25:47 +0530 Subject: [PATCH 3/3] running the autoformatter to align with the required coding format --- .../java/am/ik/yavi/constraint/CollectionConstraint.java | 6 +++--- src/main/java/am/ik/yavi/core/ViolationMessage.java | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java b/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java index cb8820a7..7d374078 100644 --- a/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java +++ b/src/main/java/am/ik/yavi/constraint/CollectionConstraint.java @@ -76,17 +76,17 @@ public CollectionConstraint containsAll(Collection values) if (collection instanceof Set) { missingValues.removeAll(collection); - } else { + } + else { missingValues.removeAll(new HashSet<>(collection)); } return missingValues.isEmpty() ? Optional.empty() : Optional.of(new ViolatedValue(missingValues)); - }, COLLECTION_CONTAINS_ALL, () -> new Object[]{values.toString()}, VALID)); + }, COLLECTION_CONTAINS_ALL, () -> new Object[] { values.toString() }, VALID)); return this; } - @Override protected ToIntFunction size() { return Collection::size; diff --git a/src/main/java/am/ik/yavi/core/ViolationMessage.java b/src/main/java/am/ik/yavi/core/ViolationMessage.java index 1c9f408f..a365a2d3 100644 --- a/src/main/java/am/ik/yavi/core/ViolationMessage.java +++ b/src/main/java/am/ik/yavi/core/ViolationMessage.java @@ -94,7 +94,8 @@ enum Default implements ViolationMessage { BYTE_SIZE_FIXED_SIZE("byteSize.fixedSize", "The byte size of \"{0}\" must be {1}. The given size is {2}"), // COLLECTION_CONTAINS("collection.contains", "\"{0}\" must contain {1}"), // COLLECTION_UNIQUE("collection.unique", "\"{0}\" must be unique. {1} is/are duplicated."), // - COLLECTION_CONTAINS_ALL("collection.containsAll", "\"{0}\" must be have of all of the following values: {1}, missing values: {2}"), // + COLLECTION_CONTAINS_ALL("collection.containsAll", + "\"{0}\" must be have of all of the following values: {1}, missing values: {2}"), // MAP_CONTAINS_VALUE("map.containsValue", "\"{0}\" must contain value {1}"), // MAP_CONTAINS_KEY("map.containsKey", "\"{0}\" must contain key {1}"), // ARRAY_CONTAINS("array.contains", "\"{0}\" must contain {1}"), //