GPBSwiftTests.swift 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. // 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. import Foundation
  31. import XCTest
  32. // Test some usage of the ObjC library from Swift.
  33. class GPBBridgeTests: XCTestCase {
  34. func testProto2Basics() {
  35. let msg = Message2()
  36. let msg2 = Message2()
  37. let msg3 = Message2_OptionalGroup()
  38. msg.optionalInt32 = 100
  39. msg.optionalString = "abc"
  40. msg.optionalEnum = .bar
  41. msg2.optionalString = "other"
  42. msg.optional = msg2
  43. msg3.a = 200
  44. msg.optionalGroup = msg3
  45. msg.repeatedInt32Array.addValue(300)
  46. msg.repeatedInt32Array.addValue(301)
  47. msg.repeatedStringArray.add("mno")
  48. msg.repeatedStringArray.add("pqr")
  49. msg.repeatedEnumArray.addValue(Message2_Enum.bar.rawValue)
  50. msg.repeatedEnumArray.addValue(Message2_Enum.baz.rawValue)
  51. msg.mapInt32Int32.setInt32(400, forKey:500)
  52. msg.mapInt32Int32.setInt32(401, forKey:501)
  53. msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
  54. msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
  55. msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
  56. msg.mapInt32Enum.setEnum(Message2_Enum.baz.rawValue, forKey:601)
  57. // Check has*.
  58. XCTAssertTrue(msg.hasOptionalInt32)
  59. XCTAssertTrue(msg.hasOptionalString)
  60. XCTAssertTrue(msg.hasOptionalEnum)
  61. XCTAssertTrue(msg2.hasOptionalString)
  62. XCTAssertTrue(msg.hasOptionalMessage)
  63. XCTAssertTrue(msg3.hasA)
  64. XCTAssertTrue(msg.hasOptionalGroup)
  65. XCTAssertFalse(msg.hasOptionalInt64)
  66. XCTAssertFalse(msg.hasOptionalFloat)
  67. // Check values.
  68. XCTAssertEqual(msg.optionalInt32, Int32(100))
  69. XCTAssertEqual(msg.optionalString, "abc")
  70. XCTAssertEqual(msg2.optionalString, "other")
  71. XCTAssertTrue(msg.optional === msg2)
  72. XCTAssertEqual(msg.optionalEnum, Message2_Enum.bar)
  73. XCTAssertEqual(msg3.a, Int32(200))
  74. XCTAssertTrue(msg.optionalGroup === msg3)
  75. XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
  76. XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
  77. XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
  78. XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
  79. XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
  80. XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
  81. XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
  82. XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message2_Enum.bar.rawValue)
  83. XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message2_Enum.baz.rawValue)
  84. XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
  85. XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
  86. var intValue: Int32 = 0
  87. XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 500))
  88. XCTAssertEqual(intValue, Int32(400))
  89. XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey: 501))
  90. XCTAssertEqual(intValue, Int32(401))
  91. XCTAssertEqual(msg.mapStringString.count, Int(2))
  92. XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
  93. XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
  94. XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
  95. XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
  96. XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
  97. XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
  98. XCTAssertEqual(intValue, Message2_Enum.baz.rawValue)
  99. // Clearing a string with nil.
  100. msg2.optionalString = nil
  101. XCTAssertFalse(msg2.hasOptionalString)
  102. XCTAssertEqual(msg2.optionalString, "")
  103. // Clearing a message with nil.
  104. msg.optionalGroup = nil
  105. XCTAssertFalse(msg.hasOptionalGroup)
  106. XCTAssertTrue(msg.optionalGroup !== msg3) // New instance
  107. // Clear.
  108. msg.clear()
  109. XCTAssertFalse(msg.hasOptionalInt32)
  110. XCTAssertFalse(msg.hasOptionalString)
  111. XCTAssertFalse(msg.hasOptionalEnum)
  112. XCTAssertFalse(msg.hasOptionalMessage)
  113. XCTAssertFalse(msg.hasOptionalInt64)
  114. XCTAssertFalse(msg.hasOptionalFloat)
  115. XCTAssertEqual(msg.optionalInt32, Int32(0))
  116. XCTAssertEqual(msg.optionalString, "")
  117. XCTAssertTrue(msg.optional !== msg2) // New instance
  118. XCTAssertEqual(msg.optionalEnum, Message2_Enum.foo) // Default
  119. XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
  120. XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
  121. XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
  122. XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
  123. XCTAssertEqual(msg.mapStringString.count, Int(0))
  124. XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
  125. }
  126. func testProto3Basics() {
  127. let msg = Message3()
  128. let msg2 = Message3()
  129. msg.optionalInt32 = 100
  130. msg.optionalString = "abc"
  131. msg.optionalEnum = .bar
  132. msg2.optionalString = "other"
  133. msg.optional = msg2
  134. msg.repeatedInt32Array.addValue(300)
  135. msg.repeatedInt32Array.addValue(301)
  136. msg.repeatedStringArray.add("mno")
  137. msg.repeatedStringArray.add("pqr")
  138. // "proto3" syntax lets enum get unknown values.
  139. msg.repeatedEnumArray.addValue(Message3_Enum.bar.rawValue)
  140. msg.repeatedEnumArray.addRawValue(666)
  141. SetMessage3_OptionalEnum_RawValue(msg2, 666)
  142. msg.mapInt32Int32.setInt32(400, forKey:500)
  143. msg.mapInt32Int32.setInt32(401, forKey:501)
  144. msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
  145. msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
  146. msg.mapInt32Enum.setEnum(Message2_Enum.bar.rawValue, forKey:600)
  147. // "proto3" syntax lets enum get unknown values.
  148. msg.mapInt32Enum.setRawValue(666, forKey:601)
  149. // Has only exists on for message fields.
  150. XCTAssertTrue(msg.hasOptionalMessage)
  151. XCTAssertFalse(msg2.hasOptionalMessage)
  152. // Check values.
  153. XCTAssertEqual(msg.optionalInt32, Int32(100))
  154. XCTAssertEqual(msg.optionalString, "abc")
  155. XCTAssertEqual(msg2.optionalString, "other")
  156. XCTAssertTrue(msg.optional === msg2)
  157. XCTAssertEqual(msg.optionalEnum, Message3_Enum.bar)
  158. XCTAssertEqual(msg.repeatedInt32Array.count, UInt(2))
  159. XCTAssertEqual(msg.repeatedInt32Array.value(at: 0), Int32(300))
  160. XCTAssertEqual(msg.repeatedInt32Array.value(at: 1), Int32(301))
  161. XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
  162. XCTAssertEqual(msg.repeatedStringArray.object(at: 0) as? String, "mno")
  163. XCTAssertEqual(msg.repeatedStringArray.object(at: 1) as? String, "pqr")
  164. XCTAssertEqual(msg.repeatedInt64Array.count, UInt(0))
  165. XCTAssertEqual(msg.repeatedEnumArray.count, UInt(2))
  166. XCTAssertEqual(msg.repeatedEnumArray.value(at: 0), Message3_Enum.bar.rawValue)
  167. XCTAssertEqual(msg.repeatedEnumArray.value(at: 1), Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
  168. XCTAssertEqual(msg.repeatedEnumArray.rawValue(at: 1), 666)
  169. XCTAssertEqual(msg2.optionalEnum, Message3_Enum.gpbUnrecognizedEnumeratorValue)
  170. XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Int32(666))
  171. XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
  172. var intValue: Int32 = 0
  173. XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:500))
  174. XCTAssertEqual(intValue, Int32(400))
  175. XCTAssertTrue(msg.mapInt32Int32.getInt32(&intValue, forKey:501))
  176. XCTAssertEqual(intValue, Int32(401))
  177. XCTAssertEqual(msg.mapStringString.count, Int(2))
  178. XCTAssertEqual(msg.mapStringString.object(forKey: "bar") as? String, "foo")
  179. XCTAssertEqual(msg.mapStringString.object(forKey: "xyz") as? String, "abc")
  180. XCTAssertEqual(msg.mapInt32Enum.count, UInt(2))
  181. XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:600))
  182. XCTAssertEqual(intValue, Message2_Enum.bar.rawValue)
  183. XCTAssertTrue(msg.mapInt32Enum.getEnum(&intValue, forKey:601))
  184. XCTAssertEqual(intValue, Message3_Enum.gpbUnrecognizedEnumeratorValue.rawValue)
  185. XCTAssertTrue(msg.mapInt32Enum.getRawValue(&intValue, forKey:601))
  186. XCTAssertEqual(intValue, 666)
  187. // Clearing a string with nil.
  188. msg2.optionalString = nil
  189. XCTAssertEqual(msg2.optionalString, "")
  190. // Clearing a message with nil.
  191. msg.optional = nil
  192. XCTAssertFalse(msg.hasOptionalMessage)
  193. XCTAssertTrue(msg.optional !== msg2) // New instance
  194. // Clear.
  195. msg.clear()
  196. XCTAssertFalse(msg.hasOptionalMessage)
  197. XCTAssertEqual(msg.optionalInt32, Int32(0))
  198. XCTAssertEqual(msg.optionalString, "")
  199. XCTAssertTrue(msg.optional !== msg2) // New instance
  200. XCTAssertEqual(msg.optionalEnum, Message3_Enum.foo) // Default
  201. XCTAssertEqual(msg.repeatedInt32Array.count, UInt(0))
  202. XCTAssertEqual(msg.repeatedStringArray.count, Int(0))
  203. XCTAssertEqual(msg.repeatedEnumArray.count, UInt(0))
  204. msg2.clear()
  205. XCTAssertEqual(msg2.optionalEnum, Message3_Enum.foo) // Default
  206. XCTAssertEqual(Message3_OptionalEnum_RawValue(msg2), Message3_Enum.foo.rawValue)
  207. XCTAssertEqual(msg.mapInt32Int32.count, UInt(0))
  208. XCTAssertEqual(msg.mapStringString.count, Int(0))
  209. XCTAssertEqual(msg.mapInt32Enum.count, UInt(0))
  210. }
  211. func testAutoCreation() {
  212. let msg = Message2()
  213. XCTAssertFalse(msg.hasOptionalGroup)
  214. XCTAssertFalse(msg.hasOptionalMessage)
  215. // Access shouldn't result in has* but should return objects.
  216. let msg2 = msg.optionalGroup
  217. let msg3 = msg.optional.optional
  218. let msg4 = msg.optional
  219. XCTAssertNotNil(msg2)
  220. XCTAssertNotNil(msg3)
  221. XCTAssertFalse(msg.hasOptionalGroup)
  222. XCTAssertFalse(msg.optional.hasOptionalMessage)
  223. XCTAssertFalse(msg.hasOptionalMessage)
  224. // Setting things should trigger has* getting set.
  225. msg.optionalGroup.a = 10
  226. msg.optional.optional.optionalInt32 = 100
  227. XCTAssertTrue(msg.hasOptionalGroup)
  228. XCTAssertTrue(msg.optional.hasOptionalMessage)
  229. XCTAssertTrue(msg.hasOptionalMessage)
  230. // And they should be the same pointer as before.
  231. XCTAssertTrue(msg2 === msg.optionalGroup)
  232. XCTAssertTrue(msg3 === msg.optional.optional)
  233. XCTAssertTrue(msg4 === msg.optional)
  234. // Clear gets us new objects next time around.
  235. msg.clear()
  236. XCTAssertFalse(msg.hasOptionalGroup)
  237. XCTAssertFalse(msg.optional.hasOptionalMessage)
  238. XCTAssertFalse(msg.hasOptionalMessage)
  239. msg.optionalGroup.a = 20
  240. msg.optional.optional.optionalInt32 = 200
  241. XCTAssertTrue(msg.hasOptionalGroup)
  242. XCTAssertTrue(msg.optional.hasOptionalMessage)
  243. XCTAssertTrue(msg.hasOptionalMessage)
  244. XCTAssertTrue(msg2 !== msg.optionalGroup)
  245. XCTAssertTrue(msg3 !== msg.optional.optional)
  246. XCTAssertTrue(msg4 !== msg.optional)
  247. // Explicit set of a message, means autocreated object doesn't bind.
  248. msg.clear()
  249. let autoCreated = msg.optional
  250. XCTAssertFalse(msg.hasOptionalMessage)
  251. let msg5 = Message2()
  252. msg5.optionalInt32 = 123
  253. msg.optional = msg5
  254. XCTAssertTrue(msg.hasOptionalMessage)
  255. // Modifying the autocreated doesn't replaced the explicit set one.
  256. autoCreated?.optionalInt32 = 456
  257. XCTAssertTrue(msg.hasOptionalMessage)
  258. XCTAssertTrue(msg.optional === msg5)
  259. XCTAssertEqual(msg.optional.optionalInt32, Int32(123))
  260. }
  261. func testProto2OneOfSupport() {
  262. let msg = Message2()
  263. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
  264. XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
  265. XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
  266. XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
  267. let autoCreated = msg.oneof // Default create one.
  268. XCTAssertNotNil(autoCreated)
  269. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
  270. msg.oneofInt32 = 10
  271. XCTAssertEqual(msg.oneofInt32, Int32(10))
  272. XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
  273. XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
  274. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  275. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
  276. msg.oneofFloat = 20.0
  277. XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
  278. XCTAssertEqual(msg.oneofFloat, Float(20.0))
  279. XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
  280. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  281. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofFloat)
  282. msg.oneofEnum = .bar
  283. XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
  284. XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
  285. XCTAssertEqual(msg.oneofEnum, Message2_Enum.bar)
  286. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  287. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofEnum)
  288. // Sets via the autocreated instance.
  289. msg.oneof.optionalInt32 = 200
  290. XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
  291. XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
  292. XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
  293. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  294. XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
  295. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
  296. // Clear the oneof.
  297. Message2_ClearOOneOfCase(msg)
  298. XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
  299. XCTAssertEqual(msg.oneofFloat, Float(110.0)) // Default
  300. XCTAssertEqual(msg.oneofEnum, Message2_Enum.baz) // Default
  301. let autoCreated2 = msg.oneof // Default create one
  302. XCTAssertNotNil(autoCreated2)
  303. XCTAssertTrue(autoCreated2 !== autoCreated) // New instance
  304. XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
  305. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
  306. msg.oneofInt32 = 10
  307. XCTAssertEqual(msg.oneofInt32, Int32(10))
  308. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofInt32)
  309. // Confirm Message.clear() handles the oneof correctly.
  310. msg.clear()
  311. XCTAssertEqual(msg.oneofInt32, Int32(100)) // Default
  312. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
  313. // Sets via the autocreated instance.
  314. msg.oneof.optionalInt32 = 300
  315. XCTAssertTrue(msg.oneof !== autoCreated) // New instance
  316. XCTAssertTrue(msg.oneof !== autoCreated2) // New instance
  317. XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
  318. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.oneofMessage)
  319. // Set message to nil clears the oneof.
  320. msg.oneof = nil
  321. XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
  322. XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase.gpbUnsetOneOfCase)
  323. }
  324. func testProto3OneOfSupport() {
  325. let msg = Message3()
  326. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
  327. XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
  328. XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
  329. XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
  330. let autoCreated = msg.oneof // Default create one.
  331. XCTAssertNotNil(autoCreated)
  332. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
  333. msg.oneofInt32 = 10
  334. XCTAssertEqual(msg.oneofInt32, Int32(10))
  335. XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
  336. XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
  337. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  338. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
  339. msg.oneofFloat = 20.0
  340. XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
  341. XCTAssertEqual(msg.oneofFloat, Float(20.0))
  342. XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
  343. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  344. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofFloat)
  345. msg.oneofEnum = .bar
  346. XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
  347. XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
  348. XCTAssertEqual(msg.oneofEnum, Message3_Enum.bar)
  349. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  350. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofEnum)
  351. // Sets via the autocreated instance.
  352. msg.oneof.optionalInt32 = 200
  353. XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
  354. XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
  355. XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
  356. XCTAssertTrue(msg.oneof === autoCreated) // Still the same
  357. XCTAssertEqual(msg.oneof.optionalInt32, Int32(200))
  358. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
  359. // Clear the oneof.
  360. Message3_ClearOOneOfCase(msg)
  361. XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
  362. XCTAssertEqual(msg.oneofFloat, Float(0.0)) // Default
  363. XCTAssertEqual(msg.oneofEnum, Message3_Enum.foo) // Default
  364. let autoCreated2 = msg.oneof // Default create one
  365. XCTAssertNotNil(autoCreated2)
  366. XCTAssertTrue(autoCreated2 !== autoCreated) // New instance
  367. XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
  368. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
  369. msg.oneofInt32 = 10
  370. XCTAssertEqual(msg.oneofInt32, Int32(10))
  371. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofInt32)
  372. // Confirm Message.clear() handles the oneof correctly.
  373. msg.clear()
  374. XCTAssertEqual(msg.oneofInt32, Int32(0)) // Default
  375. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
  376. // Sets via the autocreated instance.
  377. msg.oneof.optionalInt32 = 300
  378. XCTAssertTrue(msg.oneof !== autoCreated) // New instance
  379. XCTAssertTrue(msg.oneof !== autoCreated2) // New instance
  380. XCTAssertEqual(msg.oneof.optionalInt32, Int32(300))
  381. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.oneofMessage)
  382. // Set message to nil clears the oneof.
  383. msg.oneof = nil
  384. XCTAssertEqual(msg.oneof.optionalInt32, Int32(0)) // Default
  385. XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase.gpbUnsetOneOfCase)
  386. }
  387. func testSerialization() {
  388. let msg = Message2()
  389. msg.optionalInt32 = 100
  390. msg.optionalInt64 = 101
  391. msg.optionalGroup.a = 102
  392. msg.repeatedStringArray.add("abc")
  393. msg.repeatedStringArray.add("def")
  394. msg.mapInt32Int32.setInt32(200, forKey:300)
  395. msg.mapInt32Int32.setInt32(201, forKey:201)
  396. msg.mapStringString.setObject("foo", forKey:"bar" as NSString)
  397. msg.mapStringString.setObject("abc", forKey:"xyz" as NSString)
  398. let data = msg.data()
  399. let msg2 = try! Message2(data: data!)
  400. XCTAssertTrue(msg2 !== msg) // New instance
  401. XCTAssertEqual(msg.optionalInt32, Int32(100))
  402. XCTAssertEqual(msg.optionalInt64, Int64(101))
  403. XCTAssertEqual(msg.optionalGroup.a, Int32(102))
  404. XCTAssertEqual(msg.repeatedStringArray.count, Int(2))
  405. XCTAssertEqual(msg.mapInt32Int32.count, UInt(2))
  406. XCTAssertEqual(msg.mapStringString.count, Int(2))
  407. XCTAssertEqual(msg2, msg)
  408. }
  409. }