|
1 | 1 | package ch.jalu.typeresolver.numbers; |
2 | 2 |
|
| 3 | +import org.junit.jupiter.api.Disabled; |
3 | 4 | import org.junit.jupiter.api.Test; |
| 5 | +import org.reflections.Reflections; |
| 6 | +import org.reflections.scanners.Scanners; |
4 | 7 |
|
5 | 8 | import java.lang.reflect.Field; |
6 | 9 | import java.lang.reflect.Modifier; |
7 | 10 | import java.math.BigDecimal; |
| 11 | +import java.util.Arrays; |
8 | 12 | import java.util.Collections; |
9 | 13 | import java.util.EnumSet; |
10 | 14 | import java.util.HashSet; |
@@ -77,6 +81,43 @@ void shouldUnwrapObjectToStandardNumberType() { |
77 | 81 | assertThat(NumberTypes.unwrapToStandardNumberType(Collections.emptyList()), nullValue()); |
78 | 82 | } |
79 | 83 |
|
| 84 | + /** |
| 85 | + * If this test fails, it means there are new Number classes in the JDK that should be addressed; the Javadoc |
| 86 | + * in {@link NumberType} guarantees that certain methods can deal with any JDK Number type. |
| 87 | + */ |
| 88 | + @Disabled // Seems impossible to get JDK classes via Maven, so this can only be run locally |
| 89 | + @Test |
| 90 | + void shouldSupportAllJdkNumberTypes() { |
| 91 | + // given |
| 92 | + Reflections reflections = new Reflections("java", Scanners.SubTypes); |
| 93 | + // If no classes are found, you can try passing in a custom class loader into Reflections, |
| 94 | + // though note that this has also not made it possible to fix this test to run correctly in Maven |
| 95 | + |
| 96 | + // when |
| 97 | + Set<String> numberClasses = reflections.getSubTypesOf(Number.class).stream() |
| 98 | + .filter(clz -> !Modifier.isAbstract(clz.getModifiers())) |
| 99 | + .map(Class::getName) |
| 100 | + .collect(Collectors.toSet()); |
| 101 | + |
| 102 | + // then |
| 103 | + Set<String> expectedNumberClasses = new HashSet<>(Arrays.asList( |
| 104 | + "java.lang.Byte", |
| 105 | + "java.lang.Short", |
| 106 | + "java.lang.Integer", |
| 107 | + "java.lang.Long", |
| 108 | + "java.lang.Float", |
| 109 | + "java.lang.Double", |
| 110 | + "java.math.BigInteger", |
| 111 | + "java.math.BigDecimal", |
| 112 | + "java.util.concurrent.atomic.AtomicInteger", |
| 113 | + "java.util.concurrent.atomic.AtomicLong", |
| 114 | + "java.util.concurrent.atomic.DoubleAccumulator", |
| 115 | + "java.util.concurrent.atomic.DoubleAdder", |
| 116 | + "java.util.concurrent.atomic.LongAccumulator", |
| 117 | + "java.util.concurrent.atomic.LongAdder")); |
| 118 | + assertThat(numberClasses, equalTo(expectedNumberClasses)); |
| 119 | + } |
| 120 | + |
80 | 121 | @Test |
81 | 122 | void shouldStreamThroughAllNumberTypeInstances() { |
82 | 123 | // given |
@@ -108,6 +149,7 @@ void shouldReturnNumberTypeForClass() { |
108 | 149 | assertThat(NumberTypes.from(Byte.class), equalTo(StandardNumberType.BYTE)); |
109 | 150 | assertThat(NumberTypes.from(long.class), equalTo(StandardNumberType.LONG)); |
110 | 151 | assertThat(NumberTypes.from(Long.class), equalTo(StandardNumberType.LONG)); |
| 152 | + assertThat(NumberTypes.from(char.class), equalTo(MoreNumberTypes.CHARACTER)); |
111 | 153 | assertThat(NumberTypes.from(Character.class), equalTo(MoreNumberTypes.CHARACTER)); |
112 | 154 | assertThat(NumberTypes.from(AtomicInteger.class), equalTo(MoreNumberTypes.ATOMIC_INTEGER)); |
113 | 155 | assertThat(NumberTypes.from(AtomicLong.class), equalTo(MoreNumberTypes.ATOMIC_LONG)); |
|
0 commit comments