xref: /aosp_15_r20/external/protobuf/objectivec/Tests/GPBSwiftTests.swift (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
2*1b3f573fSAndroid Build Coastguard Worker // Copyright 2015 Google Inc.  All rights reserved.
3*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
4*1b3f573fSAndroid Build Coastguard Worker //
5*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
6*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
7*1b3f573fSAndroid Build Coastguard Worker // met:
8*1b3f573fSAndroid Build Coastguard Worker //
9*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
10*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
11*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
12*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
13*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
14*1b3f573fSAndroid Build Coastguard Worker // distribution.
15*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
16*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
17*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
18*1b3f573fSAndroid Build Coastguard Worker //
19*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*1b3f573fSAndroid Build Coastguard Worker 
31*1b3f573fSAndroid Build Coastguard Worker import Foundation
32*1b3f573fSAndroid Build Coastguard Worker import XCTest
33*1b3f573fSAndroid Build Coastguard Worker 
34*1b3f573fSAndroid Build Coastguard Worker // Test some usage of the ObjC library from Swift.
35*1b3f573fSAndroid Build Coastguard Worker 
36*1b3f573fSAndroid Build Coastguard Worker class GPBBridgeTests: XCTestCase {
37*1b3f573fSAndroid Build Coastguard Worker 
testProto2Basicsnull38*1b3f573fSAndroid Build Coastguard Worker   func testProto2Basics() {
39*1b3f573fSAndroid Build Coastguard Worker     let msg = Message2()
40*1b3f573fSAndroid Build Coastguard Worker     let msg2 = Message2()
41*1b3f573fSAndroid Build Coastguard Worker     let msg3 = Message2_OptionalGroup()
42*1b3f573fSAndroid Build Coastguard Worker 
43*1b3f573fSAndroid Build Coastguard Worker     msg.optionalInt32 = 100
44*1b3f573fSAndroid Build Coastguard Worker     msg.optionalString = "abc"
45*1b3f573fSAndroid Build Coastguard Worker     msg.optionalEnum = .bar
46*1b3f573fSAndroid Build Coastguard Worker     msg2.optionalString = "other"
47*1b3f573fSAndroid Build Coastguard Worker     msg.optional = msg2
48*1b3f573fSAndroid Build Coastguard Worker     msg3.a = 200
49*1b3f573fSAndroid Build Coastguard Worker     msg.optionalGroup = msg3
50*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedInt32Array.addValue(300)
51*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedInt32Array.addValue(301)
52*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedStringArray.add("mno")
53*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedStringArray.add("pqr")
54*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedEnumArray.addValue(Message2_Enum.bar.rawValue)
55*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedEnumArray.addValue(Message2_Enum.baz.rawValue)
56*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Int32.setInt32(400, forKey:500)
57*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Int32.setInt32(401, forKey:501)
58*1b3f573fSAndroid Build Coastguard Worker     msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
59*1b3f573fSAndroid Build Coastguard Worker     msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
60*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
61*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Enum.setEnum(Message2_Enum.baz.rawValue, forKey:601)
62*1b3f573fSAndroid Build Coastguard Worker 
63*1b3f573fSAndroid Build Coastguard Worker     // Check has*.
64*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalInt32)
65*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalString)
66*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalEnum)
67*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg2.hasOptionalString)
68*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalMessage)
69*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg3.hasA)
70*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalGroup)
71*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalInt64)
72*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalFloat)
73*1b3f573fSAndroid Build Coastguard Worker 
74*1b3f573fSAndroid Build Coastguard Worker     // Check values.
75*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalInt32, Int32(100))
76*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalString, "abc")
77*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2.optionalString, "other")
78*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional === msg2)
79*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalEnum, Message2_Enum.bar)
80*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg3.a, Int32(200))
81*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optionalGroup === msg3)
82*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
83*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
84*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
85*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
86*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
87*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
88*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
89*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message2_Enum.bar.rawValue)
90*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message2_Enum.baz.rawValue)
91*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
92*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
93*1b3f573fSAndroid Build Coastguard Worker     var intValue: Int32 = 0
94*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500))
95*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Int32(400))
96*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501))
97*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Int32(401))
98*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.count, Int(2))
99*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
100*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
101*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
102*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
103*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
104*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
105*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Message2_Enum.baz.rawValue)
106*1b3f573fSAndroid Build Coastguard Worker 
107*1b3f573fSAndroid Build Coastguard Worker     // Clearing a string with nil.
108*1b3f573fSAndroid Build Coastguard Worker     msg2.optionalString = nil
109*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg2.hasOptionalString)
110*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2.optionalString, "")
111*1b3f573fSAndroid Build Coastguard Worker 
112*1b3f573fSAndroid Build Coastguard Worker     // Clearing a message with nil.
113*1b3f573fSAndroid Build Coastguard Worker     msg.optionalGroup = nil
114*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalGroup)
115*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optionalGroup !== msg3)  // New instance
116*1b3f573fSAndroid Build Coastguard Worker 
117*1b3f573fSAndroid Build Coastguard Worker     // Clear.
118*1b3f573fSAndroid Build Coastguard Worker     msg.clear()
119*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalInt32)
120*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalString)
121*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalEnum)
122*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
123*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalInt64)
124*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalFloat)
125*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalInt32, Int32(0))
126*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalString, "")
127*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional !== msg2)  // New instance
128*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalEnum, Message2_Enum.foo)  // Default
129*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
130*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
131*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
132*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
133*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.count, Int(0))
134*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
135*1b3f573fSAndroid Build Coastguard Worker   }
136*1b3f573fSAndroid Build Coastguard Worker 
testProto3Basicsnull137*1b3f573fSAndroid Build Coastguard Worker   func testProto3Basics() {
138*1b3f573fSAndroid Build Coastguard Worker     let msg = Message3()
139*1b3f573fSAndroid Build Coastguard Worker     let msg2 = Message3()
140*1b3f573fSAndroid Build Coastguard Worker 
141*1b3f573fSAndroid Build Coastguard Worker     msg.optionalInt32 = 100
142*1b3f573fSAndroid Build Coastguard Worker     msg.optionalString = "abc"
143*1b3f573fSAndroid Build Coastguard Worker     msg.optionalEnum = .bar
144*1b3f573fSAndroid Build Coastguard Worker     msg2.optionalString = "other"
145*1b3f573fSAndroid Build Coastguard Worker     msg.optional = msg2
146*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedInt32Array.addValue(300)
147*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedInt32Array.addValue(301)
148*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedStringArray.add("mno")
149*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedStringArray.add("pqr")
150*1b3f573fSAndroid Build Coastguard Worker     // "proto3" syntax lets enum get unknown values.
151*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedEnumArray.addValue(Message3_Enum.bar.rawValue)
152*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedEnumArray.addRawValue(666)
153*1b3f573fSAndroid Build Coastguard Worker     SetMessage3_OptionalEnum_RawValue(msg2, 666)
154*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Int32.setInt32(400, forKey:500)
155*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Int32.setInt32(401, forKey:501)
156*1b3f573fSAndroid Build Coastguard Worker     msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
157*1b3f573fSAndroid Build Coastguard Worker     msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
158*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
159*1b3f573fSAndroid Build Coastguard Worker     // "proto3" syntax lets enum get unknown values.
160*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Enum.setRawValue(666, forKey:601)
161*1b3f573fSAndroid Build Coastguard Worker 
162*1b3f573fSAndroid Build Coastguard Worker     // Has only exists on for message fields.
163*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalMessage)
164*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg2.hasOptionalMessage)
165*1b3f573fSAndroid Build Coastguard Worker 
166*1b3f573fSAndroid Build Coastguard Worker     // Check values.
167*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalInt32, Int32(100))
168*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalString, "abc")
169*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2.optionalString, "other")
170*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional === msg2)
171*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalEnum, Message3_Enum.bar)
172*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
173*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
174*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
175*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
176*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
177*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
178*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
179*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
180*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message3_Enum.bar.rawValue)
181*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
182*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.rawValue(at: 1), 666)
183*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2.optionalEnum, Message3_Enum.gpbUnrecognizedEnumeratorValue)
184*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Int32(666))
185*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
186*1b3f573fSAndroid Build Coastguard Worker     var intValue: Int32 = 0
187*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:500))
188*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Int32(400))
189*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:501))
190*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Int32(401))
191*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.count, Int(2))
192*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
193*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
194*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
195*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
196*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
197*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
198*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
199*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.mapInt32Enum.getRawValue(&intValue, forKey:601))
200*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(intValue, 666)
201*1b3f573fSAndroid Build Coastguard Worker 
202*1b3f573fSAndroid Build Coastguard Worker     // Clearing a string with nil.
203*1b3f573fSAndroid Build Coastguard Worker     msg2.optionalString = nil
204*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2.optionalString, "")
205*1b3f573fSAndroid Build Coastguard Worker 
206*1b3f573fSAndroid Build Coastguard Worker     // Clearing a message with nil.
207*1b3f573fSAndroid Build Coastguard Worker     msg.optional = nil
208*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
209*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional !== msg2)  // New instance
210*1b3f573fSAndroid Build Coastguard Worker 
211*1b3f573fSAndroid Build Coastguard Worker     // Clear.
212*1b3f573fSAndroid Build Coastguard Worker     msg.clear()
213*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
214*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalInt32, Int32(0))
215*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalString, "")
216*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional !== msg2)  // New instance
217*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalEnum, Message3_Enum.foo)  // Default
218*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
219*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
220*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
221*1b3f573fSAndroid Build Coastguard Worker     msg2.clear()
222*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2.optionalEnum, Message3_Enum.foo)  // Default
223*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.foo.rawValue)
224*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
225*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.count, Int(0))
226*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
227*1b3f573fSAndroid Build Coastguard Worker   }
228*1b3f573fSAndroid Build Coastguard Worker 
testAutoCreationnull229*1b3f573fSAndroid Build Coastguard Worker   func testAutoCreation() {
230*1b3f573fSAndroid Build Coastguard Worker     let msg = Message2()
231*1b3f573fSAndroid Build Coastguard Worker 
232*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalGroup)
233*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
234*1b3f573fSAndroid Build Coastguard Worker 
235*1b3f573fSAndroid Build Coastguard Worker     // Access shouldn't result in has* but should return objects.
236*1b3f573fSAndroid Build Coastguard Worker     let msg2 = msg.optionalGroup
237*1b3f573fSAndroid Build Coastguard Worker     let msg3 = msg.optional.optional
238*1b3f573fSAndroid Build Coastguard Worker     let msg4 = msg.optional
239*1b3f573fSAndroid Build Coastguard Worker     XCTAssertNotNil(msg2)
240*1b3f573fSAndroid Build Coastguard Worker     XCTAssertNotNil(msg3)
241*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalGroup)
242*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.optional.hasOptionalMessage)
243*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
244*1b3f573fSAndroid Build Coastguard Worker 
245*1b3f573fSAndroid Build Coastguard Worker     // Setting things should trigger has* getting set.
246*1b3f573fSAndroid Build Coastguard Worker     msg.optionalGroup.a = 10
247*1b3f573fSAndroid Build Coastguard Worker     msg.optional.optional.optionalInt32 = 100
248*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalGroup)
249*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional.hasOptionalMessage)
250*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalMessage)
251*1b3f573fSAndroid Build Coastguard Worker 
252*1b3f573fSAndroid Build Coastguard Worker     // And they should be the same pointer as before.
253*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg2 === msg.optionalGroup)
254*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg3 === msg.optional.optional)
255*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg4 === msg.optional)
256*1b3f573fSAndroid Build Coastguard Worker 
257*1b3f573fSAndroid Build Coastguard Worker     // Clear gets us new objects next time around.
258*1b3f573fSAndroid Build Coastguard Worker     msg.clear()
259*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalGroup)
260*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.optional.hasOptionalMessage)
261*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
262*1b3f573fSAndroid Build Coastguard Worker     msg.optionalGroup.a = 20
263*1b3f573fSAndroid Build Coastguard Worker     msg.optional.optional.optionalInt32 = 200
264*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalGroup)
265*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional.hasOptionalMessage)
266*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalMessage)
267*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg2 !== msg.optionalGroup)
268*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg3 !== msg.optional.optional)
269*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg4 !== msg.optional)
270*1b3f573fSAndroid Build Coastguard Worker 
271*1b3f573fSAndroid Build Coastguard Worker     // Explicit set of a message, means autocreated object doesn't bind.
272*1b3f573fSAndroid Build Coastguard Worker     msg.clear()
273*1b3f573fSAndroid Build Coastguard Worker     let autoCreated = msg.optional
274*1b3f573fSAndroid Build Coastguard Worker     XCTAssertFalse(msg.hasOptionalMessage)
275*1b3f573fSAndroid Build Coastguard Worker     let msg5 = Message2()
276*1b3f573fSAndroid Build Coastguard Worker     msg5.optionalInt32 = 123
277*1b3f573fSAndroid Build Coastguard Worker     msg.optional = msg5
278*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalMessage)
279*1b3f573fSAndroid Build Coastguard Worker     // Modifying the autocreated doesn't replaced the explicit set one.
280*1b3f573fSAndroid Build Coastguard Worker     autoCreated?.optionalInt32 = 456
281*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.hasOptionalMessage)
282*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.optional === msg5)
283*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optional.optionalInt32, Int32(123))
284*1b3f573fSAndroid Build Coastguard Worker   }
285*1b3f573fSAndroid Build Coastguard Worker 
testProto2OneOfSupportnull286*1b3f573fSAndroid Build Coastguard Worker   func testProto2OneOfSupport() {
287*1b3f573fSAndroid Build Coastguard Worker     let msg = Message2()
288*1b3f573fSAndroid Build Coastguard Worker 
289*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
290*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
291*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
292*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
293*1b3f573fSAndroid Build Coastguard Worker     let autoCreated = msg.oneof  // Default create one.
294*1b3f573fSAndroid Build Coastguard Worker     XCTAssertNotNil(autoCreated)
295*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
296*1b3f573fSAndroid Build Coastguard Worker 
297*1b3f573fSAndroid Build Coastguard Worker     msg.oneofInt32 = 10
298*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(10))
299*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
300*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
301*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
302*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
303*1b3f573fSAndroid Build Coastguard Worker 
304*1b3f573fSAndroid Build Coastguard Worker     msg.oneofFloat = 20.0
305*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
306*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(20.0))
307*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
308*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
309*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofFloat)
310*1b3f573fSAndroid Build Coastguard Worker 
311*1b3f573fSAndroid Build Coastguard Worker     msg.oneofEnum = .bar
312*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
313*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
314*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message2_Enum.bar)
315*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
316*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofEnum)
317*1b3f573fSAndroid Build Coastguard Worker 
318*1b3f573fSAndroid Build Coastguard Worker     // Sets via the autocreated instance.
319*1b3f573fSAndroid Build Coastguard Worker     msg.oneof.optionalInt32 = 200
320*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
321*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
322*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
323*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
324*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
325*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
326*1b3f573fSAndroid Build Coastguard Worker 
327*1b3f573fSAndroid Build Coastguard Worker     // Clear the oneof.
328*1b3f573fSAndroid Build Coastguard Worker     Message2_ClearOOneOfCase(msg)
329*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
330*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
331*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
332*1b3f573fSAndroid Build Coastguard Worker     let autoCreated2 = msg.oneof  // Default create one
333*1b3f573fSAndroid Build Coastguard Worker     XCTAssertNotNil(autoCreated2)
334*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(autoCreated2 !== autoCreated)  // New instance
335*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
336*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
337*1b3f573fSAndroid Build Coastguard Worker 
338*1b3f573fSAndroid Build Coastguard Worker     msg.oneofInt32 = 10
339*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(10))
340*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
341*1b3f573fSAndroid Build Coastguard Worker 
342*1b3f573fSAndroid Build Coastguard Worker     // Confirm Message.clear() handles the oneof correctly.
343*1b3f573fSAndroid Build Coastguard Worker     msg.clear()
344*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
345*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
346*1b3f573fSAndroid Build Coastguard Worker 
347*1b3f573fSAndroid Build Coastguard Worker     // Sets via the autocreated instance.
348*1b3f573fSAndroid Build Coastguard Worker     msg.oneof.optionalInt32 = 300
349*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof !== autoCreated)  // New instance
350*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof !== autoCreated2)  // New instance
351*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
352*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
353*1b3f573fSAndroid Build Coastguard Worker 
354*1b3f573fSAndroid Build Coastguard Worker     // Set message to nil clears the oneof.
355*1b3f573fSAndroid Build Coastguard Worker     msg.oneof = nil
356*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
357*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
358*1b3f573fSAndroid Build Coastguard Worker   }
359*1b3f573fSAndroid Build Coastguard Worker 
testProto3OneOfSupportnull360*1b3f573fSAndroid Build Coastguard Worker   func testProto3OneOfSupport() {
361*1b3f573fSAndroid Build Coastguard Worker     let msg = Message3()
362*1b3f573fSAndroid Build Coastguard Worker 
363*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
364*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
365*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
366*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
367*1b3f573fSAndroid Build Coastguard Worker     let autoCreated = msg.oneof  // Default create one.
368*1b3f573fSAndroid Build Coastguard Worker     XCTAssertNotNil(autoCreated)
369*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
370*1b3f573fSAndroid Build Coastguard Worker 
371*1b3f573fSAndroid Build Coastguard Worker     msg.oneofInt32 = 10
372*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(10))
373*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
374*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
375*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
376*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
377*1b3f573fSAndroid Build Coastguard Worker 
378*1b3f573fSAndroid Build Coastguard Worker     msg.oneofFloat = 20.0
379*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
380*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(20.0))
381*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
382*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
383*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofFloat)
384*1b3f573fSAndroid Build Coastguard Worker 
385*1b3f573fSAndroid Build Coastguard Worker     msg.oneofEnum = .bar
386*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
387*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
388*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message3_Enum.bar)
389*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
390*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofEnum)
391*1b3f573fSAndroid Build Coastguard Worker 
392*1b3f573fSAndroid Build Coastguard Worker     // Sets via the autocreated instance.
393*1b3f573fSAndroid Build Coastguard Worker     msg.oneof.optionalInt32 = 200
394*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
395*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
396*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
397*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
398*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
399*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
400*1b3f573fSAndroid Build Coastguard Worker 
401*1b3f573fSAndroid Build Coastguard Worker     // Clear the oneof.
402*1b3f573fSAndroid Build Coastguard Worker     Message3_ClearOOneOfCase(msg)
403*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
404*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
405*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
406*1b3f573fSAndroid Build Coastguard Worker     let autoCreated2 = msg.oneof  // Default create one
407*1b3f573fSAndroid Build Coastguard Worker     XCTAssertNotNil(autoCreated2)
408*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(autoCreated2 !== autoCreated)  // New instance
409*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
410*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
411*1b3f573fSAndroid Build Coastguard Worker 
412*1b3f573fSAndroid Build Coastguard Worker     msg.oneofInt32 = 10
413*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(10))
414*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
415*1b3f573fSAndroid Build Coastguard Worker 
416*1b3f573fSAndroid Build Coastguard Worker     // Confirm Message.clear() handles the oneof correctly.
417*1b3f573fSAndroid Build Coastguard Worker     msg.clear()
418*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
419*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
420*1b3f573fSAndroid Build Coastguard Worker 
421*1b3f573fSAndroid Build Coastguard Worker     // Sets via the autocreated instance.
422*1b3f573fSAndroid Build Coastguard Worker     msg.oneof.optionalInt32 = 300
423*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof !== autoCreated)  // New instance
424*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg.oneof !== autoCreated2)  // New instance
425*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
426*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
427*1b3f573fSAndroid Build Coastguard Worker 
428*1b3f573fSAndroid Build Coastguard Worker     // Set message to nil clears the oneof.
429*1b3f573fSAndroid Build Coastguard Worker     msg.oneof = nil
430*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
431*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
432*1b3f573fSAndroid Build Coastguard Worker   }
433*1b3f573fSAndroid Build Coastguard Worker 
testSerializationnull434*1b3f573fSAndroid Build Coastguard Worker   func testSerialization() {
435*1b3f573fSAndroid Build Coastguard Worker     let msg = Message2()
436*1b3f573fSAndroid Build Coastguard Worker 
437*1b3f573fSAndroid Build Coastguard Worker     msg.optionalInt32 = 100
438*1b3f573fSAndroid Build Coastguard Worker     msg.optionalInt64 = 101
439*1b3f573fSAndroid Build Coastguard Worker     msg.optionalGroup.a = 102
440*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedStringArray.add("abc")
441*1b3f573fSAndroid Build Coastguard Worker     msg.repeatedStringArray.add("def")
442*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Int32.setInt32(200, forKey:300)
443*1b3f573fSAndroid Build Coastguard Worker     msg.mapInt32Int32.setInt32(201, forKey:201)
444*1b3f573fSAndroid Build Coastguard Worker     msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
445*1b3f573fSAndroid Build Coastguard Worker     msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
446*1b3f573fSAndroid Build Coastguard Worker 
447*1b3f573fSAndroid Build Coastguard Worker     let data = msg.data()
448*1b3f573fSAndroid Build Coastguard Worker 
449*1b3f573fSAndroid Build Coastguard Worker     let msg2 = try! Message2(data: data!)
450*1b3f573fSAndroid Build Coastguard Worker     XCTAssertTrue(msg2 !== msg)  // New instance
451*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalInt32, Int32(100))
452*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalInt64, Int64(101))
453*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.optionalGroup.a, Int32(102))
454*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
455*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
456*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg.mapStringString.count, Int(2))
457*1b3f573fSAndroid Build Coastguard Worker     XCTAssertEqual(msg2, msg)
458*1b3f573fSAndroid Build Coastguard Worker   }
459*1b3f573fSAndroid Build Coastguard Worker 
460*1b3f573fSAndroid Build Coastguard Worker }
461