blob: 2a524deebab832d48c1b8065d91d7b082667728b [file] [log] [blame]
Feng Xiaoe841bac2015-12-11 17:09:20 -08001// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31// Test suite is written using Jasmine -- see http://jasmine.github.io/
32
33goog.setTestOnly();
34
Adam Cozzette92a7e772017-12-01 10:05:10 -080035goog.require('goog.testing.PropertyReplacer');
Feng Xiaoe841bac2015-12-11 17:09:20 -080036goog.require('goog.testing.asserts');
Adam Cozzetted64a2d92016-06-29 15:23:27 -070037goog.require('goog.userAgent');
Josh Habermane9f31ee2016-02-04 10:29:27 -080038
Josh Haberman77af5d02016-02-04 16:11:07 -080039// CommonJS-LoadFromFile: google-protobuf jspb
Feng Xiaoe841bac2015-12-11 17:09:20 -080040goog.require('jspb.Message');
Josh Habermane9f31ee2016-02-04 10:29:27 -080041
Adam Cozzette0894e072018-11-09 11:28:22 -080042// CommonJS-LoadFromFile: test15_pb proto.jspb.filenametest.package1
43goog.require('proto.jspb.filenametest.package1.b');
44
45// CommonJS-LoadFromFile: test14_pb proto.jspb.filenametest.package2
46goog.require('proto.jspb.filenametest.package2.TestMessage');
47
48// CommonJS-LoadFromFile: test13_pb proto.jspb.filenametest.package1
49goog.require('proto.jspb.filenametest.package1.a');
50goog.require('proto.jspb.filenametest.package1.TestMessage');
51
52// CommonJS-LoadFromFile: test12_pb proto.jspb.circulartest
53goog.require('proto.jspb.circulartest.ExtensionContainingType1');
54goog.require('proto.jspb.circulartest.ExtensionContainingType2');
55goog.require('proto.jspb.circulartest.ExtensionField1');
56goog.require('proto.jspb.circulartest.ExtensionField2');
57goog.require('proto.jspb.circulartest.ExtensionField3');
58goog.require('proto.jspb.circulartest.MapField1');
59goog.require('proto.jspb.circulartest.MapField2');
60goog.require('proto.jspb.circulartest.MessageField1');
61goog.require('proto.jspb.circulartest.MessageField2');
62goog.require('proto.jspb.circulartest.NestedEnum1');
63goog.require('proto.jspb.circulartest.NestedEnum2');
64goog.require('proto.jspb.circulartest.NestedMessage1');
65goog.require('proto.jspb.circulartest.NestedMessage2');
66goog.require('proto.jspb.circulartest.RepeatedMessageField1');
67goog.require('proto.jspb.circulartest.RepeatedMessageField2');
68
69// CommonJS-LoadFromFile: test11_pb proto.jspb.exttest.reverse
70goog.require('proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage1');
71goog.require('proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage2');
72goog.require('proto.jspb.exttest.reverse.c');
73
Marcus Longmuir2c16f692017-01-07 00:59:47 +000074// CommonJS-LoadFromFile: test8_pb proto.jspb.exttest.nested
Feng Xiaod36c0c52017-03-29 14:32:48 -070075goog.require('proto.jspb.exttest.nested.TestNestedExtensionsMessage');
Marcus Longmuir2c16f692017-01-07 00:59:47 +000076goog.require('proto.jspb.exttest.nested.TestOuterMessage');
77
Josh Haberman77af5d02016-02-04 16:11:07 -080078// CommonJS-LoadFromFile: test5_pb proto.jspb.exttest.beta
Feng Xiaoe841bac2015-12-11 17:09:20 -080079goog.require('proto.jspb.exttest.beta.floatingStrField');
Josh Habermane9f31ee2016-02-04 10:29:27 -080080
Josh Haberman77af5d02016-02-04 16:11:07 -080081// CommonJS-LoadFromFile: test3_pb proto.jspb.exttest
Feng Xiaoe841bac2015-12-11 17:09:20 -080082goog.require('proto.jspb.exttest.floatingMsgField');
Josh Habermane9f31ee2016-02-04 10:29:27 -080083
Josh Haberman77af5d02016-02-04 16:11:07 -080084// CommonJS-LoadFromFile: test4_pb proto.jspb.exttest
Feng Xiaoe841bac2015-12-11 17:09:20 -080085goog.require('proto.jspb.exttest.floatingMsgFieldTwo');
Josh Habermane9f31ee2016-02-04 10:29:27 -080086
Josh Haberman77af5d02016-02-04 16:11:07 -080087// CommonJS-LoadFromFile: test_pb proto.jspb.test
Hao Nguyend0f91c82019-03-06 12:39:12 -080088goog.require('proto.jspb.test.BooleanFields');
Feng Xiaoe841bac2015-12-11 17:09:20 -080089goog.require('proto.jspb.test.CloneExtension');
90goog.require('proto.jspb.test.Complex');
91goog.require('proto.jspb.test.DefaultValues');
92goog.require('proto.jspb.test.Empty');
93goog.require('proto.jspb.test.EnumContainer');
Jisi Liu3b3c8ab2016-03-30 11:39:59 -070094goog.require('proto.jspb.test.floatingMsgField');
95goog.require('proto.jspb.test.FloatingPointFields');
Feng Xiaoe841bac2015-12-11 17:09:20 -080096goog.require('proto.jspb.test.floatingStrField');
97goog.require('proto.jspb.test.HasExtensions');
98goog.require('proto.jspb.test.IndirectExtension');
99goog.require('proto.jspb.test.IsExtension');
100goog.require('proto.jspb.test.OptionalFields');
101goog.require('proto.jspb.test.OuterEnum');
Josh Haberman77af5d02016-02-04 16:11:07 -0800102goog.require('proto.jspb.test.OuterMessage.Complex');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800103goog.require('proto.jspb.test.Simple1');
104goog.require('proto.jspb.test.Simple2');
105goog.require('proto.jspb.test.SpecialCases');
106goog.require('proto.jspb.test.TestClone');
Feng Xiao6bbe1972018-08-08 17:00:41 -0700107goog.require('proto.jspb.test.TestCloneExtension');
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700108goog.require('proto.jspb.test.TestEndsWithBytes');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800109goog.require('proto.jspb.test.TestGroup');
110goog.require('proto.jspb.test.TestGroup1');
Adam Cozzette0894e072018-11-09 11:28:22 -0800111goog.require('proto.jspb.test.TestLastFieldBeforePivot');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800112goog.require('proto.jspb.test.TestMessageWithOneof');
113goog.require('proto.jspb.test.TestReservedNames');
114goog.require('proto.jspb.test.TestReservedNamesExtension');
115
Josh Haberman77af5d02016-02-04 16:11:07 -0800116// CommonJS-LoadFromFile: test2_pb proto.jspb.test
Josh Habermane9f31ee2016-02-04 10:29:27 -0800117goog.require('proto.jspb.test.ExtensionMessage');
118goog.require('proto.jspb.test.TestExtensionsMessage');
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700119
Paul Yang7bff8392019-07-19 14:49:01 -0700120goog.require('proto.jspb.test.TestAllowAliasEnum');
Artem Kustikov743a4322020-02-27 20:10:16 +0300121// CommonJS-LoadFromFile: testlargenumbers_pb proto.jspb.test
122goog.require('proto.jspb.test.MessageWithLargeFieldNumbers');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800123
Joshua Haberman51daaba2021-02-04 14:09:49 -0800124goog.require('proto.jspb.test.simple1');
125
Feng Xiaoe841bac2015-12-11 17:09:20 -0800126describe('Message test suite', function() {
Adam Cozzette92a7e772017-12-01 10:05:10 -0800127 var stubs = new goog.testing.PropertyReplacer();
128
129 beforeEach(function() {
130 stubs.set(jspb.Message, 'SERIALIZE_EMPTY_TRAILING_FIELDS', false);
131 });
132
133 afterEach(function() {
134 stubs.reset();
135 });
136
Feng Xiaoe841bac2015-12-11 17:09:20 -0800137 it('testEmptyProto', function() {
138 var empty1 = new proto.jspb.test.Empty([]);
139 var empty2 = new proto.jspb.test.Empty([]);
140 assertObjectEquals({}, empty1.toObject());
141 assertObjectEquals('Message should not be corrupted:', empty2, empty1);
142 });
143
144 it('testTopLevelEnum', function() {
145 var response = new proto.jspb.test.EnumContainer([]);
146 response.setOuterEnum(proto.jspb.test.OuterEnum.FOO);
147 assertEquals(proto.jspb.test.OuterEnum.FOO, response.getOuterEnum());
148 });
149
150 it('testByteStrings', function() {
151 var data = new proto.jspb.test.DefaultValues([]);
152 data.setBytesField('some_bytes');
153 assertEquals('some_bytes', data.getBytesField());
154 });
155
156 it('testComplexConversion', function() {
Bo Yang624a40a2018-12-20 14:21:20 -0800157 var data1 = ['a', , , [, 11], [[, 22], [, 33]], , ['s1', 's2'], , 1];
158 var data2 = ['a', , , [, 11], [[, 22], [, 33]], , ['s1', 's2'], , 1];
Feng Xiaoe841bac2015-12-11 17:09:20 -0800159 var foo = new proto.jspb.test.Complex(data1);
160 var bar = new proto.jspb.test.Complex(data2);
161 var result = foo.toObject();
Bo Yang624a40a2018-12-20 14:21:20 -0800162 assertObjectEquals(
163 {
164 aString: 'a',
Hao Nguyend0f91c82019-03-06 12:39:12 -0800165 anOutOfOrderBool: true,
Bo Yang624a40a2018-12-20 14:21:20 -0800166 aNestedMessage: {anInt: 11},
167 aRepeatedMessageList: [{anInt: 22}, {anInt: 33}],
Hao Nguyend0f91c82019-03-06 12:39:12 -0800168 aRepeatedStringList: ['s1', 's2'],
169 aFloatingPointField: undefined,
Bo Yang624a40a2018-12-20 14:21:20 -0800170 },
171 result);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800172
173 // Now test with the jspb instances included.
174 result = foo.toObject(true /* opt_includeInstance */);
Bo Yang624a40a2018-12-20 14:21:20 -0800175 assertObjectEquals(
176 {
177 aString: 'a',
Hao Nguyend0f91c82019-03-06 12:39:12 -0800178 anOutOfOrderBool: true,
Bo Yang624a40a2018-12-20 14:21:20 -0800179 aNestedMessage:
180 {anInt: 11, $jspbMessageInstance: foo.getANestedMessage()},
181 aRepeatedMessageList: [
182 {anInt: 22, $jspbMessageInstance: foo.getARepeatedMessageList()[0]},
183 {anInt: 33, $jspbMessageInstance: foo.getARepeatedMessageList()[1]}
184 ],
185 aRepeatedStringList: ['s1', 's2'],
Hao Nguyend0f91c82019-03-06 12:39:12 -0800186 aFloatingPointField: undefined,
Bo Yang624a40a2018-12-20 14:21:20 -0800187 $jspbMessageInstance: foo
188 },
189 result);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800190 });
191
192 it('testMissingFields', function() {
193 var foo = new proto.jspb.test.Complex([
Bo Yang624a40a2018-12-20 14:21:20 -0800194 undefined, undefined, undefined, [], undefined, undefined, undefined,
195 undefined
196 ]);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800197 var bar = new proto.jspb.test.Complex([
Bo Yang624a40a2018-12-20 14:21:20 -0800198 undefined, undefined, undefined, [], undefined, undefined, undefined,
199 undefined
200 ]);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800201 var result = foo.toObject();
Bo Yang624a40a2018-12-20 14:21:20 -0800202 assertObjectEquals(
203 {
204 aString: undefined,
205 anOutOfOrderBool: undefined,
206 aNestedMessage: {anInt: undefined},
207 // Note: JsPb converts undefined repeated fields to empty arrays.
208 aRepeatedMessageList: [],
Hao Nguyend0f91c82019-03-06 12:39:12 -0800209 aRepeatedStringList: [],
210 aFloatingPointField: undefined,
Bo Yang624a40a2018-12-20 14:21:20 -0800211 },
212 result);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800213 });
214
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700215 it('testNestedComplexMessage', function() {
216 // Instantiate the message and set a unique field, just to ensure that we
217 // are not getting jspb.test.Complex instead.
218 var msg = new proto.jspb.test.OuterMessage.Complex();
219 msg.setInnerComplexField(5);
220 });
221
Feng Xiaoe841bac2015-12-11 17:09:20 -0800222 it('testSpecialCases', function() {
223 // Note: Some property names are reserved in JavaScript.
224 // These names are converted to the Js property named pb_<reserved_name>.
Bo Yang624a40a2018-12-20 14:21:20 -0800225 var special = new proto.jspb.test.SpecialCases(
226 ['normal', 'default', 'function', 'var']);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800227 var result = special.toObject();
Bo Yang624a40a2018-12-20 14:21:20 -0800228 assertObjectEquals(
229 {
230 normal: 'normal',
231 pb_default: 'default',
232 pb_function: 'function',
233 pb_var: 'var'
234 },
235 result);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800236 });
237
238 it('testDefaultValues', function() {
Bo Yang624a40a2018-12-20 14:21:20 -0800239 var defaultString = 'default<>\'"abc';
Feng Xiaoe841bac2015-12-11 17:09:20 -0800240 var response = new proto.jspb.test.DefaultValues();
241
242 // Test toObject
Nikolai Vavilove4b129f2016-07-19 10:34:58 +0300243 var expectedObject = {
244 stringField: defaultString,
245 boolField: true,
246 intField: 11,
247 enumField: 13,
248 emptyField: '',
249 bytesField: 'bW9v'
250 };
Feng Xiaoe841bac2015-12-11 17:09:20 -0800251 assertObjectEquals(expectedObject, response.toObject());
252
253
254 // Test getters
255 response = new proto.jspb.test.DefaultValues();
256 assertEquals(defaultString, response.getStringField());
257 assertEquals(true, response.getBoolField());
258 assertEquals(11, response.getIntField());
259 assertEquals(13, response.getEnumField());
260 assertEquals('', response.getEmptyField());
261 assertEquals('bW9v', response.getBytesField());
262
263 function makeDefault(values) {
264 return new proto.jspb.test.DefaultValues(values);
265 }
266
267 // Test with undefined values,
268 // Use push to workaround IE treating undefined array elements as holes.
269 response = makeDefault([undefined, undefined, undefined, undefined]);
270 assertEquals(defaultString, response.getStringField());
271 assertEquals(true, response.getBoolField());
272 assertEquals(11, response.getIntField());
273 assertEquals(13, response.getEnumField());
Feng Xiao9086d962016-07-13 13:47:51 -0700274 assertFalse(response.hasStringField());
275 assertFalse(response.hasBoolField());
276 assertFalse(response.hasIntField());
277 assertFalse(response.hasEnumField());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800278
279 // Test with null values, as would be returned by a JSON serializer.
280 response = makeDefault([null, null, null, null]);
281 assertEquals(defaultString, response.getStringField());
282 assertEquals(true, response.getBoolField());
283 assertEquals(11, response.getIntField());
284 assertEquals(13, response.getEnumField());
Feng Xiao9086d962016-07-13 13:47:51 -0700285 assertFalse(response.hasStringField());
286 assertFalse(response.hasBoolField());
287 assertFalse(response.hasIntField());
288 assertFalse(response.hasEnumField());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800289
290 // Test with false-like values.
291 response = makeDefault(['', false, 0, 0]);
292 assertEquals('', response.getStringField());
293 assertEquals(false, response.getBoolField());
294 assertEquals(true, response.getIntField() == 0);
295 assertEquals(true, response.getEnumField() == 0);
Feng Xiao9086d962016-07-13 13:47:51 -0700296 assertTrue(response.hasStringField());
297 assertTrue(response.hasBoolField());
298 assertTrue(response.hasIntField());
299 assertTrue(response.hasEnumField());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800300
301 // Test that clearing the values reverts them to the default state.
302 response = makeDefault(['blah', false, 111, 77]);
Bo Yang624a40a2018-12-20 14:21:20 -0800303 response.clearStringField();
304 response.clearBoolField();
305 response.clearIntField();
306 response.clearEnumField();
Feng Xiaoe841bac2015-12-11 17:09:20 -0800307 assertEquals(defaultString, response.getStringField());
308 assertEquals(true, response.getBoolField());
309 assertEquals(11, response.getIntField());
310 assertEquals(13, response.getEnumField());
Feng Xiao9086d962016-07-13 13:47:51 -0700311 assertFalse(response.hasStringField());
312 assertFalse(response.hasBoolField());
313 assertFalse(response.hasIntField());
314 assertFalse(response.hasEnumField());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800315
316 // Test that setFoo(null) clears the values.
317 response = makeDefault(['blah', false, 111, 77]);
Bo Yang624a40a2018-12-20 14:21:20 -0800318 response.setStringField(null);
319 response.setBoolField(null);
320 response.setIntField(undefined);
321 response.setEnumField(undefined);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800322 assertEquals(defaultString, response.getStringField());
323 assertEquals(true, response.getBoolField());
324 assertEquals(11, response.getIntField());
325 assertEquals(13, response.getEnumField());
Feng Xiao9086d962016-07-13 13:47:51 -0700326 assertFalse(response.hasStringField());
327 assertFalse(response.hasBoolField());
328 assertFalse(response.hasIntField());
329 assertFalse(response.hasEnumField());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800330 });
331
Feng Xiaoe841bac2015-12-11 17:09:20 -0800332 it('testEqualsSimple', function() {
333 var s1 = new proto.jspb.test.Simple1(['hi']);
334 assertTrue(jspb.Message.equals(s1, new proto.jspb.test.Simple1(['hi'])));
335 assertFalse(jspb.Message.equals(s1, new proto.jspb.test.Simple1(['bye'])));
336 var s1b = new proto.jspb.test.Simple1(['hi', ['hello']]);
Bo Yang624a40a2018-12-20 14:21:20 -0800337 assertTrue(jspb.Message.equals(
338 s1b, new proto.jspb.test.Simple1(['hi', ['hello']])));
339 assertTrue(jspb.Message.equals(s1b, new proto.jspb.test.Simple1([
340 'hi', ['hello', undefined, undefined, undefined]
341 ])));
342 assertFalse(jspb.Message.equals(
343 s1b, new proto.jspb.test.Simple1(['no', ['hello']])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800344 // Test with messages of different types
345 var s2 = new proto.jspb.test.Simple2(['hi']);
346 assertFalse(jspb.Message.equals(s1, s2));
347 });
348
349 it('testEquals_softComparison', function() {
350 var s1 = new proto.jspb.test.Simple1(['hi', [], null]);
Bo Yang624a40a2018-12-20 14:21:20 -0800351 assertTrue(
352 jspb.Message.equals(s1, new proto.jspb.test.Simple1(['hi', []])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800353
354 var s1b = new proto.jspb.test.Simple1(['hi', [], true]);
Bo Yang624a40a2018-12-20 14:21:20 -0800355 assertTrue(
356 jspb.Message.equals(s1b, new proto.jspb.test.Simple1(['hi', [], 1])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800357 });
358
359 it('testEqualsComplex', function() {
Bo Yang624a40a2018-12-20 14:21:20 -0800360 var data1 = ['a', , , [, 11], [[, 22], [, 33]], , ['s1', 's2'], , 1];
361 var data2 = ['a', , , [, 11], [[, 22], [, 34]], , ['s1', 's2'], , 1];
362 var data3 = ['a', , , [, 11], [[, 22]], , ['s1', 's2'], , 1];
Feng Xiaoe841bac2015-12-11 17:09:20 -0800363 var data4 = ['hi'];
364 var c1a = new proto.jspb.test.Complex(data1);
365 var c1b = new proto.jspb.test.Complex(data1);
366 var c2 = new proto.jspb.test.Complex(data2);
367 var c3 = new proto.jspb.test.Complex(data3);
368 var s1 = new proto.jspb.test.Simple1(data4);
369
370 assertTrue(jspb.Message.equals(c1a, c1b));
371 assertFalse(jspb.Message.equals(c1a, c2));
372 assertFalse(jspb.Message.equals(c2, c3));
373 assertFalse(jspb.Message.equals(c1a, s1));
374 });
375
376 it('testEqualsExtensionsConstructed', function() {
377 assertTrue(jspb.Message.equals(
378 new proto.jspb.test.HasExtensions([]),
Bo Yang624a40a2018-12-20 14:21:20 -0800379 new proto.jspb.test.HasExtensions([{}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800380 assertTrue(jspb.Message.equals(
381 new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
Bo Yang624a40a2018-12-20 14:21:20 -0800382 new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800383 assertFalse(jspb.Message.equals(
384 new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
Bo Yang624a40a2018-12-20 14:21:20 -0800385 new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'b'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800386 assertTrue(jspb.Message.equals(
387 new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}]),
Bo Yang624a40a2018-12-20 14:21:20 -0800388 new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800389 assertTrue(jspb.Message.equals(
390 new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}]),
Bo Yang624a40a2018-12-20 14:21:20 -0800391 new proto.jspb.test.HasExtensions([, , , {100: [{200: 'a'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800392 assertTrue(jspb.Message.equals(
Bo Yang624a40a2018-12-20 14:21:20 -0800393 new proto.jspb.test.HasExtensions([, , , {100: [{200: 'a'}]}]),
394 new proto.jspb.test.HasExtensions([{100: [{200: 'a'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800395 assertTrue(jspb.Message.equals(
396 new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}]),
Bo Yang624a40a2018-12-20 14:21:20 -0800397 new proto.jspb.test.HasExtensions(['hi', , , {100: [{200: 'a'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800398 assertTrue(jspb.Message.equals(
Bo Yang624a40a2018-12-20 14:21:20 -0800399 new proto.jspb.test.HasExtensions(['hi', , , {100: [{200: 'a'}]}]),
400 new proto.jspb.test.HasExtensions(['hi', {100: [{200: 'a'}]}])));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800401 });
402
403 it('testEqualsExtensionsUnconstructed', function() {
404 assertTrue(jspb.Message.compareFields([], [{}]));
Bo Yang624a40a2018-12-20 14:21:20 -0800405 assertTrue(jspb.Message.compareFields([, , , {}], []));
406 assertTrue(jspb.Message.compareFields([, , , {}], [, , {}]));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800407 assertTrue(jspb.Message.compareFields(
408 ['hi', {100: [{200: 'a'}]}], ['hi', {100: [{200: 'a'}]}]));
409 assertFalse(jspb.Message.compareFields(
410 ['hi', {100: [{200: 'a'}]}], ['hi', {100: [{200: 'b'}]}]));
411 assertTrue(jspb.Message.compareFields(
412 [{100: [{200: 'a'}]}], [{100: [{200: 'a'}]}]));
413 assertTrue(jspb.Message.compareFields(
Bo Yang624a40a2018-12-20 14:21:20 -0800414 [{100: [{200: 'a'}]}], [, , , {100: [{200: 'a'}]}]));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800415 assertTrue(jspb.Message.compareFields(
Bo Yang624a40a2018-12-20 14:21:20 -0800416 [, , , {100: [{200: 'a'}]}], [{100: [{200: 'a'}]}]));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800417 assertTrue(jspb.Message.compareFields(
Bo Yang624a40a2018-12-20 14:21:20 -0800418 ['hi', {100: [{200: 'a'}]}], ['hi', , , {100: [{200: 'a'}]}]));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800419 assertTrue(jspb.Message.compareFields(
Bo Yang624a40a2018-12-20 14:21:20 -0800420 ['hi', , , {100: [{200: 'a'}]}], ['hi', {100: [{200: 'a'}]}]));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800421 });
422
Adam Cozzette0894e072018-11-09 11:28:22 -0800423 it('testInitializeMessageWithLastFieldNull', function() {
424 // This tests for regression to bug http://b/117298778
425 var msg = new proto.jspb.test.TestLastFieldBeforePivot([null]);
426 assertNotUndefined(msg.getLastFieldBeforePivot());
427 });
428
Adam Cozzette0400cca2018-03-13 16:37:29 -0700429 it('testEqualsNonFinite', function() {
430 assertTrue(jspb.Message.compareFields(NaN, NaN));
431 assertTrue(jspb.Message.compareFields(NaN, 'NaN'));
432 assertTrue(jspb.Message.compareFields('NaN', NaN));
433 assertTrue(jspb.Message.compareFields(Infinity, Infinity));
434 assertTrue(jspb.Message.compareFields(Infinity, 'Infinity'));
435 assertTrue(jspb.Message.compareFields('-Infinity', -Infinity));
436 assertTrue(jspb.Message.compareFields([NaN], ['NaN']));
437 assertFalse(jspb.Message.compareFields(undefined, NaN));
438 assertFalse(jspb.Message.compareFields(NaN, undefined));
439 });
440
Feng Xiaoe841bac2015-12-11 17:09:20 -0800441 it('testToMap', function() {
442 var p1 = new proto.jspb.test.Simple1(['k', ['v']]);
443 var p2 = new proto.jspb.test.Simple1(['k1', ['v1', 'v2']]);
Bo Yang624a40a2018-12-20 14:21:20 -0800444 var soymap = jspb.Message.toMap(
445 [p1, p2], proto.jspb.test.Simple1.prototype.getAString,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800446 proto.jspb.test.Simple1.prototype.toObject);
447 assertEquals('k', soymap['k'].aString);
448 assertArrayEquals(['v'], soymap['k'].aRepeatedStringList);
Bo Yang624a40a2018-12-20 14:21:20 -0800449 var protomap = jspb.Message.toMap(
450 [p1, p2], proto.jspb.test.Simple1.prototype.getAString);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800451 assertEquals('k', protomap['k'].getAString());
452 assertArrayEquals(['v'], protomap['k'].getARepeatedStringList());
453 });
454
455 it('testClone', function() {
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700456 var supportsUint8Array =
457 !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800458 var original = new proto.jspb.test.TestClone();
459 original.setStr('v1');
460 var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
461 var simple2 = new proto.jspb.test.Simple1(['x2', ['y2', 'z2']]);
462 var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
463 original.setSimple1(simple1);
464 original.setSimple2List([simple2, simple3]);
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700465 var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
466 original.setBytesField(bytes1);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800467 var extension = new proto.jspb.test.CloneExtension();
468 extension.setExt('e1');
469 original.setExtension(proto.jspb.test.IsExtension.extField, extension);
Bo Yangcc8ca5b2016-09-19 13:45:07 -0700470 var clone = original.clone();
Bo Yang624a40a2018-12-20 14:21:20 -0800471 assertArrayEquals(
472 [
473 'v1', , ['x1', ['y1', 'z1']], ,
474 [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1, ,
475 {100: [, 'e1']}
476 ],
Feng Xiaoe841bac2015-12-11 17:09:20 -0800477 clone.toArray());
478 clone.setStr('v2');
479 var simple4 = new proto.jspb.test.Simple1(['a1', ['b1', 'c1']]);
480 var simple5 = new proto.jspb.test.Simple1(['a2', ['b2', 'c2']]);
481 var simple6 = new proto.jspb.test.Simple1(['a3', ['b3', 'c3']]);
482 clone.setSimple1(simple4);
483 clone.setSimple2List([simple5, simple6]);
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700484 if (supportsUint8Array) {
485 clone.getBytesField()[0] = 4;
486 assertObjectEquals(bytes1, original.getBytesField());
487 }
488 var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
489 clone.setBytesField(bytes2);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800490 var newExtension = new proto.jspb.test.CloneExtension();
491 newExtension.setExt('e2');
492 clone.setExtension(proto.jspb.test.CloneExtension.extField, newExtension);
Bo Yang624a40a2018-12-20 14:21:20 -0800493 assertArrayEquals(
494 [
495 'v2', , ['a1', ['b1', 'c1']], ,
496 [['a2', ['b2', 'c2']], ['a3', ['b3', 'c3']]], bytes2, ,
497 {100: [, 'e2']}
498 ],
Feng Xiaoe841bac2015-12-11 17:09:20 -0800499 clone.toArray());
Bo Yang624a40a2018-12-20 14:21:20 -0800500 assertArrayEquals(
501 [
502 'v1', , ['x1', ['y1', 'z1']], ,
503 [['x2', ['y2', 'z2']], ['x3', ['y3', 'z3']]], bytes1, ,
504 {100: [, 'e1']}
505 ],
Feng Xiaoe841bac2015-12-11 17:09:20 -0800506 original.toArray());
507 });
508
509 it('testCopyInto', function() {
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700510 var supportsUint8Array =
511 !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800512 var original = new proto.jspb.test.TestClone();
513 original.setStr('v1');
514 var dest = new proto.jspb.test.TestClone();
515 dest.setStr('override');
516 var simple1 = new proto.jspb.test.Simple1(['x1', ['y1', 'z1']]);
517 var simple2 = new proto.jspb.test.Simple1(['x2', ['y2', 'z2']]);
518 var simple3 = new proto.jspb.test.Simple1(['x3', ['y3', 'z3']]);
519 var destSimple1 = new proto.jspb.test.Simple1(['ox1', ['oy1', 'oz1']]);
520 var destSimple2 = new proto.jspb.test.Simple1(['ox2', ['oy2', 'oz2']]);
521 var destSimple3 = new proto.jspb.test.Simple1(['ox3', ['oy3', 'oz3']]);
522 original.setSimple1(simple1);
523 original.setSimple2List([simple2, simple3]);
524 dest.setSimple1(destSimple1);
525 dest.setSimple2List([destSimple2, destSimple3]);
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700526 var bytes1 = supportsUint8Array ? new Uint8Array([1, 2, 3]) : '123';
527 var bytes2 = supportsUint8Array ? new Uint8Array([4, 5, 6]) : '456';
528 original.setBytesField(bytes1);
529 dest.setBytesField(bytes2);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800530 var extension = new proto.jspb.test.CloneExtension();
531 extension.setExt('e1');
532 original.setExtension(proto.jspb.test.CloneExtension.extField, extension);
533
534 jspb.Message.copyInto(original, dest);
535 assertArrayEquals(original.toArray(), dest.toArray());
536 assertEquals('x1', dest.getSimple1().getAString());
Bo Yang624a40a2018-12-20 14:21:20 -0800537 assertEquals(
538 'e1',
Feng Xiaoe841bac2015-12-11 17:09:20 -0800539 dest.getExtension(proto.jspb.test.CloneExtension.extField).getExt());
540 dest.getSimple1().setAString('new value');
Bo Yang624a40a2018-12-20 14:21:20 -0800541 assertNotEquals(
542 dest.getSimple1().getAString(), original.getSimple1().getAString());
Adam Cozzetted64a2d92016-06-29 15:23:27 -0700543 if (supportsUint8Array) {
544 dest.getBytesField()[0] = 7;
545 assertObjectEquals(bytes1, original.getBytesField());
546 assertObjectEquals(new Uint8Array([7, 2, 3]), dest.getBytesField());
547 } else {
548 dest.setBytesField('789');
549 assertObjectEquals(bytes1, original.getBytesField());
550 assertObjectEquals('789', dest.getBytesField());
551 }
Bo Yang624a40a2018-12-20 14:21:20 -0800552 dest.getExtension(proto.jspb.test.CloneExtension.extField)
553 .setExt('new value');
Feng Xiaoe841bac2015-12-11 17:09:20 -0800554 assertNotEquals(
555 dest.getExtension(proto.jspb.test.CloneExtension.extField).getExt(),
Bo Yang624a40a2018-12-20 14:21:20 -0800556 original.getExtension(proto.jspb.test.CloneExtension.extField)
557 .getExt());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800558 });
559
560 it('testCopyInto_notSameType', function() {
561 var a = new proto.jspb.test.TestClone();
562 var b = new proto.jspb.test.Simple1(['str', ['s1', 's2']]);
563
564 var e = assertThrows(function() {
565 jspb.Message.copyInto(a, b);
566 });
567 assertContains('should have the same type', e.message);
568 });
569
570 it('testExtensions', function() {
571 var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
572 var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2']]);
573 var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
574 extendable.setExtension(proto.jspb.test.IsExtension.extField, extension1);
Bo Yang624a40a2018-12-20 14:21:20 -0800575 extendable.setExtension(
576 proto.jspb.test.IndirectExtension.simple, extension2);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800577 extendable.setExtension(proto.jspb.test.IndirectExtension.str, 'xyzzy');
Bo Yang624a40a2018-12-20 14:21:20 -0800578 extendable.setExtension(
579 proto.jspb.test.IndirectExtension.repeatedStrList, ['a', 'b']);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800580 var s1 = new proto.jspb.test.Simple1(['foo', ['s1', 's2']]);
581 var s2 = new proto.jspb.test.Simple1(['bar', ['t1', 't2']]);
582 extendable.setExtension(
Bo Yang624a40a2018-12-20 14:21:20 -0800583 proto.jspb.test.IndirectExtension.repeatedSimpleList, [s1, s2]);
584 assertObjectEquals(
585 extension1,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800586 extendable.getExtension(proto.jspb.test.IsExtension.extField));
Bo Yang624a40a2018-12-20 14:21:20 -0800587 assertObjectEquals(
588 extension2,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800589 extendable.getExtension(proto.jspb.test.IndirectExtension.simple));
Bo Yang624a40a2018-12-20 14:21:20 -0800590 assertObjectEquals(
591 'xyzzy',
Feng Xiaoe841bac2015-12-11 17:09:20 -0800592 extendable.getExtension(proto.jspb.test.IndirectExtension.str));
Bo Yang624a40a2018-12-20 14:21:20 -0800593 assertObjectEquals(
594 ['a', 'b'],
595 extendable.getExtension(
596 proto.jspb.test.IndirectExtension.repeatedStrList));
597 assertObjectEquals(
598 [s1, s2],
599 extendable.getExtension(
600 proto.jspb.test.IndirectExtension.repeatedSimpleList));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800601 // Not supported yet, but it should work...
602 extendable.setExtension(proto.jspb.test.IndirectExtension.simple, null);
603 assertNull(
604 extendable.getExtension(proto.jspb.test.IndirectExtension.simple));
605 extendable.setExtension(proto.jspb.test.IndirectExtension.str, null);
606 assertNull(extendable.getExtension(proto.jspb.test.IndirectExtension.str));
607
Josh Habermane9cf31e2015-12-21 15:18:17 -0800608
Feng Xiaoe841bac2015-12-11 17:09:20 -0800609 // Extension fields with jspb.ignore = true are ignored.
610 assertUndefined(proto.jspb.test.IndirectExtension['ignored']);
611 assertUndefined(proto.jspb.test.HasExtensions['ignoredFloating']);
612 });
613
614 it('testFloatingExtensions', function() {
615 // From an autogenerated container.
616 var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
617 var extension = new proto.jspb.test.Simple1(['foo', ['s1', 's2']]);
618 extendable.setExtension(proto.jspb.test.simple1, extension);
Bo Yang624a40a2018-12-20 14:21:20 -0800619 assertObjectEquals(
620 extension, extendable.getExtension(proto.jspb.test.simple1));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800621
622 // From _lib mode.
623 extension = new proto.jspb.test.ExtensionMessage(['s1']);
624 extendable = new proto.jspb.test.TestExtensionsMessage([16]);
625 extendable.setExtension(proto.jspb.test.floatingMsgField, extension);
626 extendable.setExtension(proto.jspb.test.floatingStrField, 's2');
Bo Yang624a40a2018-12-20 14:21:20 -0800627 assertObjectEquals(
628 extension, extendable.getExtension(proto.jspb.test.floatingMsgField));
629 assertObjectEquals(
630 's2', extendable.getExtension(proto.jspb.test.floatingStrField));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800631 assertNotUndefined(proto.jspb.exttest.floatingMsgField);
632 assertNotUndefined(proto.jspb.exttest.floatingMsgFieldTwo);
633 assertNotUndefined(proto.jspb.exttest.beta.floatingStrField);
634 });
635
Marcus Longmuir2c16f692017-01-07 00:59:47 +0000636 it('testNestedExtensions', function() {
Bo Yang624a40a2018-12-20 14:21:20 -0800637 var extendable =
638 new proto.jspb.exttest.nested.TestNestedExtensionsMessage();
639 var extension =
640 new proto.jspb.exttest.nested.TestOuterMessage.NestedExtensionMessage(
641 ['s1']);
642 extendable.setExtension(
643 proto.jspb.exttest.nested.TestOuterMessage.innerExtension, extension);
644 assertObjectEquals(
645 extension,
646 extendable.getExtension(
647 proto.jspb.exttest.nested.TestOuterMessage.innerExtension));
Marcus Longmuir2c16f692017-01-07 00:59:47 +0000648 });
649
Feng Xiaoe841bac2015-12-11 17:09:20 -0800650 it('testToObject_extendedObject', function() {
651 var extension1 = new proto.jspb.test.IsExtension(['ext1field']);
652 var extension2 = new proto.jspb.test.Simple1(['str', ['s1', 's2'], true]);
653 var extendable = new proto.jspb.test.HasExtensions(['v1', 'v2', 'v3']);
654 extendable.setExtension(proto.jspb.test.IsExtension.extField, extension1);
Bo Yang624a40a2018-12-20 14:21:20 -0800655 extendable.setExtension(
656 proto.jspb.test.IndirectExtension.simple, extension2);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800657 extendable.setExtension(proto.jspb.test.IndirectExtension.str, 'xyzzy');
Bo Yang624a40a2018-12-20 14:21:20 -0800658 extendable.setExtension(
659 proto.jspb.test.IndirectExtension.repeatedStrList, ['a', 'b']);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800660 var s1 = new proto.jspb.test.Simple1(['foo', ['s1', 's2'], true]);
661 var s2 = new proto.jspb.test.Simple1(['bar', ['t1', 't2'], false]);
662 extendable.setExtension(
Bo Yang624a40a2018-12-20 14:21:20 -0800663 proto.jspb.test.IndirectExtension.repeatedSimpleList, [s1, s2]);
664 assertObjectEquals(
665 {
666 str1: 'v1',
667 str2: 'v2',
668 str3: 'v3',
669 extField: {ext1: 'ext1field'},
670 simple: {
671 aString: 'str',
672 aRepeatedStringList: ['s1', 's2'],
673 aBoolean: true
674 },
675 str: 'xyzzy',
676 repeatedStrList: ['a', 'b'],
677 repeatedSimpleList: [
678 {aString: 'foo', aRepeatedStringList: ['s1', 's2'], aBoolean: true},
679 {aString: 'bar', aRepeatedStringList: ['t1', 't2'], aBoolean: false}
680 ]
681 },
682 extendable.toObject());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800683
684 // Now, with instances included.
Bo Yang624a40a2018-12-20 14:21:20 -0800685 assertObjectEquals(
686 {
687 str1: 'v1',
688 str2: 'v2',
689 str3: 'v3',
690 extField: {
691 ext1: 'ext1field',
692 $jspbMessageInstance:
693 extendable.getExtension(proto.jspb.test.IsExtension.extField)
694 },
695 simple: {
696 aString: 'str',
697 aRepeatedStringList: ['s1', 's2'],
698 aBoolean: true,
699 $jspbMessageInstance: extendable.getExtension(
700 proto.jspb.test.IndirectExtension.simple)
701 },
702 str: 'xyzzy',
703 repeatedStrList: ['a', 'b'],
704 repeatedSimpleList: [
705 {
706 aString: 'foo',
707 aRepeatedStringList: ['s1', 's2'],
708 aBoolean: true,
709 $jspbMessageInstance: s1
710 },
711 {
712 aString: 'bar',
713 aRepeatedStringList: ['t1', 't2'],
714 aBoolean: false,
715 $jspbMessageInstance: s2
716 }
717 ],
718 $jspbMessageInstance: extendable
719 },
720 extendable.toObject(true /* opt_includeInstance */));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800721 });
722
723 it('testInitialization_emptyArray', function() {
724 var msg = new proto.jspb.test.HasExtensions([]);
Jisi Liu09354db2017-07-18 15:38:30 -0700725 assertArrayEquals([], msg.toArray());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800726 });
727
728 it('testInitialization_justExtensionObject', function() {
729 var msg = new proto.jspb.test.Empty([{1: 'hi'}]);
730 // The extensionObject is not moved from its original location.
731 assertArrayEquals([{1: 'hi'}], msg.toArray());
732 });
733
734 it('testInitialization_incompleteList', function() {
735 var msg = new proto.jspb.test.Empty([1, {4: 'hi'}]);
736 // The extensionObject is not moved from its original location.
737 assertArrayEquals([1, {4: 'hi'}], msg.toArray());
738 });
739
740 it('testInitialization_forwardCompatible', function() {
741 var msg = new proto.jspb.test.Empty([1, 2, 3, {1: 'hi'}]);
742 assertArrayEquals([1, 2, 3, {1: 'hi'}], msg.toArray());
743 });
744
Bo Yangcc8ca5b2016-09-19 13:45:07 -0700745 it('testExtendedMessageEnsureObject',
746 /** @suppress {visibility} */ function() {
747 var data =
748 new proto.jspb.test.HasExtensions(['str1', {'a_key': 'an_object'}]);
749 assertEquals('an_object', data.extensionObject_['a_key']);
750 });
Feng Xiaoe841bac2015-12-11 17:09:20 -0800751
752 it('testToObject_hasExtensionField', function() {
Bo Yang624a40a2018-12-20 14:21:20 -0800753 var data =
754 new proto.jspb.test.HasExtensions(['str1', {100: ['ext1'], 102: ''}]);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800755 var obj = data.toObject();
756 assertEquals('str1', obj.str1);
757 assertEquals('ext1', obj.extField.ext1);
Adam Cozzette651ba622017-03-06 15:12:19 -0800758 assertEquals('', obj.str);
Feng Xiaoe841bac2015-12-11 17:09:20 -0800759 });
760
761 it('testGetExtension', function() {
762 var data = new proto.jspb.test.HasExtensions(['str1', {100: ['ext1']}]);
763 assertEquals('str1', data.getStr1());
764 var extension = data.getExtension(proto.jspb.test.IsExtension.extField);
765 assertNotNull(extension);
766 assertEquals('ext1', extension.getExt1());
767 });
768
769 it('testSetExtension', function() {
770 var data = new proto.jspb.test.HasExtensions();
771 var extensionMessage = new proto.jspb.test.IsExtension(['is_extension']);
772 data.setExtension(proto.jspb.test.IsExtension.extField, extensionMessage);
773 var obj = data.toObject();
Bo Yang624a40a2018-12-20 14:21:20 -0800774 assertNotNull(data.getExtension(proto.jspb.test.IsExtension.extField));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800775 assertEquals('is_extension', obj.extField.ext1);
776 });
777
778 /**
779 * Note that group is long deprecated, we only support it because JsPb has
780 * a goal of being able to generate JS classes for all proto descriptors.
781 */
782 it('testGroups', function() {
783 var group = new proto.jspb.test.TestGroup();
784 var someGroup = new proto.jspb.test.TestGroup.RepeatedGroup();
785 someGroup.setId('g1');
786 someGroup.setSomeBoolList([true, false]);
787 group.setRepeatedGroupList([someGroup]);
788 var groups = group.getRepeatedGroupList();
789 assertEquals('g1', groups[0].getId());
790 assertObjectEquals([true, false], groups[0].getSomeBoolList());
Bo Yang624a40a2018-12-20 14:21:20 -0800791 assertObjectEquals(
792 {id: 'g1', someBoolList: [true, false]}, groups[0].toObject());
793 assertObjectEquals(
794 {
795 repeatedGroupList: [{id: 'g1', someBoolList: [true, false]}],
796 requiredGroup: {id: undefined},
797 optionalGroup: undefined,
798 requiredSimple: {aRepeatedStringList: [], aString: undefined},
799 optionalSimple: undefined,
800 id: undefined
801 },
802 group.toObject());
Feng Xiaoe841bac2015-12-11 17:09:20 -0800803 var group1 = new proto.jspb.test.TestGroup1();
804 group1.setGroup(someGroup);
805 assertEquals(someGroup, group1.getGroup());
806 });
807
808 it('testNonExtensionFieldsAfterExtensionRange', function() {
809 var data = [{'1': 'a_string'}];
810 var message = new proto.jspb.test.Complex(data);
811 assertArrayEquals([], message.getARepeatedStringList());
812 });
813
814 it('testReservedGetterNames', function() {
815 var message = new proto.jspb.test.TestReservedNames();
816 message.setExtension$(11);
817 message.setExtension(proto.jspb.test.TestReservedNamesExtension.foo, 12);
818 assertEquals(11, message.getExtension$());
Bo Yang624a40a2018-12-20 14:21:20 -0800819 assertEquals(
820 12,
821 message.getExtension(proto.jspb.test.TestReservedNamesExtension.foo));
Feng Xiaoe841bac2015-12-11 17:09:20 -0800822 assertObjectEquals({extension: 11, foo: 12}, message.toObject());
823 });
824
825 it('testInitializeMessageWithUnsetOneof', function() {
826 var message = new proto.jspb.test.TestMessageWithOneof([]);
827 assertEquals(
Bo Yang624a40a2018-12-20 14:21:20 -0800828 proto.jspb.test.TestMessageWithOneof.PartialOneofCase
829 .PARTIAL_ONEOF_NOT_SET,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800830 message.getPartialOneofCase());
831 assertEquals(
Bo Yang624a40a2018-12-20 14:21:20 -0800832 proto.jspb.test.TestMessageWithOneof.RecursiveOneofCase
833 .RECURSIVE_ONEOF_NOT_SET,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800834 message.getRecursiveOneofCase());
835 });
836
Feng Xiaoe841bac2015-12-11 17:09:20 -0800837 it('testUnsetsOneofCaseWhenFieldIsCleared', function() {
838 var message = new proto.jspb.test.TestMessageWithOneof;
839 assertEquals(
Bo Yang624a40a2018-12-20 14:21:20 -0800840 proto.jspb.test.TestMessageWithOneof.PartialOneofCase
841 .PARTIAL_ONEOF_NOT_SET,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800842 message.getPartialOneofCase());
843
844 message.setPone('hi');
845 assertEquals(
846 proto.jspb.test.TestMessageWithOneof.PartialOneofCase.PONE,
847 message.getPartialOneofCase());
848
849 message.clearPone();
850 assertEquals(
Bo Yang624a40a2018-12-20 14:21:20 -0800851 proto.jspb.test.TestMessageWithOneof.PartialOneofCase
852 .PARTIAL_ONEOF_NOT_SET,
Feng Xiaoe841bac2015-12-11 17:09:20 -0800853 message.getPartialOneofCase());
854 });
855
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700856 it('testFloatingPointFieldsSupportNan', function() {
857 var assertNan = function(x) {
Bo Yang624a40a2018-12-20 14:21:20 -0800858 assertTrue(
859 'Expected ' + x + ' (' + goog.typeOf(x) + ') to be NaN.',
Rafi Kamal58d44202019-11-11 17:06:56 -0800860 typeof x === 'number' && isNaN(x));
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700861 };
862
863 var message = new proto.jspb.test.FloatingPointFields([
Bo Yang624a40a2018-12-20 14:21:20 -0800864 'NaN', 'NaN', ['NaN', 'NaN'], 'NaN', 'NaN', 'NaN', ['NaN', 'NaN'], 'NaN'
Jisi Liu3b3c8ab2016-03-30 11:39:59 -0700865 ]);
866 assertNan(message.getOptionalFloatField());
867 assertNan(message.getRequiredFloatField());
868 assertNan(message.getRepeatedFloatFieldList()[0]);
869 assertNan(message.getRepeatedFloatFieldList()[1]);
870 assertNan(message.getDefaultFloatField());
871 assertNan(message.getOptionalDoubleField());
872 assertNan(message.getRequiredDoubleField());
873 assertNan(message.getRepeatedDoubleFieldList()[0]);
874 assertNan(message.getRepeatedDoubleFieldList()[1]);
875 assertNan(message.getDefaultDoubleField());
876 });
877
Hao Nguyend0f91c82019-03-06 12:39:12 -0800878 it('testFloatingPointsAreConvertedFromStringInput', function() {
879 var assertInf = function(x) {
880 assertTrue(
881 'Expected ' + x + ' (' + goog.typeOf(x) + ') to be Infinity.',
882 x === Infinity);
883 };
884 var message = new proto.jspb.test.FloatingPointFields([
885 Infinity, 'Infinity', ['Infinity', Infinity], 'Infinity', 'Infinity',
886 'Infinity', ['Infinity', Infinity], 'Infinity'
887 ]);
888 assertInf(message.getOptionalFloatField());
889 assertInf(message.getRequiredFloatField());
890 assertInf(message.getRepeatedFloatFieldList()[0]);
891 assertInf(message.getRepeatedFloatFieldList()[1]);
892 assertInf(message.getDefaultFloatField());
893 assertInf(message.getOptionalDoubleField());
894 assertInf(message.getRequiredDoubleField());
895 assertInf(message.getRepeatedDoubleFieldList()[0]);
896 assertInf(message.getRepeatedDoubleFieldList()[1]);
897 assertInf(message.getDefaultDoubleField());
898 });
899
900 it('testBooleansAreConvertedFromNumberInput', function() {
901 var assertBooleanFieldTrue = function(x) {
902 assertTrue(
903 'Expected ' + x + ' (' + goog.typeOf(x) + ') to be True.',
904 x === true);
905 };
906 var message = new proto.jspb.test.BooleanFields([1, 1, [true, 1]]);
907 assertBooleanFieldTrue(message.getOptionalBooleanField());
908 assertBooleanFieldTrue(message.getRequiredBooleanField());
909 assertBooleanFieldTrue(message.getRepeatedBooleanFieldList()[0]);
910 assertBooleanFieldTrue(message.getRepeatedBooleanFieldList()[1]);
911 assertBooleanFieldTrue(message.getDefaultBooleanField());
912
913 var assertBooleanFieldFalse = function(x) {
914 assertTrue(
915 'Expected ' + x + ' (' + goog.typeOf(x) + ') to be False.',
916 x === false);
917 };
918 message = new proto.jspb.test.BooleanFields([0, 0, [0, 0]]);
919 assertBooleanFieldFalse(message.getOptionalBooleanField());
920 assertBooleanFieldFalse(message.getRequiredBooleanField());
921 assertBooleanFieldFalse(message.getRepeatedBooleanFieldList()[0]);
922 assertBooleanFieldFalse(message.getRepeatedBooleanFieldList()[1]);
923 });
924
Adam Cozzette0894e072018-11-09 11:28:22 -0800925 it('testExtensionReverseOrder', function() {
926 var message2 =
927 new proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage2;
928
929 message2.setExtension(
930 proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage1.a, 233);
931 message2.setExtension(
Bo Yang624a40a2018-12-20 14:21:20 -0800932 proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage1
933 .TestExtensionReverseOrderNestedMessage1.b,
934 2333);
Adam Cozzette0894e072018-11-09 11:28:22 -0800935 message2.setExtension(proto.jspb.exttest.reverse.c, 23333);
936
937 assertEquals(
938 233,
939 message2.getExtension(
940 proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage1.a));
941 assertEquals(
942 2333,
943 message2.getExtension(
Bo Yang624a40a2018-12-20 14:21:20 -0800944 proto.jspb.exttest.reverse.TestExtensionReverseOrderMessage1
Adam Cozzette0894e072018-11-09 11:28:22 -0800945 .TestExtensionReverseOrderNestedMessage1.b));
Bo Yang624a40a2018-12-20 14:21:20 -0800946 assertEquals(23333, message2.getExtension(proto.jspb.exttest.reverse.c));
Adam Cozzette0894e072018-11-09 11:28:22 -0800947 });
948
949 it('testCircularDepsBaseOnMessageField', function() {
950 var nestMessage1 = new proto.jspb.circulartest.MessageField1;
951 var nestMessage2 = new proto.jspb.circulartest.MessageField2;
952 var message1 = new proto.jspb.circulartest.MessageField1;
953 var message2 = new proto.jspb.circulartest.MessageField2;
954
955 nestMessage1.setA(1);
956 nestMessage2.setA(2);
957 message1.setB(nestMessage2);
958 message2.setB(nestMessage1);
959
960
961 assertEquals(2, message1.getB().getA());
962 assertEquals(1, message2.getB().getA());
963 });
964
965
966 it('testCircularDepsBaseOnRepeatedMessageField', function() {
967 var nestMessage1 = new proto.jspb.circulartest.RepeatedMessageField1;
968 var nestMessage2 = new proto.jspb.circulartest.RepeatedMessageField2;
969 var message1 = new proto.jspb.circulartest.RepeatedMessageField1;
970 var message2 = new proto.jspb.circulartest.RepeatedMessageField2;
971
972 nestMessage1.setA(1);
973 nestMessage2.setA(2);
974 message1.setB(nestMessage2);
975 message2.addB(nestMessage1);
976
977
978 assertEquals(2, message1.getB().getA());
979 assertEquals(1, message2.getBList()[0].getA());
980 });
981
982 it('testCircularDepsBaseOnMapField', function() {
983 var nestMessage1 = new proto.jspb.circulartest.MapField1;
984 var nestMessage2 = new proto.jspb.circulartest.MapField2;
985 var message1 = new proto.jspb.circulartest.MapField1;
986 var message2 = new proto.jspb.circulartest.MapField2;
987
988 nestMessage1.setA(1);
989 nestMessage2.setA(2);
990 message1.setB(nestMessage2);
991 message2.getBMap().set(1, nestMessage1);
992
993
994 assertEquals(2, message1.getB().getA());
995 assertEquals(1, message2.getBMap().get(1).getA());
996 });
997
998 it('testCircularDepsBaseOnNestedMessage', function() {
999 var nestMessage1 =
1000 new proto.jspb.circulartest.NestedMessage1.NestedNestedMessage;
1001 var nestMessage2 = new proto.jspb.circulartest.NestedMessage2;
1002 var message1 = new proto.jspb.circulartest.NestedMessage1;
1003 var message2 = new proto.jspb.circulartest.NestedMessage2;
1004
1005 nestMessage1.setA(1);
1006 nestMessage2.setA(2);
1007 message1.setB(nestMessage2);
1008 message2.setB(nestMessage1);
1009
1010
1011 assertEquals(2, message1.getB().getA());
1012 assertEquals(1, message2.getB().getA());
1013 });
1014
1015 it('testCircularDepsBaseOnNestedEnum', function() {
1016 var nestMessage2 = new proto.jspb.circulartest.NestedEnum2;
1017 var message1 = new proto.jspb.circulartest.NestedEnum1;
1018 var message2 = new proto.jspb.circulartest.NestedEnum2;
1019
1020 nestMessage2.setA(2);
1021 message1.setB(nestMessage2);
1022 message2.setB(proto.jspb.circulartest.NestedEnum1.NestedNestedEnum.VALUE_1);
1023
1024
1025 assertEquals(2, message1.getB().getA());
1026 assertEquals(
1027 proto.jspb.circulartest.NestedEnum1.NestedNestedEnum.VALUE_1,
1028 message2.getB());
1029 });
1030
1031 it('testCircularDepsBaseOnExtensionContainingType', function() {
1032 var nestMessage2 = new proto.jspb.circulartest.ExtensionContainingType2;
1033 var message1 = new proto.jspb.circulartest.ExtensionContainingType1;
1034
1035 nestMessage2.setA(2);
1036 message1.setB(nestMessage2);
1037 message1.setExtension(
1038 proto.jspb.circulartest.ExtensionContainingType2.c, 1);
1039
1040
1041 assertEquals(2, message1.getB().getA());
1042 assertEquals(
1043 1,
1044 message1.getExtension(
1045 proto.jspb.circulartest.ExtensionContainingType2.c));
1046 });
1047
1048 it('testCircularDepsBaseOnExtensionField', function() {
1049 var nestMessage2 = new proto.jspb.circulartest.ExtensionField2;
1050 var message1 = new proto.jspb.circulartest.ExtensionField1;
1051 var message3 = new proto.jspb.circulartest.ExtensionField3;
1052
1053 nestMessage2.setA(2);
1054 message1.setB(nestMessage2);
1055 message3.setExtension(proto.jspb.circulartest.ExtensionField2.c, message1);
1056
1057
1058 assertEquals(
1059 2,
1060 message3.getExtension(proto.jspb.circulartest.ExtensionField2.c)
1061 .getB()
1062 .getA());
1063 });
1064
1065 it('testSameMessageNameOuputs', function() {
1066 var package1Message = new proto.jspb.filenametest.package1.TestMessage;
1067 var package2Message = new proto.jspb.filenametest.package2.TestMessage;
1068
Bo Yang624a40a2018-12-20 14:21:20 -08001069 package1Message.setExtension(proto.jspb.filenametest.package1.a, 10);
1070 package1Message.setExtension(proto.jspb.filenametest.package1.b, 11);
Adam Cozzette0894e072018-11-09 11:28:22 -08001071 package2Message.setA(12);
1072
Bo Yang624a40a2018-12-20 14:21:20 -08001073 assertEquals(
1074 10, package1Message.getExtension(proto.jspb.filenametest.package1.a));
1075 assertEquals(
1076 11, package1Message.getExtension(proto.jspb.filenametest.package1.b));
Adam Cozzette0894e072018-11-09 11:28:22 -08001077 assertEquals(12, package2Message.getA());
1078 });
1079
Artem Kustikov743a4322020-02-27 20:10:16 +03001080
1081 it('testMessageWithLargeFieldNumbers', function() {
1082 var message = new proto.jspb.test.MessageWithLargeFieldNumbers;
Joshua Habermanb99994d2020-03-31 16:25:37 -07001083
Artem Kustikov743a4322020-02-27 20:10:16 +03001084 message.setAString('string');
1085 assertEquals('string', message.getAString());
1086
1087 message.setAString('');
1088 assertEquals('', message.getAString());
1089
1090 message.setAString('new string');
1091 assertEquals('new string', message.getAString());
1092
1093 message.setABoolean(true);
1094 assertEquals(true, message.getABoolean());
1095
1096 message.setABoolean(false);
1097 assertEquals(false, message.getABoolean());
1098
1099 message.setABoolean(true);
1100 assertEquals(true, message.getABoolean());
1101
1102 message.setAInt(42);
1103 assertEquals(42, message.getAInt());
1104
1105 message.setAInt(0);
1106 assertEquals(0, message.getAInt());
1107
1108 message.setAInt(42);
1109 assertEquals(42, message.getAInt());
1110 });
Feng Xiaoe841bac2015-12-11 17:09:20 -08001111});