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" |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |