Skip to content

Commit b19615d

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

File tree

2 files changed

+121
-23
lines changed

2 files changed

+121
-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: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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+
public class ConstraintOnClassTest {
17+
18+
@ParameterizedTest
19+
@MethodSource("provideValidators")
20+
void testConstraintOnConditionClass(Validator<User> validator) {
21+
User validAdmin = new Admin("admin123", "admin@gmail", 27, "yavi123");
22+
User invalidAdmin = new Admin("Niraz", "niraz@gmail", 23, "user");
23+
24+
assertThat(validator.validate(validAdmin).isValid()).isTrue();
25+
assertThat(validator.validate(invalidAdmin).isValid()).isFalse();
26+
}
27+
28+
@ParameterizedTest
29+
@MethodSource("provideValidators")
30+
void testConstraintOnNonConditionClass(Validator<User> validator) {
31+
User validUser = new User("Rawad", "rawad@gmail", 25);
32+
User invalidUser = new User("Almog", "almog@gmail", 19);
33+
34+
assertThat(validator.validate(validUser).isValid()).isTrue();
35+
assertThat(validator.validate(invalidUser).isValid()).isFalse();
36+
}
37+
38+
static Stream<Arguments> provideValidators() {
39+
ValidatorBuilder<User> userValidatorBuilder = ValidatorBuilder.of(User.class)
40+
.constraint(User::getAge, "age", c -> c.greaterThan(20));
41+
Function<CharSequenceConstraint<Admin, String>, CharSequenceConstraint<Admin, String>> startsWithAdmin = (
42+
CharSequenceConstraint<Admin, String> c) -> c.startsWith("yavi");
43+
44+
return Stream
45+
.of(Arguments.of(new ValidatorBuilder<>(userValidatorBuilder)
46+
.constraintOnClass(Admin.class,
47+
ValidatorBuilder.of(Admin.class)
48+
.constraint(Admin::getGroup, "group",
49+
startsWithAdmin)
50+
.build())
51+
.build()), Arguments
52+
.of(new ValidatorBuilder<>(userValidatorBuilder)
53+
.constraintOnClass(Admin.class,
54+
b -> b.constraint(Admin::getGroup,
55+
"group", startsWithAdmin))
56+
.build()));
57+
}
58+
59+
private static class Admin extends User {
60+
private String group;
61+
62+
public Admin(String name, String email, int age, String group) {
63+
super(name, email, age);
64+
this.group = group;
65+
}
66+
67+
public String getGroup() {
68+
return group;
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)