diff --git a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java index 801015176..d8e3cb63b 100644 --- a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java +++ b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java @@ -6,7 +6,9 @@ import org.junit.jupiter.api.Test; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.core.JsonParser.NumberType; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.ObjectMapper; @@ -47,6 +49,25 @@ static class NestedBigDecimalHolder2784 { public BigDecimalHolder2784 holder; } + static class DeserializationIssue4917 { + public DecimalHolder4917 decimalHolder; + public double number; + } + + static class DecimalHolder4917 { + @JsonValue + BigDecimal value; + + private DecimalHolder4917(BigDecimal value) { + this.value = value; + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + static DecimalHolder4917 of(BigDecimal value) { + return new DecimalHolder4917(value); + } + } + /* /********************************************************** /* Test methods @@ -256,4 +277,21 @@ public void testBigDecimalWithBuffering() throws Exception NestedBigDecimalHolder2784.class); assertEquals(VALUE, result.holder.value); } + + // [databind#4917] + @Test + public void testIssue4917() throws Exception { + final String bd = "100.00"; + final double d = 50.0; + final DeserializationIssue4917 value = new DeserializationIssue4917(); + value.decimalHolder = DecimalHolder4917.of(new BigDecimal(bd)); + value.number = d; + final byte[] data = MAPPER.writeValueAsBytes(value); + + final DeserializationIssue4917 result = MAPPER.readValue( + data, DeserializationIssue4917.class); + assertEquals(value.decimalHolder.value, result.decimalHolder.value); + assertEquals(value.number, result.number); + } + } diff --git a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java new file mode 100644 index 000000000..5cd9d518e --- /dev/null +++ b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java @@ -0,0 +1,50 @@ +package com.fasterxml.jackson.dataformat.smile.mapper; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile; +import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class NumberReadTest extends BaseTestForSmile { + + static class DeserializationIssue4917 { + public DecimalHolder4917 decimalHolder; + public double number; + } + + static class DecimalHolder4917 { + @JsonValue + BigDecimal value; + + private DecimalHolder4917(BigDecimal value) { + this.value = value; + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + static DecimalHolder4917 of(BigDecimal value) { + return new DecimalHolder4917(value); + } + } + + // [databind#4917] + @Test + public void testIssue4917() throws Exception { + final String bd = "100.00"; + final double d = 50.0; + final DeserializationIssue4917 value = new DeserializationIssue4917(); + value.decimalHolder = DecimalHolder4917.of(new BigDecimal(bd)); + value.number = d; + final SmileMapper mapper = smileMapper(); + final byte[] data = mapper.writeValueAsBytes(value); + final DeserializationIssue4917 result = mapper.readValue( + data, DeserializationIssue4917.class); + assertEquals(value.decimalHolder.value, result.decimalHolder.value); + assertEquals(value.number, result.number); + } + +}