Skip to content

Commit f4dbffc

Browse files
committed
Change PositiveAdapter and NegativeAdatper to use _type and switch
1 parent e503972 commit f4dbffc

File tree

4 files changed

+112
-37
lines changed

4 files changed

+112
-37
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ static String lookupType(TypeMirror typeMirror) {
109109
if (val != null) {
110110
return val;
111111
}
112+
if (isAssignable2Interface(rawType, "java.math.BigDecimal")) {
113+
return "BigDecimal";
114+
}
115+
if (isAssignable2Interface(rawType, "java.math.BigInteger")) {
116+
return "BigInteger";
117+
}
112118
if (isAssignable2Interface(rawType, "java.lang.Number")) {
113119
return "Number";
114120
}

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public boolean isValid(Object value) {
235235
if (value instanceof final BigDecimal bd) {
236236
bigNum = bd;
237237
} else {
238-
bigNum = NumberSignHelper.getBigDecimalValue(value.toString()).stripTrailingZeros();
238+
bigNum = NumberSignHelper.toBigDecimal(value.toString()).stripTrailingZeros();
239239
}
240240

241241
final int integerPartLength = bigNum.precision() - bigNum.scale();
@@ -247,10 +247,12 @@ public boolean isValid(Object value) {
247247
private static final class PositiveAdapter extends AbstractConstraintAdapter<Object> {
248248

249249
private final boolean inclusive;
250+
private final String targetType;
250251

251252
PositiveAdapter(AdapterCreateRequest request, boolean inclusive) {
252253
super(request);
253254
this.inclusive = inclusive;
255+
this.targetType = request.targetType();
254256
}
255257

256258
@Override
@@ -259,19 +261,20 @@ public boolean isValid(Object value) {
259261
if (value == null) {
260262
return true;
261263
}
262-
263-
final int sign = NumberSignHelper.signum(value, LESS_THAN);
264+
final int sign = NumberSignHelper.signum(targetType, value, LESS_THAN);
264265
return !(inclusive ? sign < 0 : sign <= 0);
265266
}
266267
}
267268

268269
private static final class NegativeAdapter extends AbstractConstraintAdapter<Object> {
269270

270271
private final boolean inclusive;
272+
private final String targetType;
271273

272274
NegativeAdapter(AdapterCreateRequest request, boolean inclusive) {
273275
super(request);
274276
this.inclusive = inclusive;
277+
this.targetType = request.targetType();
275278
}
276279

277280
@Override
@@ -280,8 +283,7 @@ public boolean isValid(Object value) {
280283
if (value == null) {
281284
return true;
282285
}
283-
284-
final int sign = NumberSignHelper.signum(value, GREATER_THAN);
286+
final int sign = NumberSignHelper.signum(targetType, value, GREATER_THAN);
285287
return !(inclusive ? sign > 0 : sign >= 0);
286288
}
287289
}

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

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,46 +13,29 @@ private NumberSignHelper() {}
1313
private static final double DOUBLE_ZERO = 0D;
1414
private static final byte BYTE_ZERO = (byte) 0;
1515

16-
static BigDecimal getBigDecimalValue(Object value) {
17-
BigDecimal bd;
16+
static BigDecimal toBigDecimal(Object value) {
1817
try {
19-
bd = new BigDecimal(value.toString());
18+
return new BigDecimal(value.toString());
2019
} catch (final NumberFormatException nfe) {
2120
throw new IllegalArgumentException("Object: " + value + " Is not a valid number", nfe);
2221
}
23-
return bd;
2422
}
2523

26-
static int signum(Object value, OptionalInt treatNanAs) {
27-
if (value instanceof CharSequence) {
28-
return signum(getBigDecimalValue(value), treatNanAs);
29-
} else if (value instanceof final Number number) {
30-
return signum(number, treatNanAs);
31-
}
32-
throw new IllegalArgumentException("Object: " + value + " Is not a valid number");
24+
static int signum(String targetType, Object value, OptionalInt treatNanAs) {
25+
return switch (targetType) {
26+
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);
36+
};
3337
}
3438

35-
private static int signum(Number number, OptionalInt treatNanAs) {
36-
if (number instanceof final BigDecimal bd) {
37-
return bd.signum();
38-
} else if (number instanceof final BigInteger bi) {
39-
return bi.signum();
40-
} else if (number instanceof final Short sh) {
41-
return sh.compareTo(SHORT_ZERO);
42-
} else if (number instanceof final Integer i) {
43-
return Integer.signum(i);
44-
} else if (number instanceof final Long l) {
45-
return Long.signum(l);
46-
} else if (number instanceof final Float f) {
47-
return signum(f, treatNanAs);
48-
} else if (number instanceof final Double d) {
49-
return signum(d, treatNanAs);
50-
} else if (number instanceof final Byte b) {
51-
return b.compareTo(BYTE_ZERO);
52-
} else {
53-
return Double.compare(number.doubleValue(), DOUBLE_ZERO);
54-
}
55-
}
5639

5740
static int signum(Float number, OptionalInt treatNanAs) {
5841
final OptionalInt infinity = InfinityNumberComparatorHelper.infinityCheck(number, treatNanAs);
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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.assertj.core.api.Assertions.assertThat;
10+
11+
class NumberSignHelperTest {
12+
13+
@Test
14+
void signum() {
15+
assertThat(NumberSignHelper.signum("Long", -1L, OptionalInt.of(1))).isEqualTo(-1);
16+
assertThat(NumberSignHelper.signum("Long", 1L, OptionalInt.of(1))).isEqualTo(1);
17+
assertThat(NumberSignHelper.signum("Integer", -1, OptionalInt.of(1))).isEqualTo(-1);
18+
assertThat(NumberSignHelper.signum("Integer", 1, OptionalInt.of(1))).isEqualTo(1);
19+
assertThat(NumberSignHelper.signum("Float", -1F, OptionalInt.of(1))).isEqualTo(-1);
20+
assertThat(NumberSignHelper.signum("Float", 1F, OptionalInt.of(1))).isEqualTo(1);
21+
assertThat(NumberSignHelper.signum("Double", -0.1D, OptionalInt.of(1))).isEqualTo(-1);
22+
assertThat(NumberSignHelper.signum("Double", 0.1D, OptionalInt.of(1))).isEqualTo(1);
23+
assertThat(NumberSignHelper.signum("Short", (short)-1, OptionalInt.of(1))).isEqualTo(-1);
24+
assertThat(NumberSignHelper.signum("Short", (short)1, OptionalInt.of(1))).isEqualTo(1);
25+
assertThat(NumberSignHelper.signum("Byte", (byte)-1, OptionalInt.of(1))).isEqualTo(-1);
26+
assertThat(NumberSignHelper.signum("Byte", (byte)1, OptionalInt.of(1))).isEqualTo(1);
27+
}
28+
29+
@Test
30+
void signum_BigDecimal() {
31+
assertThat(NumberSignHelper.signum("BigDecimal", BigDecimal.TEN, OptionalInt.of(1))).isEqualTo(1);
32+
assertThat(NumberSignHelper.signum("BigDecimal", BigDecimal.valueOf(-2), OptionalInt.of(1))).isEqualTo(-1);
33+
}
34+
35+
@Test
36+
void signum_BigInteger() {
37+
assertThat(NumberSignHelper.signum("BigInteger", BigInteger.TEN, OptionalInt.of(1))).isEqualTo(1);
38+
assertThat(NumberSignHelper.signum("BigInteger", BigInteger.valueOf(-4), OptionalInt.of(1))).isEqualTo(-1);
39+
}
40+
41+
@Test
42+
void signum_String() {
43+
assertThat(NumberSignHelper.signum("String", "5", OptionalInt.of(1))).isEqualTo(1);
44+
assertThat(NumberSignHelper.signum("String", "-2", OptionalInt.of(1))).isEqualTo(-1);
45+
assertThat(NumberSignHelper.signum("CharSequence", "5", OptionalInt.of(1))).isEqualTo(1);
46+
assertThat(NumberSignHelper.signum("CharSequence", "-2", OptionalInt.of(1))).isEqualTo(-1);
47+
}
48+
49+
@Test
50+
void signum_Number() {
51+
assertThat(NumberSignHelper.signum("Number", new FooNum(5.8), OptionalInt.of(1))).isEqualTo(1);
52+
assertThat(NumberSignHelper.signum("Number", new FooNum(-5.8), OptionalInt.of(1))).isEqualTo(-1);
53+
}
54+
55+
56+
static final class FooNum extends Number {
57+
58+
final double doubleValue;
59+
60+
FooNum(double doubleValue) {
61+
this.doubleValue = doubleValue;
62+
}
63+
64+
@Override
65+
public int intValue() {
66+
return 0;
67+
}
68+
69+
@Override
70+
public long longValue() {
71+
return 0;
72+
}
73+
74+
@Override
75+
public float floatValue() {
76+
return 0;
77+
}
78+
79+
@Override
80+
public double doubleValue() {
81+
return doubleValue;
82+
}
83+
}
84+
}

0 commit comments

Comments
 (0)