Index: third_party/protobuf/js/message_test.js |
diff --git a/third_party/protobuf/js/message_test.js b/third_party/protobuf/js/message_test.js |
index 01add5f1dd279d9b1a6c4fa7f29eccca4980770a..082da944b3b1ff4c61932dbd91fa11dbb308e14e 100644 |
--- a/third_party/protobuf/js/message_test.js |
+++ b/third_party/protobuf/js/message_test.js |
@@ -34,6 +34,7 @@ goog.setTestOnly(); |
goog.require('goog.json'); |
goog.require('goog.testing.asserts'); |
+goog.require('goog.userAgent'); |
// CommonJS-LoadFromFile: google-protobuf jspb |
goog.require('jspb.Message'); |
@@ -66,15 +67,18 @@ goog.require('proto.jspb.test.Simple1'); |
goog.require('proto.jspb.test.Simple2'); |
goog.require('proto.jspb.test.SpecialCases'); |
goog.require('proto.jspb.test.TestClone'); |
+goog.require('proto.jspb.test.TestEndsWithBytes'); |
goog.require('proto.jspb.test.TestGroup'); |
goog.require('proto.jspb.test.TestGroup1'); |
goog.require('proto.jspb.test.TestMessageWithOneof'); |
goog.require('proto.jspb.test.TestReservedNames'); |
goog.require('proto.jspb.test.TestReservedNamesExtension'); |
+goog.require('proto.jspb.test.Deeply.Nested.Message'); |
// CommonJS-LoadFromFile: test2_pb proto.jspb.test |
goog.require('proto.jspb.test.ExtensionMessage'); |
goog.require('proto.jspb.test.TestExtensionsMessage'); |
+goog.require('proto.jspb.test.ForeignNestedFieldMessage'); |
@@ -213,6 +217,10 @@ describe('Message test suite', function() { |
assertEquals(true, response.getBoolField()); |
assertEquals(11, response.getIntField()); |
assertEquals(13, response.getEnumField()); |
+ assertFalse(response.hasStringField()); |
+ assertFalse(response.hasBoolField()); |
+ assertFalse(response.hasIntField()); |
+ assertFalse(response.hasEnumField()); |
// Test with null values, as would be returned by a JSON serializer. |
response = makeDefault([null, null, null, null]); |
@@ -220,6 +228,10 @@ describe('Message test suite', function() { |
assertEquals(true, response.getBoolField()); |
assertEquals(11, response.getIntField()); |
assertEquals(13, response.getEnumField()); |
+ assertFalse(response.hasStringField()); |
+ assertFalse(response.hasBoolField()); |
+ assertFalse(response.hasIntField()); |
+ assertFalse(response.hasEnumField()); |
// Test with false-like values. |
response = makeDefault(['', false, 0, 0]); |
@@ -227,6 +239,10 @@ describe('Message test suite', function() { |
assertEquals(false, response.getBoolField()); |
assertEquals(true, response.getIntField() == 0); |
assertEquals(true, response.getEnumField() == 0); |
+ assertTrue(response.hasStringField()); |
+ assertTrue(response.hasBoolField()); |
+ assertTrue(response.hasIntField()); |
+ assertTrue(response.hasEnumField()); |
// Test that clearing the values reverts them to the default state. |
response = makeDefault(['blah', false, 111, 77]); |
@@ -236,6 +252,10 @@ describe('Message test suite', function() { |
assertEquals(true, response.getBoolField()); |
assertEquals(11, response.getIntField()); |
assertEquals(13, response.getEnumField()); |
+ assertFalse(response.hasStringField()); |
+ assertFalse(response.hasBoolField()); |
+ assertFalse(response.hasIntField()); |
+ assertFalse(response.hasEnumField()); |
// Test that setFoo(null) clears the values. |
response = makeDefault(['blah', false, 111, 77]); |
@@ -245,18 +265,19 @@ describe('Message test suite', function() { |
assertEquals(true, response.getBoolField()); |
assertEquals(11, response.getIntField()); |
assertEquals(13, response.getEnumField()); |
+ assertFalse(response.hasStringField()); |
+ assertFalse(response.hasBoolField()); |
+ assertFalse(response.hasIntField()); |
+ assertFalse(response.hasEnumField()); |
}); |
- it('testMessageRegistration', function() { |
+ it('testMessageRegistration', /** @suppress {visibility} */ function() { |
// goog.require(SomeResponse) will include its library, which will in |
// turn add SomeResponse to the message registry. |
assertEquals(jspb.Message.registry_['res'], proto.jspb.test.SomeResponse); |
}); |
it('testClearFields', function() { |
- // We don't set 'proper' defaults, rather, bools, strings, |
- // etc, are cleared to undefined or null and take on the Javascript |
- // meaning for that value. Repeated fields are set to [] when cleared. |
var data = ['str', true, [11], [[22], [33]], ['s1', 's2']]; |
var foo = new proto.jspb.test.OptionalFields(data); |
foo.clearAString(); |
@@ -264,9 +285,11 @@ describe('Message test suite', function() { |
foo.clearANestedMessage(); |
foo.clearARepeatedMessageList(); |
foo.clearARepeatedStringList(); |
- assertUndefined(foo.getAString()); |
- assertUndefined(foo.getABool()); |
+ assertEquals('', foo.getAString()); |
+ assertEquals(false, foo.getABool()); |
assertUndefined(foo.getANestedMessage()); |
+ assertFalse(foo.hasAString()); |
+ assertFalse(foo.hasABool()); |
assertObjectEquals([], foo.getARepeatedMessageList()); |
assertObjectEquals([], foo.getARepeatedStringList()); |
// NOTE: We want the missing fields in 'expected' to be undefined, |
@@ -276,51 +299,17 @@ describe('Message test suite', function() { |
var expected = [,,, [], []]; |
expected[0] = expected[1] = expected[2] = undefined; |
assertObjectEquals(expected, foo.toArray()); |
- |
- // Test set(null). We could deprecated this in favor of clear(), but |
- // it's also convenient to have. |
- data = ['str', true, [11], [[22], [33]], ['s1', 's2']]; |
- foo = new proto.jspb.test.OptionalFields(data); |
- foo.setAString(null); |
- foo.setABool(null); |
- foo.setANestedMessage(null); |
- foo.setARepeatedMessageList(null); |
- foo.setARepeatedStringList(null); |
- assertNull(foo.getAString()); |
- assertNull(foo.getABool()); |
- assertNull(foo.getANestedMessage()); |
- assertObjectEquals([], foo.getARepeatedMessageList()); |
- assertObjectEquals([], foo.getARepeatedStringList()); |
- assertObjectEquals([null, null, null, [], []], foo.toArray()); |
- |
- // Test set(undefined). Again, not something we really need, and not |
- // supported directly by our typing, but it should 'do the right thing'. |
- data = ['str', true, [11], [[22], [33]], ['s1', 's2']]; |
- foo = new proto.jspb.test.OptionalFields(data); |
- foo.setAString(undefined); |
- foo.setABool(undefined); |
- foo.setANestedMessage(undefined); |
- foo.setARepeatedMessageList(undefined); |
- foo.setARepeatedStringList(undefined); |
- assertUndefined(foo.getAString()); |
- assertUndefined(foo.getABool()); |
- assertUndefined(foo.getANestedMessage()); |
- assertObjectEquals([], foo.getARepeatedMessageList()); |
- assertObjectEquals([], foo.getARepeatedStringList()); |
- expected = [,,, [], []]; |
- expected[0] = expected[1] = expected[2] = undefined; |
- assertObjectEquals(expected, foo.toArray()); |
}); |
- it('testDifferenceRawObject', function() { |
+ it('testDifferenceRawObject', /** @suppress {visibility} */ function() { |
var p1 = new proto.jspb.test.HasExtensions(['hi', 'diff', {}]); |
var p2 = new proto.jspb.test.HasExtensions(['hi', 'what', |
{1000: 'unique'}]); |
var diff = /** @type {proto.jspb.test.HasExtensions} */ |
(jspb.Message.difference(p1, p2)); |
- assertUndefined(diff.getStr1()); |
+ assertEquals('', diff.getStr1()); |
assertEquals('what', diff.getStr2()); |
- assertUndefined(diff.getStr3()); |
+ assertEquals('', diff.getStr3()); |
assertEquals('unique', diff.extensionObject_[1000]); |
}); |
@@ -438,6 +427,8 @@ describe('Message test suite', function() { |
}); |
it('testClone', function() { |
+ var supportsUint8Array = |
+ !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10'); |
var original = new proto.jspb.test.TestClone(); |
original.setStr('v1'); |
var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]); |
@@ -445,12 +436,14 @@ describe('Message test suite', function() { |
var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]); |
original.setSimple1(simple1); |
original.setSimple2List([simple2, simple3]); |
+ var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123'; |
+ original.setBytesField(bytes1); |
var extension = new proto.jspb.test.CloneExtension(); |
extension.setExt('e1'); |
original.setExtension(proto.jspb.test.IsExtension.extField, extension); |
- var clone = original.cloneMessage(); |
+ var clone = original.clone(); |
assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],, |
- [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]],,, { 100: [, 'e1'] }], |
+ [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }], |
clone.toArray()); |
clone.setStr('v2'); |
var simple4 = new proto.jspb.test.Simple1(['a1', ['b1', 'c1']]); |
@@ -458,18 +451,26 @@ describe('Message test suite', function() { |
var simple6 = new proto.jspb.test.Simple1(['a3', ['b3', 'c3']]); |
clone.setSimple1(simple4); |
clone.setSimple2List([simple5, simple6]); |
+ if (supportsUint8Array) { |
+ clone.getBytesField()[0] = 4; |
+ assertObjectEquals(bytes1, original.getBytesField()); |
+ } |
+ var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456'; |
+ clone.setBytesField(bytes2); |
var newExtension = new proto.jspb.test.CloneExtension(); |
newExtension.setExt('e2'); |
clone.setExtension(proto.jspb.test.CloneExtension.extField, newExtension); |
assertArrayEquals(['v2',, ['a1', ['b1', 'c1']],, |
- [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]],,, { 100: [, 'e2'] }], |
+ [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]], bytes2,, { 100: [, 'e2'] }], |
clone.toArray()); |
assertArrayEquals(['v1',, ['x1', ['y1', 'z1']],, |
- [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]],,, { 100: [, 'e1'] }], |
+ [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1,, { 100: [, 'e1'] }], |
original.toArray()); |
}); |
it('testCopyInto', function() { |
+ var supportsUint8Array = |
+ !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10'); |
var original = new proto.jspb.test.TestClone(); |
original.setStr('v1'); |
var dest = new proto.jspb.test.TestClone(); |
@@ -484,6 +485,10 @@ describe('Message test suite', function() { |
original.setSimple2List([simple2, simple3]); |
dest.setSimple1(destSimple1); |
dest.setSimple2List([destSimple2, destSimple3]); |
+ var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123'; |
+ var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456'; |
+ original.setBytesField(bytes1); |
+ dest.setBytesField(bytes2); |
var extension = new proto.jspb.test.CloneExtension(); |
extension.setExt('e1'); |
original.setExtension(proto.jspb.test.CloneExtension.extField, extension); |
@@ -496,6 +501,15 @@ describe('Message test suite', function() { |
dest.getSimple1().setAString('new value'); |
assertNotEquals(dest.getSimple1().getAString(), |
original.getSimple1().getAString()); |
+ if (supportsUint8Array) { |
+ dest.getBytesField()[0] = 7; |
+ assertObjectEquals(bytes1, original.getBytesField()); |
+ assertObjectEquals(new Uint8Array([7, 2, 3]), dest.getBytesField()); |
+ } else { |
+ dest.setBytesField('789'); |
+ assertObjectEquals(bytes1, original.getBytesField()); |
+ assertObjectEquals('789', dest.getBytesField()); |
+ } |
dest.getExtension(proto.jspb.test.CloneExtension.extField). |
setExt('new value'); |
assertNotEquals( |
@@ -662,11 +676,12 @@ describe('Message test suite', function() { |
assertArrayEquals([1, 2, 3, {1: 'hi'}], msg.toArray()); |
}); |
- it('testExtendedMessageEnsureObject', function() { |
- var data = new proto.jspb.test.HasExtensions(['str1', |
- {'a_key': 'an_object'}]); |
- assertEquals('an_object', data.extensionObject_['a_key']); |
- }); |
+ it('testExtendedMessageEnsureObject', |
+ /** @suppress {visibility} */ function() { |
+ var data = |
+ new proto.jspb.test.HasExtensions(['str1', {'a_key': 'an_object'}]); |
+ assertEquals('an_object', data.extensionObject_['a_key']); |
+ }); |
it('testToObject_hasExtensionField', function() { |
var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]); |
@@ -753,7 +768,7 @@ describe('Message test suite', function() { |
var message = new proto.jspb.test.TestMessageWithOneof([,, 'x']); |
assertEquals('x', message.getPone()); |
- assertUndefined(message.getPthree()); |
+ assertEquals('', message.getPthree()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE, |
message.getPartialOneofCase()); |
@@ -762,7 +777,7 @@ describe('Message test suite', function() { |
it('testKeepsLastWireValueSetInUnion_multipleValues', function() { |
var message = new proto.jspb.test.TestMessageWithOneof([,, 'x',, 'y']); |
- assertUndefined('x', message.getPone()); |
+ assertEquals('', message.getPone()); |
assertEquals('y', message.getPthree()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PTHREE, |
@@ -771,35 +786,47 @@ describe('Message test suite', function() { |
it('testSettingOneofFieldClearsOthers', function() { |
var message = new proto.jspb.test.TestMessageWithOneof; |
- assertUndefined(message.getPone()); |
- assertUndefined(message.getPthree()); |
+ assertEquals('', message.getPone()); |
+ assertEquals('', message.getPthree()); |
+ assertFalse(message.hasPone()); |
+ assertFalse(message.hasPthree()); |
message.setPone('hi'); |
assertEquals('hi', message.getPone()); |
- assertUndefined(message.getPthree()); |
+ assertEquals('', message.getPthree()); |
+ assertTrue(message.hasPone()); |
+ assertFalse(message.hasPthree()); |
message.setPthree('bye'); |
- assertUndefined(message.getPone()); |
+ assertEquals('', message.getPone()); |
assertEquals('bye', message.getPthree()); |
+ assertFalse(message.hasPone()); |
+ assertTrue(message.hasPthree()); |
}); |
it('testSettingOneofFieldDoesNotClearFieldsFromOtherUnions', function() { |
var other = new proto.jspb.test.TestMessageWithOneof; |
var message = new proto.jspb.test.TestMessageWithOneof; |
- assertUndefined(message.getPone()); |
- assertUndefined(message.getPthree()); |
+ assertEquals('', message.getPone()); |
+ assertEquals('', message.getPthree()); |
assertUndefined(message.getRone()); |
+ assertFalse(message.hasPone()); |
+ assertFalse(message.hasPthree()); |
message.setPone('hi'); |
message.setRone(other); |
assertEquals('hi', message.getPone()); |
- assertUndefined(message.getPthree()); |
+ assertEquals('', message.getPthree()); |
assertEquals(other, message.getRone()); |
+ assertTrue(message.hasPone()); |
+ assertFalse(message.hasPthree()); |
message.setPthree('bye'); |
- assertUndefined(message.getPone()); |
+ assertEquals('', message.getPone()); |
assertEquals('bye', message.getPthree()); |
assertEquals(other, message.getRone()); |
+ assertFalse(message.hasPone()); |
+ assertTrue(message.hasPthree()); |
}); |
it('testUnsetsOneofCaseWhenFieldIsCleared', function() { |
@@ -824,7 +851,7 @@ describe('Message test suite', function() { |
it('testMessageWithDefaultOneofValues', function() { |
var message = new proto.jspb.test.TestMessageWithOneof; |
assertEquals(1234, message.getAone()); |
- assertUndefined(message.getAtwo()); |
+ assertEquals(0, message.getAtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofACase |
.DEFAULT_ONEOF_A_NOT_SET, |
@@ -832,7 +859,7 @@ describe('Message test suite', function() { |
message.setAone(567); |
assertEquals(567, message.getAone()); |
- assertUndefined(message.getAtwo()); |
+ assertEquals(0, message.getAtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE, |
message.getDefaultOneofACase()); |
@@ -846,7 +873,7 @@ describe('Message test suite', function() { |
message.clearAtwo(); |
assertEquals(1234, message.getAone()); |
- assertUndefined(message.getAtwo()); |
+ assertEquals(0, message.getAtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofACase |
.DEFAULT_ONEOF_A_NOT_SET, |
@@ -855,8 +882,10 @@ describe('Message test suite', function() { |
it('testMessageWithDefaultOneofValues_defaultNotOnFirstField', function() { |
var message = new proto.jspb.test.TestMessageWithOneof; |
- assertUndefined(message.getBone()); |
+ assertEquals(0, message.getBone()); |
assertEquals(1234, message.getBtwo()); |
+ assertFalse(message.hasBone()); |
+ assertFalse(message.hasBtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase |
.DEFAULT_ONEOF_B_NOT_SET, |
@@ -865,19 +894,25 @@ describe('Message test suite', function() { |
message.setBone(2); |
assertEquals(2, message.getBone()); |
assertEquals(1234, message.getBtwo()); |
+ assertTrue(message.hasBone()); |
+ assertFalse(message.hasBtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BONE, |
message.getDefaultOneofBCase()); |
message.setBtwo(3); |
- assertUndefined(message.getBone()); |
+ assertEquals(0, message.getBone()); |
+ assertFalse(message.hasBone()); |
+ assertTrue(message.hasBtwo()); |
assertEquals(3, message.getBtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO, |
message.getDefaultOneofBCase()); |
message.clearBtwo(); |
- assertUndefined(message.getBone()); |
+ assertEquals(0, message.getBone()); |
+ assertFalse(message.hasBone()); |
+ assertFalse(message.hasBtwo()); |
assertEquals(1234, message.getBtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase |
@@ -889,7 +924,7 @@ describe('Message test suite', function() { |
var message = |
new proto.jspb.test.TestMessageWithOneof(new Array(9).concat(567)); |
assertEquals(567, message.getAone()); |
- assertUndefined(message.getAtwo()); |
+ assertEquals(0, message.getAtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofACase.AONE, |
message.getDefaultOneofACase()); |
@@ -925,7 +960,7 @@ describe('Message test suite', function() { |
message = |
new proto.jspb.test.TestMessageWithOneof(new Array(12).concat(890)); |
- assertUndefined(message.getBone()); |
+ assertEquals(0, message.getBone()); |
assertEquals(890, message.getBtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO, |
@@ -933,7 +968,7 @@ describe('Message test suite', function() { |
message = new proto.jspb.test.TestMessageWithOneof( |
new Array(11).concat(567, 890)); |
- assertUndefined(message.getBone()); |
+ assertEquals(0, message.getBone()); |
assertEquals(890, message.getBtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.DefaultOneofBCase.BTWO, |
@@ -950,7 +985,7 @@ describe('Message test suite', function() { |
var other = new proto.jspb.test.TestMessageWithOneof; |
message.setRone(other); |
assertEquals(other, message.getRone()); |
- assertUndefined(message.getRtwo()); |
+ assertEquals('', message.getRtwo()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase.RONE, |
message.getRecursiveOneofCase()); |
@@ -968,7 +1003,7 @@ describe('Message test suite', function() { |
var message = new proto.jspb.test.TestMessageWithOneof; |
message.setPone('x'); |
assertEquals('x', message.getPone()); |
- assertUndefined(message.getPthree()); |
+ assertEquals('', message.getPthree()); |
assertEquals( |
proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE, |
message.getPartialOneofCase()); |
@@ -1007,4 +1042,21 @@ describe('Message test suite', function() { |
assertNan(message.getDefaultDoubleField()); |
}); |
+ // Verify that we can successfully use a field referring to a nested message |
+ // from a different .proto file. |
+ it('testForeignNestedMessage', function() { |
+ var msg = new proto.jspb.test.ForeignNestedFieldMessage(); |
+ var nested = new proto.jspb.test.Deeply.Nested.Message(); |
+ nested.setCount(5); |
+ msg.setDeeplyNestedMessage(nested); |
+ assertEquals(5, msg.getDeeplyNestedMessage().getCount()); |
+ |
+ // After a serialization-deserialization round trip we should get back the |
+ // same data we started with. |
+ var serialized = msg.serializeBinary(); |
+ var deserialized = |
+ proto.jspb.test.ForeignNestedFieldMessage.deserializeBinary(serialized); |
+ assertEquals(5, deserialized.getDeeplyNestedMessage().getCount()); |
+ }); |
+ |
}); |