Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: third_party/protobuf/objectivec/Tests/GPBMessageTests+Runtime.m

Issue 2495533002: third_party/protobuf: Update to HEAD (83d681ee2c) (Closed)
Patch Set: Make chrome settings proto generated file a component Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2015 Google Inc. All rights reserved. 2 // Copyright 2015 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 18 matching lines...) Expand all
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 30
31 #import "GPBTestUtilities.h" 31 #import "GPBTestUtilities.h"
32 32
33 #import <objc/runtime.h> 33 #import <objc/runtime.h>
34 34
35 #import "GPBMessage.h" 35 #import "GPBMessage.h"
36 36
37 #import "google/protobuf/MapUnittest.pbobjc.h" 37 #import "google/protobuf/MapUnittest.pbobjc.h"
38 #import "google/protobuf/Unittest.pbobjc.h" 38 #import "google/protobuf/Unittest.pbobjc.h"
39 #import "google/protobuf/UnittestCycle.pbobjc.h"
39 #import "google/protobuf/UnittestObjcStartup.pbobjc.h" 40 #import "google/protobuf/UnittestObjcStartup.pbobjc.h"
40 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h" 41 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
41 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h" 42 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
42 43
43 @interface MessageRuntimeTests : GPBTestCase 44 @interface MessageRuntimeTests : GPBTestCase
44 @end 45 @end
45 46
46 @implementation MessageRuntimeTests 47 @implementation MessageRuntimeTests
47 48
48 // TODO(thomasvl): Pull tests over from GPBMessageTests that are runtime 49 // TODO(thomasvl): Pull tests over from GPBMessageTests that are runtime
49 // specific. 50 // specific.
50 51
51 - (void)testStartupOrdering { 52 - (void)testStartupOrdering {
52 // Just have to create a message. Nothing else uses the classes from 53 // Message class/Root class initialization is a little tricky, so these just
53 // this file, so the first selector invoked on the class will initialize 54 // create some possible patterns that can be a problem. The messages don't
54 // it, which also initializes the root. 55 // have to be exercised, just creating them is enough to test. If there
56 // is a problem, the runtime should assert or hang.
57 //
58 // Note: the messages from these proto files should not be used in any other
59 // tests, that way when they are referenced here it will be the first use and
60 // initialization will take place now.
61
55 TestObjCStartupMessage *message = [TestObjCStartupMessage message]; 62 TestObjCStartupMessage *message = [TestObjCStartupMessage message];
56 XCTAssertNotNil(message); 63 XCTAssertNotNil(message);
64
65 CycleBaz *baz = [CycleBaz message];
66 CycleBar *bar = [CycleBar message];
67 CycleFoo *foo = [CycleFoo message];
68 XCTAssertNotNil(baz);
69 XCTAssertNotNil(bar);
70 XCTAssertNotNil(foo);
57 } 71 }
58 72
59 - (void)testProto2HasMethodSupport { 73 - (void)testProto2HasMethodSupport {
60 NSArray *names = @[ 74 NSArray *names = @[
61 @"Int32", 75 @"Int32",
62 @"Int64", 76 @"Int64",
63 @"Uint32", 77 @"Uint32",
64 @"Uint64", 78 @"Uint64",
65 @"Sint32", 79 @"Sint32",
66 @"Sint64", 80 @"Sint64",
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 //% { // optional##FIELD :: ZERO_VALUE 333 //% { // optional##FIELD :: ZERO_VALUE
320 //% Message2 *msg = [[Message2 alloc] init]; 334 //% Message2 *msg = [[Message2 alloc] init];
321 //% XCTAssertFalse(msg.hasOptional##FIELD); 335 //% XCTAssertFalse(msg.hasOptional##FIELD);
322 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Opti onal##FIELD)); 336 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Opti onal##FIELD));
323 //% msg.optional##FIELD = ZERO_VALUE; 337 //% msg.optional##FIELD = ZERO_VALUE;
324 //% XCTAssertTrue(msg.hasOptional##FIELD); 338 //% XCTAssertTrue(msg.hasOptional##FIELD);
325 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optio nal##FIELD)); 339 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optio nal##FIELD));
326 //% [msg release]; 340 //% [msg release];
327 //% } 341 //% }
328 //% 342 //%
343 //%PDDM-DEFINE PROTO2_TEST_CLEAR_FIELD_WITH_NIL(FIELD, VALUE)
344 //% { // optional##FIELD
345 //% Message2 *msg = [[Message2 alloc] init];
346 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Opti onal##FIELD));
347 //% msg.optional##FIELD = VALUE;
348 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optio nal##FIELD));
349 //% msg.optional##FIELD = nil;
350 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Opti onal##FIELD));
351 //% [msg release];
352 //% }
353 //%
329 //%PDDM-DEFINE PROTO2_TEST_HAS_FIELDS() 354 //%PDDM-DEFINE PROTO2_TEST_HAS_FIELDS()
330 //%PROTO2_TEST_HAS_FIELD(Int32, 1, 0) 355 //%PROTO2_TEST_HAS_FIELD(Int32, 1, 0)
331 //%PROTO2_TEST_HAS_FIELD(Int64, 1, 0) 356 //%PROTO2_TEST_HAS_FIELD(Int64, 1, 0)
332 //%PROTO2_TEST_HAS_FIELD(Uint32, 1, 0) 357 //%PROTO2_TEST_HAS_FIELD(Uint32, 1, 0)
333 //%PROTO2_TEST_HAS_FIELD(Uint64, 1, 0) 358 //%PROTO2_TEST_HAS_FIELD(Uint64, 1, 0)
334 //%PROTO2_TEST_HAS_FIELD(Sint32, 1, 0) 359 //%PROTO2_TEST_HAS_FIELD(Sint32, 1, 0)
335 //%PROTO2_TEST_HAS_FIELD(Sint64, 1, 0) 360 //%PROTO2_TEST_HAS_FIELD(Sint64, 1, 0)
336 //%PROTO2_TEST_HAS_FIELD(Fixed32, 1, 0) 361 //%PROTO2_TEST_HAS_FIELD(Fixed32, 1, 0)
337 //%PROTO2_TEST_HAS_FIELD(Fixed64, 1, 0) 362 //%PROTO2_TEST_HAS_FIELD(Fixed64, 1, 0)
338 //%PROTO2_TEST_HAS_FIELD(Sfixed32, 1, 0) 363 //%PROTO2_TEST_HAS_FIELD(Sfixed32, 1, 0)
339 //%PROTO2_TEST_HAS_FIELD(Sfixed64, 1, 0) 364 //%PROTO2_TEST_HAS_FIELD(Sfixed64, 1, 0)
340 //%PROTO2_TEST_HAS_FIELD(Float, 1.0f, 0.0f) 365 //%PROTO2_TEST_HAS_FIELD(Float, 1.0f, 0.0f)
341 //%PROTO2_TEST_HAS_FIELD(Double, 1.0, 0.0) 366 //%PROTO2_TEST_HAS_FIELD(Double, 1.0, 0.0)
342 //%PROTO2_TEST_HAS_FIELD(Bool, YES, NO) 367 //%PROTO2_TEST_HAS_FIELD(Bool, YES, NO)
343 //%PROTO2_TEST_HAS_FIELD(String, @"foo", @"") 368 //%PROTO2_TEST_HAS_FIELD(String, @"foo", @"")
344 //%PROTO2_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data]) 369 //%PROTO2_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data])
345 //% // 370 //% //
346 //% // Test doesn't apply to optionalGroup/optionalMessage. 371 //% // Test doesn't apply to optionalGroup/optionalMessage.
347 //% // 372 //% //
348 //% 373 //%
349 //%PROTO2_TEST_HAS_FIELD(Enum, Message2_Enum_Bar, Message2_Enum_Foo) 374 //%PROTO2_TEST_HAS_FIELD(Enum, Message2_Enum_Bar, Message2_Enum_Foo)
375 //% //
376 //% // Nil can also be used to clear strings, bytes, groups, and messages.
377 //% //
378 //%
379 //%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(String, @"foo")
380 //%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Bytes, [@"foo" dataUsingEncoding:NSUTF8Strin gEncoding])
381 //%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Group, [Message2_OptionalGroup message])
382 //%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message2 message])
350 //%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS() 383 //%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS()
351 // This block of code is generated, do not edit it directly. 384 // This block of code is generated, do not edit it directly.
352 385
353 { // optionalInt32 :: 1 386 { // optionalInt32 :: 1
354 Message2 *msg = [[Message2 alloc] init]; 387 Message2 *msg = [[Message2 alloc] init];
355 XCTAssertFalse(msg.hasOptionalInt32); 388 XCTAssertFalse(msg.hasOptionalInt32);
356 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lInt32)); 389 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lInt32));
357 msg.optionalInt32 = 1; 390 msg.optionalInt32 = 1;
358 XCTAssertTrue(msg.hasOptionalInt32); 391 XCTAssertTrue(msg.hasOptionalInt32);
359 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Int32)); 392 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Int32));
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 { // optionalEnum :: Message2_Enum_Foo 684 { // optionalEnum :: Message2_Enum_Foo
652 Message2 *msg = [[Message2 alloc] init]; 685 Message2 *msg = [[Message2 alloc] init];
653 XCTAssertFalse(msg.hasOptionalEnum); 686 XCTAssertFalse(msg.hasOptionalEnum);
654 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lEnum)); 687 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lEnum));
655 msg.optionalEnum = Message2_Enum_Foo; 688 msg.optionalEnum = Message2_Enum_Foo;
656 XCTAssertTrue(msg.hasOptionalEnum); 689 XCTAssertTrue(msg.hasOptionalEnum);
657 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Enum)); 690 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Enum));
658 [msg release]; 691 [msg release];
659 } 692 }
660 693
694 //
695 // Nil can also be used to clear strings, bytes, groups, and messages.
696 //
697
698 { // optionalString
699 Message2 *msg = [[Message2 alloc] init];
700 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lString));
701 msg.optionalString = @"foo";
702 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional String));
703 msg.optionalString = nil;
704 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lString));
705 [msg release];
706 }
707
708 { // optionalBytes
709 Message2 *msg = [[Message2 alloc] init];
710 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lBytes));
711 msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
712 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Bytes));
713 msg.optionalBytes = nil;
714 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lBytes));
715 [msg release];
716 }
717
718 { // optionalGroup
719 Message2 *msg = [[Message2 alloc] init];
720 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lGroup));
721 msg.optionalGroup = [Message2_OptionalGroup message];
722 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Group));
723 msg.optionalGroup = nil;
724 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lGroup));
725 [msg release];
726 }
727
728 { // optionalMessage
729 Message2 *msg = [[Message2 alloc] init];
730 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lMessage));
731 msg.optionalMessage = [Message2 message];
732 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional Message));
733 msg.optionalMessage = nil;
734 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona lMessage));
735 [msg release];
736 }
737
661 //%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS() 738 //%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS()
662 } 739 }
663 740
664 - (void)testProto3SingleFieldHasBehavior { 741 - (void)testProto3SingleFieldHasBehavior {
665 // 742 //
666 // Setting to any value including the default value (0) should result has* 743 // Setting to any value but the default value (0) should result has*
667 // being true. 744 // being true. When set to the default, shouldn't be true.
668 // 745 //
669 746
670 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE) 747 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
671 //% { // optional##FIELD 748 //% { // optional##FIELD
672 //% Message3 *msg = [[Message3 alloc] init]; 749 //% Message3 *msg = [[Message3 alloc] init];
673 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti onal##FIELD)); 750 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti onal##FIELD));
674 //% msg.optional##FIELD = NON_ZERO_VALUE; 751 //% msg.optional##FIELD = NON_ZERO_VALUE;
675 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optio nal##FIELD)); 752 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optio nal##FIELD));
676 //% msg.optional##FIELD = ZERO_VALUE; 753 //% msg.optional##FIELD = ZERO_VALUE;
677 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti onal##FIELD)); 754 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti onal##FIELD));
678 //% [msg release]; 755 //% [msg release];
679 //% } 756 //% }
680 //% 757 //%
758 //%PDDM-DEFINE PROTO3_TEST_CLEAR_FIELD_WITH_NIL(FIELD, VALUE)
759 //% { // optional##FIELD
760 //% Message3 *msg = [[Message3 alloc] init];
761 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti onal##FIELD));
762 //% msg.optional##FIELD = VALUE;
763 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optio nal##FIELD));
764 //% msg.optional##FIELD = nil;
765 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti onal##FIELD));
766 //% [msg release];
767 //% }
768 //%
681 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELDS() 769 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELDS()
682 //%PROTO3_TEST_HAS_FIELD(Int32, 1, 0) 770 //%PROTO3_TEST_HAS_FIELD(Int32, 1, 0)
683 //%PROTO3_TEST_HAS_FIELD(Int64, 1, 0) 771 //%PROTO3_TEST_HAS_FIELD(Int64, 1, 0)
684 //%PROTO3_TEST_HAS_FIELD(Uint32, 1, 0) 772 //%PROTO3_TEST_HAS_FIELD(Uint32, 1, 0)
685 //%PROTO3_TEST_HAS_FIELD(Uint64, 1, 0) 773 //%PROTO3_TEST_HAS_FIELD(Uint64, 1, 0)
686 //%PROTO3_TEST_HAS_FIELD(Sint32, 1, 0) 774 //%PROTO3_TEST_HAS_FIELD(Sint32, 1, 0)
687 //%PROTO3_TEST_HAS_FIELD(Sint64, 1, 0) 775 //%PROTO3_TEST_HAS_FIELD(Sint64, 1, 0)
688 //%PROTO3_TEST_HAS_FIELD(Fixed32, 1, 0) 776 //%PROTO3_TEST_HAS_FIELD(Fixed32, 1, 0)
689 //%PROTO3_TEST_HAS_FIELD(Fixed64, 1, 0) 777 //%PROTO3_TEST_HAS_FIELD(Fixed64, 1, 0)
690 //%PROTO3_TEST_HAS_FIELD(Sfixed32, 1, 0) 778 //%PROTO3_TEST_HAS_FIELD(Sfixed32, 1, 0)
691 //%PROTO3_TEST_HAS_FIELD(Sfixed64, 1, 0) 779 //%PROTO3_TEST_HAS_FIELD(Sfixed64, 1, 0)
692 //%PROTO3_TEST_HAS_FIELD(Float, 1.0f, 0.0f) 780 //%PROTO3_TEST_HAS_FIELD(Float, 1.0f, 0.0f)
693 //%PROTO3_TEST_HAS_FIELD(Double, 1.0, 0.0) 781 //%PROTO3_TEST_HAS_FIELD(Double, 1.0, 0.0)
694 //%PROTO3_TEST_HAS_FIELD(Bool, YES, NO) 782 //%PROTO3_TEST_HAS_FIELD(Bool, YES, NO)
695 //%PROTO3_TEST_HAS_FIELD(String, @"foo", @"") 783 //%PROTO3_TEST_HAS_FIELD(String, @"foo", @"")
696 //%PROTO3_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data]) 784 //%PROTO3_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding], [NSData data])
697 //% // 785 //% //
698 //% // Test doesn't apply to optionalGroup/optionalMessage. 786 //% // Test doesn't apply to optionalMessage (no groups in proto3).
699 //% // 787 //% //
700 //% 788 //%
701 //%PROTO3_TEST_HAS_FIELD(Enum, Message3_Enum_Bar, Message3_Enum_Foo) 789 //%PROTO3_TEST_HAS_FIELD(Enum, Message3_Enum_Bar, Message3_Enum_Foo)
790 //% //
791 //% // Nil can also be used to clear strings, bytes, and messages (no groups in proto3).
792 //% //
793 //%
794 //%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(String, @"foo")
795 //%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Bytes, [@"foo" dataUsingEncoding:NSUTF8Strin gEncoding])
796 //%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message3 message])
702 //%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS() 797 //%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS()
703 // This block of code is generated, do not edit it directly. 798 // This block of code is generated, do not edit it directly.
704 799
705 { // optionalInt32 800 { // optionalInt32
706 Message3 *msg = [[Message3 alloc] init]; 801 Message3 *msg = [[Message3 alloc] init];
707 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lInt32)); 802 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lInt32));
708 msg.optionalInt32 = 1; 803 msg.optionalInt32 = 1;
709 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Int32)); 804 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Int32));
710 msg.optionalInt32 = 0; 805 msg.optionalInt32 = 0;
711 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lInt32)); 806 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lInt32));
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 Message3 *msg = [[Message3 alloc] init]; 941 Message3 *msg = [[Message3 alloc] init];
847 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lBytes)); 942 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lBytes));
848 msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding]; 943 msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
849 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Bytes)); 944 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Bytes));
850 msg.optionalBytes = [NSData data]; 945 msg.optionalBytes = [NSData data];
851 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lBytes)); 946 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lBytes));
852 [msg release]; 947 [msg release];
853 } 948 }
854 949
855 // 950 //
856 // Test doesn't apply to optionalGroup/optionalMessage. 951 // Test doesn't apply to optionalMessage (no groups in proto3).
857 // 952 //
858 953
859 { // optionalEnum 954 { // optionalEnum
860 Message3 *msg = [[Message3 alloc] init]; 955 Message3 *msg = [[Message3 alloc] init];
861 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lEnum)); 956 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lEnum));
862 msg.optionalEnum = Message3_Enum_Bar; 957 msg.optionalEnum = Message3_Enum_Bar;
863 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Enum)); 958 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Enum));
864 msg.optionalEnum = Message3_Enum_Foo; 959 msg.optionalEnum = Message3_Enum_Foo;
865 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lEnum)); 960 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lEnum));
866 [msg release]; 961 [msg release];
867 } 962 }
868 963
964 //
965 // Nil can also be used to clear strings, bytes, and messages (no groups in pr oto3).
966 //
967
968 { // optionalString
969 Message3 *msg = [[Message3 alloc] init];
970 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lString));
971 msg.optionalString = @"foo";
972 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional String));
973 msg.optionalString = nil;
974 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lString));
975 [msg release];
976 }
977
978 { // optionalBytes
979 Message3 *msg = [[Message3 alloc] init];
980 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lBytes));
981 msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
982 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Bytes));
983 msg.optionalBytes = nil;
984 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lBytes));
985 [msg release];
986 }
987
988 { // optionalMessage
989 Message3 *msg = [[Message3 alloc] init];
990 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lMessage));
991 msg.optionalMessage = [Message3 message];
992 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional Message));
993 msg.optionalMessage = nil;
994 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona lMessage));
995 [msg release];
996 }
997
869 //%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS() 998 //%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS()
870 } 999 }
871 1000
872 - (void)testAccessingProto2UnknownEnumValues { 1001 - (void)testAccessingProto2UnknownEnumValues {
873 Message2 *msg = [[Message2 alloc] init]; 1002 Message2 *msg = [[Message2 alloc] init];
874 1003
875 // Set it to something non zero, try and confirm it doesn't change. 1004 // Set it to something non zero, try and confirm it doesn't change.
876 1005
877 msg.optionalEnum = Message2_Enum_Bar; 1006 msg.optionalEnum = Message2_Enum_Bar;
878 XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException, 1007 XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException,
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after
1965 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i); 2094 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
1966 XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i); 2095 XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i);
1967 XCTAssertNotEqual(msg.oneofMessage, subMessage, "Loop: %zd", 2096 XCTAssertNotEqual(msg.oneofMessage, subMessage, "Loop: %zd",
1968 i); // Pointer compare. 2097 i); // Pointer compare.
1969 XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i); 2098 XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i);
1970 } 2099 }
1971 2100
1972 [msg release]; 2101 [msg release];
1973 } 2102 }
1974 2103
2104 - (void)testProto2OneofSetToDefault {
2105
2106 // proto3 doesn't normally write out zero (default) fields, but if they are
2107 // in a oneof it does. proto2 doesn't have this special behavior, but we
2108 // still confirm setting to the explicit default does set the case to be
2109 // sure the runtime is working correctly.
2110
2111 NSString *oneofStringDefault = @"string";
2112 NSData *oneofBytesDefault = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
2113
2114 Message2 *msg = [[Message2 alloc] init];
2115
2116 uint32_t values[] = {
2117 Message2_O_OneOfCase_OneofInt32,
2118 Message2_O_OneOfCase_OneofInt64,
2119 Message2_O_OneOfCase_OneofUint32,
2120 Message2_O_OneOfCase_OneofUint64,
2121 Message2_O_OneOfCase_OneofSint32,
2122 Message2_O_OneOfCase_OneofSint64,
2123 Message2_O_OneOfCase_OneofFixed32,
2124 Message2_O_OneOfCase_OneofFixed64,
2125 Message2_O_OneOfCase_OneofSfixed32,
2126 Message2_O_OneOfCase_OneofSfixed64,
2127 Message2_O_OneOfCase_OneofFloat,
2128 Message2_O_OneOfCase_OneofDouble,
2129 Message2_O_OneOfCase_OneofBool,
2130 Message2_O_OneOfCase_OneofString,
2131 Message2_O_OneOfCase_OneofBytes,
2132 // Skip group
2133 // Skip message
2134 Message2_O_OneOfCase_OneofEnum,
2135 };
2136
2137 for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
2138 switch (values[i]) {
2139 case Message2_O_OneOfCase_OneofInt32:
2140 msg.oneofInt32 = 100;
2141 break;
2142 case Message2_O_OneOfCase_OneofInt64:
2143 msg.oneofInt64 = 101;
2144 break;
2145 case Message2_O_OneOfCase_OneofUint32:
2146 msg.oneofUint32 = 102;
2147 break;
2148 case Message2_O_OneOfCase_OneofUint64:
2149 msg.oneofUint64 = 103;
2150 break;
2151 case Message2_O_OneOfCase_OneofSint32:
2152 msg.oneofSint32 = 104;
2153 break;
2154 case Message2_O_OneOfCase_OneofSint64:
2155 msg.oneofSint64 = 105;
2156 break;
2157 case Message2_O_OneOfCase_OneofFixed32:
2158 msg.oneofFixed32 = 106;
2159 break;
2160 case Message2_O_OneOfCase_OneofFixed64:
2161 msg.oneofFixed64 = 107;
2162 break;
2163 case Message2_O_OneOfCase_OneofSfixed32:
2164 msg.oneofSfixed32 = 108;
2165 break;
2166 case Message2_O_OneOfCase_OneofSfixed64:
2167 msg.oneofSfixed64 = 109;
2168 break;
2169 case Message2_O_OneOfCase_OneofFloat:
2170 msg.oneofFloat = 110.0f;
2171 break;
2172 case Message2_O_OneOfCase_OneofDouble:
2173 msg.oneofDouble = 111.0;
2174 break;
2175 case Message2_O_OneOfCase_OneofBool:
2176 msg.oneofBool = YES;
2177 break;
2178 case Message2_O_OneOfCase_OneofString:
2179 msg.oneofString = oneofStringDefault;
2180 break;
2181 case Message2_O_OneOfCase_OneofBytes:
2182 msg.oneofBytes = oneofBytesDefault;
2183 break;
2184 case Message2_O_OneOfCase_OneofEnum:
2185 msg.oneofEnum = Message3_Enum_Baz;
2186 break;
2187 default:
2188 XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
2189 break;
2190 }
2191
2192 // Should be set to the correct case.
2193 XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
2194
2195 // Confirm everything is the defaults.
2196 XCTAssertEqual(msg.oneofInt32, 100, "Loop: %zd", i);
2197 XCTAssertEqual(msg.oneofInt64, 101, "Loop: %zd", i);
2198 XCTAssertEqual(msg.oneofUint32, 102U, "Loop: %zd", i);
2199 XCTAssertEqual(msg.oneofUint64, 103U, "Loop: %zd", i);
2200 XCTAssertEqual(msg.oneofSint32, 104, "Loop: %zd", i);
2201 XCTAssertEqual(msg.oneofSint64, 105, "Loop: %zd", i);
2202 XCTAssertEqual(msg.oneofFixed32, 106U, "Loop: %zd", i);
2203 XCTAssertEqual(msg.oneofFixed64, 107U, "Loop: %zd", i);
2204 XCTAssertEqual(msg.oneofSfixed32, 108, "Loop: %zd", i);
2205 XCTAssertEqual(msg.oneofSfixed64, 109, "Loop: %zd", i);
2206 XCTAssertEqual(msg.oneofFloat, 110.0f, "Loop: %zd", i);
2207 XCTAssertEqual(msg.oneofDouble, 111.0, "Loop: %zd", i);
2208 XCTAssertEqual(msg.oneofBool, YES, "Loop: %zd", i);
2209 XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
2210 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
2211 // Skip group, no default to consider.
2212 // Skip message, no default to consider.
2213 XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz, "Loop: %zd", i);
2214 }
2215
2216 // We special case nil on string, data, group, and message, ensure they work
2217 // as expected. i.e. - it clears the case.
2218 msg.oneofString = nil;
2219 XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2220 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2221 msg.oneofBytes = nil;
2222 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2223 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2224 msg.oneofGroup = nil;
2225 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2226 XCTAssertNotNil(msg.oneofGroup);
2227 msg.oneofMessage = nil;
2228 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase);
2229 XCTAssertNotNil(msg.oneofMessage);
2230
2231 [msg release];
2232 }
2233
2234 - (void)testProto3OneofSetToZero {
2235
2236 // Normally setting a proto3 field to the zero value should result in it being
2237 // reset/cleared. But in a oneof, it still gets recored so it can go out
2238 // over the wire and the other side can see what was set in the oneof.
2239
2240 NSString *oneofStringDefault = @"";
2241 NSData *oneofBytesDefault = [NSData data];
2242
2243 Message3 *msg = [[Message3 alloc] init];
2244
2245 uint32_t values[] = {
2246 Message3_O_OneOfCase_OneofInt32,
2247 Message3_O_OneOfCase_OneofInt64,
2248 Message3_O_OneOfCase_OneofUint32,
2249 Message3_O_OneOfCase_OneofUint64,
2250 Message3_O_OneOfCase_OneofSint32,
2251 Message3_O_OneOfCase_OneofSint64,
2252 Message3_O_OneOfCase_OneofFixed32,
2253 Message3_O_OneOfCase_OneofFixed64,
2254 Message3_O_OneOfCase_OneofSfixed32,
2255 Message3_O_OneOfCase_OneofSfixed64,
2256 Message3_O_OneOfCase_OneofFloat,
2257 Message3_O_OneOfCase_OneofDouble,
2258 Message3_O_OneOfCase_OneofBool,
2259 Message3_O_OneOfCase_OneofString,
2260 Message3_O_OneOfCase_OneofBytes,
2261 Message3_O_OneOfCase_OneofMessage,
2262 Message3_O_OneOfCase_OneofEnum,
2263 };
2264
2265 for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
2266 switch (values[i]) {
2267 case Message3_O_OneOfCase_OneofInt32:
2268 msg.oneofInt32 = 0;
2269 break;
2270 case Message3_O_OneOfCase_OneofInt64:
2271 msg.oneofInt64 = 0;
2272 break;
2273 case Message3_O_OneOfCase_OneofUint32:
2274 msg.oneofUint32 = 0;
2275 break;
2276 case Message3_O_OneOfCase_OneofUint64:
2277 msg.oneofUint64 = 0;
2278 break;
2279 case Message3_O_OneOfCase_OneofSint32:
2280 msg.oneofSint32 = 0;
2281 break;
2282 case Message3_O_OneOfCase_OneofSint64:
2283 msg.oneofSint64 = 0;
2284 break;
2285 case Message3_O_OneOfCase_OneofFixed32:
2286 msg.oneofFixed32 = 0;
2287 break;
2288 case Message3_O_OneOfCase_OneofFixed64:
2289 msg.oneofFixed64 = 0;
2290 break;
2291 case Message3_O_OneOfCase_OneofSfixed32:
2292 msg.oneofSfixed32 = 0;
2293 break;
2294 case Message3_O_OneOfCase_OneofSfixed64:
2295 msg.oneofSfixed64 = 0;
2296 break;
2297 case Message3_O_OneOfCase_OneofFloat:
2298 msg.oneofFloat = 0.0f;
2299 break;
2300 case Message3_O_OneOfCase_OneofDouble:
2301 msg.oneofDouble = 0.0;
2302 break;
2303 case Message3_O_OneOfCase_OneofBool:
2304 msg.oneofBool = NO;
2305 break;
2306 case Message3_O_OneOfCase_OneofString:
2307 msg.oneofString = oneofStringDefault;
2308 break;
2309 case Message3_O_OneOfCase_OneofBytes:
2310 msg.oneofBytes = oneofBytesDefault;
2311 break;
2312 case Message3_O_OneOfCase_OneofMessage:
2313 msg.oneofMessage.optionalInt32 = 0;
2314 break;
2315 case Message3_O_OneOfCase_OneofEnum:
2316 msg.oneofEnum = Message3_Enum_Foo;
2317 break;
2318 default:
2319 XCTFail(@"shouldn't happen, loop: %zd, value: %d", i, values[i]);
2320 break;
2321 }
2322
2323 // Should be set to the correct case.
2324 XCTAssertEqual(msg.oOneOfCase, values[i], "Loop: %zd", i);
2325
2326 // Confirm everything is still zeros.
2327 XCTAssertEqual(msg.oneofInt32, 0, "Loop: %zd", i);
2328 XCTAssertEqual(msg.oneofInt64, 0, "Loop: %zd", i);
2329 XCTAssertEqual(msg.oneofUint32, 0U, "Loop: %zd", i);
2330 XCTAssertEqual(msg.oneofUint64, 0U, "Loop: %zd", i);
2331 XCTAssertEqual(msg.oneofSint32, 0, "Loop: %zd", i);
2332 XCTAssertEqual(msg.oneofSint64, 0, "Loop: %zd", i);
2333 XCTAssertEqual(msg.oneofFixed32, 0U, "Loop: %zd", i);
2334 XCTAssertEqual(msg.oneofFixed64, 0U, "Loop: %zd", i);
2335 XCTAssertEqual(msg.oneofSfixed32, 0, "Loop: %zd", i);
2336 XCTAssertEqual(msg.oneofSfixed64, 0, "Loop: %zd", i);
2337 XCTAssertEqual(msg.oneofFloat, 0.0f, "Loop: %zd", i);
2338 XCTAssertEqual(msg.oneofDouble, 0.0, "Loop: %zd", i);
2339 XCTAssertEqual(msg.oneofBool, NO, "Loop: %zd", i);
2340 XCTAssertEqualObjects(msg.oneofString, oneofStringDefault, "Loop: %zd", i);
2341 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i);
2342 XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i);
2343 XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i);
2344 }
2345
2346 // We special case nil on string, data, message, ensure they work as expected.
2347 msg.oneofString = nil;
2348 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
2349 XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
2350 msg.oneofBytes = nil;
2351 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
2352 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault);
2353 msg.oneofMessage = nil;
2354 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase);
2355 XCTAssertNotNil(msg.oneofMessage);
2356
2357 [msg release];
2358 }
2359
1975 - (void)testCopyingMakesUniqueObjects { 2360 - (void)testCopyingMakesUniqueObjects {
1976 const int repeatCount = 5; 2361 const int repeatCount = 5;
1977 TestAllTypes *msg1 = [TestAllTypes message]; 2362 TestAllTypes *msg1 = [TestAllTypes message];
1978 [self setAllFields:msg1 repeatedCount:repeatCount]; 2363 [self setAllFields:msg1 repeatedCount:repeatCount];
1979 2364
1980 TestAllTypes *msg2 = [[msg1 copy] autorelease]; 2365 TestAllTypes *msg2 = [[msg1 copy] autorelease];
1981 2366
1982 XCTAssertNotEqual(msg1, msg2); // Ptr compare, new object. 2367 XCTAssertNotEqual(msg1, msg2); // Ptr compare, new object.
1983 XCTAssertEqualObjects(msg1, msg2); // Equal values. 2368 XCTAssertEqualObjects(msg1, msg2); // Equal values.
1984 2369
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2059 2444
2060 // Ensure the messages are unique per map. 2445 // Ensure the messages are unique per map.
2061 [msg1.mapInt32ForeignMessage 2446 [msg1.mapInt32ForeignMessage
2062 enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, BOOL *stop) { 2447 enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, BOOL *stop) {
2063 #pragma unused(stop) 2448 #pragma unused(stop)
2064 ForeignMessage *subMsg2 = [msg2.mapInt32ForeignMessage objectForKey:key] ; 2449 ForeignMessage *subMsg2 = [msg2.mapInt32ForeignMessage objectForKey:key] ;
2065 XCTAssertNotEqual(value, subMsg2); // Ptr compare, new object. 2450 XCTAssertNotEqual(value, subMsg2); // Ptr compare, new object.
2066 }]; 2451 }];
2067 } 2452 }
2068 2453
2454 - (void)test_GPBGetMessageRepeatedField {
2455 TestAllTypes *message = [TestAllTypes message];
2456 GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"re peatedStringArray"];
2457 XCTAssertNotNil(fieldDescriptor);
2458 NSMutableArray *fieldArray = GPBGetMessageRepeatedField(message, fieldDescript or);
2459 XCTAssertNotNil(fieldArray); // Should have autocreated.
2460 XCTAssertTrue(fieldArray == message.repeatedStringArray); // Same pointer
2461 }
2462
2463 - (void)test_GPBSetMessageRepeatedField {
2464 TestAllTypes *message = [TestAllTypes message];
2465 GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"re peatedStringArray"];
2466 XCTAssertNotNil(fieldDescriptor);
2467
2468 NSMutableArray *fieldArray = [NSMutableArray arrayWithObject:@"foo"];
2469 GPBSetMessageRepeatedField(message, fieldDescriptor, fieldArray);
2470 XCTAssertTrue(fieldArray == message.repeatedStringArray); // Same pointer
2471 XCTAssertEqualObjects(@"foo", message.repeatedStringArray.firstObject);
2472 }
2473
2474 - (void)test_GPBGetMessageMapField {
2475 TestMap *message = [TestMap message];
2476 GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"ma pStringString"];
2477 XCTAssertNotNil(fieldDescriptor);
2478 NSMutableDictionary *fieldMap = GPBGetMessageMapField(message, fieldDescriptor );
2479 XCTAssertNotNil(fieldMap); // Should have autocreated.
2480 XCTAssertTrue(fieldMap == message.mapStringString); // Same pointer
2481 }
2482
2483 - (void)test_GPBSetMessageMapField {
2484 TestMap *message = [TestMap message];
2485 GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"ma pStringString"];
2486 XCTAssertNotNil(fieldDescriptor);
2487
2488 NSMutableDictionary *fieldMap = [NSMutableDictionary dictionaryWithObject:@"ba r" forKey:@"foo"];
2489 GPBSetMessageMapField(message, fieldDescriptor, fieldMap);
2490 XCTAssertTrue(fieldMap == message.mapStringString); // Same pointer
2491 XCTAssertEqualObjects(@"bar", message.mapStringString[@"foo"]);
2492 }
2493
2069 #pragma mark - Subset from from map_tests.cc 2494 #pragma mark - Subset from from map_tests.cc
2070 2495
2071 // TEST(GeneratedMapFieldTest, IsInitialized) 2496 // TEST(GeneratedMapFieldTest, IsInitialized)
2072 - (void)testMap_IsInitialized { 2497 - (void)testMap_IsInitialized {
2073 TestRequiredMessageMap *msg = [[TestRequiredMessageMap alloc] init]; 2498 TestRequiredMessageMap *msg = [[TestRequiredMessageMap alloc] init];
2074 2499
2075 // Add an uninitialized message. 2500 // Add an uninitialized message.
2076 TestRequired *subMsg = [[TestRequired alloc] init]; 2501 TestRequired *subMsg = [[TestRequired alloc] init];
2077 [msg.mapField setObject:subMsg forKey:0]; 2502 [msg.mapField setObject:subMsg forKey:0];
2078 XCTAssertFalse(msg.initialized); 2503 XCTAssertFalse(msg.initialized);
2079 2504
2080 // Initialize uninitialized message 2505 // Initialize uninitialized message
2081 subMsg.a = 0; 2506 subMsg.a = 0;
2082 subMsg.b = 0; 2507 subMsg.b = 0;
2083 subMsg.c = 0; 2508 subMsg.c = 0;
2084 XCTAssertTrue(msg.initialized); 2509 XCTAssertTrue(msg.initialized);
2085 2510
2086 [subMsg release]; 2511 [subMsg release];
2087 [msg release]; 2512 [msg release];
2088 } 2513 }
2089 2514
2090 @end 2515 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698