OLD | NEW |
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 Loading... |
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" | |
40 #import "google/protobuf/UnittestObjcStartup.pbobjc.h" | 39 #import "google/protobuf/UnittestObjcStartup.pbobjc.h" |
41 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h" | 40 #import "google/protobuf/UnittestRuntimeProto2.pbobjc.h" |
42 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h" | 41 #import "google/protobuf/UnittestRuntimeProto3.pbobjc.h" |
43 | 42 |
44 @interface MessageRuntimeTests : GPBTestCase | 43 @interface MessageRuntimeTests : GPBTestCase |
45 @end | 44 @end |
46 | 45 |
47 @implementation MessageRuntimeTests | 46 @implementation MessageRuntimeTests |
48 | 47 |
49 // TODO(thomasvl): Pull tests over from GPBMessageTests that are runtime | 48 // TODO(thomasvl): Pull tests over from GPBMessageTests that are runtime |
50 // specific. | 49 // specific. |
51 | 50 |
52 - (void)testStartupOrdering { | 51 - (void)testStartupOrdering { |
53 // Message class/Root class initialization is a little tricky, so these just | 52 // Just have to create a message. Nothing else uses the classes from |
54 // create some possible patterns that can be a problem. The messages don't | 53 // this file, so the first selector invoked on the class will initialize |
55 // have to be exercised, just creating them is enough to test. If there | 54 // it, which also initializes the root. |
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 | |
62 TestObjCStartupMessage *message = [TestObjCStartupMessage message]; | 55 TestObjCStartupMessage *message = [TestObjCStartupMessage message]; |
63 XCTAssertNotNil(message); | 56 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); | |
71 } | 57 } |
72 | 58 |
73 - (void)testProto2HasMethodSupport { | 59 - (void)testProto2HasMethodSupport { |
74 NSArray *names = @[ | 60 NSArray *names = @[ |
75 @"Int32", | 61 @"Int32", |
76 @"Int64", | 62 @"Int64", |
77 @"Uint32", | 63 @"Uint32", |
78 @"Uint64", | 64 @"Uint64", |
79 @"Sint32", | 65 @"Sint32", |
80 @"Sint64", | 66 @"Sint64", |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 //% { // optional##FIELD :: ZERO_VALUE | 319 //% { // optional##FIELD :: ZERO_VALUE |
334 //% Message2 *msg = [[Message2 alloc] init]; | 320 //% Message2 *msg = [[Message2 alloc] init]; |
335 //% XCTAssertFalse(msg.hasOptional##FIELD); | 321 //% XCTAssertFalse(msg.hasOptional##FIELD); |
336 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Opti
onal##FIELD)); | 322 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Opti
onal##FIELD)); |
337 //% msg.optional##FIELD = ZERO_VALUE; | 323 //% msg.optional##FIELD = ZERO_VALUE; |
338 //% XCTAssertTrue(msg.hasOptional##FIELD); | 324 //% XCTAssertTrue(msg.hasOptional##FIELD); |
339 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optio
nal##FIELD)); | 325 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optio
nal##FIELD)); |
340 //% [msg release]; | 326 //% [msg release]; |
341 //% } | 327 //% } |
342 //% | 328 //% |
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 //% | |
354 //%PDDM-DEFINE PROTO2_TEST_HAS_FIELDS() | 329 //%PDDM-DEFINE PROTO2_TEST_HAS_FIELDS() |
355 //%PROTO2_TEST_HAS_FIELD(Int32, 1, 0) | 330 //%PROTO2_TEST_HAS_FIELD(Int32, 1, 0) |
356 //%PROTO2_TEST_HAS_FIELD(Int64, 1, 0) | 331 //%PROTO2_TEST_HAS_FIELD(Int64, 1, 0) |
357 //%PROTO2_TEST_HAS_FIELD(Uint32, 1, 0) | 332 //%PROTO2_TEST_HAS_FIELD(Uint32, 1, 0) |
358 //%PROTO2_TEST_HAS_FIELD(Uint64, 1, 0) | 333 //%PROTO2_TEST_HAS_FIELD(Uint64, 1, 0) |
359 //%PROTO2_TEST_HAS_FIELD(Sint32, 1, 0) | 334 //%PROTO2_TEST_HAS_FIELD(Sint32, 1, 0) |
360 //%PROTO2_TEST_HAS_FIELD(Sint64, 1, 0) | 335 //%PROTO2_TEST_HAS_FIELD(Sint64, 1, 0) |
361 //%PROTO2_TEST_HAS_FIELD(Fixed32, 1, 0) | 336 //%PROTO2_TEST_HAS_FIELD(Fixed32, 1, 0) |
362 //%PROTO2_TEST_HAS_FIELD(Fixed64, 1, 0) | 337 //%PROTO2_TEST_HAS_FIELD(Fixed64, 1, 0) |
363 //%PROTO2_TEST_HAS_FIELD(Sfixed32, 1, 0) | 338 //%PROTO2_TEST_HAS_FIELD(Sfixed32, 1, 0) |
364 //%PROTO2_TEST_HAS_FIELD(Sfixed64, 1, 0) | 339 //%PROTO2_TEST_HAS_FIELD(Sfixed64, 1, 0) |
365 //%PROTO2_TEST_HAS_FIELD(Float, 1.0f, 0.0f) | 340 //%PROTO2_TEST_HAS_FIELD(Float, 1.0f, 0.0f) |
366 //%PROTO2_TEST_HAS_FIELD(Double, 1.0, 0.0) | 341 //%PROTO2_TEST_HAS_FIELD(Double, 1.0, 0.0) |
367 //%PROTO2_TEST_HAS_FIELD(Bool, YES, NO) | 342 //%PROTO2_TEST_HAS_FIELD(Bool, YES, NO) |
368 //%PROTO2_TEST_HAS_FIELD(String, @"foo", @"") | 343 //%PROTO2_TEST_HAS_FIELD(String, @"foo", @"") |
369 //%PROTO2_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding],
[NSData data]) | 344 //%PROTO2_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding],
[NSData data]) |
370 //% // | 345 //% // |
371 //% // Test doesn't apply to optionalGroup/optionalMessage. | 346 //% // Test doesn't apply to optionalGroup/optionalMessage. |
372 //% // | 347 //% // |
373 //% | 348 //% |
374 //%PROTO2_TEST_HAS_FIELD(Enum, Message2_Enum_Bar, Message2_Enum_Foo) | 349 //%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]) | |
383 //%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS() | 350 //%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS() |
384 // This block of code is generated, do not edit it directly. | 351 // This block of code is generated, do not edit it directly. |
385 | 352 |
386 { // optionalInt32 :: 1 | 353 { // optionalInt32 :: 1 |
387 Message2 *msg = [[Message2 alloc] init]; | 354 Message2 *msg = [[Message2 alloc] init]; |
388 XCTAssertFalse(msg.hasOptionalInt32); | 355 XCTAssertFalse(msg.hasOptionalInt32); |
389 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona
lInt32)); | 356 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona
lInt32)); |
390 msg.optionalInt32 = 1; | 357 msg.optionalInt32 = 1; |
391 XCTAssertTrue(msg.hasOptionalInt32); | 358 XCTAssertTrue(msg.hasOptionalInt32); |
392 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional
Int32)); | 359 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional
Int32)); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 { // optionalEnum :: Message2_Enum_Foo | 651 { // optionalEnum :: Message2_Enum_Foo |
685 Message2 *msg = [[Message2 alloc] init]; | 652 Message2 *msg = [[Message2 alloc] init]; |
686 XCTAssertFalse(msg.hasOptionalEnum); | 653 XCTAssertFalse(msg.hasOptionalEnum); |
687 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona
lEnum)); | 654 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optiona
lEnum)); |
688 msg.optionalEnum = Message2_Enum_Foo; | 655 msg.optionalEnum = Message2_Enum_Foo; |
689 XCTAssertTrue(msg.hasOptionalEnum); | 656 XCTAssertTrue(msg.hasOptionalEnum); |
690 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional
Enum)); | 657 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message2_FieldNumber_Optional
Enum)); |
691 [msg release]; | 658 [msg release]; |
692 } | 659 } |
693 | 660 |
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 | |
738 //%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS() | 661 //%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS() |
739 } | 662 } |
740 | 663 |
741 - (void)testProto3SingleFieldHasBehavior { | 664 - (void)testProto3SingleFieldHasBehavior { |
742 // | 665 // |
743 // Setting to any value but the default value (0) should result has* | 666 // Setting to any value including the default value (0) should result has* |
744 // being true. When set to the default, shouldn't be true. | 667 // being true. |
745 // | 668 // |
746 | 669 |
747 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE) | 670 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE) |
748 //% { // optional##FIELD | 671 //% { // optional##FIELD |
749 //% Message3 *msg = [[Message3 alloc] init]; | 672 //% Message3 *msg = [[Message3 alloc] init]; |
750 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti
onal##FIELD)); | 673 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti
onal##FIELD)); |
751 //% msg.optional##FIELD = NON_ZERO_VALUE; | 674 //% msg.optional##FIELD = NON_ZERO_VALUE; |
752 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optio
nal##FIELD)); | 675 //% XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optio
nal##FIELD)); |
753 //% msg.optional##FIELD = ZERO_VALUE; | 676 //% msg.optional##FIELD = ZERO_VALUE; |
754 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti
onal##FIELD)); | 677 //% XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Opti
onal##FIELD)); |
755 //% [msg release]; | 678 //% [msg release]; |
756 //% } | 679 //% } |
757 //% | 680 //% |
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 //% | |
769 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELDS() | 681 //%PDDM-DEFINE PROTO3_TEST_HAS_FIELDS() |
770 //%PROTO3_TEST_HAS_FIELD(Int32, 1, 0) | 682 //%PROTO3_TEST_HAS_FIELD(Int32, 1, 0) |
771 //%PROTO3_TEST_HAS_FIELD(Int64, 1, 0) | 683 //%PROTO3_TEST_HAS_FIELD(Int64, 1, 0) |
772 //%PROTO3_TEST_HAS_FIELD(Uint32, 1, 0) | 684 //%PROTO3_TEST_HAS_FIELD(Uint32, 1, 0) |
773 //%PROTO3_TEST_HAS_FIELD(Uint64, 1, 0) | 685 //%PROTO3_TEST_HAS_FIELD(Uint64, 1, 0) |
774 //%PROTO3_TEST_HAS_FIELD(Sint32, 1, 0) | 686 //%PROTO3_TEST_HAS_FIELD(Sint32, 1, 0) |
775 //%PROTO3_TEST_HAS_FIELD(Sint64, 1, 0) | 687 //%PROTO3_TEST_HAS_FIELD(Sint64, 1, 0) |
776 //%PROTO3_TEST_HAS_FIELD(Fixed32, 1, 0) | 688 //%PROTO3_TEST_HAS_FIELD(Fixed32, 1, 0) |
777 //%PROTO3_TEST_HAS_FIELD(Fixed64, 1, 0) | 689 //%PROTO3_TEST_HAS_FIELD(Fixed64, 1, 0) |
778 //%PROTO3_TEST_HAS_FIELD(Sfixed32, 1, 0) | 690 //%PROTO3_TEST_HAS_FIELD(Sfixed32, 1, 0) |
779 //%PROTO3_TEST_HAS_FIELD(Sfixed64, 1, 0) | 691 //%PROTO3_TEST_HAS_FIELD(Sfixed64, 1, 0) |
780 //%PROTO3_TEST_HAS_FIELD(Float, 1.0f, 0.0f) | 692 //%PROTO3_TEST_HAS_FIELD(Float, 1.0f, 0.0f) |
781 //%PROTO3_TEST_HAS_FIELD(Double, 1.0, 0.0) | 693 //%PROTO3_TEST_HAS_FIELD(Double, 1.0, 0.0) |
782 //%PROTO3_TEST_HAS_FIELD(Bool, YES, NO) | 694 //%PROTO3_TEST_HAS_FIELD(Bool, YES, NO) |
783 //%PROTO3_TEST_HAS_FIELD(String, @"foo", @"") | 695 //%PROTO3_TEST_HAS_FIELD(String, @"foo", @"") |
784 //%PROTO3_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding],
[NSData data]) | 696 //%PROTO3_TEST_HAS_FIELD(Bytes, [@"foo" dataUsingEncoding:NSUTF8StringEncoding],
[NSData data]) |
785 //% // | 697 //% // |
786 //% // Test doesn't apply to optionalMessage (no groups in proto3). | 698 //% // Test doesn't apply to optionalGroup/optionalMessage. |
787 //% // | 699 //% // |
788 //% | 700 //% |
789 //%PROTO3_TEST_HAS_FIELD(Enum, Message3_Enum_Bar, Message3_Enum_Foo) | 701 //%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]) | |
797 //%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS() | 702 //%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS() |
798 // This block of code is generated, do not edit it directly. | 703 // This block of code is generated, do not edit it directly. |
799 | 704 |
800 { // optionalInt32 | 705 { // optionalInt32 |
801 Message3 *msg = [[Message3 alloc] init]; | 706 Message3 *msg = [[Message3 alloc] init]; |
802 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lInt32)); | 707 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lInt32)); |
803 msg.optionalInt32 = 1; | 708 msg.optionalInt32 = 1; |
804 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional
Int32)); | 709 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional
Int32)); |
805 msg.optionalInt32 = 0; | 710 msg.optionalInt32 = 0; |
806 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lInt32)); | 711 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lInt32)); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 Message3 *msg = [[Message3 alloc] init]; | 846 Message3 *msg = [[Message3 alloc] init]; |
942 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lBytes)); | 847 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lBytes)); |
943 msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding]; | 848 msg.optionalBytes = [@"foo" dataUsingEncoding:NSUTF8StringEncoding]; |
944 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional
Bytes)); | 849 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional
Bytes)); |
945 msg.optionalBytes = [NSData data]; | 850 msg.optionalBytes = [NSData data]; |
946 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lBytes)); | 851 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lBytes)); |
947 [msg release]; | 852 [msg release]; |
948 } | 853 } |
949 | 854 |
950 // | 855 // |
951 // Test doesn't apply to optionalMessage (no groups in proto3). | 856 // Test doesn't apply to optionalGroup/optionalMessage. |
952 // | 857 // |
953 | 858 |
954 { // optionalEnum | 859 { // optionalEnum |
955 Message3 *msg = [[Message3 alloc] init]; | 860 Message3 *msg = [[Message3 alloc] init]; |
956 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lEnum)); | 861 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lEnum)); |
957 msg.optionalEnum = Message3_Enum_Bar; | 862 msg.optionalEnum = Message3_Enum_Bar; |
958 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional
Enum)); | 863 XCTAssertTrue(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optional
Enum)); |
959 msg.optionalEnum = Message3_Enum_Foo; | 864 msg.optionalEnum = Message3_Enum_Foo; |
960 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lEnum)); | 865 XCTAssertFalse(GPBMessageHasFieldNumberSet(msg, Message3_FieldNumber_Optiona
lEnum)); |
961 [msg release]; | 866 [msg release]; |
962 } | 867 } |
963 | 868 |
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 | |
998 //%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS() | 869 //%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS() |
999 } | 870 } |
1000 | 871 |
1001 - (void)testAccessingProto2UnknownEnumValues { | 872 - (void)testAccessingProto2UnknownEnumValues { |
1002 Message2 *msg = [[Message2 alloc] init]; | 873 Message2 *msg = [[Message2 alloc] init]; |
1003 | 874 |
1004 // Set it to something non zero, try and confirm it doesn't change. | 875 // Set it to something non zero, try and confirm it doesn't change. |
1005 | 876 |
1006 msg.optionalEnum = Message2_Enum_Bar; | 877 msg.optionalEnum = Message2_Enum_Bar; |
1007 XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException, | 878 XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException, |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2094 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i); | 1965 XCTAssertEqualObjects(msg.oneofBytes, oneofBytesDefault, "Loop: %zd", i); |
2095 XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i); | 1966 XCTAssertNotNil(msg.oneofMessage, "Loop: %zd", i); |
2096 XCTAssertNotEqual(msg.oneofMessage, subMessage, "Loop: %zd", | 1967 XCTAssertNotEqual(msg.oneofMessage, subMessage, "Loop: %zd", |
2097 i); // Pointer compare. | 1968 i); // Pointer compare. |
2098 XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i); | 1969 XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo, "Loop: %zd", i); |
2099 } | 1970 } |
2100 | 1971 |
2101 [msg release]; | 1972 [msg release]; |
2102 } | 1973 } |
2103 | 1974 |
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 | |
2360 - (void)testCopyingMakesUniqueObjects { | 1975 - (void)testCopyingMakesUniqueObjects { |
2361 const int repeatCount = 5; | 1976 const int repeatCount = 5; |
2362 TestAllTypes *msg1 = [TestAllTypes message]; | 1977 TestAllTypes *msg1 = [TestAllTypes message]; |
2363 [self setAllFields:msg1 repeatedCount:repeatCount]; | 1978 [self setAllFields:msg1 repeatedCount:repeatCount]; |
2364 | 1979 |
2365 TestAllTypes *msg2 = [[msg1 copy] autorelease]; | 1980 TestAllTypes *msg2 = [[msg1 copy] autorelease]; |
2366 | 1981 |
2367 XCTAssertNotEqual(msg1, msg2); // Ptr compare, new object. | 1982 XCTAssertNotEqual(msg1, msg2); // Ptr compare, new object. |
2368 XCTAssertEqualObjects(msg1, msg2); // Equal values. | 1983 XCTAssertEqualObjects(msg1, msg2); // Equal values. |
2369 | 1984 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2444 | 2059 |
2445 // Ensure the messages are unique per map. | 2060 // Ensure the messages are unique per map. |
2446 [msg1.mapInt32ForeignMessage | 2061 [msg1.mapInt32ForeignMessage |
2447 enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, BOOL *stop) { | 2062 enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, BOOL *stop) { |
2448 #pragma unused(stop) | 2063 #pragma unused(stop) |
2449 ForeignMessage *subMsg2 = [msg2.mapInt32ForeignMessage objectForKey:key]
; | 2064 ForeignMessage *subMsg2 = [msg2.mapInt32ForeignMessage objectForKey:key]
; |
2450 XCTAssertNotEqual(value, subMsg2); // Ptr compare, new object. | 2065 XCTAssertNotEqual(value, subMsg2); // Ptr compare, new object. |
2451 }]; | 2066 }]; |
2452 } | 2067 } |
2453 | 2068 |
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 | |
2494 #pragma mark - Subset from from map_tests.cc | 2069 #pragma mark - Subset from from map_tests.cc |
2495 | 2070 |
2496 // TEST(GeneratedMapFieldTest, IsInitialized) | 2071 // TEST(GeneratedMapFieldTest, IsInitialized) |
2497 - (void)testMap_IsInitialized { | 2072 - (void)testMap_IsInitialized { |
2498 TestRequiredMessageMap *msg = [[TestRequiredMessageMap alloc] init]; | 2073 TestRequiredMessageMap *msg = [[TestRequiredMessageMap alloc] init]; |
2499 | 2074 |
2500 // Add an uninitialized message. | 2075 // Add an uninitialized message. |
2501 TestRequired *subMsg = [[TestRequired alloc] init]; | 2076 TestRequired *subMsg = [[TestRequired alloc] init]; |
2502 [msg.mapField setObject:subMsg forKey:0]; | 2077 [msg.mapField setObject:subMsg forKey:0]; |
2503 XCTAssertFalse(msg.initialized); | 2078 XCTAssertFalse(msg.initialized); |
2504 | 2079 |
2505 // Initialize uninitialized message | 2080 // Initialize uninitialized message |
2506 subMsg.a = 0; | 2081 subMsg.a = 0; |
2507 subMsg.b = 0; | 2082 subMsg.b = 0; |
2508 subMsg.c = 0; | 2083 subMsg.c = 0; |
2509 XCTAssertTrue(msg.initialized); | 2084 XCTAssertTrue(msg.initialized); |
2510 | 2085 |
2511 [subMsg release]; | 2086 [subMsg release]; |
2512 [msg release]; | 2087 [msg release]; |
2513 } | 2088 } |
2514 | 2089 |
2515 @end | 2090 @end |
OLD | NEW |