Skip to content

Commit b7d42de

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

File tree

2 files changed

+131
-23
lines changed

2 files changed

+131
-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: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (C) 2018-2023 Toshiaki Maki <[email protected]>
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package am.ik.yavi.core;
17+
18+
import am.ik.yavi.User;
19+
import am.ik.yavi.builder.ValidatorBuilder;
20+
import am.ik.yavi.constraint.CharSequenceConstraint;
21+
import org.junit.jupiter.api.TestInstance;
22+
import org.junit.jupiter.params.ParameterizedTest;
23+
import org.junit.jupiter.params.provider.Arguments;
24+
import org.junit.jupiter.params.provider.MethodSource;
25+
26+
import java.util.function.Function;
27+
import java.util.stream.Stream;
28+
29+
import static com.google.common.truth.Truth.assertThat;
30+
31+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
32+
public class ConstraintOnClassTest {
33+
34+
@ParameterizedTest
35+
@MethodSource("provideValidators")
36+
void testConstraintOnConditionClass(Validator<User> validator) {
37+
User validAdmin = new Admin("admin123", "admin@gmail", 27);
38+
User invalidAdmin = new Admin("Niraz", "niraz@gmail", 23);
39+
40+
assertThat(validator.validate(validAdmin).isValid()).isTrue();
41+
assertThat(validator.validate(invalidAdmin).isValid()).isFalse();
42+
}
43+
44+
@ParameterizedTest
45+
@MethodSource("provideValidators")
46+
void testConstraintOnNonConditionClass(Validator<User> validator) {
47+
User validUser = new User("Rawad", "rawad@gmail", 25);
48+
User invalidUser = new User("Almog", "almog@gmail", 19);
49+
50+
assertThat(validator.validate(validUser).isValid()).isTrue();
51+
assertThat(validator.validate(invalidUser).isValid()).isFalse();
52+
}
53+
54+
static Stream<Arguments> provideValidators() {
55+
ValidatorBuilder<User> userValidatorBuilder = ValidatorBuilder.of(User.class)
56+
.constraint(User::getAge, "age", c -> c.greaterThan(20));
57+
Function<CharSequenceConstraint<Admin, String>, CharSequenceConstraint<Admin, String>> startsWithAdmin = (
58+
CharSequenceConstraint<Admin, String> c) -> c.startsWith("admin");
59+
60+
return Stream
61+
.of(Arguments
62+
.of(new ValidatorBuilder<>(userValidatorBuilder)
63+
.constraintOnClass(Admin.class,
64+
ValidatorBuilder.of(Admin.class)
65+
.constraint(Admin::getName, "name",
66+
startsWithAdmin)
67+
.build())
68+
.build()),
69+
Arguments.of(new ValidatorBuilder<>(userValidatorBuilder)
70+
.constraintOnClass(Admin.class,
71+
b -> b.constraint(Admin::getName, "name",
72+
startsWithAdmin))
73+
.build()));
74+
}
75+
76+
private static class Admin extends User {
77+
public Admin(String name, String email, int age) {
78+
super(name, email, age);
79+
}
80+
}
81+
}

0 commit comments

Comments
 (0)