From 2eb4f783da06db5d7a570067a957a152677a52a8 Mon Sep 17 00:00:00 2001 From: James Bench Date: Wed, 24 Jun 2020 19:04:28 +0100 Subject: [PATCH] Support deserializing ints as BigDecimals. --- .../com/arangodb/velocypack/VPackSlice.java | 4 +++ .../VPackSerializeDeserializeTest.java | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/java/com/arangodb/velocypack/VPackSlice.java b/src/main/java/com/arangodb/velocypack/VPackSlice.java index 62c92f1..53f9dc2 100644 --- a/src/main/java/com/arangodb/velocypack/VPackSlice.java +++ b/src/main/java/com/arangodb/velocypack/VPackSlice.java @@ -289,6 +289,10 @@ public BigDecimal getAsBigDecimal() { return new BigDecimal(getAsString()); } else if (isDouble()) { return BigDecimal.valueOf(getAsDouble()); + } else if (isSmallInt() || isInt()) { + return BigDecimal.valueOf(getAsLong()); + } else if (isUInt()) { + return new BigDecimal(NumberUtil.toBigInteger(vpack, start + 1, length())); } else { throw new VPackValueTypeException(ValueType.STRING, ValueType.DOUBLE); } diff --git a/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java b/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java index 6195763..cfb113c 100644 --- a/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java +++ b/src/test/java/com/arangodb/velocypack/VPackSerializeDeserializeTest.java @@ -717,6 +717,7 @@ public void toDouble() throws VPackException { protected static class TestEntityBigNumber { private BigInteger bi = BigInteger.valueOf(1L); private BigDecimal bd = BigDecimal.valueOf(1.5); + private BigDecimal bdi = BigDecimal.valueOf(1); public BigInteger getBi() { return bi; @@ -733,6 +734,14 @@ public BigDecimal getBd() { public void setBd(final BigDecimal bd) { this.bd = bd; } + + public BigDecimal getBdi() { + return bdi; + } + + public void setBdi(final BigDecimal bdi) { + this.bdi = bdi; + } } @Test @@ -750,6 +759,11 @@ public void fromBigNumbers() throws VPackException { assertThat(bd.isString(), is(true)); assertThat(bd.getAsBigDecimal(), is(BigDecimal.valueOf(1.5))); } + { + final VPackSlice bdi = vpack.get("bdi"); + assertThat(bdi.isString(), is(true)); + assertThat(bdi.getAsBigDecimal(), is(BigDecimal.valueOf(1))); + } } @Test @@ -759,6 +773,7 @@ public void toBigNumbers() throws VPackException { builder.add(ValueType.OBJECT); builder.add("bi", BigInteger.valueOf(2)); builder.add("bd", BigDecimal.valueOf(3.75)); + builder.add("bdi", BigDecimal.valueOf(3)); builder.close(); } final VPackSlice vpack = builder.slice(); @@ -766,6 +781,7 @@ public void toBigNumbers() throws VPackException { assertThat(entity, is(notNullValue())); assertThat(entity.bi, is(BigInteger.valueOf(2))); assertThat(entity.bd, is(BigDecimal.valueOf(3.75))); + assertThat(entity.bdi, is(BigDecimal.valueOf(3))); } @Test @@ -777,6 +793,20 @@ public void bigDecimal() { assertThat(new VPackBuilder().add(fromString).slice().getAsBigDecimal(), is(fromDouble)); } + @Test + public void deserializeIntAsBigDecimal() { + final int integer = Integer.MAX_VALUE; + final BigDecimal fromInt = BigDecimal.valueOf(integer); + assertThat(new VPackBuilder().add(integer).slice().getAsBigDecimal(), is(fromInt)); + } + + @Test + public void deserializeLongAsBigDecimal() { + final long lng = Long.MAX_VALUE; + final BigDecimal fromLng = BigDecimal.valueOf(lng); + assertThat(new VPackBuilder().add(lng).slice().getAsBigDecimal(), is(fromLng)); + } + protected static class TestEntityArray { private String[] a1 = { "a", "b", "cd" }; private int[] a2 = { 1, 2, 3, 4, 5 };