123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- // Copyright 2010 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- goog.provide('goog.proto2.MessageTest');
- goog.setTestOnly('goog.proto2.MessageTest');
- goog.require('goog.testing.TestCase');
- goog.require('goog.testing.jsunit');
- goog.require('proto2.TestAllTypes');
- goog.require('proto2.TestAllTypes.NestedEnum');
- goog.require('proto2.TestAllTypes.NestedMessage');
- goog.require('proto2.TestAllTypes.OptionalGroup');
- goog.require('proto2.TestAllTypes.RepeatedGroup');
- function setUp() {
- // TODO(b/25875505): Fix unreported assertions (go/failonunreportedasserts).
- goog.testing.TestCase.getActiveTestCase().failOnUnreportedAsserts = false;
- }
- function testEqualsWithEmptyMessages() {
- var message1 = new proto2.TestAllTypes();
- assertTrue('same message object', message1.equals(message1));
- assertFalse('comparison with null', message1.equals(null));
- assertFalse('comparison with undefined', message1.equals(undefined));
- var message2 = new proto2.TestAllTypes();
- assertTrue('two empty message objects', message1.equals(message2));
- var message3 = new proto2.TestAllTypes.NestedMessage();
- assertFalse('different message types', message3.equals(message1));
- }
- function testEqualsWithSingleInt32Field() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- message1.setOptionalInt32(1);
- assertFalse('message1 has an extra int32 field', message1.equals(message2));
- message2.setOptionalInt32(1);
- assertTrue('same int32 field in both messages', message1.equals(message2));
- message2.setOptionalInt32(2);
- assertFalse('different int32 field', message1.equals(message2));
- message1.clearOptionalInt32();
- assertFalse('message2 has an extra int32 field', message1.equals(message2));
- }
- function testEqualsWithRepeatedInt32Fields() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- message1.addRepeatedInt32(0);
- message2.addRepeatedInt32(0);
- assertTrue('equal repeated int32 field', message1.equals(message2));
- message1.addRepeatedInt32(1);
- assertFalse('message1 has more items', message1.equals(message2));
- message2.addRepeatedInt32(1);
- message2.addRepeatedInt32(1);
- assertFalse('message2 has more items', message1.equals(message2));
- message1.addRepeatedInt32(2);
- assertFalse('different int32 items', message1.equals(message2));
- }
- function testEqualsWithDefaultValue() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- message1.setOptionalInt64('1');
- assertEquals(
- 'message1.getOptionalInt64OrDefault should return 1', '1',
- message1.getOptionalInt64OrDefault());
- assertEquals(
- 'message2.getOptionalInt64OrDefault should return 1 too', '1',
- message2.getOptionalInt64OrDefault());
- assertTrue(
- 'message1.hasOptionalInt64() should be true',
- message1.hasOptionalInt64());
- assertFalse(
- 'message2.hasOptionalInt64() should be false',
- message2.hasOptionalInt64());
- assertFalse('as a result they are not equal', message1.equals(message2));
- }
- function testEqualsWithOptionalGroup() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- var group1 = new proto2.TestAllTypes.OptionalGroup();
- var group2 = new proto2.TestAllTypes.OptionalGroup();
- message1.setOptionalgroup(group1);
- assertFalse(
- 'only message1 has OptionalGroup field', message1.equals(message2));
- message2.setOptionalgroup(group2);
- assertTrue(
- 'both messages have OptionalGroup field', message1.equals(message2));
- group1.setA(0);
- group2.setA(1);
- assertFalse(
- 'different value in the optional group', message1.equals(message2));
- message1.clearOptionalgroup();
- assertFalse(
- 'only message2 has OptionalGroup field', message1.equals(message2));
- }
- function testEqualsWithRepeatedGroup() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- var group1 = new proto2.TestAllTypes.RepeatedGroup();
- var group2 = new proto2.TestAllTypes.RepeatedGroup();
- message1.addRepeatedgroup(group1);
- assertFalse('message1 has more RepeatedGroups', message1.equals(message2));
- message2.addRepeatedgroup(group2);
- assertTrue('both messages have one RepeatedGroup', message1.equals(message2));
- group1.addA(1);
- assertFalse(
- 'message1 has more int32s in RepeatedGroup', message1.equals(message2));
- group2.addA(1);
- assertTrue(
- 'both messages have one int32 in RepeatedGroup',
- message1.equals(message2));
- group1.addA(1);
- group2.addA(2);
- assertFalse(
- 'the messages have different int32s in RepeatedGroup',
- message1.equals(message2));
- }
- function testEqualsWithNestedMessage() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- var nested1 = new proto2.TestAllTypes.NestedMessage();
- var nested2 = new proto2.TestAllTypes.NestedMessage();
- message1.setOptionalNestedMessage(nested1);
- assertFalse('only message1 has nested message', message1.equals(message2));
- message2.setOptionalNestedMessage(nested2);
- assertTrue('both messages have nested message', message1.equals(message2));
- nested1.setB(1);
- assertFalse(
- 'different int32 in the nested messages', message1.equals(message2));
- message1.clearOptionalNestedMessage();
- assertFalse('only message2 has nested message', message1.equals(message2));
- }
- function testEqualsWithNestedEnum() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- message1.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.FOO);
- assertFalse('only message1 has nested enum', message1.equals(message2));
- message2.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.FOO);
- assertTrue('both messages have nested enum', message1.equals(message2));
- message2.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.BAR);
- assertFalse('different enum value', message1.equals(message2));
- message1.clearOptionalNestedEnum();
- assertFalse('only message2 has nested enum', message1.equals(message2));
- }
- function testEqualsWithUnknownFields() {
- var message1 = new proto2.TestAllTypes();
- var message2 = new proto2.TestAllTypes();
- message1.setUnknown(999, 'foo');
- message1.setUnknown(999, 'bar');
- assertTrue('unknown fields are ignored', message1.equals(message2));
- }
- function testCloneEmptyMessage() {
- var message = new proto2.TestAllTypes();
- var clone = message.clone();
- assertObjectEquals('cloned empty message', message, clone);
- }
- function testCloneMessageWithSeveralFields() {
- var message = new proto2.TestAllTypes();
- message.setOptionalInt32(1);
- message.addRepeatedInt32(2);
- var optionalGroup = new proto2.TestAllTypes.OptionalGroup();
- optionalGroup.setA(3);
- message.setOptionalgroup(optionalGroup);
- var repeatedGroup = new proto2.TestAllTypes.RepeatedGroup();
- repeatedGroup.addA(4);
- message.addRepeatedgroup(repeatedGroup);
- var nestedMessage = new proto2.TestAllTypes.NestedMessage();
- nestedMessage.setB(5);
- message.setOptionalNestedMessage(nestedMessage);
- message.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.FOO);
- message.setUnknown(999, 'foo');
- var clone = message.clone();
- assertNotEquals(
- 'different OptionalGroup instance', message.getOptionalgroup(),
- clone.getOptionalgroup());
- assertNotEquals(
- 'different RepeatedGroup array instance', message.repeatedgroupArray(),
- clone.repeatedgroupArray());
- assertNotEquals(
- 'different RepeatedGroup array item instance',
- message.getRepeatedgroup(0), clone.getRepeatedgroup(0));
- assertNotEquals(
- 'different NestedMessage instance', message.getOptionalNestedMessage(),
- clone.getOptionalNestedMessage());
- }
- function testCloneWithUnknownFields() {
- var message = new proto2.TestAllTypes();
- message.setUnknown(999, 'foo');
- var clone = message.clone();
- assertTrue('clone.equals(message) returns true', clone.equals(message));
- clone.forEachUnknown(function(tag, value) {
- fail('the unknown fields should not have been cloned');
- });
- clone.setUnknown(999, 'foo');
- assertObjectEquals(
- 'the original and the cloned message are equal except ' +
- 'for the unknown fields',
- message, clone);
- }
- function testCopyFromSameMessage() {
- var source = new proto2.TestAllTypes();
- source.setOptionalInt32(32);
- source.copyFrom(source);
- assertEquals(32, source.getOptionalInt32());
- }
- function testCopyFromFlatMessage() {
- // Recursive copying is implicitly tested in the testClone... methods.
- var source = new proto2.TestAllTypes();
- source.setOptionalInt32(32);
- source.setOptionalInt64('64');
- source.addRepeatedInt32(32);
- var target = new proto2.TestAllTypes();
- target.setOptionalInt32(33);
- target.setOptionalUint32(33);
- target.addRepeatedInt32(33);
- target.copyFrom(source);
- assertObjectEquals(
- 'source and target are equal after copyFrom', source, target);
- target.copyFrom(source);
- assertObjectEquals('second copyFrom call has no effect', source, target);
- source.setUnknown(999, 'foo');
- target.setUnknown(999, 'bar');
- target.copyFrom(source);
- assertThrows(
- 'unknown fields are not copied',
- goog.partial(assertObjectEquals, source, target));
- }
- function testMergeFromEmptyMessage() {
- var source = new proto2.TestAllTypes();
- source.setOptionalInt32(32);
- source.setOptionalInt64('64');
- var nested = new proto2.TestAllTypes.NestedMessage();
- nested.setB(66);
- source.setOptionalNestedMessage(nested);
- var target = new proto2.TestAllTypes();
- target.mergeFrom(source);
- assertObjectEquals(
- 'source and target are equal after mergeFrom', source, target);
- }
- function testMergeFromFlatMessage() {
- var source = new proto2.TestAllTypes();
- source.setOptionalInt32(32);
- source.setOptionalString('foo');
- source.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.FOO);
- var target = new proto2.TestAllTypes();
- target.setOptionalInt64('64');
- target.setOptionalString('bar');
- target.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.BAR);
- var expected = new proto2.TestAllTypes();
- expected.setOptionalInt32(32);
- expected.setOptionalInt64('64');
- expected.setOptionalString('foo');
- expected.setOptionalNestedEnum(proto2.TestAllTypes.NestedEnum.FOO);
- target.mergeFrom(source);
- assertObjectEquals(
- 'expected and target are equal after mergeFrom', expected, target);
- }
- function testMergeFromNestedMessage() {
- var source = new proto2.TestAllTypes();
- var nested = new proto2.TestAllTypes.NestedMessage();
- nested.setB(66);
- source.setOptionalNestedMessage(nested);
- var target = new proto2.TestAllTypes();
- nested = new proto2.TestAllTypes.NestedMessage();
- nested.setC(77);
- target.setOptionalNestedMessage(nested);
- var expected = new proto2.TestAllTypes();
- nested = new proto2.TestAllTypes.NestedMessage();
- nested.setB(66);
- nested.setC(77);
- expected.setOptionalNestedMessage(nested);
- target.mergeFrom(source);
- assertObjectEquals(
- 'expected and target are equal after mergeFrom', expected, target);
- }
- function testMergeFromRepeatedMessage() {
- var source = new proto2.TestAllTypes();
- source.addRepeatedInt32(2);
- source.addRepeatedInt32(3);
- var target = new proto2.TestAllTypes();
- target.addRepeatedInt32(1);
- target.mergeFrom(source);
- assertArrayEquals(
- 'repeated_int32 array has elements from both messages', [1, 2, 3],
- target.repeatedInt32Array());
- }
- function testInitDefaultsWithEmptyMessage() {
- var message = new proto2.TestAllTypes();
- message.initDefaults(false);
- assertFalse('int32 field is not set', message.hasOptionalInt32());
- assertFalse('int64 [default=1] field is not set', message.hasOptionalInt64());
- assertTrue('optional group field is set', message.hasOptionalgroup());
- assertFalse(
- 'int32 inside the group is not set', message.getOptionalgroup().hasA());
- assertObjectEquals(
- 'value of the optional group', new proto2.TestAllTypes.OptionalGroup(),
- message.getOptionalgroup());
- assertTrue('nested message is set', message.hasOptionalNestedMessage());
- assertObjectEquals(
- 'value of the nested message', new proto2.TestAllTypes.NestedMessage(),
- message.getOptionalNestedMessage());
- assertFalse('nested enum is not set', message.hasOptionalNestedEnum());
- assertFalse('repeated int32 is not set', message.hasRepeatedInt32());
- assertFalse(
- 'repeated nested message is not set', message.hasRepeatedNestedMessage());
- message = new proto2.TestAllTypes();
- message.initDefaults(true);
- assertTrue('int32 field is set', message.hasOptionalInt32());
- assertEquals('value of the int32 field', 0, message.getOptionalInt32());
- assertTrue('int64 [default=1] field is set', message.hasOptionalInt64());
- assertEquals('value of the int64 field', '1', message.getOptionalInt64());
- assertTrue(
- 'int32 inside nested message is set',
- message.getOptionalNestedMessage().hasB());
- assertEquals(
- 'value of the int32 field inside the nested message', 0,
- message.getOptionalNestedMessage().getB());
- }
- function testInitDefaultsWithNonEmptyMessage() {
- var message = new proto2.TestAllTypes();
- message.setOptionalInt32(32);
- message.setOptionalInt64('64');
- message.setOptionalgroup(new proto2.TestAllTypes.OptionalGroup());
- var nested1 = new proto2.TestAllTypes.NestedMessage();
- nested1.setB(66);
- message.setOptionalNestedMessage(nested1);
- var nested2 = new proto2.TestAllTypes.NestedMessage();
- message.addRepeatedNestedMessage(nested2);
- var nested3 = new proto2.TestAllTypes.NestedMessage();
- nested3.setB(66);
- message.addRepeatedNestedMessage(nested3);
- message.initDefaults(true);
- assertEquals('int32 field is unchanged', 32, message.getOptionalInt32());
- assertEquals(
- 'int64 [default=1] field is unchanged', '64', message.getOptionalInt64());
- assertTrue('bool field is initialized', message.hasOptionalBool());
- assertFalse('value of the bool field', message.getOptionalBool());
- assertTrue(
- 'int32 inside the optional group is initialized',
- message.getOptionalgroup().hasA());
- assertEquals(
- 'value of the int32 inside the optional group', 0,
- message.getOptionalgroup().getA());
- assertEquals(
- 'int32 inside nested message is unchanged', 66,
- message.getOptionalNestedMessage().getB());
- assertTrue(
- 'int32 at index 0 of the repeated nested message is initialized',
- message.getRepeatedNestedMessage(0).hasB());
- assertEquals(
- 'value of int32 at index 0 of the repeated nested message', 0,
- message.getRepeatedNestedMessage(0).getB());
- assertEquals(
- 'int32 at index 1 of the repeated nested message is unchanged', 66,
- message.getRepeatedNestedMessage(1).getB());
- }
- function testInitDefaultsTwice() {
- var message = new proto2.TestAllTypes();
- message.initDefaults(false);
- var clone = message.clone();
- clone.initDefaults(false);
- assertObjectEquals(
- 'second call of initDefaults(false) has no effect', message, clone);
- message = new proto2.TestAllTypes();
- message.initDefaults(true);
- clone = message.clone();
- clone.initDefaults(true);
- assertObjectEquals(
- 'second call of initDefaults(true) has no effect', message, clone);
- }
- function testInitDefaultsThenClone() {
- var message = new proto2.TestAllTypes();
- message.initDefaults(true);
- assertObjectEquals('message is cloned properly', message, message.clone());
- }
- function testClassGetDescriptorEqualToInstanceGetDescriptor() {
- var classDescriptor = proto2.TestAllTypes.getDescriptor();
- var instanceDescriptor = new proto2.TestAllTypes().getDescriptor();
- assertEquals(classDescriptor, instanceDescriptor);
- }
- function testGetAfterSetWithLazyDeserializer() {
- // Test makes sure that the lazy deserializer for a field is not
- // erroneously called when get$Value is called after set$Value.
- var message = new proto2.TestAllTypes();
- var fakeDeserializer = {}; // stub with no methods defined; fails hard
- message.initializeForLazyDeserializer(fakeDeserializer, {} /* data */);
- message.setOptionalBool(true);
- assertEquals(true, message.getOptionalBool());
- }
- function testHasOnLazyDeserializer() {
- // Test that null values for fields are treated as absent by the lazy
- // deserializer.
- var message = new proto2.TestAllTypes();
- var fakeDeserializer = {}; // stub with no methods defined; fails hard
- message.initializeForLazyDeserializer(
- fakeDeserializer, {13: false} /* data */);
- assertEquals(true, message.hasOptionalBool());
- }
- function testHasOnLazyDeserializerWithNulls() {
- // Test that null values for fields are treated as absent by the lazy
- // deserializer.
- var message = new proto2.TestAllTypes();
- var fakeDeserializer = {}; // stub with no methods defined; fails hard
- message.initializeForLazyDeserializer(
- fakeDeserializer, {13: null} /* data */);
- assertEquals(false, message.hasOptionalBool());
- }
|