• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2015 Google Inc.  All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7 
8 import Foundation
9 import XCTest
10 // This works for the Xcode project, but for any other build that gets the tests wired up
11 // it will need something else.
12 import ProtocolBuffers
13 
14 // Test some usage of the ObjC library from Swift.
15 
dataFromStrnull16 private func dataFromStr(_ str: String) -> Data {
17   return str.data(using: .utf8)!
18 }
19 
20 class GPBBridgeTests: XCTestCase {
21 
testProto2Basicsnull22   func testProto2Basics() {
23     let msg = Message2()
24     let msg2 = Message2()
25     let msg3 = Message2_OptionalGroup()
26 
27     msg.optionalInt32 = 100
28     msg.optionalString = "abc"
29     msg.optionalEnum = .bar
30     msg2.optionalString = "other"
31     msg.optional = msg2
32     msg3.a = 200
33     msg.optionalGroup = msg3
34     msg.repeatedInt32Array.addValue(300)
35     msg.repeatedInt32Array.addValue(301)
36     msg.repeatedStringArray.add("mno")
37     msg.repeatedStringArray.add("pqr")
38     msg.repeatedEnumArray.addValue(Message2_Enum.bar.rawValue)
39     msg.repeatedEnumArray.addValue(Message2_Enum.baz.rawValue)
40     msg.mapInt32Int32.setInt32(400, forKey: 500)
41     msg.mapInt32Int32.setInt32(401, forKey: 501)
42     msg.mapStringString.setObject("foo", forKey: "bar" as NSString)
43     msg.mapStringString.setObject("abc", forKey: "xyz" as NSString)
44     msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey: 600)
45     msg.mapInt32Enum.setEnum(Message2_Enum.baz.rawValue, forKey: 601)
46 
47     // Check has*.
48     XCTAssertTrue(msg.hasOptionalInt32)
49     XCTAssertTrue(msg.hasOptionalString)
50     XCTAssertTrue(msg.hasOptionalEnum)
51     XCTAssertTrue(msg2.hasOptionalString)
52     XCTAssertTrue(msg.hasOptionalMessage)
53     XCTAssertTrue(msg3.hasA)
54     XCTAssertTrue(msg.hasOptionalGroup)
55     XCTAssertFalse(msg.hasOptionalInt64)
56     XCTAssertFalse(msg.hasOptionalFloat)
57 
58     // Check values.
59     XCTAssertEqual(msg.optionalInt32, Int32(100))
60     XCTAssertEqual(msg.optionalString, "abc")
61     XCTAssertEqual(msg2.optionalString, "other")
62     XCTAssertTrue(msg.optional === msg2)
63     XCTAssertEqual(msg.optionalEnum, Message2_Enum.bar)
64     XCTAssertEqual(msg3.a, Int32(200))
65     XCTAssertTrue(msg.optionalGroup === msg3)
66     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
67     XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
68     XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
69     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
70     XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
71     XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
72     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
73     XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message2_Enum.bar.rawValue)
74     XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message2_Enum.baz.rawValue)
75     XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
76     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
77     var intValue: Int32 = 0
78     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500))
79     XCTAssertEqual(intValue, Int32(400))
80     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501))
81     XCTAssertEqual(intValue, Int32(401))
82     XCTAssertEqual(msg.mapStringString.count, Int(2))
83     XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
84     XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
85     XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
86     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey: 600))
87     XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
88     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey: 601))
89     XCTAssertEqual(intValue, Message2_Enum.baz.rawValue)
90 
91     // Clearing a string with nil.
92     msg2.optionalString = nil
93     XCTAssertFalse(msg2.hasOptionalString)
94     XCTAssertEqual(msg2.optionalString, "")
95 
96     // Clearing a message with nil.
97     msg.optionalGroup = nil
98     XCTAssertFalse(msg.hasOptionalGroup)
99     XCTAssertTrue(msg.optionalGroup !== msg3)  // New instance
100 
101     // Clear.
102     msg.clear()
103     XCTAssertFalse(msg.hasOptionalInt32)
104     XCTAssertFalse(msg.hasOptionalString)
105     XCTAssertFalse(msg.hasOptionalEnum)
106     XCTAssertFalse(msg.hasOptionalMessage)
107     XCTAssertFalse(msg.hasOptionalInt64)
108     XCTAssertFalse(msg.hasOptionalFloat)
109     XCTAssertEqual(msg.optionalInt32, Int32(0))
110     XCTAssertEqual(msg.optionalString, "")
111     XCTAssertTrue(msg.optional !== msg2)  // New instance
112     XCTAssertEqual(msg.optionalEnum, Message2_Enum.foo)  // Default
113     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
114     XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
115     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
116     XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
117     XCTAssertEqual(msg.mapStringString.count, Int(0))
118     XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
119   }
120 
testProto3Basicsnull121   func testProto3Basics() {
122     let msg = Message3()
123     let msg2 = Message3()
124 
125     msg.optionalInt32 = 100
126     msg.optionalString = "abc"
127     msg.optionalEnum = .bar
128     msg2.optionalString = "other"
129     msg.optional = msg2
130     msg.repeatedInt32Array.addValue(300)
131     msg.repeatedInt32Array.addValue(301)
132     msg.repeatedStringArray.add("mno")
133     msg.repeatedStringArray.add("pqr")
134     // "proto3" syntax lets enum get unknown values.
135     msg.repeatedEnumArray.addValue(Message3_Enum.bar.rawValue)
136     msg.repeatedEnumArray.addRawValue(666)
137     SetMessage3_OptionalEnum_RawValue(msg2, 666)
138     msg.mapInt32Int32.setInt32(400, forKey: 500)
139     msg.mapInt32Int32.setInt32(401, forKey: 501)
140     msg.mapStringString.setObject("foo", forKey: "bar" as NSString)
141     msg.mapStringString.setObject("abc", forKey: "xyz" as NSString)
142     msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey: 600)
143     // "proto3" syntax lets enum get unknown values.
144     msg.mapInt32Enum.setRawValue(666, forKey: 601)
145 
146     // Has only exists on for message fields.
147     XCTAssertTrue(msg.hasOptionalMessage)
148     XCTAssertFalse(msg2.hasOptionalMessage)
149 
150     // Check values.
151     XCTAssertEqual(msg.optionalInt32, Int32(100))
152     XCTAssertEqual(msg.optionalString, "abc")
153     XCTAssertEqual(msg2.optionalString, "other")
154     XCTAssertTrue(msg.optional === msg2)
155     XCTAssertEqual(msg.optionalEnum, Message3_Enum.bar)
156     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
157     XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
158     XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
159     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
160     XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
161     XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
162     XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
163     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
164     XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message3_Enum.bar.rawValue)
165     XCTAssertEqual(
166       msg.repeatedEnumArray.value(at: 1), Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
167     XCTAssertEqual(msg.repeatedEnumArray.rawValue(at: 1), 666)
168     XCTAssertEqual(msg2.optionalEnum, Message3_Enum.gpbUnrecognizedEnumeratorValue)
169     XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Int32(666))
170     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
171     var intValue: Int32 = 0
172     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500))
173     XCTAssertEqual(intValue, Int32(400))
174     XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501))
175     XCTAssertEqual(intValue, Int32(401))
176     XCTAssertEqual(msg.mapStringString.count, Int(2))
177     XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
178     XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
179     XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
180     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey: 600))
181     XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
182     XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey: 601))
183     XCTAssertEqual(intValue, Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
184     XCTAssertTrue(msg.mapInt32Enum.getRawValue(&intValue, forKey: 601))
185     XCTAssertEqual(intValue, 666)
186 
187     // Clearing a string with nil.
188     msg2.optionalString = nil
189     XCTAssertEqual(msg2.optionalString, "")
190 
191     // Clearing a message with nil.
192     msg.optional = nil
193     XCTAssertFalse(msg.hasOptionalMessage)
194     XCTAssertTrue(msg.optional !== msg2)  // New instance
195 
196     // Clear.
197     msg.clear()
198     XCTAssertFalse(msg.hasOptionalMessage)
199     XCTAssertEqual(msg.optionalInt32, Int32(0))
200     XCTAssertEqual(msg.optionalString, "")
201     XCTAssertTrue(msg.optional !== msg2)  // New instance
202     XCTAssertEqual(msg.optionalEnum, Message3_Enum.foo)  // Default
203     XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
204     XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
205     XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
206     msg2.clear()
207     XCTAssertEqual(msg2.optionalEnum, Message3_Enum.foo)  // Default
208     XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.foo.rawValue)
209     XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
210     XCTAssertEqual(msg.mapStringString.count, Int(0))
211     XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
212   }
213 
testAutoCreationnull214   func testAutoCreation() {
215     let msg = Message2()
216 
217     XCTAssertFalse(msg.hasOptionalGroup)
218     XCTAssertFalse(msg.hasOptionalMessage)
219 
220     // Access shouldn't result in has* but should return objects.
221     let msg2 = msg.optionalGroup
222     let msg3 = msg.optional.optional
223     let msg4 = msg.optional
224     XCTAssertNotNil(msg2)
225     XCTAssertNotNil(msg3)
226     XCTAssertFalse(msg.hasOptionalGroup)
227     XCTAssertFalse(msg.optional.hasOptionalMessage)
228     XCTAssertFalse(msg.hasOptionalMessage)
229 
230     // Setting things should trigger has* getting set.
231     msg.optionalGroup.a = 10
232     msg.optional.optional.optionalInt32 = 100
233     XCTAssertTrue(msg.hasOptionalGroup)
234     XCTAssertTrue(msg.optional.hasOptionalMessage)
235     XCTAssertTrue(msg.hasOptionalMessage)
236 
237     // And they should be the same pointer as before.
238     XCTAssertTrue(msg2 === msg.optionalGroup)
239     XCTAssertTrue(msg3 === msg.optional.optional)
240     XCTAssertTrue(msg4 === msg.optional)
241 
242     // Clear gets us new objects next time around.
243     msg.clear()
244     XCTAssertFalse(msg.hasOptionalGroup)
245     XCTAssertFalse(msg.optional.hasOptionalMessage)
246     XCTAssertFalse(msg.hasOptionalMessage)
247     msg.optionalGroup.a = 20
248     msg.optional.optional.optionalInt32 = 200
249     XCTAssertTrue(msg.hasOptionalGroup)
250     XCTAssertTrue(msg.optional.hasOptionalMessage)
251     XCTAssertTrue(msg.hasOptionalMessage)
252     XCTAssertTrue(msg2 !== msg.optionalGroup)
253     XCTAssertTrue(msg3 !== msg.optional.optional)
254     XCTAssertTrue(msg4 !== msg.optional)
255 
256     // Explicit set of a message, means autocreated object doesn't bind.
257     msg.clear()
258     let autoCreated = msg.optional
259     XCTAssertFalse(msg.hasOptionalMessage)
260     let msg5 = Message2()
261     msg5.optionalInt32 = 123
262     msg.optional = msg5
263     XCTAssertTrue(msg.hasOptionalMessage)
264     // Modifying the autocreated doesn't replaced the explicit set one.
265     autoCreated?.optionalInt32 = 456
266     XCTAssertTrue(msg.hasOptionalMessage)
267     XCTAssertTrue(msg.optional === msg5)
268     XCTAssertEqual(msg.optional.optionalInt32, Int32(123))
269   }
270 
testProto2OneOfSupportnull271   func testProto2OneOfSupport() {
272     let msg = Message2()
273 
274     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
275     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
276     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
277     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
278     let autoCreated = msg.oneof  // Default create one.
279     XCTAssertNotNil(autoCreated)
280     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
281 
282     msg.oneofInt32 = 10
283     XCTAssertEqual(msg.oneofInt32, Int32(10))
284     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
285     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
286     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
287     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
288 
289     msg.oneofFloat = 20.0
290     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
291     XCTAssertEqual(msg.oneofFloat, Float(20.0))
292     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
293     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
294     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofFloat)
295 
296     msg.oneofEnum = .bar
297     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
298     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
299     XCTAssertEqual(msg.oneofEnum, Message2_Enum.bar)
300     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
301     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofEnum)
302 
303     // Sets via the autocreated instance.
304     msg.oneof.optionalInt32 = 200
305     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
306     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
307     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
308     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
309     XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
310     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
311 
312     // Clear the oneof.
313     Message2_ClearOOneOfCase(msg)
314     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
315     XCTAssertEqual(msg.oneofFloat, Float(110.0))  // Default
316     XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz)  // Default
317     let autoCreated2 = msg.oneof  // Default create one
318     XCTAssertNotNil(autoCreated2)
319     XCTAssertTrue(autoCreated2 !== autoCreated)  // New instance
320     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
321     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
322 
323     msg.oneofInt32 = 10
324     XCTAssertEqual(msg.oneofInt32, Int32(10))
325     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
326 
327     // Confirm Message.clear() handles the oneof correctly.
328     msg.clear()
329     XCTAssertEqual(msg.oneofInt32, Int32(100))  // Default
330     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
331 
332     // Sets via the autocreated instance.
333     msg.oneof.optionalInt32 = 300
334     XCTAssertTrue(msg.oneof !== autoCreated)  // New instance
335     XCTAssertTrue(msg.oneof !== autoCreated2)  // New instance
336     XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
337     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
338 
339     // Set message to nil clears the oneof.
340     msg.oneof = nil
341     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
342     XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
343   }
344 
testProto3OneOfSupportnull345   func testProto3OneOfSupport() {
346     let msg = Message3()
347 
348     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
349     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
350     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
351     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
352     let autoCreated = msg.oneof  // Default create one.
353     XCTAssertNotNil(autoCreated)
354     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
355 
356     msg.oneofInt32 = 10
357     XCTAssertEqual(msg.oneofInt32, Int32(10))
358     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
359     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
360     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
361     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
362 
363     msg.oneofFloat = 20.0
364     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
365     XCTAssertEqual(msg.oneofFloat, Float(20.0))
366     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
367     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
368     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofFloat)
369 
370     msg.oneofEnum = .bar
371     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
372     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
373     XCTAssertEqual(msg.oneofEnum, Message3_Enum.bar)
374     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
375     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofEnum)
376 
377     // Sets via the autocreated instance.
378     msg.oneof.optionalInt32 = 200
379     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
380     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
381     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
382     XCTAssertTrue(msg.oneof === autoCreated)  // Still the same
383     XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
384     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
385 
386     // Clear the oneof.
387     Message3_ClearOOneOfCase(msg)
388     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
389     XCTAssertEqual(msg.oneofFloat, Float(0.0))  // Default
390     XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo)  // Default
391     let autoCreated2 = msg.oneof  // Default create one
392     XCTAssertNotNil(autoCreated2)
393     XCTAssertTrue(autoCreated2 !== autoCreated)  // New instance
394     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
395     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
396 
397     msg.oneofInt32 = 10
398     XCTAssertEqual(msg.oneofInt32, Int32(10))
399     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
400 
401     // Confirm Message.clear() handles the oneof correctly.
402     msg.clear()
403     XCTAssertEqual(msg.oneofInt32, Int32(0))  // Default
404     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
405 
406     // Sets via the autocreated instance.
407     msg.oneof.optionalInt32 = 300
408     XCTAssertTrue(msg.oneof !== autoCreated)  // New instance
409     XCTAssertTrue(msg.oneof !== autoCreated2)  // New instance
410     XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
411     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
412 
413     // Set message to nil clears the oneof.
414     msg.oneof = nil
415     XCTAssertEqual(msg.oneof.optionalInt32, Int32(0))  // Default
416     XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
417   }
418 
testSerializationnull419   func testSerialization() {
420     let msg = Message2()
421 
422     msg.optionalInt32 = 100
423     msg.optionalInt64 = 101
424     msg.optionalGroup.a = 102
425     msg.repeatedStringArray.add("abc")
426     msg.repeatedStringArray.add("def")
427     msg.mapInt32Int32.setInt32(200, forKey: 300)
428     msg.mapInt32Int32.setInt32(201, forKey: 201)
429     msg.mapStringString.setObject("foo", forKey: "bar" as NSString)
430     msg.mapStringString.setObject("abc", forKey: "xyz" as NSString)
431 
432     let data = msg.data()
433 
434     let msg2 = try! Message2(data: data!)
435     XCTAssertTrue(msg2 !== msg)  // New instance
436     XCTAssertEqual(msg.optionalInt32, Int32(100))
437     XCTAssertEqual(msg.optionalInt64, Int64(101))
438     XCTAssertEqual(msg.optionalGroup.a, Int32(102))
439     XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
440     XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
441     XCTAssertEqual(msg.mapStringString.count, Int(2))
442     XCTAssertEqual(msg2, msg)
443   }
444 
testUnknownFieldsAdditions_getToOptionalnull445   func testUnknownFieldsAdditions_getToOptional() {
446     let ufs = GPBUnknownFields()
447     ufs.addFieldNumber(1, varint: 1)
448     ufs.addFieldNumber(1, varint: 2)
449     ufs.addFieldNumber(1, fixed32: 3)
450     ufs.addFieldNumber(1, fixed32: 4)
451     ufs.addFieldNumber(1, fixed64: 5)
452     ufs.addFieldNumber(1, fixed64: 6)
453     ufs.addFieldNumber(1, lengthDelimited: dataFromStr("foo"))
454     ufs.addFieldNumber(1, lengthDelimited: dataFromStr("bar"))
455     let group1 = ufs.addGroup(withFieldNumber: 1)
456     let group2 = ufs.addGroup(withFieldNumber: 1)
457     XCTAssertFalse(group1 === group2)  // Different objects
458     XCTAssertEqual(ufs.count, 10)
459 
460     ufs.addFieldNumber(11, varint: 11)
461     ufs.addFieldNumber(12, fixed32: 12)
462     ufs.addFieldNumber(13, fixed64: 13)
463     ufs.addFieldNumber(14, lengthDelimited: dataFromStr("foo2"))
464     let group3 = ufs.addGroup(withFieldNumber: 15)
465     XCTAssertNotNil(group3)
466     XCTAssertFalse(group3 === group1)  // Different objects
467     XCTAssertFalse(group3 === group2)  // Different objects
468     XCTAssertEqual(ufs.count, 15)
469 
470     XCTAssertEqual(ufs.firstVarint(1), 1)
471     XCTAssertEqual(ufs.firstVarint(11), 11)
472     XCTAssertNil(ufs.firstVarint(12))  // Different type
473     XCTAssertNil(ufs.firstVarint(99))  // Not present
474 
475     XCTAssertEqual(ufs.firstFixed32(1), 3)
476     XCTAssertEqual(ufs.firstFixed32(12), 12)
477     XCTAssertNil(ufs.firstFixed32(11))  // Different type
478     XCTAssertNil(ufs.firstFixed32(99))  // Not present
479 
480     XCTAssertEqual(ufs.firstFixed64(1), 5)
481     XCTAssertEqual(ufs.firstFixed64(13), 13)
482     XCTAssertNil(ufs.firstFixed64(11))  // Different type
483     XCTAssertNil(ufs.firstFixed64(99))  // Not present
484 
485     XCTAssertEqual(dataFromStr("foo"), ufs.firstLengthDelimited(1))
486     XCTAssertEqual(dataFromStr("foo2"), ufs.firstLengthDelimited(14))
487     XCTAssertNil(ufs.firstLengthDelimited(11))  // Different type
488     XCTAssertNil(ufs.firstLengthDelimited(99))  // Not present
489 
490     XCTAssertTrue(group1 === ufs.firstGroup(1))  // Testing ptr, exact object
491     XCTAssertTrue(group3 === ufs.firstGroup(15))  // Testing ptr, exact object
492     XCTAssertNil(ufs.firstGroup(11))  // Different type
493     XCTAssertNil(ufs.firstGroup(99))  // Not present
494   }
495 
496   // This also test the `NSFastEnumeration` -> `Sequence` support.
testUnknownFieldAdditions_valuenull497   func testUnknownFieldAdditions_value() {
498     let ufs = GPBUnknownFields()
499     ufs.addFieldNumber(1, varint: 1)
500     ufs.addFieldNumber(2, varint: 2)
501     ufs.addFieldNumber(1, fixed32: 3)
502     ufs.addFieldNumber(2, fixed32: 4)
503     ufs.addFieldNumber(1, fixed64: 5)
504     ufs.addFieldNumber(3, fixed64: 6)
505     ufs.addFieldNumber(1, lengthDelimited: dataFromStr("foo"))
506     ufs.addFieldNumber(2, lengthDelimited: dataFromStr("bar"))
507     let group1 = ufs.addGroup(withFieldNumber: 1)
508     group1.addFieldNumber(10, varint: 1)
509     let group2 = ufs.addGroup(withFieldNumber: 3)
510     group2.addFieldNumber(10, varint: 2)
511 
512     // The order added nothing to do with field numbers.
513     var loop = 0
514     for field in ufs {
515       loop += 1
516       switch loop {
517       case 1:
518         XCTAssertEqual(field.number, 1)
519         XCTAssertEqual(field.value, GPBUnknownField.Value.varint(1))
520       case 2:
521         XCTAssertEqual(field.number, 2)
522         XCTAssertEqual(field.value, .varint(2))
523       case 3:
524         XCTAssertEqual(field.number, 1)
525         XCTAssertEqual(field.value, .fixed32(3))
526       case 4:
527         XCTAssertEqual(field.number, 2)
528         XCTAssertEqual(field.value, .fixed32(4))
529       case 5:
530         XCTAssertEqual(field.number, 1)
531         XCTAssertEqual(field.value, .fixed64(5))
532       case 6:
533         XCTAssertEqual(field.number, 3)
534         XCTAssertEqual(field.value, .fixed64(6))
535       case 7:
536         XCTAssertEqual(field.number, 1)
537         XCTAssertEqual(field.value, .lengthDelimited(dataFromStr("foo")))
538       case 8:
539         XCTAssertEqual(field.number, 2)
540         XCTAssertEqual(field.value, .lengthDelimited(dataFromStr("bar")))
541       case 9:
542         XCTAssertEqual(field.number, 1)
543         XCTAssertEqual(field.value, .group(group1))
544       case 10:
545         XCTAssertEqual(field.number, 3)
546         XCTAssertEqual(field.value, .group(group2))
547       default:
548         XCTFail("Unexpected")
549       }
550     }
551     XCTAssertEqual(loop, 10)
552   }
553 
554 }
555