Skip to content

Commit 45933f0

Browse files
author
Hao Nguyen
authored
Down integrate to Github (#5839)
* Down integrate to github
1 parent 4c8e604 commit 45933f0

File tree

6 files changed

+493
-366
lines changed

6 files changed

+493
-366
lines changed

compatibility_tests/v3.1.0/message_test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,14 @@ describe('Message test suite', function() {
102102
});
103103

104104
it('testComplexConversion', function() {
105-
var data1 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
106-
var data2 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, 1];
105+
var data1 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, true];
106+
var data2 = ['a',,, [, 11], [[, 22], [, 33]],, ['s1', 's2'],, true];
107107
var foo = new proto.jspb.test.Complex(data1);
108108
var bar = new proto.jspb.test.Complex(data2);
109109
var result = foo.toObject();
110110
assertObjectEquals({
111111
aString: 'a',
112-
anOutOfOrderBool: 1,
112+
anOutOfOrderBool: true,
113113
aNestedMessage: {
114114
anInt: 11
115115
},
@@ -121,7 +121,7 @@ describe('Message test suite', function() {
121121
result = foo.toObject(true /* opt_includeInstance */);
122122
assertObjectEquals({
123123
aString: 'a',
124-
anOutOfOrderBool: 1,
124+
anOutOfOrderBool: true,
125125
aNestedMessage: {
126126
anInt: 11,
127127
$jspbMessageInstance: foo.getANestedMessage()

message.js

Lines changed: 88 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,12 @@ jspb.Message.prototype.messageId_;
268268

269269

270270
/**
271-
* Repeated float or double fields which have been converted to include only
272-
* numbers and not strings holding "NaN", "Infinity" and "-Infinity".
271+
* Repeated fields that have been converted to their proper type. This is used
272+
* for numbers stored as strings (typically "NaN", "Infinity" and "-Infinity")
273+
* and for booleans stored as numbers (0 or 1).
273274
* @private {!Object<number,boolean>|undefined}
274275
*/
275-
jspb.Message.prototype.convertedFloatingPointFields_;
276-
276+
jspb.Message.prototype.convertedPrimitiveFields_;
277277

278278
/**
279279
* Repeated fields numbers.
@@ -368,7 +368,7 @@ jspb.Message.initialize = function(
368368
msg.arrayIndexOffset_ = messageId === 0 ? -1 : 0;
369369
msg.array = data;
370370
jspb.Message.initPivotAndExtensionObject_(msg, suggestedPivot);
371-
msg.convertedFloatingPointFields_ = {};
371+
msg.convertedPrimitiveFields_ = {};
372372

373373
if (!jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS) {
374374
// TODO(jakubvrana): This is same for all instances, move to prototype.
@@ -718,6 +718,20 @@ jspb.Message.getOptionalFloatingPointField = function(msg, fieldNumber) {
718718
};
719719

720720

721+
/**
722+
* Gets the value of an optional boolean field.
723+
* @param {!jspb.Message} msg A jspb proto.
724+
* @param {number} fieldNumber The field number.
725+
* @return {?boolean|undefined} The field's value.
726+
* @protected
727+
*/
728+
jspb.Message.getBooleanField = function(msg, fieldNumber) {
729+
var value = jspb.Message.getField(msg, fieldNumber);
730+
// TODO(b/122673075): always return null when the value is null-ish.
731+
return value == null ? (value) : !!value;
732+
};
733+
734+
721735
/**
722736
* Gets the value of a repeated float or double field.
723737
* @param {!jspb.Message} msg A jspb proto.
@@ -727,20 +741,42 @@ jspb.Message.getOptionalFloatingPointField = function(msg, fieldNumber) {
727741
*/
728742
jspb.Message.getRepeatedFloatingPointField = function(msg, fieldNumber) {
729743
var values = jspb.Message.getRepeatedField(msg, fieldNumber);
730-
if (!msg.convertedFloatingPointFields_) {
731-
msg.convertedFloatingPointFields_ = {};
744+
if (!msg.convertedPrimitiveFields_) {
745+
msg.convertedPrimitiveFields_ = {};
732746
}
733-
if (!msg.convertedFloatingPointFields_[fieldNumber]) {
747+
if (!msg.convertedPrimitiveFields_[fieldNumber]) {
734748
for (var i = 0; i < values.length; i++) {
735749
// Converts "NaN", "Infinity" and "-Infinity" to their corresponding
736750
// numbers.
737751
values[i] = +values[i];
738752
}
739-
msg.convertedFloatingPointFields_[fieldNumber] = true;
753+
msg.convertedPrimitiveFields_[fieldNumber] = true;
740754
}
741755
return /** @type {!Array<number>} */ (values);
742756
};
743757

758+
/**
759+
* Gets the value of a repeated boolean field.
760+
* @param {!jspb.Message} msg A jspb proto.
761+
* @param {number} fieldNumber The field number.
762+
* @return {!Array<boolean>} The field's value.
763+
* @protected
764+
*/
765+
jspb.Message.getRepeatedBooleanField = function(msg, fieldNumber) {
766+
var values = jspb.Message.getRepeatedField(msg, fieldNumber);
767+
if (!msg.convertedPrimitiveFields_) {
768+
msg.convertedPrimitiveFields_ = {};
769+
}
770+
if (!msg.convertedPrimitiveFields_[fieldNumber]) {
771+
for (var i = 0; i < values.length; i++) {
772+
// Converts 0 and 1 to their corresponding booleans.
773+
values[i] = !!values[i];
774+
}
775+
msg.convertedPrimitiveFields_[fieldNumber] = true;
776+
}
777+
return /** @type {!Array<boolean>} */ (values);
778+
};
779+
744780

745781
/**
746782
* Coerce a 'bytes' field to a base 64 string.
@@ -849,6 +885,49 @@ jspb.Message.getFieldWithDefault = function(msg, fieldNumber, defaultValue) {
849885
};
850886

851887

888+
/**
889+
* Gets the value of a boolean field, with proto3 (non-nullable primitives)
890+
* semantics. Returns `defaultValue` if the field is not otherwise set.
891+
* @template T
892+
* @param {!jspb.Message} msg A jspb proto.
893+
* @param {number} fieldNumber The field number.
894+
* @param {boolean} defaultValue The default value.
895+
* @return {boolean} The field's value.
896+
* @protected
897+
*/
898+
jspb.Message.getBooleanFieldWithDefault = function(
899+
msg, fieldNumber, defaultValue) {
900+
var value = jspb.Message.getBooleanField(msg, fieldNumber);
901+
if (value == null) {
902+
return defaultValue;
903+
} else {
904+
return value;
905+
}
906+
};
907+
908+
909+
/**
910+
* Gets the value of a floating point field, with proto3 (non-nullable
911+
* primitives) semantics. Returns `defaultValue` if the field is not otherwise
912+
* set.
913+
* @template T
914+
* @param {!jspb.Message} msg A jspb proto.
915+
* @param {number} fieldNumber The field number.
916+
* @param {number} defaultValue The default value.
917+
* @return {number} The field's value.
918+
* @protected
919+
*/
920+
jspb.Message.getFloatingPointFieldWithDefault = function(
921+
msg, fieldNumber, defaultValue) {
922+
var value = jspb.Message.getOptionalFloatingPointField(msg, fieldNumber);
923+
if (value == null) {
924+
return defaultValue;
925+
} else {
926+
return value;
927+
}
928+
};
929+
930+
852931
/**
853932
* Alias for getFieldWithDefault used by older generated code.
854933
* @template T

message_test.js

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ goog.require('proto.jspb.exttest.floatingMsgField');
8686
goog.require('proto.jspb.exttest.floatingMsgFieldTwo');
8787

8888
// CommonJS-LoadFromFile: test_pb proto.jspb.test
89+
goog.require('proto.jspb.test.BooleanFields');
8990
goog.require('proto.jspb.test.CloneExtension');
9091
goog.require('proto.jspb.test.Complex');
9192
goog.require('proto.jspb.test.DefaultValues');
@@ -157,10 +158,11 @@ describe('Message test suite', function() {
157158
assertObjectEquals(
158159
{
159160
aString: 'a',
160-
anOutOfOrderBool: 1,
161+
anOutOfOrderBool: true,
161162
aNestedMessage: {anInt: 11},
162163
aRepeatedMessageList: [{anInt: 22}, {anInt: 33}],
163-
aRepeatedStringList: ['s1', 's2']
164+
aRepeatedStringList: ['s1', 's2'],
165+
aFloatingPointField: undefined,
164166
},
165167
result);
166168

@@ -169,14 +171,15 @@ describe('Message test suite', function() {
169171
assertObjectEquals(
170172
{
171173
aString: 'a',
172-
anOutOfOrderBool: 1,
174+
anOutOfOrderBool: true,
173175
aNestedMessage:
174176
{anInt: 11, $jspbMessageInstance: foo.getANestedMessage()},
175177
aRepeatedMessageList: [
176178
{anInt: 22, $jspbMessageInstance: foo.getARepeatedMessageList()[0]},
177179
{anInt: 33, $jspbMessageInstance: foo.getARepeatedMessageList()[1]}
178180
],
179181
aRepeatedStringList: ['s1', 's2'],
182+
aFloatingPointField: undefined,
180183
$jspbMessageInstance: foo
181184
},
182185
result);
@@ -200,7 +203,8 @@ describe('Message test suite', function() {
200203
aNestedMessage: {anInt: undefined},
201204
// Note: JsPb converts undefined repeated fields to empty arrays.
202205
aRepeatedMessageList: [],
203-
aRepeatedStringList: []
206+
aRepeatedStringList: [],
207+
aFloatingPointField: undefined,
204208
},
205209
result);
206210

@@ -869,6 +873,53 @@ describe('Message test suite', function() {
869873
assertNan(message.getDefaultDoubleField());
870874
});
871875

876+
it('testFloatingPointsAreConvertedFromStringInput', function() {
877+
var assertInf = function(x) {
878+
assertTrue(
879+
'Expected ' + x + ' (' + goog.typeOf(x) + ') to be Infinity.',
880+
x === Infinity);
881+
};
882+
var message = new proto.jspb.test.FloatingPointFields([
883+
Infinity, 'Infinity', ['Infinity', Infinity], 'Infinity', 'Infinity',
884+
'Infinity', ['Infinity', Infinity], 'Infinity'
885+
]);
886+
assertInf(message.getOptionalFloatField());
887+
assertInf(message.getRequiredFloatField());
888+
assertInf(message.getRepeatedFloatFieldList()[0]);
889+
assertInf(message.getRepeatedFloatFieldList()[1]);
890+
assertInf(message.getDefaultFloatField());
891+
assertInf(message.getOptionalDoubleField());
892+
assertInf(message.getRequiredDoubleField());
893+
assertInf(message.getRepeatedDoubleFieldList()[0]);
894+
assertInf(message.getRepeatedDoubleFieldList()[1]);
895+
assertInf(message.getDefaultDoubleField());
896+
});
897+
898+
it('testBooleansAreConvertedFromNumberInput', function() {
899+
var assertBooleanFieldTrue = function(x) {
900+
assertTrue(
901+
'Expected ' + x + ' (' + goog.typeOf(x) + ') to be True.',
902+
x === true);
903+
};
904+
var message = new proto.jspb.test.BooleanFields([1, 1, [true, 1]]);
905+
assertBooleanFieldTrue(message.getOptionalBooleanField());
906+
assertBooleanFieldTrue(message.getRequiredBooleanField());
907+
assertBooleanFieldTrue(message.getRepeatedBooleanFieldList()[0]);
908+
assertBooleanFieldTrue(message.getRepeatedBooleanFieldList()[1]);
909+
assertBooleanFieldTrue(message.getDefaultBooleanField());
910+
911+
var assertBooleanFieldFalse = function(x) {
912+
assertTrue(
913+
'Expected ' + x + ' (' + goog.typeOf(x) + ') to be False.',
914+
x === false);
915+
};
916+
message = new proto.jspb.test.BooleanFields([0, 0, [0, 0]]);
917+
assertBooleanFieldFalse(message.getOptionalBooleanField());
918+
assertBooleanFieldFalse(message.getRequiredBooleanField());
919+
assertBooleanFieldFalse(message.getRepeatedBooleanFieldList()[0]);
920+
assertBooleanFieldFalse(message.getRepeatedBooleanFieldList()[1]);
921+
});
922+
872923
it('testExtensionReverseOrder', function() {
873924
var message2 =
874925
new proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage2;

0 commit comments

Comments
 (0)