Skip to content

Commit b2af292

Browse files
authored
Merge pull request #38 from avaje/feature/avaje-decimalMaxMin
Add support for avaje DecimalMax DecimalMin
2 parents 90553da + e9f00c9 commit b2af292

File tree

5 files changed

+301
-0
lines changed

5 files changed

+301
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package example.avaje;
2+
3+
import jakarta.validation.Valid;
4+
import io.avaje.validation.constraints.DecimalMin;
5+
6+
import java.math.BigDecimal;
7+
8+
@Valid
9+
public class AMyMinNumbers {
10+
11+
private static final BigDecimal VALID = new BigDecimal("20");
12+
13+
@DecimalMin("10.50")
14+
final BigDecimal price;
15+
16+
@DecimalMin(value = "9.30", inclusive = false)
17+
final BigDecimal priceInc;
18+
19+
@DecimalMin("9.50")
20+
final double dmin;
21+
22+
@DecimalMin(value = "8.30", inclusive = false)
23+
final double dminInc;
24+
25+
public AMyMinNumbers(BigDecimal price, BigDecimal priceInc) {
26+
this.price = price;
27+
this.priceInc = priceInc;
28+
this.dmin = 20;
29+
this.dminInc = 20;
30+
}
31+
32+
public AMyMinNumbers(double dmin, double dminInc) {
33+
this.price = VALID;
34+
this.priceInc = VALID;
35+
this.dmin = dmin;
36+
this.dminInc = dminInc;
37+
}
38+
39+
public BigDecimal price() {
40+
return price;
41+
}
42+
43+
public BigDecimal priceInc() {
44+
return priceInc;
45+
}
46+
47+
48+
public double dmin() {
49+
return dmin;
50+
}
51+
52+
public double dminInc() {
53+
return dminInc;
54+
}
55+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package example.avaje;
2+
3+
import io.avaje.validation.ConstraintViolation;
4+
import io.avaje.validation.ConstraintViolationException;
5+
import io.avaje.validation.Validator;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.math.BigDecimal;
9+
import java.util.ArrayList;
10+
import java.util.Locale;
11+
12+
import static java.math.BigDecimal.ONE;
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.assertj.core.api.Assertions.fail;
15+
16+
class AMyMinNumbersTest {
17+
18+
final Validator validator = Validator.builder().build();
19+
20+
final BigDecimal valid = new BigDecimal("20");
21+
22+
@Test
23+
void valid() {
24+
var bean = new AMyMinNumbers(valid, valid);
25+
validator.validate(bean);
26+
}
27+
28+
@Test
29+
void validDouble() {
30+
var bean = new AMyMinNumbers(20d, 20d);
31+
validator.validate(bean);
32+
}
33+
34+
@Test
35+
void decimalMin() {
36+
var violation = one(new AMyMinNumbers(ONE, valid));
37+
assertThat(violation.message()).isEqualTo("must be greater than or equal to 10.50");
38+
}
39+
40+
@Test
41+
void decimalMinDE() {
42+
var violation = one(new AMyMinNumbers(ONE, valid), Locale.GERMAN);
43+
assertThat(violation.message()).isEqualTo("muss größer oder gleich 10.50 sein");
44+
}
45+
46+
@Test
47+
void decimalMinExclusive() {
48+
var violation = one(new AMyMinNumbers(valid, ONE));
49+
assertThat(violation.message()).isEqualTo("must be greater than 9.30");
50+
}
51+
52+
@Test
53+
void decimalMaxExclusiveDE() {
54+
var violation = one(new AMyMinNumbers(valid, ONE), Locale.GERMAN);
55+
assertThat(violation.message()).isEqualTo("muss größer 9.30 sein");
56+
}
57+
58+
@Test
59+
void doubleDecimalMin() {
60+
var violation = one(new AMyMinNumbers(1d, 20d));
61+
assertThat(violation.message()).isEqualTo("must be greater than or equal to 9.50");
62+
}
63+
64+
@Test
65+
void doubleDecimalMinDE() {
66+
var violation = one(new AMyMinNumbers(1d, 20d), Locale.GERMAN);
67+
assertThat(violation.message()).isEqualTo("muss größer oder gleich 9.50 sein");
68+
}
69+
70+
@Test
71+
void doubleDecimalMinExclusive() {
72+
var violation = one(new AMyMinNumbers(20d, 1d));
73+
assertThat(violation.message()).isEqualTo("must be greater than 8.30");
74+
}
75+
76+
@Test
77+
void doubleDecimalMaxExclusiveDE() {
78+
var violation = one(new AMyMinNumbers(20d, 1d), Locale.GERMAN);
79+
assertThat(violation.message()).isEqualTo("muss größer 8.30 sein");
80+
}
81+
82+
ConstraintViolation one(Object any) {
83+
return one(any, Locale.ENGLISH);
84+
}
85+
86+
ConstraintViolation one(Object any, Locale locale) {
87+
try {
88+
validator.validate(any, locale);
89+
fail("not expected");
90+
return null;
91+
} catch (ConstraintViolationException e) {
92+
var violations = new ArrayList<>(e.violations());
93+
assertThat(violations).hasSize(1);
94+
return violations.get(0);
95+
}
96+
}
97+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package example.avaje;
2+
3+
import io.avaje.validation.ValidPojo;
4+
import io.avaje.validation.constraints.DecimalMax;
5+
6+
import java.math.BigDecimal;
7+
8+
@ValidPojo
9+
public class AMyNumbers {
10+
11+
@DecimalMax("10.50")
12+
final BigDecimal price;
13+
14+
@DecimalMax(value = "9.30", inclusive = false)
15+
final BigDecimal priceInc;
16+
17+
@DecimalMax("9.50")
18+
final double dprice;
19+
20+
@DecimalMax(value = "8.30", inclusive = false)
21+
final double dpriceInc;
22+
23+
public AMyNumbers(BigDecimal price, BigDecimal priceInc) {
24+
this.price = price;
25+
this.priceInc = priceInc;
26+
this.dprice = 1d;
27+
this.dpriceInc = 1d;
28+
}
29+
30+
public AMyNumbers(double dprice, double dpriceInc) {
31+
this.price = BigDecimal.ONE;
32+
this.priceInc = BigDecimal.ONE;
33+
this.dprice = dprice;
34+
this.dpriceInc = dpriceInc;
35+
}
36+
37+
public BigDecimal price() {
38+
return price;
39+
}
40+
41+
public BigDecimal priceInc() {
42+
return priceInc;
43+
}
44+
45+
public double dprice() {
46+
return dprice;
47+
}
48+
49+
public double dpriceInc() {
50+
return dpriceInc;
51+
}
52+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package example.avaje;
2+
3+
import io.avaje.validation.ConstraintViolation;
4+
import io.avaje.validation.ConstraintViolationException;
5+
import io.avaje.validation.Validator;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.math.BigDecimal;
9+
import java.util.ArrayList;
10+
import java.util.Locale;
11+
12+
import static java.math.BigDecimal.ONE;
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.assertj.core.api.Assertions.fail;
15+
16+
class AMyNumbersTest {
17+
18+
final Validator validator = Validator.builder().build();
19+
20+
@Test
21+
void valid() {
22+
var bean = new AMyNumbers(ONE, ONE);
23+
validator.validate(bean);
24+
}
25+
26+
@Test
27+
void validDouble() {
28+
var bean = new AMyNumbers(1d, 1d);
29+
validator.validate(bean);
30+
}
31+
32+
@Test
33+
void decimalMax() {
34+
var violation = one(new AMyNumbers(new BigDecimal("11"), ONE));
35+
assertThat(violation.message()).isEqualTo("must be less than or equal to 10.50");
36+
}
37+
38+
@Test
39+
void decimalMaxDE() {
40+
var violation = one(new AMyNumbers(new BigDecimal("11"), ONE), Locale.GERMAN);
41+
assertThat(violation.message()).isEqualTo("muss kleiner oder gleich 10.50 sein");
42+
}
43+
44+
@Test
45+
void decimalMaxExclusive() {
46+
var violation = one(new AMyNumbers(ONE, new BigDecimal("11")));
47+
assertThat(violation.message()).isEqualTo("must be less than 9.30");
48+
}
49+
50+
@Test
51+
void decimalMaxExclusiveDE() {
52+
var violation = one(new AMyNumbers(ONE, new BigDecimal("11")), Locale.GERMAN);
53+
assertThat(violation.message()).isEqualTo("muss kleiner 9.30 sein");
54+
}
55+
56+
@Test
57+
void doubleDecimalMax() {
58+
var violation = one(new AMyNumbers(11d, 1d));
59+
assertThat(violation.message()).isEqualTo("must be less than or equal to 9.50");
60+
}
61+
62+
@Test
63+
void doubleDecimalMaxDE() {
64+
var violation = one(new AMyNumbers(11d, 1d), Locale.GERMAN);
65+
assertThat(violation.message()).isEqualTo("muss kleiner oder gleich 9.50 sein");
66+
}
67+
68+
@Test
69+
void doubleDecimalMaxExclusive() {
70+
var violation = one(new AMyNumbers(1d, 11d));
71+
assertThat(violation.message()).isEqualTo("must be less than 8.30");
72+
}
73+
74+
@Test
75+
void doubleDecimalMaxExclusiveDE() {
76+
var violation = one(new AMyNumbers(1d, 11d), Locale.GERMAN);
77+
assertThat(violation.message()).isEqualTo("muss kleiner 8.30 sein");
78+
}
79+
80+
ConstraintViolation one(Object any) {
81+
return one(any, Locale.ENGLISH);
82+
}
83+
84+
ConstraintViolation one(Object any, Locale locale) {
85+
try {
86+
validator.validate(any, locale);
87+
fail("not expected");
88+
return null;
89+
} catch (ConstraintViolationException e) {
90+
var violations = new ArrayList<>(e.violations());
91+
assertThat(violations).hasSize(1);
92+
return violations.get(0);
93+
}
94+
}
95+
}

validator-generator/src/main/java/io/avaje/validation/generator/AnnotationUtil.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ interface Handler {
2323
handlers.put("jakarta.validation.constraints.Size", jakartaHandler);
2424

2525
final var jakartaDecimal = new JakartaDecimal();
26+
handlers.put("io.avaje.validation.constraints.DecimalMax", jakartaDecimal);
27+
handlers.put("io.avaje.validation.constraints.DecimalMin", jakartaDecimal);
2628
handlers.put("jakarta.validation.constraints.DecimalMax", jakartaDecimal);
2729
handlers.put("jakarta.validation.constraints.DecimalMin", jakartaDecimal);
2830
}

0 commit comments

Comments
 (0)