Skip to content

Commit d14b186

Browse files
authored
Merge pull request #50 from Exlll/fix/inconsistent-behavior-deserializing-doubles
Use target type (not element type) when choosing a deserializer for numbers
2 parents a578622 + 1da867b commit d14b186

File tree

3 files changed

+80
-13
lines changed

3 files changed

+80
-13
lines changed

configlib-core/src/main/java/de/exlll/configlib/Serializers.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ public Number serialize(Number element) {
7777

7878
@Override
7979
public Number deserialize(Number element) {
80-
if (Reflect.isIntegerType(element.getClass())) {
80+
if (Reflect.isIntegerType(cls)) {
8181
return deserializeFromIntegerType(element);
8282
}
83-
if (Reflect.isFloatingPointType(element.getClass())) {
83+
if (Reflect.isFloatingPointType(cls)) {
8484
return deserializeFromFloatingPointType(element);
8585
}
8686
String clsName = element.getClass().getSimpleName();

configlib-core/src/test/java/de/exlll/configlib/SerializersTest.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,6 @@ void numberSerializerRequiresValidNumberType() {
6161
);
6262
}
6363

64-
@Test
65-
void numberSerializerDeserializeInvalidType() {
66-
NumberSerializer serializer = new NumberSerializer(int.class);
67-
68-
assertThrowsConfigurationException(
69-
() -> serializer.deserialize(BigInteger.ONE),
70-
"Cannot deserialize element '1' of type BigInteger.\n" +
71-
"This serializer only supports primitive number types and their wrapper types."
72-
);
73-
}
74-
7564
@ParameterizedTest
7665
@ValueSource(classes = {
7766
byte.class, Byte.class,

configlib-yaml/src/test/java/de/exlll/configlib/YamlConfigurationsTest.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212
import java.nio.file.FileSystem;
1313
import java.nio.file.Files;
1414
import java.nio.file.Path;
15+
import java.util.List;
1516

17+
import static de.exlll.configlib.TestUtils.asList;
1618
import static de.exlll.configlib.TestUtils.createPlatformSpecificFilePath;
1719
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertNull;
1821

1922
class YamlConfigurationsTest {
2023
private static final FieldFilter includeI = field -> field.getName().equals("i");
@@ -230,4 +233,79 @@ private void writeStringToStream(String string) {
230233
private InputStream inputFromOutput() {
231234
return new ByteArrayInputStream(outputStream.toByteArray());
232235
}
236+
237+
@Configuration
238+
private static final class DoublesConfig {
239+
double d;
240+
Double boxed;
241+
List<Double> list;
242+
}
243+
244+
@Test
245+
void loadYamlConfigurationDoublesAllDecimal() {
246+
writeStringToFile(
247+
"""
248+
d: 10.0
249+
boxed: 20.0
250+
list:
251+
- 1.0
252+
- 2.0
253+
- 3.0
254+
"""
255+
);
256+
DoublesConfig config = YamlConfigurations.load(yamlFile, DoublesConfig.class);
257+
assertEquals(10.0, config.d);
258+
assertEquals(20.0, config.boxed);
259+
assertEquals(asList(1.0, 2.0, 3.0), config.list);
260+
}
261+
262+
@Test
263+
void loadYamlConfigurationDoublesUnboxed() {
264+
writeStringToFile("d: 10");
265+
DoublesConfig config = YamlConfigurations.load(yamlFile, DoublesConfig.class);
266+
assertEquals(10.0, config.d);
267+
}
268+
269+
@Test
270+
void loadYamlConfigurationDoublesBoxed() {
271+
writeStringToFile("boxed: 20");
272+
DoublesConfig config = YamlConfigurations.load(yamlFile, DoublesConfig.class);
273+
assertEquals(20.0, config.boxed);
274+
}
275+
276+
@Test
277+
void loadYamlConfigurationDoublesCollection() {
278+
writeStringToFile(
279+
"""
280+
list:
281+
- 1.0
282+
- 2
283+
- 3.0
284+
"""
285+
);
286+
DoublesConfig config = YamlConfigurations.load(yamlFile, DoublesConfig.class);
287+
assertEquals(asList(1.0, 2.0, 3.0), config.list);
288+
}
289+
290+
@Test
291+
void loadYamlConfigurationDoublesWithNulls() {
292+
writeStringToFile(
293+
"""
294+
boxed: null
295+
list:
296+
- null
297+
- null
298+
- 1.0
299+
- 2
300+
"""
301+
);
302+
DoublesConfig config = YamlConfigurations.load(
303+
yamlFile,
304+
DoublesConfig.class,
305+
builder -> builder.inputNulls(true)
306+
);
307+
assertEquals(0.0, config.d);
308+
assertNull(config.boxed);
309+
assertEquals(asList(null, null, 1.0, 2.0), config.list);
310+
}
233311
}

0 commit comments

Comments
 (0)