From 9035d4872e32d6402c8e4d8c915d4f24d5192ea9 Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Wed, 4 Jan 2017 13:03:12 +0100 Subject: [PATCH] Added more default value checks to converter, fixes #616 --- src/converter.js | 8 +-- src/converters.js | 23 +++----- tests/data/ambiguous-names.js | 2 +- tests/data/mapbox/vector_tile.js | 18 +++---- tests/data/package.js | 2 +- tests/data/test.js | 93 ++++++++++++++++---------------- 6 files changed, 70 insertions(+), 76 deletions(-) diff --git a/src/converter.js b/src/converter.js index abc5ca051..94fd2a74d 100644 --- a/src/converter.js +++ b/src/converter.js @@ -65,10 +65,12 @@ function converter(mtype) { // non-repeated } else if (convert = genConvert(field, i, prop)) { - if (field.long || field.resolvedType && !(field.resolvedType instanceof Enum)) gen - ("if(s%s!==undefined&&s%s!==null||o.defaults)", prop, prop); + if (field.long) gen + ("if(o.defaults||s%s!==undefined&&s%s!==null&&util.longNe(s%s,%d,%d))", prop, prop, prop, field.typeDefault.low, field.typeDefault.high); + else if (field.resolvedType && !(field.resolvedType instanceof Enum)) gen + ("if(o.defaults||s%s!==undefined&&s%s!==null)", prop, prop); else gen - ("if(s%s!==undefined||o.defaults)", prop); + ("if(o.defaults||s%s!==undefined&&s%s!==%j)", prop, prop, field.typeDefault); gen ("d%s=%s", prop, convert); } else gen diff --git a/src/converters.js b/src/converters.js index 537fd2d37..62ea76ef9 100644 --- a/src/converters.js +++ b/src/converters.js @@ -27,30 +27,22 @@ var util = require("./util/runtime"); */ converters.json = { create: function(value, typeOrCtor, options) { - if (!value) + if (!value) // inner messages return null; return options.fieldsOnly ? {} : util.merge({}, value); }, enums: function(value, defaultValue, values, options) { - if (!options.defaults) { - if (value === undefined || value === defaultValue) - return undefined; - } else if (value === undefined) + if (value === undefined) value = defaultValue; return options.enums === String && typeof value === "number" ? values[value] : value; }, longs: function(value, defaultLow, defaultHigh, unsigned, options) { - if (!value) { - if (options.defaults) - value = { low: defaultLow, high: defaultHigh }; - else - return undefined; - } else if (!util.longNe(value, defaultLow, defaultHigh) && !options.defaults) - return undefined; + if (value === undefined || value === null) + value = { low: defaultLow, high: defaultHigh }; if (options.longs === Number) return typeof value === "number" ? value @@ -66,10 +58,7 @@ converters.json = { }, bytes: function(value, defaultValue, options) { if (!value) { - if (options.defaults) - value = defaultValue; - else - return undefined; + value = defaultValue; } else if (!value.length && !options.defaults) return undefined; return options.bytes === String @@ -105,7 +94,7 @@ converters.message = { enums: function(value, defaultValue, values) { if (typeof value === "string") return values[value]; - return value | 0; + return value; }, longs: function(value, defaultLow, defaultHigh, unsigned) { if (typeof value === "string") diff --git a/tests/data/ambiguous-names.js b/tests/data/ambiguous-names.js index fd97b1612..459ccee83 100644 --- a/tests/data/ambiguous-names.js +++ b/tests/data/ambiguous-names.js @@ -296,7 +296,7 @@ $root.B = (function() { } var dst = impl.create(src, this, options); if (dst) { - if (src.A !== undefined && src.A !== null || options.defaults) { + if (options.defaults || src.A !== undefined && src.A !== null) { dst.A = types[0].convert(src.A, impl, options); } } diff --git a/tests/data/mapbox/vector_tile.js b/tests/data/mapbox/vector_tile.js index 6e8138cb8..084d45cd7 100644 --- a/tests/data/mapbox/vector_tile.js +++ b/tests/data/mapbox/vector_tile.js @@ -441,7 +441,7 @@ $root.vector_tile = (function() { * @param {Object.} [options] Conversion options * @returns {vector_tile.Tile.Value|Object} Converted message */ - Value.convert = (function() { return function convert(src, impl, options) { + Value.convert = (function(util) { return function convert(src, impl, options) { if (!options) { options = {}; } @@ -456,13 +456,13 @@ $root.vector_tile = (function() { if (dst.doubleValue === undefined && options.defaults) { dst.doubleValue = 0; } - if (src.intValue !== undefined && src.intValue !== null || options.defaults) { + if (options.defaults || src.intValue !== undefined && src.intValue !== null && util.longNe(src.intValue, 0, 0)) { dst.intValue = impl.longs(src.intValue, 0, 0, false, options); } - if (src.uintValue !== undefined && src.uintValue !== null || options.defaults) { + if (options.defaults || src.uintValue !== undefined && src.uintValue !== null && util.longNe(src.uintValue, 0, 0)) { dst.uintValue = impl.longs(src.uintValue, 0, 0, true, options); } - if (src.sintValue !== undefined && src.sintValue !== null || options.defaults) { + if (options.defaults || src.sintValue !== undefined && src.sintValue !== null && util.longNe(src.sintValue, 0, 0)) { dst.sintValue = impl.longs(src.sintValue, 0, 0, false, options); } if (dst.boolValue === undefined && options.defaults) { @@ -470,7 +470,7 @@ $root.vector_tile = (function() { } } return dst; - };})(); + };})($protobuf.util); /** * Creates a Value message from JSON. @@ -717,13 +717,13 @@ $root.vector_tile = (function() { * @param {Object.} [options] Conversion options * @returns {vector_tile.Tile.Feature|Object} Converted message */ - Feature.convert = (function(types) { return function convert(src, impl, options) { + Feature.convert = (function(util, types) { return function convert(src, impl, options) { if (!options) { options = {}; } var dst = impl.create(src, this, options); if (dst) { - if (src.id !== undefined && src.id !== null || options.defaults) { + if (options.defaults || src.id !== undefined && src.id !== null && util.longNe(src.id, 0, 0)) { dst.id = impl.longs(src.id, 0, 0, true, options); } if (src.tags && src.tags.length) { @@ -736,7 +736,7 @@ $root.vector_tile = (function() { dst.tags = []; } } - if (src.type !== undefined || options.defaults) { + if (options.defaults || src.type !== undefined && src.type !== undefined) { dst.type = impl.enums(src.type, undefined, types[2], options); } if (src.geometry && src.geometry.length) { @@ -751,7 +751,7 @@ $root.vector_tile = (function() { } } return dst; - };})($types); + };})($protobuf.util, $types); /** * Creates a Feature message from JSON. diff --git a/tests/data/package.js b/tests/data/package.js index 5495b7b43..80e03d7d0 100644 --- a/tests/data/package.js +++ b/tests/data/package.js @@ -520,7 +520,7 @@ $root.Package = (function() { if (dst.license === undefined && options.defaults) { dst.license = ""; } - if (src.repository !== undefined && src.repository !== null || options.defaults) { + if (options.defaults || src.repository !== undefined && src.repository !== null) { dst.repository = types[5].convert(src.repository, impl, options); } if (dst.bugs === undefined && options.defaults) { diff --git a/tests/data/test.js b/tests/data/test.js index 5bd635b9a..73a3f7a98 100644 --- a/tests/data/test.js +++ b/tests/data/test.js @@ -311,7 +311,7 @@ $root.jspb = (function() { } var dst = impl.create(src, this, options); if (dst) { - if (src.outerEnum !== undefined || options.defaults) { + if (options.defaults || src.outerEnum !== undefined && src.outerEnum !== 1) { dst.outerEnum = impl.enums(src.outerEnum, 1, types[0], options); } } @@ -1173,7 +1173,7 @@ $root.jspb = (function() { if (dst.aBool === undefined && options.defaults) { dst.aBool = false; } - if (src.aNestedMessage !== undefined && src.aNestedMessage !== null || options.defaults) { + if (options.defaults || src.aNestedMessage !== undefined && src.aNestedMessage !== null) { dst.aNestedMessage = types[2].convert(src.aNestedMessage, impl, options); } if (src.aRepeatedMessage && src.aRepeatedMessage.length) { @@ -1691,10 +1691,10 @@ $root.jspb = (function() { if (dst.str3 === undefined && options.defaults) { dst.str3 = ""; } - if (src[".jspb.test.IsExtension.extField"] !== undefined && src[".jspb.test.IsExtension.extField"] !== null || options.defaults) { + if (options.defaults || src[".jspb.test.IsExtension.extField"] !== undefined && src[".jspb.test.IsExtension.extField"] !== null) { dst[".jspb.test.IsExtension.extField"] = types[3].convert(src[".jspb.test.IsExtension.extField"], impl, options); } - if (src[".jspb.test.IndirectExtension.simple"] !== undefined && src[".jspb.test.IndirectExtension.simple"] !== null || options.defaults) { + if (options.defaults || src[".jspb.test.IndirectExtension.simple"] !== undefined && src[".jspb.test.IndirectExtension.simple"] !== null) { dst[".jspb.test.IndirectExtension.simple"] = types[4].convert(src[".jspb.test.IndirectExtension.simple"], impl, options); } if (dst[".jspb.test.IndirectExtension.str"] === undefined && options.defaults) { @@ -1720,7 +1720,7 @@ $root.jspb = (function() { dst[".jspb.test.IndirectExtension.repeatedSimple"] = []; } } - if (src[".jspb.test.simple1"] !== undefined && src[".jspb.test.simple1"] !== null || options.defaults) { + if (options.defaults || src[".jspb.test.simple1"] !== undefined && src[".jspb.test.simple1"] !== null) { dst[".jspb.test.simple1"] = types[8].convert(src[".jspb.test.simple1"], impl, options); } } @@ -1971,7 +1971,7 @@ $root.jspb = (function() { if (dst.anOutOfOrderBool === undefined && options.defaults) { dst.anOutOfOrderBool = false; } - if (src.aNestedMessage !== undefined && src.aNestedMessage !== null || options.defaults) { + if (options.defaults || src.aNestedMessage !== undefined && src.aNestedMessage !== null) { dst.aNestedMessage = types[2].convert(src.aNestedMessage, impl, options); } if (src.aRepeatedMessage && src.aRepeatedMessage.length) { @@ -2969,7 +2969,7 @@ $root.jspb = (function() { * @param {Object.} [options] Conversion options * @returns {jspb.test.DefaultValues|Object} Converted message */ - DefaultValues.convert = (function(types) { return function convert(src, impl, options) { + DefaultValues.convert = (function(util, types) { return function convert(src, impl, options) { if (!options) { options = {}; } @@ -2981,21 +2981,24 @@ $root.jspb = (function() { if (dst.boolField === undefined && options.defaults) { dst.boolField = true; } - if (src.intField !== undefined && src.intField !== null || options.defaults) { + if (options.defaults || src.intField !== undefined && src.intField !== null && util.longNe(src.intField, 11, 0)) { dst.intField = impl.longs(src.intField, 11, 0, false, options); } - if (src.enumField !== undefined || options.defaults) { + if (options.defaults || src.enumField !== undefined && src.enumField !== undefined) { dst.enumField = impl.enums(src.enumField, undefined, types[3], options); } if (dst.emptyField === undefined && options.defaults) { dst.emptyField = ""; } - if (src.bytesField !== undefined || options.defaults) { + if (options.defaults || src.bytesField !== undefined && src.bytesField !== { + type: "Buffer", + data: [ 109, 111, 111 ] + }) { dst.bytesField = impl.bytes(src.bytesField, [ 109, 111, 111 ], options); } } return dst; - };})($types); + };})($protobuf.util, $types); /** * Creates a DefaultValues message from JSON. @@ -3601,7 +3604,7 @@ $root.jspb = (function() { if (dst.str === undefined && options.defaults) { dst.str = ""; } - if (src.simple1 !== undefined && src.simple1 !== null || options.defaults) { + if (options.defaults || src.simple1 !== undefined && src.simple1 !== null) { dst.simple1 = types[1].convert(src.simple1, impl, options); } if (src.simple2 && src.simple2.length) { @@ -3614,13 +3617,13 @@ $root.jspb = (function() { dst.simple2 = []; } } - if (src.bytesField !== undefined || options.defaults) { + if (options.defaults || src.bytesField !== undefined && src.bytesField !== []) { dst.bytesField = impl.bytes(src.bytesField, [], options); } if (dst.unused === undefined && options.defaults) { dst.unused = ""; } - if (src[".jspb.test.CloneExtension.extField"] !== undefined && src[".jspb.test.CloneExtension.extField"] !== null || options.defaults) { + if (options.defaults || src[".jspb.test.CloneExtension.extField"] !== undefined && src[".jspb.test.CloneExtension.extField"] !== null) { dst[".jspb.test.CloneExtension.extField"] = types[5].convert(src[".jspb.test.CloneExtension.extField"], impl, options); } } @@ -3972,10 +3975,10 @@ $root.jspb = (function() { if (dst.id === undefined && options.defaults) { dst.id = ""; } - if (src.requiredSimple !== undefined && src.requiredSimple !== null || options.defaults) { + if (options.defaults || src.requiredSimple !== undefined && src.requiredSimple !== null) { dst.requiredSimple = types[1].convert(src.requiredSimple, impl, options); } - if (src.optionalSimple !== undefined && src.optionalSimple !== null || options.defaults) { + if (options.defaults || src.optionalSimple !== undefined && src.optionalSimple !== null) { dst.optionalSimple = types[2].convert(src.optionalSimple, impl, options); } } @@ -4720,7 +4723,7 @@ $root.jspb = (function() { if (dst.pthree === undefined && options.defaults) { dst.pthree = ""; } - if (src.rone !== undefined && src.rone !== null || options.defaults) { + if (options.defaults || src.rone !== undefined && src.rone !== null) { dst.rone = types[2].convert(src.rone, impl, options); } if (dst.rtwo === undefined && options.defaults) { @@ -4925,7 +4928,7 @@ $root.jspb = (function() { if (dst.value === undefined && options.defaults) { dst.value = 0; } - if (src.data !== undefined || options.defaults) { + if (options.defaults || src.data !== undefined && src.data !== []) { dst.data = impl.bytes(src.data, [], options); } } @@ -5483,7 +5486,7 @@ $root.jspb = (function() { * @param {Object.} [options] Conversion options * @returns {jspb.test.TestMapFieldsNoBinary|Object} Converted message */ - TestMapFieldsNoBinary.convert = (function(types) { return function convert(src, impl, options) { + TestMapFieldsNoBinary.convert = (function(util, types) { return function convert(src, impl, options) { if (!options) { options = {}; } @@ -5495,7 +5498,7 @@ $root.jspb = (function() { if (dst.mapStringInt32 === undefined && options.defaults) { dst.mapStringInt32 = 0; } - if (src.mapStringInt64 !== undefined && src.mapStringInt64 !== null || options.defaults) { + if (options.defaults || src.mapStringInt64 !== undefined && src.mapStringInt64 !== null && util.longNe(src.mapStringInt64, 0, 0)) { dst.mapStringInt64 = impl.longs(src.mapStringInt64, 0, 0, false, options); } if (dst.mapStringBool === undefined && options.defaults) { @@ -5504,10 +5507,10 @@ $root.jspb = (function() { if (dst.mapStringDouble === undefined && options.defaults) { dst.mapStringDouble = 0; } - if (src.mapStringEnum !== undefined || options.defaults) { + if (options.defaults || src.mapStringEnum !== undefined && src.mapStringEnum !== 0) { dst.mapStringEnum = impl.enums(src.mapStringEnum, 0, types[5], options); } - if (src.mapStringMsg !== undefined && src.mapStringMsg !== null || options.defaults) { + if (options.defaults || src.mapStringMsg !== undefined && src.mapStringMsg !== null) { dst.mapStringMsg = types[6].convert(src.mapStringMsg, impl, options); } if (dst.mapInt32String === undefined && options.defaults) { @@ -5519,15 +5522,15 @@ $root.jspb = (function() { if (dst.mapBoolString === undefined && options.defaults) { dst.mapBoolString = ""; } - if (src.testMapFields !== undefined && src.testMapFields !== null || options.defaults) { + if (options.defaults || src.testMapFields !== undefined && src.testMapFields !== null) { dst.testMapFields = types[10].convert(src.testMapFields, impl, options); } - if (src.mapStringTestmapfields !== undefined && src.mapStringTestmapfields !== null || options.defaults) { + if (options.defaults || src.mapStringTestmapfields !== undefined && src.mapStringTestmapfields !== null) { dst.mapStringTestmapfields = types[11].convert(src.mapStringTestmapfields, impl, options); } } return dst; - };})($types); + };})($protobuf.util, $types); /** * Creates a TestMapFieldsNoBinary message from JSON. @@ -6829,10 +6832,10 @@ $root.google = (function() { dst.extension = []; } } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[9].convert(src.options, impl, options); } - if (src.sourceCodeInfo !== undefined && src.sourceCodeInfo !== null || options.defaults) { + if (options.defaults || src.sourceCodeInfo !== undefined && src.sourceCodeInfo !== null) { dst.sourceCodeInfo = types[10].convert(src.sourceCodeInfo, impl, options); } if (dst.syntax === undefined && options.defaults) { @@ -7307,7 +7310,7 @@ $root.google = (function() { dst.oneofDecl = []; } } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[7].convert(src.options, impl, options); } if (src.reservedRange && src.reservedRange.length) { @@ -8036,10 +8039,10 @@ $root.google = (function() { if (dst.number === undefined && options.defaults) { dst.number = 0; } - if (src.label !== undefined || options.defaults) { + if (options.defaults || src.label !== undefined && src.label !== 1) { dst.label = impl.enums(src.label, 1, types[2], options); } - if (src.type !== undefined || options.defaults) { + if (options.defaults || src.type !== undefined && src.type !== 1) { dst.type = impl.enums(src.type, 1, types[3].values, options); } if (dst.typeName === undefined && options.defaults) { @@ -8057,7 +8060,7 @@ $root.google = (function() { if (dst.jsonName === undefined && options.defaults) { dst.jsonName = ""; } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[9].convert(src.options, impl, options); } } @@ -8304,7 +8307,7 @@ $root.google = (function() { if (dst.name === undefined && options.defaults) { dst.name = ""; } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[1].convert(src.options, impl, options); } } @@ -8524,7 +8527,7 @@ $root.google = (function() { dst.value = []; } } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[2].convert(src.options, impl, options); } } @@ -8726,7 +8729,7 @@ $root.google = (function() { if (dst.number === undefined && options.defaults) { dst.number = 0; } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[2].convert(src.options, impl, options); } } @@ -8946,7 +8949,7 @@ $root.google = (function() { dst.method = []; } } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[2].convert(src.options, impl, options); } } @@ -9205,7 +9208,7 @@ $root.google = (function() { if (dst.outputType === undefined && options.defaults) { dst.outputType = ""; } - if (src.options !== undefined && src.options !== null || options.defaults) { + if (options.defaults || src.options !== undefined && src.options !== null) { dst.options = types[3].convert(src.options, impl, options); } if (dst.clientStreaming === undefined && options.defaults) { @@ -9654,7 +9657,7 @@ $root.google = (function() { if (dst.javaStringCheckUtf8 === undefined && options.defaults) { dst.javaStringCheckUtf8 = false; } - if (src.optimizeFor !== undefined || options.defaults) { + if (options.defaults || src.optimizeFor !== undefined && src.optimizeFor !== undefined) { dst.optimizeFor = impl.enums(src.optimizeFor, undefined, types[5], options); } if (dst.goPackage === undefined && options.defaults) { @@ -10257,13 +10260,13 @@ $root.google = (function() { } var dst = impl.create(src, this, options); if (dst) { - if (src.ctype !== undefined || options.defaults) { + if (options.defaults || src.ctype !== undefined && src.ctype !== undefined) { dst.ctype = impl.enums(src.ctype, undefined, types[0], options); } if (dst.packed === undefined && options.defaults) { dst.packed = false; } - if (src.jstype !== undefined || options.defaults) { + if (options.defaults || src.jstype !== undefined && src.jstype !== undefined) { dst.jstype = impl.enums(src.jstype, undefined, types[2].values, options); } if (dst.lazy === undefined && options.defaults) { @@ -11347,7 +11350,7 @@ $root.google = (function() { if (dst.deprecated === undefined && options.defaults) { dst.deprecated = false; } - if (src.idempotencyLevel !== undefined || options.defaults) { + if (options.defaults || src.idempotencyLevel !== undefined && src.idempotencyLevel !== undefined) { dst.idempotencyLevel = impl.enums(src.idempotencyLevel, undefined, types[1], options); } if (src.uninterpretedOption && src.uninterpretedOption.length) { @@ -11647,7 +11650,7 @@ $root.google = (function() { * @param {Object.} [options] Conversion options * @returns {google.protobuf.UninterpretedOption|Object} Converted message */ - UninterpretedOption.convert = (function(types) { return function convert(src, impl, options) { + UninterpretedOption.convert = (function(util, types) { return function convert(src, impl, options) { if (!options) { options = {}; } @@ -11666,16 +11669,16 @@ $root.google = (function() { if (dst.identifierValue === undefined && options.defaults) { dst.identifierValue = ""; } - if (src.positiveIntValue !== undefined && src.positiveIntValue !== null || options.defaults) { + if (options.defaults || src.positiveIntValue !== undefined && src.positiveIntValue !== null && util.longNe(src.positiveIntValue, 0, 0)) { dst.positiveIntValue = impl.longs(src.positiveIntValue, 0, 0, true, options); } - if (src.negativeIntValue !== undefined && src.negativeIntValue !== null || options.defaults) { + if (options.defaults || src.negativeIntValue !== undefined && src.negativeIntValue !== null && util.longNe(src.negativeIntValue, 0, 0)) { dst.negativeIntValue = impl.longs(src.negativeIntValue, 0, 0, false, options); } if (dst.doubleValue === undefined && options.defaults) { dst.doubleValue = 0; } - if (src.stringValue !== undefined || options.defaults) { + if (options.defaults || src.stringValue !== undefined && src.stringValue !== []) { dst.stringValue = impl.bytes(src.stringValue, [], options); } if (dst.aggregateValue === undefined && options.defaults) { @@ -11683,7 +11686,7 @@ $root.google = (function() { } } return dst; - };})($types); + };})($protobuf.util, $types); /** * Creates an UninterpretedOption message from JSON.