Skip to content

Commit 9510739

Browse files
route -0 to double serializer to preserve sign bit on round-trip
1 parent ed4d0ae commit 9510739

3 files changed

Lines changed: 10 additions & 9 deletions

File tree

gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/NumberSerializationStrategy.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ export default class NumberSerializationStrategy {
4848
Number.isNaN(item) ||
4949
item === Number.POSITIVE_INFINITY ||
5050
item === Number.NEGATIVE_INFINITY ||
51-
!Number.isInteger(item)
51+
!Number.isInteger(item) ||
52+
Object.is(item, -0)
5253
) {
5354
return this.ioc.doubleSerializer.serialize(item, fullyQualifiedFormat);
5455
}

gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/model-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ describe('GraphBinary v4 Model Tests', () => {
232232
runWriteRead('traversal-vertex');
233233

234234
// runRead mode (6 entries)
235-
runRead('neg-zero-double', negZeroComparator);
235+
run('neg-zero-double', negZeroComparator);
236236
runRead('neg-zero-float', negZeroComparator);
237237
runRead('max-offsetdatetime', invalidDateComparator);
238238
runRead('min-offsetdatetime', invalidDateComparator);

gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphbinary/type-detection-test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ describe('Type Detection Tests', () => {
7373
assert.strictEqual(anySerializer.serialize(-Infinity)[0], DataType.DOUBLE);
7474
});
7575

76+
it('-0 → DOUBLE (0x07) preserving sign', () => {
77+
const result = anySerializer.serialize(-0);
78+
assert.strictEqual(result[0], DataType.DOUBLE);
79+
const deserialized = anySerializer.deserialize(result);
80+
assert.isTrue(Object.is(deserialized.v, -0));
81+
});
82+
7683
it('BigInt within Int64 range → BIGINTEGER (0x23)', () => {
7784
assert.strictEqual(anySerializer.serialize(123n)[0], DataType.BIGINTEGER);
7885
assert.strictEqual(anySerializer.serialize(-456n)[0], DataType.BIGINTEGER);
@@ -318,13 +325,6 @@ describe('Type Detection Tests', () => {
318325
assert.isTrue(Number.isNaN(deserialized.v));
319326
});
320327

321-
it('-0 round-trip (loses sign)', () => {
322-
const serialized = anySerializer.serialize(-0);
323-
const deserialized = anySerializer.deserialize(serialized);
324-
// -0 loses its sign through serialization, becomes +0
325-
assert.strictEqual(deserialized.v, 0);
326-
});
327-
328328
it('complex nested structure', () => {
329329
const value = new Map([
330330
['numbers', [1, 2.5, BigInt(123)]],

0 commit comments

Comments
 (0)