blob: 9d8a0faeb0a40b981d19fb8d2f4531200fdefac0 [file] [log] [blame]
Brian Silverman9c614bc2016-02-15 20:20:02 -05001// Protocol Buffers - Google's data interchange format
2// Copyright 2015 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
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
14// distribution.
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.
18//
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.
30
31import Foundation
32import XCTest
33
34// Test some usage of the ObjC library from Swift.
35
36class GPBBridgeTests: XCTestCase {
37
38 func testProto2Basics() {
39 let msg = Message2()
40 let msg2 = Message2()
41 let msg3 = Message2_OptionalGroup()
42
43 msg.optionalInt32 = 100
44 msg.optionalString = "abc"
Austin Schuh40c16522018-10-28 20:27:54 -070045 msg.optionalEnum = .bar
Brian Silverman9c614bc2016-02-15 20:20:02 -050046 msg2.optionalString = "other"
Austin Schuh40c16522018-10-28 20:27:54 -070047 msg.optional = msg2
Brian Silverman9c614bc2016-02-15 20:20:02 -050048 msg3.a = 200
49 msg.optionalGroup = msg3
50 msg.repeatedInt32Array.addValue(300)
51 msg.repeatedInt32Array.addValue(301)
Austin Schuh40c16522018-10-28 20:27:54 -070052 msg.repeatedStringArray.add("mno")
53 msg.repeatedStringArray.add("pqr")
54 msg.repeatedEnumArray.addValue(Message2_Enum.bar.rawValue)
55 msg.repeatedEnumArray.addValue(Message2_Enum.baz.rawValue)
56 msg.mapInt32Int32.setInt32(400, forKey:500)
57 msg.mapInt32Int32.setInt32(401, forKey:501)
58 msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
59 msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
60 msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
61 msg.mapInt32Enum.setEnum(Message2_Enum.baz.rawValue, forKey:601)
Brian Silverman9c614bc2016-02-15 20:20:02 -050062
63 // Check has*.
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)
73
74 // Check values.
75 XCTAssertEqual(msg.optionalInt32, Int32(100))
76 XCTAssertEqual(msg.optionalString, "abc")
77 XCTAssertEqual(msg2.optionalString, "other")
Austin Schuh40c16522018-10-28 20:27:54 -070078 XCTAssertTrue(msg.optional === msg2)
79 XCTAssertEqual(msg.optionalEnum, Message2_Enum.bar)
Brian Silverman9c614bc2016-02-15 20:20:02 -050080 XCTAssertEqual(msg3.a, Int32(200))
81 XCTAssertTrue(msg.optionalGroup === msg3)
82 XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -070083 XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
84 XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
Brian Silverman9c614bc2016-02-15 20:20:02 -050085 XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
Austin Schuh40c16522018-10-28 20:27:54 -070086 XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
87 XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
Brian Silverman9c614bc2016-02-15 20:20:02 -050088 XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -070089 XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message2_Enum.bar.rawValue)
90 XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message2_Enum.baz.rawValue)
Brian Silverman9c614bc2016-02-15 20:20:02 -050091 XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
92 XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -070093 var intValue: Int32 = 0
94 XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500))
Brian Silverman9c614bc2016-02-15 20:20:02 -050095 XCTAssertEqual(intValue, Int32(400))
Austin Schuh40c16522018-10-28 20:27:54 -070096 XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501))
Brian Silverman9c614bc2016-02-15 20:20:02 -050097 XCTAssertEqual(intValue, Int32(401))
98 XCTAssertEqual(msg.mapStringString.count, Int(2))
Austin Schuh40c16522018-10-28 20:27:54 -070099 XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
100 XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
Brian Silverman9c614bc2016-02-15 20:20:02 -0500101 XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700102 XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
103 XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
104 XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
105 XCTAssertEqual(intValue, Message2_Enum.baz.rawValue)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500106
107 // Clearing a string with nil.
108 msg2.optionalString = nil
109 XCTAssertFalse(msg2.hasOptionalString)
110 XCTAssertEqual(msg2.optionalString, "")
111
112 // Clearing a message with nil.
113 msg.optionalGroup = nil
114 XCTAssertFalse(msg.hasOptionalGroup)
115 XCTAssertTrue(msg.optionalGroup !== msg3) // New instance
116
117 // Clear.
118 msg.clear()
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, "")
Austin Schuh40c16522018-10-28 20:27:54 -0700127 XCTAssertTrue(msg.optional !== msg2) // New instance
128 XCTAssertEqual(msg.optionalEnum, Message2_Enum.foo) // Default
Brian Silverman9c614bc2016-02-15 20:20:02 -0500129 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))
135 }
136
137 func testProto3Basics() {
138 let msg = Message3()
139 let msg2 = Message3()
140
141 msg.optionalInt32 = 100
142 msg.optionalString = "abc"
Austin Schuh40c16522018-10-28 20:27:54 -0700143 msg.optionalEnum = .bar
Brian Silverman9c614bc2016-02-15 20:20:02 -0500144 msg2.optionalString = "other"
Austin Schuh40c16522018-10-28 20:27:54 -0700145 msg.optional = msg2
Brian Silverman9c614bc2016-02-15 20:20:02 -0500146 msg.repeatedInt32Array.addValue(300)
147 msg.repeatedInt32Array.addValue(301)
Austin Schuh40c16522018-10-28 20:27:54 -0700148 msg.repeatedStringArray.add("mno")
149 msg.repeatedStringArray.add("pqr")
Brian Silverman9c614bc2016-02-15 20:20:02 -0500150 // "proto3" syntax lets enum get unknown values.
Austin Schuh40c16522018-10-28 20:27:54 -0700151 msg.repeatedEnumArray.addValue(Message3_Enum.bar.rawValue)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500152 msg.repeatedEnumArray.addRawValue(666)
153 SetMessage3_OptionalEnum_RawValue(msg2, 666)
Austin Schuh40c16522018-10-28 20:27:54 -0700154 msg.mapInt32Int32.setInt32(400, forKey:500)
155 msg.mapInt32Int32.setInt32(401, forKey:501)
156 msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
157 msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
158 msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500159 // "proto3" syntax lets enum get unknown values.
160 msg.mapInt32Enum.setRawValue(666, forKey:601)
161
162 // Has only exists on for message fields.
163 XCTAssertTrue(msg.hasOptionalMessage)
164 XCTAssertFalse(msg2.hasOptionalMessage)
165
166 // Check values.
167 XCTAssertEqual(msg.optionalInt32, Int32(100))
168 XCTAssertEqual(msg.optionalString, "abc")
169 XCTAssertEqual(msg2.optionalString, "other")
Austin Schuh40c16522018-10-28 20:27:54 -0700170 XCTAssertTrue(msg.optional === msg2)
171 XCTAssertEqual(msg.optionalEnum, Message3_Enum.bar)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500172 XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700173 XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
174 XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
Brian Silverman9c614bc2016-02-15 20:20:02 -0500175 XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700176 XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
177 XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
Brian Silverman9c614bc2016-02-15 20:20:02 -0500178 XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
179 XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700180 XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message3_Enum.bar.rawValue)
181 XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
182 XCTAssertEqual(msg.repeatedEnumArray.rawValue(at: 1), 666)
183 XCTAssertEqual(msg2.optionalEnum, Message3_Enum.gpbUnrecognizedEnumeratorValue)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500184 XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Int32(666))
185 XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700186 var intValue: Int32 = 0
187 XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:500))
Brian Silverman9c614bc2016-02-15 20:20:02 -0500188 XCTAssertEqual(intValue, Int32(400))
Austin Schuh40c16522018-10-28 20:27:54 -0700189 XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:501))
Brian Silverman9c614bc2016-02-15 20:20:02 -0500190 XCTAssertEqual(intValue, Int32(401))
191 XCTAssertEqual(msg.mapStringString.count, Int(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700192 XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
193 XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
Brian Silverman9c614bc2016-02-15 20:20:02 -0500194 XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
Austin Schuh40c16522018-10-28 20:27:54 -0700195 XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
196 XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
197 XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
198 XCTAssertEqual(intValue, Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
199 XCTAssertTrue(msg.mapInt32Enum.getRawValue(&intValue, forKey:601))
Brian Silverman9c614bc2016-02-15 20:20:02 -0500200 XCTAssertEqual(intValue, 666)
201
202 // Clearing a string with nil.
203 msg2.optionalString = nil
204 XCTAssertEqual(msg2.optionalString, "")
205
206 // Clearing a message with nil.
Austin Schuh40c16522018-10-28 20:27:54 -0700207 msg.optional = nil
Brian Silverman9c614bc2016-02-15 20:20:02 -0500208 XCTAssertFalse(msg.hasOptionalMessage)
Austin Schuh40c16522018-10-28 20:27:54 -0700209 XCTAssertTrue(msg.optional !== msg2) // New instance
Brian Silverman9c614bc2016-02-15 20:20:02 -0500210
211 // Clear.
212 msg.clear()
213 XCTAssertFalse(msg.hasOptionalMessage)
214 XCTAssertEqual(msg.optionalInt32, Int32(0))
215 XCTAssertEqual(msg.optionalString, "")
Austin Schuh40c16522018-10-28 20:27:54 -0700216 XCTAssertTrue(msg.optional !== msg2) // New instance
217 XCTAssertEqual(msg.optionalEnum, Message3_Enum.foo) // Default
Brian Silverman9c614bc2016-02-15 20:20:02 -0500218 XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
219 XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
220 XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
221 msg2.clear()
Austin Schuh40c16522018-10-28 20:27:54 -0700222 XCTAssertEqual(msg2.optionalEnum, Message3_Enum.foo) // Default
223 XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.foo.rawValue)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500224 XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
225 XCTAssertEqual(msg.mapStringString.count, Int(0))
226 XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
227 }
228
229 func testAutoCreation() {
230 let msg = Message2()
231
232 XCTAssertFalse(msg.hasOptionalGroup)
233 XCTAssertFalse(msg.hasOptionalMessage)
234
235 // Access shouldn't result in has* but should return objects.
236 let msg2 = msg.optionalGroup
Austin Schuh40c16522018-10-28 20:27:54 -0700237 let msg3 = msg.optional.optional
238 let msg4 = msg.optional
Brian Silverman9c614bc2016-02-15 20:20:02 -0500239 XCTAssertNotNil(msg2)
240 XCTAssertNotNil(msg3)
241 XCTAssertFalse(msg.hasOptionalGroup)
Austin Schuh40c16522018-10-28 20:27:54 -0700242 XCTAssertFalse(msg.optional.hasOptionalMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500243 XCTAssertFalse(msg.hasOptionalMessage)
244
245 // Setting things should trigger has* getting set.
246 msg.optionalGroup.a = 10
Austin Schuh40c16522018-10-28 20:27:54 -0700247 msg.optional.optional.optionalInt32 = 100
Brian Silverman9c614bc2016-02-15 20:20:02 -0500248 XCTAssertTrue(msg.hasOptionalGroup)
Austin Schuh40c16522018-10-28 20:27:54 -0700249 XCTAssertTrue(msg.optional.hasOptionalMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500250 XCTAssertTrue(msg.hasOptionalMessage)
251
252 // And they should be the same pointer as before.
253 XCTAssertTrue(msg2 === msg.optionalGroup)
Austin Schuh40c16522018-10-28 20:27:54 -0700254 XCTAssertTrue(msg3 === msg.optional.optional)
255 XCTAssertTrue(msg4 === msg.optional)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500256
257 // Clear gets us new objects next time around.
258 msg.clear()
259 XCTAssertFalse(msg.hasOptionalGroup)
Austin Schuh40c16522018-10-28 20:27:54 -0700260 XCTAssertFalse(msg.optional.hasOptionalMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500261 XCTAssertFalse(msg.hasOptionalMessage)
262 msg.optionalGroup.a = 20
Austin Schuh40c16522018-10-28 20:27:54 -0700263 msg.optional.optional.optionalInt32 = 200
Brian Silverman9c614bc2016-02-15 20:20:02 -0500264 XCTAssertTrue(msg.hasOptionalGroup)
Austin Schuh40c16522018-10-28 20:27:54 -0700265 XCTAssertTrue(msg.optional.hasOptionalMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500266 XCTAssertTrue(msg.hasOptionalMessage)
267 XCTAssertTrue(msg2 !== msg.optionalGroup)
Austin Schuh40c16522018-10-28 20:27:54 -0700268 XCTAssertTrue(msg3 !== msg.optional.optional)
269 XCTAssertTrue(msg4 !== msg.optional)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500270
271 // Explicit set of a message, means autocreated object doesn't bind.
272 msg.clear()
Austin Schuh40c16522018-10-28 20:27:54 -0700273 let autoCreated = msg.optional
Brian Silverman9c614bc2016-02-15 20:20:02 -0500274 XCTAssertFalse(msg.hasOptionalMessage)
275 let msg5 = Message2()
276 msg5.optionalInt32 = 123
Austin Schuh40c16522018-10-28 20:27:54 -0700277 msg.optional = msg5
Brian Silverman9c614bc2016-02-15 20:20:02 -0500278 XCTAssertTrue(msg.hasOptionalMessage)
279 // Modifing the autocreated doesn't replaced the explicit set one.
Austin Schuh40c16522018-10-28 20:27:54 -0700280 autoCreated?.optionalInt32 = 456
Brian Silverman9c614bc2016-02-15 20:20:02 -0500281 XCTAssertTrue(msg.hasOptionalMessage)
Austin Schuh40c16522018-10-28 20:27:54 -0700282 XCTAssertTrue(msg.optional === msg5)
283 XCTAssertEqual(msg.optional.optionalInt32, Int32(123))
Brian Silverman9c614bc2016-02-15 20:20:02 -0500284 }
285
286 func testProto2OneOfSupport() {
287 let msg = Message2()
288
Austin Schuh40c16522018-10-28 20:27:54 -0700289 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500290 XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
291 XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700292 XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
293 let autoCreated = msg.oneof // Default create one.
Brian Silverman9c614bc2016-02-15 20:20:02 -0500294 XCTAssertNotNil(autoCreated)
Austin Schuh40c16522018-10-28 20:27:54 -0700295 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500296
297 msg.oneofInt32 = 10
298 XCTAssertEqual(msg.oneofInt32, Int32(10))
299 XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700300 XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
301 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
302 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500303
304 msg.oneofFloat = 20.0
305 XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
306 XCTAssertEqual(msg.oneofFloat, Float(20.0))
Austin Schuh40c16522018-10-28 20:27:54 -0700307 XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
308 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
309 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofFloat)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500310
Austin Schuh40c16522018-10-28 20:27:54 -0700311 msg.oneofEnum = .bar
Brian Silverman9c614bc2016-02-15 20:20:02 -0500312 XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
313 XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700314 XCTAssertEqual(msg.oneofEnum, Message2_Enum.bar)
315 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
316 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofEnum)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500317
318 // Sets via the autocreated instance.
Austin Schuh40c16522018-10-28 20:27:54 -0700319 msg.oneof.optionalInt32 = 200
Brian Silverman9c614bc2016-02-15 20:20:02 -0500320 XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
321 XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700322 XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
323 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
324 XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
325 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500326
327 // Clear the oneof.
328 Message2_ClearOOneOfCase(msg)
329 XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
330 XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700331 XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
332 let autoCreated2 = msg.oneof // Default create one
Brian Silverman9c614bc2016-02-15 20:20:02 -0500333 XCTAssertNotNil(autoCreated2)
334 XCTAssertTrue(autoCreated2 !== autoCreated) // New instance
Austin Schuh40c16522018-10-28 20:27:54 -0700335 XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
336 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500337
338 msg.oneofInt32 = 10
339 XCTAssertEqual(msg.oneofInt32, Int32(10))
Austin Schuh40c16522018-10-28 20:27:54 -0700340 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500341
342 // Confirm Message.clear() handles the oneof correctly.
343 msg.clear()
344 XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700345 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500346
347 // Sets via the autocreated instance.
Austin Schuh40c16522018-10-28 20:27:54 -0700348 msg.oneof.optionalInt32 = 300
349 XCTAssertTrue(msg.oneof !== autoCreated) // New instance
350 XCTAssertTrue(msg.oneof !== autoCreated2) // New instance
351 XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
352 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500353
354 // Set message to nil clears the oneof.
Austin Schuh40c16522018-10-28 20:27:54 -0700355 msg.oneof = nil
356 XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
357 XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500358}
359
360 func testProto3OneOfSupport() {
361 let msg = Message3()
362
Austin Schuh40c16522018-10-28 20:27:54 -0700363 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500364 XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
365 XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700366 XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
367 let autoCreated = msg.oneof // Default create one.
Brian Silverman9c614bc2016-02-15 20:20:02 -0500368 XCTAssertNotNil(autoCreated)
Austin Schuh40c16522018-10-28 20:27:54 -0700369 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500370
371 msg.oneofInt32 = 10
372 XCTAssertEqual(msg.oneofInt32, Int32(10))
373 XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700374 XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
375 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
376 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500377
378 msg.oneofFloat = 20.0
379 XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
380 XCTAssertEqual(msg.oneofFloat, Float(20.0))
Austin Schuh40c16522018-10-28 20:27:54 -0700381 XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
382 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
383 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofFloat)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500384
Austin Schuh40c16522018-10-28 20:27:54 -0700385 msg.oneofEnum = .bar
Brian Silverman9c614bc2016-02-15 20:20:02 -0500386 XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
387 XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700388 XCTAssertEqual(msg.oneofEnum, Message3_Enum.bar)
389 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
390 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofEnum)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500391
392 // Sets via the autocreated instance.
Austin Schuh40c16522018-10-28 20:27:54 -0700393 msg.oneof.optionalInt32 = 200
Brian Silverman9c614bc2016-02-15 20:20:02 -0500394 XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
395 XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700396 XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
397 XCTAssertTrue(msg.oneof === autoCreated) // Still the same
398 XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
399 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500400
401 // Clear the oneof.
402 Message3_ClearOOneOfCase(msg)
403 XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
404 XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700405 XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
406 let autoCreated2 = msg.oneof // Default create one
Brian Silverman9c614bc2016-02-15 20:20:02 -0500407 XCTAssertNotNil(autoCreated2)
408 XCTAssertTrue(autoCreated2 !== autoCreated) // New instance
Austin Schuh40c16522018-10-28 20:27:54 -0700409 XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
410 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500411
412 msg.oneofInt32 = 10
413 XCTAssertEqual(msg.oneofInt32, Int32(10))
Austin Schuh40c16522018-10-28 20:27:54 -0700414 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500415
416 // Confirm Message.clear() handles the oneof correctly.
417 msg.clear()
418 XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
Austin Schuh40c16522018-10-28 20:27:54 -0700419 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500420
421 // Sets via the autocreated instance.
Austin Schuh40c16522018-10-28 20:27:54 -0700422 msg.oneof.optionalInt32 = 300
423 XCTAssertTrue(msg.oneof !== autoCreated) // New instance
424 XCTAssertTrue(msg.oneof !== autoCreated2) // New instance
425 XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
426 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500427
428 // Set message to nil clears the oneof.
Austin Schuh40c16522018-10-28 20:27:54 -0700429 msg.oneof = nil
430 XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
431 XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500432 }
433
434 func testSerialization() {
435 let msg = Message2()
436
437 msg.optionalInt32 = 100
438 msg.optionalInt64 = 101
439 msg.optionalGroup.a = 102
Austin Schuh40c16522018-10-28 20:27:54 -0700440 msg.repeatedStringArray.add("abc")
441 msg.repeatedStringArray.add("def")
442 msg.mapInt32Int32.setInt32(200, forKey:300)
443 msg.mapInt32Int32.setInt32(201, forKey:201)
444 msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
445 msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500446
447 let data = msg.data()
448
Austin Schuh40c16522018-10-28 20:27:54 -0700449 let msg2 = try! Message2(data: data!)
Brian Silverman9c614bc2016-02-15 20:20:02 -0500450 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)
458 }
459
460}