Skip to content

Commit 4c92b34

Browse files
authored
Set StreamReadCapability.EXACT_FLOATS=true (#307)
1 parent 05559ab commit 4c92b34

File tree

4 files changed

+91
-4
lines changed

4 files changed

+91
-4
lines changed

cbor/src/main/java/com/fasterxml/jackson/dataformat/cbor/CBORParser.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,7 @@ public int getFormatFeatures() {
420420

421421
@Override // since 2.12
422422
public JacksonFeatureSet<StreamReadCapability> getReadCapabilities() {
423-
// Defaults are fine
424-
return DEFAULT_READ_CAPABILITIES;
423+
return DEFAULT_READ_CAPABILITIES.with(StreamReadCapability.EXACT_FLOATS);
425424
}
426425

427426
/*
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.fasterxml.jackson.dataformat.cbor;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.math.BigDecimal;
5+
6+
import static org.junit.Assert.assertArrayEquals;
7+
8+
9+
// for [jackson-core#730]
10+
public class FloatPrecisionTest extends CBORTestBase
11+
{
12+
// for [jackson-core#730]
13+
public void testFloatRoundtrips() throws Exception
14+
{
15+
ByteArrayOutputStream out = new ByteArrayOutputStream();
16+
CBORGenerator gen = cborGenerator(out);
17+
gen.writeStartArray();
18+
19+
gen.writeNumber(Float.MIN_VALUE);
20+
gen.writeNumber(0.0f);
21+
gen.writeNumber(Float.MAX_VALUE);
22+
23+
gen.writeNumber(Double.MIN_VALUE);
24+
gen.writeNumber(0.0d);
25+
gen.writeNumber(Double.MAX_VALUE);
26+
27+
gen.writeNumber(new BigDecimal("1e999"));
28+
gen.writeEndArray();
29+
gen.close();
30+
byte[] expected = out.toByteArray();
31+
32+
CBORParser parser = cborParser(expected);
33+
ByteArrayOutputStream out2 = new ByteArrayOutputStream();
34+
CBORGenerator gen2 = cborGenerator(out2);
35+
parser.nextToken();
36+
gen2.copyCurrentStructure(parser);
37+
gen2.close();
38+
byte[] actual = out2.toByteArray();
39+
assertArrayEquals(expected, actual);
40+
}
41+
}

smile/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParserBase.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,12 @@ public final JsonParser overrideFormatFeatures(int values, int mask) {
319319
return this;
320320
}
321321

322+
protected final static JacksonFeatureSet<StreamReadCapability> SMILE_READ_CAPABILITIES
323+
= DEFAULT_READ_CAPABILITIES.with(StreamReadCapability.EXACT_FLOATS);
324+
322325
@Override // since 2.12
323326
public JacksonFeatureSet<StreamReadCapability> getReadCapabilities() {
324-
// Defaults are fine
325-
return DEFAULT_READ_CAPABILITIES;
327+
return SMILE_READ_CAPABILITIES;
326328
}
327329

328330
/*
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.fasterxml.jackson.dataformat.smile;
2+
3+
import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile;
4+
import com.fasterxml.jackson.dataformat.smile.SmileGenerator;
5+
import com.fasterxml.jackson.dataformat.smile.SmileParser;
6+
7+
import java.io.ByteArrayOutputStream;
8+
import java.math.BigDecimal;
9+
10+
import static org.junit.Assert.assertArrayEquals;
11+
12+
13+
// for [jackson-core#730]
14+
public class FloatPrecisionTest extends BaseTestForSmile
15+
{
16+
// for [jackson-core#730]
17+
public void testFloatRoundtrips() throws Exception
18+
{
19+
ByteArrayOutputStream out = new ByteArrayOutputStream();
20+
SmileGenerator gen = smileGenerator(out, true);
21+
gen.writeStartArray();
22+
23+
gen.writeNumber(Float.MIN_VALUE);
24+
gen.writeNumber(0.0f);
25+
gen.writeNumber(Float.MAX_VALUE);
26+
27+
gen.writeNumber(Double.MIN_VALUE);
28+
gen.writeNumber(0.0d);
29+
gen.writeNumber(Double.MAX_VALUE);
30+
31+
gen.writeNumber(new BigDecimal("1e999"));
32+
gen.writeEndArray();
33+
gen.close();
34+
byte[] expected = out.toByteArray();
35+
36+
SmileParser parser = _smileParser(expected);
37+
ByteArrayOutputStream out2 = new ByteArrayOutputStream();
38+
SmileGenerator gen2 = smileGenerator(out2, true);
39+
parser.nextToken();
40+
gen2.copyCurrentStructure(parser);
41+
gen2.close();
42+
byte[] actual = out2.toByteArray();
43+
assertArrayEquals(expected, actual);
44+
}
45+
}

0 commit comments

Comments
 (0)