Skip to content

Commit 15f8692

Browse files
added constraint on class api to ValidatorBuilder
1 parent f0ba625 commit 15f8692

File tree

2 files changed

+122
-23
lines changed

2 files changed

+122
-23
lines changed

src/main/java/am/ik/yavi/builder/ValidatorBuilder.java

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,6 @@
1515
*/
1616
package am.ik.yavi.builder;
1717

18-
import java.math.BigDecimal;
19-
import java.math.BigInteger;
20-
import java.time.Instant;
21-
import java.time.LocalDate;
22-
import java.time.LocalDateTime;
23-
import java.time.LocalTime;
24-
import java.time.OffsetDateTime;
25-
import java.time.Year;
26-
import java.time.YearMonth;
27-
import java.time.ZonedDateTime;
28-
import java.util.ArrayList;
29-
import java.util.Arrays;
30-
import java.util.Collection;
31-
import java.util.Deque;
32-
import java.util.LinkedHashMap;
33-
import java.util.LinkedList;
34-
import java.util.List;
35-
import java.util.Map;
36-
import java.util.function.Consumer;
37-
import java.util.function.Function;
38-
import java.util.function.Predicate;
39-
import java.util.function.Supplier;
40-
4118
import am.ik.yavi.constraint.BigDecimalConstraint;
4219
import am.ik.yavi.constraint.BigIntegerConstraint;
4320
import am.ik.yavi.constraint.BooleanConstraint;
@@ -111,6 +88,29 @@
11188
import am.ik.yavi.meta.YearMonthConstraintMeta;
11289
import am.ik.yavi.meta.ZonedDateTimeConstraintMeta;
11390

91+
import java.math.BigDecimal;
92+
import java.math.BigInteger;
93+
import java.time.Instant;
94+
import java.time.LocalDate;
95+
import java.time.LocalDateTime;
96+
import java.time.LocalTime;
97+
import java.time.OffsetDateTime;
98+
import java.time.Year;
99+
import java.time.YearMonth;
100+
import java.time.ZonedDateTime;
101+
import java.util.ArrayList;
102+
import java.util.Arrays;
103+
import java.util.Collection;
104+
import java.util.Deque;
105+
import java.util.LinkedHashMap;
106+
import java.util.LinkedList;
107+
import java.util.List;
108+
import java.util.Map;
109+
import java.util.function.Consumer;
110+
import java.util.function.Function;
111+
import java.util.function.Predicate;
112+
import java.util.function.Supplier;
113+
114114
public class ValidatorBuilder<T> implements Cloneable {
115115
private static final String DEFAULT_SEPARATOR = ".";
116116

@@ -732,6 +732,33 @@ public ValidatorBuilder<T> _doubleArray(ToDoubleArray<T> f, String name,
732732
return this.constraint(f, name, c, DoubleArrayConstraint::new);
733733
}
734734

735+
/**
736+
* @since 0.14.0
737+
*/
738+
public <C extends T> ValidatorBuilder<T> constraintOnClass(Class<C> clazz,
739+
Validator<C> cValidator) {
740+
Validator<T> TValidator = new ValidatorBuilder<T>()
741+
.nest(clazz::cast, clazz.getName(), cValidator).build();
742+
743+
return constraintOnCondition(getClassConstraintCondition(clazz), TValidator);
744+
}
745+
746+
/**
747+
* @since 0.14.0
748+
*/
749+
public <C extends T> ValidatorBuilder<T> constraintOnClass(Class<C> clazz,
750+
ValidatorBuilderConverter<C> converter) {
751+
ValidatorBuilderConverter<T> tConverter = tValidatorBuilder -> tValidatorBuilder
752+
.nest(clazz::cast, clazz.getName(), converter);
753+
754+
return constraintOnCondition(getClassConstraintCondition(clazz), tConverter);
755+
}
756+
757+
private <C extends T> ConstraintCondition<T> getClassConstraintCondition(
758+
Class<C> classCondition) {
759+
return (t, c) -> classCondition.isInstance(t);
760+
}
761+
735762
/**
736763
* @since 0.11.0
737764
*/
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package am.ik.yavi.core;
2+
3+
import am.ik.yavi.User;
4+
import am.ik.yavi.builder.ValidatorBuilder;
5+
import am.ik.yavi.constraint.CharSequenceConstraint;
6+
import org.junit.jupiter.api.TestInstance;
7+
import org.junit.jupiter.params.ParameterizedTest;
8+
import org.junit.jupiter.params.provider.Arguments;
9+
import org.junit.jupiter.params.provider.MethodSource;
10+
11+
import java.util.function.Function;
12+
import java.util.stream.Stream;
13+
14+
import static com.google.common.truth.Truth.assertThat;
15+
16+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
17+
public class ConstraintOnClassTest {
18+
19+
@ParameterizedTest
20+
@MethodSource("provideValidators")
21+
void testConstraintOnConditionClass(Validator<User> validator) {
22+
User validAdmin = new Admin("admin123", "admin@gmail", 27, "yavi123");
23+
User invalidAdmin = new Admin("Niraz", "niraz@gmail", 23, "user");
24+
25+
assertThat(validator.validate(validAdmin).isValid()).isTrue();
26+
assertThat(validator.validate(invalidAdmin).isValid()).isFalse();
27+
}
28+
29+
@ParameterizedTest
30+
@MethodSource("provideValidators")
31+
void testConstraintOnNonConditionClass(Validator<User> validator) {
32+
User validUser = new User("Rawad", "rawad@gmail", 25);
33+
User invalidUser = new User("Almog", "almog@gmail", 19);
34+
35+
assertThat(validator.validate(validUser).isValid()).isTrue();
36+
assertThat(validator.validate(invalidUser).isValid()).isFalse();
37+
}
38+
39+
static Stream<Arguments> provideValidators() {
40+
ValidatorBuilder<User> userValidatorBuilder = ValidatorBuilder.of(User.class)
41+
.constraint(User::getAge, "age", c -> c.greaterThan(20));
42+
Function<CharSequenceConstraint<Admin, String>, CharSequenceConstraint<Admin, String>> startsWithAdmin = (
43+
CharSequenceConstraint<Admin, String> c) -> c.startsWith("yavi");
44+
45+
return Stream
46+
.of(Arguments.of(new ValidatorBuilder<>(userValidatorBuilder)
47+
.constraintOnClass(Admin.class,
48+
ValidatorBuilder.of(Admin.class)
49+
.constraint(Admin::getGroup, "group",
50+
startsWithAdmin)
51+
.build())
52+
.build()), Arguments
53+
.of(new ValidatorBuilder<>(userValidatorBuilder)
54+
.constraintOnClass(Admin.class,
55+
b -> b.constraint(Admin::getGroup,
56+
"group", startsWithAdmin))
57+
.build()));
58+
}
59+
60+
private static class Admin extends User {
61+
private String group;
62+
63+
public Admin(String name, String email, int age, String group) {
64+
super(name, email, age);
65+
this.group = group;
66+
}
67+
68+
public String getGroup() {
69+
return group;
70+
}
71+
}
72+
}

0 commit comments

Comments
 (0)