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