Skip to content

Commit fc8d885

Browse files
committed
Change DecimalMin DecimalMax to use _type and switch
1 parent f4dbffc commit fc8d885

File tree

6 files changed

+103
-61
lines changed

6 files changed

+103
-61
lines changed

validator/src/main/java/io/avaje/validation/core/adapters/NumberAdapters.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ private static final class DecimalMaxAdapter extends AbstractConstraintAdapter<N
5454

5555
private final BigDecimal value;
5656
private final boolean inclusive;
57+
private final String targetType;
5758

5859
DecimalMaxAdapter(AdapterCreateRequest request) {
5960
super(request);
6061
final var attributes = request.attributes();
6162
this.value = new BigDecimal((String) attributes.get("value"));
6263
this.inclusive = Optional.ofNullable((Boolean) attributes.get("inclusive")).orElse(true);
64+
this.targetType = request.targetType();
6365
}
6466

6567
@Override
@@ -68,8 +70,7 @@ public boolean isValid(Number number) {
6870
if (number == null) {
6971
return true;
7072
}
71-
72-
final int comparisonResult = NumberComparatorHelper.compareDecimal(number, value, LESS_THAN);
73+
final int comparisonResult = NumberComparatorHelper.compareDecimal(targetType, number, value, LESS_THAN);
7374
return !(inclusive ? comparisonResult > 0 : comparisonResult >= 0);
7475
}
7576
}
@@ -78,12 +79,14 @@ private static final class DecimalMinAdapter extends AbstractConstraintAdapter<N
7879

7980
private final BigDecimal value;
8081
private final boolean inclusive;
82+
private final String targetType;
8183

8284
DecimalMinAdapter(AdapterCreateRequest request) {
8385
super(request);
8486
final var attributes = request.attributes();
8587
this.value = new BigDecimal((String) attributes.get("value"));
8688
this.inclusive = Optional.ofNullable((Boolean) attributes.get("inclusive")).orElse(true);
89+
this.targetType = request.targetType();
8790
}
8891

8992
@Override
@@ -92,8 +95,7 @@ public boolean isValid(Number number) {
9295
if (number == null) {
9396
return true;
9497
}
95-
96-
final int comparisonResult = NumberComparatorHelper.compareDecimal(number, value, LESS_THAN);
98+
final int comparisonResult = NumberComparatorHelper.compareDecimal(targetType, number, value, LESS_THAN);
9799
return !(inclusive ? comparisonResult < 0 : comparisonResult <= 0);
98100
}
99101
}

validator/src/main/java/io/avaje/validation/core/adapters/NumberComparatorHelper.java

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,15 @@ final class NumberComparatorHelper {
88

99
private NumberComparatorHelper() {}
1010

11-
static int compare(Number number, long value, OptionalInt treatNanAs) {
12-
if (number instanceof final Double d) {
13-
return compareDouble(d, value, treatNanAs);
14-
} else if (number instanceof final Float f) {
15-
return compareFloat(f, value, treatNanAs);
16-
} else if (number instanceof final BigDecimal bd) {
17-
return bd.compareTo(BigDecimal.valueOf(value));
18-
} else if (number instanceof final BigInteger bi) {
19-
return bi.compareTo(BigInteger.valueOf(value));
20-
} else if (number instanceof Byte
21-
|| number instanceof Integer
22-
|| number instanceof Long
23-
|| number instanceof Short) {
24-
final Long numLong = number.longValue();
25-
return numLong.compareTo(value);
26-
}
27-
return compare(number.doubleValue(), value, treatNanAs);
28-
}
29-
30-
static int compareDecimal(Number number, BigDecimal value, OptionalInt treatNanAs) {
31-
if (number instanceof final Double d) {
32-
return compare(d, value, treatNanAs);
33-
} else if (number instanceof final Float f) {
34-
return compare(f, value, treatNanAs);
35-
} else if (number instanceof final BigDecimal bd) {
36-
return bd.compareTo(value);
37-
} else if (number instanceof final BigInteger bi) {
38-
return new BigDecimal(bi).compareTo(value);
39-
} else if (number instanceof Byte
40-
|| number instanceof Integer
41-
|| number instanceof Long
42-
|| number instanceof Short) {
43-
44-
return BigDecimal.valueOf(number.longValue()).compareTo(value);
45-
}
46-
47-
return compare(number.doubleValue(), value, treatNanAs);
11+
static int compareDecimal(String targetType, Number number, BigDecimal value, OptionalInt treatNanAs) {
12+
return switch (targetType) {
13+
case "Double" -> compare((Double) number, value, treatNanAs);
14+
case "Float" -> compare((Float) number, value, treatNanAs);
15+
case "BigDecimal" -> ((BigDecimal) number).compareTo(value);
16+
case "BigInteger" -> new BigDecimal((BigInteger) number).compareTo(value);
17+
case "Byte", "Integer", "Long", "Short" -> BigDecimal.valueOf(number.longValue()).compareTo(value);
18+
default -> compare(number.doubleValue(), value, treatNanAs);
19+
};
4820
}
4921

5022
static int compareDouble(Double number, long value, OptionalInt treatNanAs) {

validator/src/main/java/io/avaje/validation/core/adapters/NumberSignHelper.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,18 @@ static BigDecimal toBigDecimal(Object value) {
2424
static int signum(String targetType, Object value, OptionalInt treatNanAs) {
2525
return switch (targetType) {
2626
case "String", "CharSequence" -> toBigDecimal(value).signum();
27-
case "BigDecimal" -> ((BigDecimal)value).signum();
28-
case "BigInteger" -> ((BigInteger)value).signum();
29-
case "Byte" -> ((Byte)value).compareTo(BYTE_ZERO);
30-
case "Short" -> ((Short)value).compareTo(SHORT_ZERO);
31-
case "Integer" -> Integer.signum((Integer)value);
32-
case "Long" -> Long.signum((Long)value);
33-
case "Float" -> signum((Float)value, treatNanAs);
34-
case "Double" -> signum((Double)value, treatNanAs);
35-
default -> Double.compare(((Number)value).doubleValue(), DOUBLE_ZERO);
27+
case "BigDecimal" -> ((BigDecimal) value).signum();
28+
case "BigInteger" -> ((BigInteger) value).signum();
29+
case "Byte" -> ((Byte) value).compareTo(BYTE_ZERO);
30+
case "Short" -> ((Short) value).compareTo(SHORT_ZERO);
31+
case "Integer" -> Integer.signum((Integer) value);
32+
case "Long" -> Long.signum((Long) value);
33+
case "Float" -> signum((Float) value, treatNanAs);
34+
case "Double" -> signum((Double) value, treatNanAs);
35+
default -> Double.compare(((Number) value).doubleValue(), DOUBLE_ZERO);
3636
};
3737
}
3838

39-
4039
static int signum(Float number, OptionalInt treatNanAs) {
4140
final OptionalInt infinity = InfinityNumberComparatorHelper.infinityCheck(number, treatNanAs);
4241
if (infinity.isPresent()) {

validator/src/test/java/io/avaje/validation/core/adapters/DecimalMinMaxTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ class DecimalMinMaxTest extends BasicTest {
1818
@interface DecimalMax {}
1919

2020
ValidationAdapter<Object> minAdapter =
21-
ctx.adapter(DecimalMin.class, Map.of("message", "mini", "value", "-69"));
21+
ctx.adapter(DecimalMin.class, Map.of("message", "mini", "value", "-69", "_type", "Number"));
2222

2323
ValidationAdapter<Object> maxAdapter =
24-
ctx.adapter(DecimalMax.class, Map.of("message", "maxwell", "value", "69"));
24+
ctx.adapter(DecimalMax.class, Map.of("message", "maxwell", "value", "69", "_type", "Number"));
2525

2626
@Test
2727
void testNull() {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package io.avaje.validation.core.adapters;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.math.BigDecimal;
6+
import java.math.BigInteger;
7+
import java.util.OptionalInt;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class NumberComparatorHelperTest {
12+
13+
@Test
14+
void asInteger() {
15+
assertEquals(-1, NumberComparatorHelper.compareDecimal("Integer", 9, BigDecimal.TEN, OptionalInt.of(-1)));
16+
assertEquals(-1, NumberComparatorHelper.compareDecimal("Integer", 9, BigDecimal.TEN, OptionalInt.of(1)));
17+
assertEquals(0, NumberComparatorHelper.compareDecimal("Integer", 10, BigDecimal.TEN, OptionalInt.of(-1)));
18+
assertEquals(0, NumberComparatorHelper.compareDecimal("Integer", 10, BigDecimal.TEN, OptionalInt.of(1)));
19+
assertEquals(1, NumberComparatorHelper.compareDecimal("Integer", 11, BigDecimal.TEN, OptionalInt.of(-1)));
20+
assertEquals(1, NumberComparatorHelper.compareDecimal("Integer", 11, BigDecimal.TEN, OptionalInt.of(1)));
21+
}
22+
23+
@Test
24+
void asFloat() {
25+
assertEquals(-1, NumberComparatorHelper.compareDecimal("Float", 9.9F, BigDecimal.TEN, OptionalInt.of(-1)));
26+
assertEquals(-1, NumberComparatorHelper.compareDecimal("Float", 9.9F, BigDecimal.TEN, OptionalInt.of(1)));
27+
assertEquals(0, NumberComparatorHelper.compareDecimal("Float", 10.0F, BigDecimal.TEN, OptionalInt.of(-1)));
28+
assertEquals(0, NumberComparatorHelper.compareDecimal("Float", 10.0F, BigDecimal.TEN, OptionalInt.of(1)));
29+
assertEquals(1, NumberComparatorHelper.compareDecimal("Float", 10.1F, BigDecimal.TEN, OptionalInt.of(-1)));
30+
assertEquals(1, NumberComparatorHelper.compareDecimal("Float", 10.1F, BigDecimal.TEN, OptionalInt.of(1)));
31+
}
32+
33+
@Test
34+
void asDouble() {
35+
assertEquals(-1, NumberComparatorHelper.compareDecimal("Double", 9.9D, BigDecimal.TEN, OptionalInt.of(-1)));
36+
assertEquals(-1, NumberComparatorHelper.compareDecimal("Double", 9.9D, BigDecimal.TEN, OptionalInt.of(1)));
37+
assertEquals(0, NumberComparatorHelper.compareDecimal("Double", 10.0D, BigDecimal.TEN, OptionalInt.of(-1)));
38+
assertEquals(0, NumberComparatorHelper.compareDecimal("Double", 10.0D, BigDecimal.TEN, OptionalInt.of(1)));
39+
assertEquals(1, NumberComparatorHelper.compareDecimal("Double", 10.1D, BigDecimal.TEN, OptionalInt.of(-1)));
40+
assertEquals(1, NumberComparatorHelper.compareDecimal("Double", 10.1D, BigDecimal.TEN, OptionalInt.of(1)));
41+
}
42+
43+
@Test
44+
void bigDecimal() {
45+
assertEquals(-1, NumberComparatorHelper.compareDecimal("BigDecimal", new BigDecimal("9.9"), BigDecimal.TEN, OptionalInt.of(-1)));
46+
assertEquals(-1, NumberComparatorHelper.compareDecimal("BigDecimal", new BigDecimal("9.9"), BigDecimal.TEN, OptionalInt.of(1)));
47+
assertEquals(0, NumberComparatorHelper.compareDecimal("BigDecimal", new BigDecimal("10.0"), BigDecimal.TEN, OptionalInt.of(-1)));
48+
assertEquals(0, NumberComparatorHelper.compareDecimal("BigDecimal", new BigDecimal("10.0"), BigDecimal.TEN, OptionalInt.of(1)));
49+
assertEquals(1, NumberComparatorHelper.compareDecimal("BigDecimal", new BigDecimal("10.1"), BigDecimal.TEN, OptionalInt.of(-1)));
50+
assertEquals(1, NumberComparatorHelper.compareDecimal("BigDecimal", new BigDecimal("10.1"), BigDecimal.TEN, OptionalInt.of(1)));
51+
}
52+
53+
@Test
54+
void bigInteger() {
55+
assertEquals(-1, NumberComparatorHelper.compareDecimal("BigInteger", new BigInteger("9"), BigDecimal.TEN, OptionalInt.of(-1)));
56+
assertEquals(-1, NumberComparatorHelper.compareDecimal("BigInteger", new BigInteger("9"), BigDecimal.TEN, OptionalInt.of(1)));
57+
assertEquals(0, NumberComparatorHelper.compareDecimal("BigInteger", new BigInteger("10"), BigDecimal.TEN, OptionalInt.of(-1)));
58+
assertEquals(0, NumberComparatorHelper.compareDecimal("BigInteger", new BigInteger("10"), BigDecimal.TEN, OptionalInt.of(1)));
59+
assertEquals(1, NumberComparatorHelper.compareDecimal("BigInteger", new BigInteger("11"), BigDecimal.TEN, OptionalInt.of(-1)));
60+
assertEquals(1, NumberComparatorHelper.compareDecimal("BigInteger", new BigInteger("11"), BigDecimal.TEN, OptionalInt.of(1)));
61+
}
62+
63+
}

validator/src/test/java/io/avaje/validation/core/adapters/PositiveTest.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@ class PositiveTest extends BasicTest {
1818
@interface PositiveOrZero {}
1919

2020
ValidationAdapter<Object> positiveAdapter =
21-
ctx.adapter(Positive.class, Map.of("message", "you gotta accent-"));
21+
ctx.adapter(Positive.class, Map.of("message", "you gotta accent-", "_type", "Number"));
2222
ValidationAdapter<Object> positiveOrZeroAdapter =
23-
ctx.adapter(PositiveOrZero.class, Map.of("message", "-tuate the positive"));
23+
ctx.adapter(PositiveOrZero.class, Map.of("message", "-tuate the positive", "_type", "Number"));
24+
25+
ValidationAdapter<Object> positiveString =
26+
ctx.adapter(Positive.class, Map.of("message", "you gotta accent-", "_type", "String"));
27+
ValidationAdapter<Object> positiveOrZeroString =
28+
ctx.adapter(PositiveOrZero.class, Map.of("message", "-tuate the positive", "_type", "String"));
29+
2430

2531
@Test
2632
void testNull() {
@@ -43,7 +49,7 @@ void testInfinity() {
4349

4450
@Test
4551
void testPositive() {
46-
assertThat(positiveAdapter.validate("1", request)).isTrue();
52+
assertThat(positiveString.validate("1", request)).isTrue();
4753
assertThat(positiveAdapter.validate(1, request)).isTrue();
4854
assertThat(positiveAdapter.validate(1f, request)).isTrue();
4955
assertThat(positiveAdapter.validate(1D, request)).isTrue();
@@ -53,7 +59,7 @@ void testPositive() {
5359
assertThat(positiveAdapter.validate(BigInteger.ONE, request)).isTrue();
5460
assertThat(positiveAdapter.validate(BigDecimal.ONE, request)).isTrue();
5561

56-
assertThat(positiveOrZeroAdapter.validate("1", request)).isTrue();
62+
assertThat(positiveOrZeroString.validate("1", request)).isTrue();
5763
assertThat(positiveOrZeroAdapter.validate(1, request)).isTrue();
5864
assertThat(positiveOrZeroAdapter.validate(1f, request)).isTrue();
5965
assertThat(positiveOrZeroAdapter.validate(1D, request)).isTrue();
@@ -67,7 +73,7 @@ void testPositive() {
6773
@Test
6874
void testNegative() {
6975

70-
assertThat(positiveAdapter.validate("-1", request)).isFalse();
76+
assertThat(positiveString.validate("-1", request)).isFalse();
7177
assertThat(positiveAdapter.validate(-1, request)).isFalse();
7278
assertThat(positiveAdapter.validate(-1f, request)).isFalse();
7379
assertThat(positiveAdapter.validate(-1D, request)).isFalse();
@@ -77,7 +83,7 @@ void testNegative() {
7783
assertThat(positiveAdapter.validate(BigInteger.valueOf(-1), request)).isFalse();
7884
assertThat(positiveAdapter.validate(BigDecimal.valueOf(-1), request)).isFalse();
7985

80-
assertThat(positiveOrZeroAdapter.validate("-1", request)).isFalse();
86+
assertThat(positiveOrZeroString.validate("-1", request)).isFalse();
8187
assertThat(positiveOrZeroAdapter.validate(-1, request)).isFalse();
8288
assertThat(positiveOrZeroAdapter.validate(-1f, request)).isFalse();
8389
assertThat(positiveOrZeroAdapter.validate(-1D, request)).isFalse();
@@ -90,7 +96,7 @@ void testNegative() {
9096

9197
@Test
9298
void testZero() {
93-
assertThat(positiveAdapter.validate("0", request)).isFalse();
99+
assertThat(positiveString.validate("0", request)).isFalse();
94100
assertThat(positiveAdapter.validate(0, request)).isFalse();
95101
assertThat(positiveAdapter.validate(0f, request)).isFalse();
96102
assertThat(positiveAdapter.validate(0D, request)).isFalse();
@@ -100,7 +106,7 @@ void testZero() {
100106
assertThat(positiveAdapter.validate(BigInteger.ZERO, request)).isFalse();
101107
assertThat(positiveAdapter.validate(BigDecimal.ZERO, request)).isFalse();
102108

103-
assertThat(positiveOrZeroAdapter.validate("0", request)).isTrue();
109+
assertThat(positiveOrZeroString.validate("0", request)).isTrue();
104110
assertThat(positiveOrZeroAdapter.validate(0, request)).isTrue();
105111
assertThat(positiveOrZeroAdapter.validate(0f, request)).isTrue();
106112
assertThat(positiveOrZeroAdapter.validate(0D, request)).isTrue();

0 commit comments

Comments
 (0)