Skip to content

Commit

Permalink
Merge pull request #38 from avaje/feature/avaje-decimalMaxMin
Browse files Browse the repository at this point in the history
Add support for avaje DecimalMax DecimalMin
  • Loading branch information
rbygrave authored May 22, 2023
2 parents 90553da + e9f00c9 commit b2af292
Show file tree
Hide file tree
Showing 5 changed files with 301 additions and 0 deletions.
55 changes: 55 additions & 0 deletions blackbox-test/src/test/java/example/avaje/AMyMinNumbers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package example.avaje;

import jakarta.validation.Valid;
import io.avaje.validation.constraints.DecimalMin;

import java.math.BigDecimal;

@Valid
public class AMyMinNumbers {

private static final BigDecimal VALID = new BigDecimal("20");

@DecimalMin("10.50")
final BigDecimal price;

@DecimalMin(value = "9.30", inclusive = false)
final BigDecimal priceInc;

@DecimalMin("9.50")
final double dmin;

@DecimalMin(value = "8.30", inclusive = false)
final double dminInc;

public AMyMinNumbers(BigDecimal price, BigDecimal priceInc) {
this.price = price;
this.priceInc = priceInc;
this.dmin = 20;
this.dminInc = 20;
}

public AMyMinNumbers(double dmin, double dminInc) {
this.price = VALID;
this.priceInc = VALID;
this.dmin = dmin;
this.dminInc = dminInc;
}

public BigDecimal price() {
return price;
}

public BigDecimal priceInc() {
return priceInc;
}


public double dmin() {
return dmin;
}

public double dminInc() {
return dminInc;
}
}
97 changes: 97 additions & 0 deletions blackbox-test/src/test/java/example/avaje/AMyMinNumbersTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package example.avaje;

import io.avaje.validation.ConstraintViolation;
import io.avaje.validation.ConstraintViolationException;
import io.avaje.validation.Validator;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Locale;

import static java.math.BigDecimal.ONE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;

class AMyMinNumbersTest {

final Validator validator = Validator.builder().build();

final BigDecimal valid = new BigDecimal("20");

@Test
void valid() {
var bean = new AMyMinNumbers(valid, valid);
validator.validate(bean);
}

@Test
void validDouble() {
var bean = new AMyMinNumbers(20d, 20d);
validator.validate(bean);
}

@Test
void decimalMin() {
var violation = one(new AMyMinNumbers(ONE, valid));
assertThat(violation.message()).isEqualTo("must be greater than or equal to 10.50");
}

@Test
void decimalMinDE() {
var violation = one(new AMyMinNumbers(ONE, valid), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss größer oder gleich 10.50 sein");
}

@Test
void decimalMinExclusive() {
var violation = one(new AMyMinNumbers(valid, ONE));
assertThat(violation.message()).isEqualTo("must be greater than 9.30");
}

@Test
void decimalMaxExclusiveDE() {
var violation = one(new AMyMinNumbers(valid, ONE), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss größer 9.30 sein");
}

@Test
void doubleDecimalMin() {
var violation = one(new AMyMinNumbers(1d, 20d));
assertThat(violation.message()).isEqualTo("must be greater than or equal to 9.50");
}

@Test
void doubleDecimalMinDE() {
var violation = one(new AMyMinNumbers(1d, 20d), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss größer oder gleich 9.50 sein");
}

@Test
void doubleDecimalMinExclusive() {
var violation = one(new AMyMinNumbers(20d, 1d));
assertThat(violation.message()).isEqualTo("must be greater than 8.30");
}

@Test
void doubleDecimalMaxExclusiveDE() {
var violation = one(new AMyMinNumbers(20d, 1d), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss größer 8.30 sein");
}

ConstraintViolation one(Object any) {
return one(any, Locale.ENGLISH);
}

ConstraintViolation one(Object any, Locale locale) {
try {
validator.validate(any, locale);
fail("not expected");
return null;
} catch (ConstraintViolationException e) {
var violations = new ArrayList<>(e.violations());
assertThat(violations).hasSize(1);
return violations.get(0);
}
}
}
52 changes: 52 additions & 0 deletions blackbox-test/src/test/java/example/avaje/AMyNumbers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package example.avaje;

import io.avaje.validation.ValidPojo;
import io.avaje.validation.constraints.DecimalMax;

import java.math.BigDecimal;

@ValidPojo
public class AMyNumbers {

@DecimalMax("10.50")
final BigDecimal price;

@DecimalMax(value = "9.30", inclusive = false)
final BigDecimal priceInc;

@DecimalMax("9.50")
final double dprice;

@DecimalMax(value = "8.30", inclusive = false)
final double dpriceInc;

public AMyNumbers(BigDecimal price, BigDecimal priceInc) {
this.price = price;
this.priceInc = priceInc;
this.dprice = 1d;
this.dpriceInc = 1d;
}

public AMyNumbers(double dprice, double dpriceInc) {
this.price = BigDecimal.ONE;
this.priceInc = BigDecimal.ONE;
this.dprice = dprice;
this.dpriceInc = dpriceInc;
}

public BigDecimal price() {
return price;
}

public BigDecimal priceInc() {
return priceInc;
}

public double dprice() {
return dprice;
}

public double dpriceInc() {
return dpriceInc;
}
}
95 changes: 95 additions & 0 deletions blackbox-test/src/test/java/example/avaje/AMyNumbersTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package example.avaje;

import io.avaje.validation.ConstraintViolation;
import io.avaje.validation.ConstraintViolationException;
import io.avaje.validation.Validator;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Locale;

import static java.math.BigDecimal.ONE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;

class AMyNumbersTest {

final Validator validator = Validator.builder().build();

@Test
void valid() {
var bean = new AMyNumbers(ONE, ONE);
validator.validate(bean);
}

@Test
void validDouble() {
var bean = new AMyNumbers(1d, 1d);
validator.validate(bean);
}

@Test
void decimalMax() {
var violation = one(new AMyNumbers(new BigDecimal("11"), ONE));
assertThat(violation.message()).isEqualTo("must be less than or equal to 10.50");
}

@Test
void decimalMaxDE() {
var violation = one(new AMyNumbers(new BigDecimal("11"), ONE), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss kleiner oder gleich 10.50 sein");
}

@Test
void decimalMaxExclusive() {
var violation = one(new AMyNumbers(ONE, new BigDecimal("11")));
assertThat(violation.message()).isEqualTo("must be less than 9.30");
}

@Test
void decimalMaxExclusiveDE() {
var violation = one(new AMyNumbers(ONE, new BigDecimal("11")), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss kleiner 9.30 sein");
}

@Test
void doubleDecimalMax() {
var violation = one(new AMyNumbers(11d, 1d));
assertThat(violation.message()).isEqualTo("must be less than or equal to 9.50");
}

@Test
void doubleDecimalMaxDE() {
var violation = one(new AMyNumbers(11d, 1d), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss kleiner oder gleich 9.50 sein");
}

@Test
void doubleDecimalMaxExclusive() {
var violation = one(new AMyNumbers(1d, 11d));
assertThat(violation.message()).isEqualTo("must be less than 8.30");
}

@Test
void doubleDecimalMaxExclusiveDE() {
var violation = one(new AMyNumbers(1d, 11d), Locale.GERMAN);
assertThat(violation.message()).isEqualTo("muss kleiner 8.30 sein");
}

ConstraintViolation one(Object any) {
return one(any, Locale.ENGLISH);
}

ConstraintViolation one(Object any, Locale locale) {
try {
validator.validate(any, locale);
fail("not expected");
return null;
} catch (ConstraintViolationException e) {
var violations = new ArrayList<>(e.violations());
assertThat(violations).hasSize(1);
return violations.get(0);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ interface Handler {
handlers.put("jakarta.validation.constraints.Size", jakartaHandler);

final var jakartaDecimal = new JakartaDecimal();
handlers.put("io.avaje.validation.constraints.DecimalMax", jakartaDecimal);
handlers.put("io.avaje.validation.constraints.DecimalMin", jakartaDecimal);
handlers.put("jakarta.validation.constraints.DecimalMax", jakartaDecimal);
handlers.put("jakarta.validation.constraints.DecimalMin", jakartaDecimal);
}
Expand Down

0 comments on commit b2af292

Please sign in to comment.