From dc2227b7180f4a4dfd743ba6d693fb7106e0c2a7 Mon Sep 17 00:00:00 2001 From: Vitaly Puzrin Date: Mon, 5 Mar 2018 18:36:32 +0300 Subject: [PATCH] Dumper: fix negative integers in bin/octal/hex formats, close #399 --- lib/js-yaml/type/int.js | 9 +++++---- test/issues/0399.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 test/issues/0399.js diff --git a/lib/js-yaml/type/int.js b/lib/js-yaml/type/int.js index 4ae522a5..ba61c5f9 100644 --- a/lib/js-yaml/type/int.js +++ b/lib/js-yaml/type/int.js @@ -157,10 +157,11 @@ module.exports = new Type('tag:yaml.org,2002:int', { construct: constructYamlInteger, predicate: isInteger, represent: { - binary: function (object) { return '0b' + object.toString(2); }, - octal: function (object) { return '0' + object.toString(8); }, - decimal: function (object) { return object.toString(10); }, - hexadecimal: function (object) { return '0x' + object.toString(16).toUpperCase(); } + binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); }, + octal: function (obj) { return obj >= 0 ? '0' + obj.toString(8) : '-0' + obj.toString(8).slice(1); }, + decimal: function (obj) { return obj.toString(10); }, + /* eslint-disable max-len */ + hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); } }, defaultStyle: 'decimal', styleAliases: { diff --git a/test/issues/0399.js b/test/issues/0399.js new file mode 100644 index 00000000..e7fa9d62 --- /dev/null +++ b/test/issues/0399.js @@ -0,0 +1,19 @@ +'use strict'; + + +var assert = require('assert'); +var yaml = require('../../'); + + +test('should properly dump negative ints in different styles', function () { + var dump, src = { integer: -100 }; + + dump = yaml.dump(src, { styles: { '!!int': 'binary' } }); + assert.deepEqual(yaml.safeLoad(dump), src); + + dump = yaml.dump(src, { styles: { '!!int': 'octal' } }); + assert.deepEqual(yaml.safeLoad(dump), src); + + dump = yaml.dump(src, { styles: { '!!int': 'hex' } }); + assert.deepEqual(yaml.safeLoad(dump), src); +});