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