Test_Descriptor.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. // Tests/SwiftProtobufPluginLibraryTests/Test_Descriptor.swift - Test Descriptor.swift
  2. //
  3. // Copyright (c) 2014 - 2017 Apple Inc. and the project authors
  4. // Licensed under Apache License v2.0 with Runtime Library Exception
  5. //
  6. // See LICENSE.txt for license information:
  7. // https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
  8. //
  9. // -----------------------------------------------------------------------------
  10. import SwiftProtobuf
  11. import SwiftProtobufPluginLibrary
  12. import XCTest
  13. extension FileDescriptor {
  14. func extensionField(named: String) -> FieldDescriptor? {
  15. extensions.first { $0.name == named }
  16. }
  17. }
  18. extension Descriptor {
  19. func field(named: String) -> FieldDescriptor? {
  20. fields.first { $0.name == named }
  21. }
  22. }
  23. final class Test_Descriptor: XCTestCase {
  24. func testParsing() throws {
  25. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  26. let descriptorSet = DescriptorSet(proto: fileSet)
  27. XCTAssertEqual(descriptorSet.files.count, 7)
  28. // descriptor.proto documents the protoc will order the files based on the import
  29. // from plugin on descriptor.
  30. XCTAssertEqual(descriptorSet.files[0].name, "pluginlib_descriptor_test_import.proto")
  31. XCTAssertEqual(descriptorSet.files[1].name, "pluginlib_descriptor_test.proto")
  32. XCTAssertEqual(descriptorSet.files[2].name, "pluginlib_descriptor_test2.proto")
  33. XCTAssertEqual(descriptorSet.files[3].name, "pluginlib_descriptor_delimited.proto")
  34. XCTAssertEqual(descriptorSet.files[4].name, "unittest_delimited_import.proto")
  35. XCTAssertEqual(descriptorSet.files[5].name, "unittest_delimited.proto")
  36. XCTAssertEqual(descriptorSet.files[6].name, "swift_protobuf_module_mappings.proto")
  37. let importFileDescriptor = descriptorSet.files[0]
  38. XCTAssertEqual(importFileDescriptor.messages.count, 2)
  39. XCTAssertEqual(importFileDescriptor.messages[0].fullName, "swift_descriptor_test.import.Version")
  40. XCTAssertNil(importFileDescriptor.messages[0].containingType)
  41. XCTAssertEqual(importFileDescriptor.messages[0].messages.count, 0)
  42. XCTAssertEqual(importFileDescriptor.enums.count, 0)
  43. XCTAssertEqual(importFileDescriptor.extensions.count, 0)
  44. XCTAssertEqual(importFileDescriptor.messages[1].fullName, "swift_descriptor_test.import.ExtendableOne")
  45. XCTAssertNil(importFileDescriptor.messages[1].containingType)
  46. XCTAssertEqual(importFileDescriptor.messages[1].messages.count, 1)
  47. XCTAssertEqual(
  48. importFileDescriptor.messages[1].messages[0].fullName,
  49. "swift_descriptor_test.import.ExtendableOne.ExtendableTwo"
  50. )
  51. XCTAssertEqual(importFileDescriptor.messages[1].messages[0].messages.count, 0)
  52. let testFileDesciptor = descriptorSet.files[1]
  53. XCTAssertEqual(testFileDesciptor.enums.count, 1)
  54. XCTAssertEqual(testFileDesciptor.enums[0].fullName, "swift_descriptor_test.TopLevelEnum")
  55. XCTAssertNil(testFileDesciptor.enums[0].containingType)
  56. XCTAssertEqual(testFileDesciptor.messages[0].enums.count, 1)
  57. XCTAssertEqual(testFileDesciptor.messages[0].enums[0].fullName, "swift_descriptor_test.TopLevelMessage.SubEnum")
  58. XCTAssertTrue(testFileDesciptor.messages[0].enums[0].containingType === testFileDesciptor.messages[0])
  59. XCTAssertEqual(testFileDesciptor.messages[0].oneofs.count, 1)
  60. XCTAssertEqual(testFileDesciptor.messages[0].oneofs[0].name, "o")
  61. XCTAssertEqual(testFileDesciptor.messages[1].oneofs.count, 0)
  62. XCTAssertEqual(testFileDesciptor.extensions.count, 1)
  63. XCTAssertEqual(testFileDesciptor.extensions[0].name, "ext_str")
  64. XCTAssertEqual(testFileDesciptor.messages[3].extensions.count, 2)
  65. XCTAssertEqual(testFileDesciptor.messages[3].extensions[0].name, "ext_enum")
  66. XCTAssertEqual(testFileDesciptor.messages[3].extensions[1].name, "ext_msg")
  67. XCTAssertEqual(testFileDesciptor.services.count, 1)
  68. XCTAssertEqual(testFileDesciptor.services[0].fullName, "swift_descriptor_test.SomeService")
  69. XCTAssertEqual(testFileDesciptor.services[0].methods.count, 2)
  70. XCTAssertEqual(testFileDesciptor.services[0].methods[0].name, "Foo")
  71. XCTAssertEqual(testFileDesciptor.services[0].methods[1].name, "Bar")
  72. }
  73. func testLookup() throws {
  74. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  75. let descriptorSet = DescriptorSet(proto: fileSet)
  76. XCTAssertTrue(
  77. descriptorSet.fileDescriptor(named: "pluginlib_descriptor_test_import.proto") === descriptorSet.files[0]
  78. )
  79. XCTAssertTrue(
  80. descriptorSet.descriptor(named: "swift_descriptor_test.import.Version")
  81. === descriptorSet.files[0].messages[0]
  82. )
  83. XCTAssertTrue(
  84. descriptorSet.descriptor(named: "swift_descriptor_test.TopLevelMessage")
  85. === descriptorSet.files[1].messages[0]
  86. )
  87. XCTAssertTrue(
  88. descriptorSet.descriptor(named: "swift_descriptor_test.TopLevelMessage.SubMessage")
  89. === descriptorSet.files[1].messages[0].messages[0]
  90. )
  91. XCTAssertTrue(
  92. descriptorSet.enumDescriptor(named: "swift_descriptor_test.TopLevelEnum")
  93. === descriptorSet.files[1].enums[0]
  94. )
  95. XCTAssertTrue(
  96. descriptorSet.enumDescriptor(named: "swift_descriptor_test.TopLevelMessage.SubEnum")
  97. === descriptorSet.files[1].messages[0].enums[0]
  98. )
  99. XCTAssertTrue(
  100. descriptorSet.serviceDescriptor(named: "swift_descriptor_test.SomeService")
  101. === descriptorSet.files[1].services[0]
  102. )
  103. }
  104. func testParents() throws {
  105. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  106. let descriptorSet = DescriptorSet(proto: fileSet)
  107. let importVersion = descriptorSet.descriptor(named: "swift_descriptor_test.import.Version")!
  108. XCTAssertTrue(importVersion.containingType == nil)
  109. let importExtendOne = descriptorSet.descriptor(named: "swift_descriptor_test.import.ExtendableOne")!
  110. let importExtendTwo = descriptorSet.descriptor(
  111. named: "swift_descriptor_test.import.ExtendableOne.ExtendableTwo"
  112. )!
  113. XCTAssertTrue(importExtendTwo.containingType === importExtendOne)
  114. let testDescriptor = descriptorSet.descriptor(named: "swift_descriptor_test.TopLevelMessage")!
  115. let testEnum = descriptorSet.enumDescriptor(named: "swift_descriptor_test.TopLevelMessage.SubEnum")!
  116. XCTAssertTrue(testEnum.containingType === testDescriptor)
  117. let serviceDescProto = descriptorSet.serviceDescriptor(named: "swift_descriptor_test.SomeService")!
  118. let fooMethod = serviceDescProto.methods[0]
  119. XCTAssertTrue(fooMethod.service === serviceDescProto)
  120. let barMethod = serviceDescProto.methods[1]
  121. XCTAssertTrue(barMethod.service === serviceDescProto)
  122. let importFile = descriptorSet.files[0]
  123. let testFile = descriptorSet.files[1]
  124. XCTAssertTrue(importVersion.file === importFile)
  125. XCTAssertTrue(importExtendOne.file === importFile)
  126. XCTAssertTrue(importExtendTwo.file === importFile)
  127. XCTAssertTrue(testDescriptor.file === testFile)
  128. XCTAssertTrue(testEnum.file === testFile)
  129. XCTAssertTrue(serviceDescProto.file === testFile)
  130. }
  131. func testFields() throws {
  132. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  133. let descriptorSet = DescriptorSet(proto: fileSet)
  134. let topLevelEnum = descriptorSet.enumDescriptor(named: "swift_descriptor_test.TopLevelEnum")!
  135. let topLevelMessage = descriptorSet.descriptor(named: "swift_descriptor_test.TopLevelMessage")!
  136. let subEnum = topLevelMessage.enums[0]
  137. let subMessage = topLevelMessage.messages[0]
  138. let topLevelMessage2 = descriptorSet.descriptor(named: "swift_descriptor_test.TopLevelMessage2")!
  139. XCTAssertEqual(topLevelMessage.fields.count, 6)
  140. XCTAssertEqual(topLevelMessage.fields[0].name, "field1")
  141. XCTAssertEqual(topLevelMessage.fields[1].name, "field2")
  142. XCTAssertEqual(topLevelMessage.fields[2].name, "field3")
  143. XCTAssertEqual(topLevelMessage.fields[3].name, "field4")
  144. XCTAssertEqual(topLevelMessage.fields[4].name, "field5")
  145. XCTAssertEqual(topLevelMessage.fields[5].name, "field6")
  146. XCTAssertTrue(topLevelMessage.fields[2].enumType === topLevelEnum)
  147. XCTAssertTrue(topLevelMessage.fields[3].enumType === subEnum)
  148. XCTAssertTrue(topLevelMessage.fields[4].messageType === subMessage)
  149. XCTAssertTrue(topLevelMessage.fields[5].messageType === topLevelMessage2)
  150. let oneof = topLevelMessage.oneofs[0]
  151. XCTAssertTrue(oneof.containingType === topLevelMessage)
  152. XCTAssertEqual(oneof.fields.count, 4)
  153. XCTAssertTrue(oneof.fields[0] === topLevelMessage.fields[2])
  154. XCTAssertTrue(oneof.fields[1] === topLevelMessage.fields[3])
  155. XCTAssertTrue(oneof.fields[2] === topLevelMessage.fields[4])
  156. XCTAssertTrue(oneof.fields[3] === topLevelMessage.fields[5])
  157. XCTAssertEqual(topLevelMessage2.fields.count, 2)
  158. XCTAssertEqual(topLevelMessage2.fields[0].name, "left")
  159. XCTAssertEqual(topLevelMessage2.fields[1].name, "right")
  160. XCTAssertTrue(topLevelMessage2.fields[0].messageType === topLevelMessage)
  161. XCTAssertTrue(topLevelMessage2.fields[1].messageType === topLevelMessage2)
  162. let externalRefs = descriptorSet.descriptor(named: "swift_descriptor_test.ExternalRefs")!
  163. let extendOne = descriptorSet.descriptor(named: "swift_descriptor_test.import.ExtendableOne")!
  164. let testImportVersion = descriptorSet.descriptor(named: "swift_descriptor_test.import.Version")!
  165. XCTAssertEqual(externalRefs.fields.count, 2)
  166. XCTAssertEqual(externalRefs.fields[0].name, "one")
  167. XCTAssertEqual(externalRefs.fields[1].name, "ver")
  168. XCTAssertTrue(externalRefs.fields[0].messageType === extendOne)
  169. XCTAssertTrue(externalRefs.fields[1].messageType === testImportVersion)
  170. // Proto2 Presence
  171. let proto2ForPresence = descriptorSet.descriptor(named: "swift_descriptor_test.Proto2MessageForPresence")!
  172. XCTAssertEqual(proto2ForPresence.fields.count, 16)
  173. XCTAssertEqual(proto2ForPresence.fields[0].name, "req_str_field")
  174. XCTAssertEqual(proto2ForPresence.fields[1].name, "req_int32_field")
  175. XCTAssertEqual(proto2ForPresence.fields[2].name, "req_enum_field")
  176. XCTAssertEqual(proto2ForPresence.fields[3].name, "req_message_field")
  177. XCTAssertEqual(proto2ForPresence.fields[4].name, "opt_str_field")
  178. XCTAssertEqual(proto2ForPresence.fields[5].name, "opt_int32_field")
  179. XCTAssertEqual(proto2ForPresence.fields[6].name, "opt_enum_field")
  180. XCTAssertEqual(proto2ForPresence.fields[7].name, "opt_message_field")
  181. XCTAssertEqual(proto2ForPresence.fields[8].name, "repeat_str_field")
  182. XCTAssertEqual(proto2ForPresence.fields[9].name, "repeat_int32_field")
  183. XCTAssertEqual(proto2ForPresence.fields[10].name, "repeat_enum_field")
  184. XCTAssertEqual(proto2ForPresence.fields[11].name, "repeat_message_field")
  185. XCTAssertEqual(proto2ForPresence.fields[12].name, "oneof_str_field")
  186. XCTAssertEqual(proto2ForPresence.fields[13].name, "oneof_int32_field")
  187. XCTAssertEqual(proto2ForPresence.fields[14].name, "oneof_enum_field")
  188. XCTAssertEqual(proto2ForPresence.fields[15].name, "oneof_message_field")
  189. XCTAssertFalse(proto2ForPresence.fields[0]._hasOptionalKeyword)
  190. XCTAssertFalse(proto2ForPresence.fields[1]._hasOptionalKeyword)
  191. XCTAssertFalse(proto2ForPresence.fields[2]._hasOptionalKeyword)
  192. XCTAssertFalse(proto2ForPresence.fields[3]._hasOptionalKeyword)
  193. XCTAssertTrue(proto2ForPresence.fields[4]._hasOptionalKeyword)
  194. XCTAssertTrue(proto2ForPresence.fields[5]._hasOptionalKeyword)
  195. XCTAssertTrue(proto2ForPresence.fields[6]._hasOptionalKeyword)
  196. XCTAssertTrue(proto2ForPresence.fields[7]._hasOptionalKeyword)
  197. XCTAssertFalse(proto2ForPresence.fields[8]._hasOptionalKeyword)
  198. XCTAssertFalse(proto2ForPresence.fields[9]._hasOptionalKeyword)
  199. XCTAssertFalse(proto2ForPresence.fields[10]._hasOptionalKeyword)
  200. XCTAssertFalse(proto2ForPresence.fields[11]._hasOptionalKeyword)
  201. XCTAssertFalse(proto2ForPresence.fields[12]._hasOptionalKeyword)
  202. XCTAssertFalse(proto2ForPresence.fields[13]._hasOptionalKeyword)
  203. XCTAssertFalse(proto2ForPresence.fields[14]._hasOptionalKeyword)
  204. XCTAssertFalse(proto2ForPresence.fields[15]._hasOptionalKeyword)
  205. XCTAssertTrue(proto2ForPresence.fields[0].hasPresence)
  206. XCTAssertTrue(proto2ForPresence.fields[1].hasPresence)
  207. XCTAssertTrue(proto2ForPresence.fields[2].hasPresence)
  208. XCTAssertTrue(proto2ForPresence.fields[3].hasPresence)
  209. XCTAssertTrue(proto2ForPresence.fields[4].hasPresence)
  210. XCTAssertTrue(proto2ForPresence.fields[5].hasPresence)
  211. XCTAssertTrue(proto2ForPresence.fields[6].hasPresence)
  212. XCTAssertTrue(proto2ForPresence.fields[7].hasPresence)
  213. XCTAssertFalse(proto2ForPresence.fields[8].hasPresence)
  214. XCTAssertFalse(proto2ForPresence.fields[9].hasPresence)
  215. XCTAssertFalse(proto2ForPresence.fields[10].hasPresence)
  216. XCTAssertFalse(proto2ForPresence.fields[11].hasPresence)
  217. XCTAssertTrue(proto2ForPresence.fields[12].hasPresence)
  218. XCTAssertTrue(proto2ForPresence.fields[13].hasPresence)
  219. XCTAssertTrue(proto2ForPresence.fields[14].hasPresence)
  220. XCTAssertTrue(proto2ForPresence.fields[15].hasPresence)
  221. // No synthetic oneof in proto2 syntax, so the lists should be the same.
  222. XCTAssertEqual(proto2ForPresence.oneofs.count, proto2ForPresence.realOneofs.count)
  223. for (i, o) in proto2ForPresence.realOneofs.enumerated() {
  224. XCTAssert(o === proto2ForPresence.oneofs[i])
  225. }
  226. // Proto3 Presence
  227. let proto3ForPresence = descriptorSet.descriptor(named: "swift_descriptor_test.Proto3MessageForPresence")!
  228. XCTAssertEqual(proto3ForPresence.fields.count, 16)
  229. XCTAssertEqual(proto3ForPresence.fields[0].name, "str_field")
  230. XCTAssertEqual(proto3ForPresence.fields[1].name, "int32_field")
  231. XCTAssertEqual(proto3ForPresence.fields[2].name, "enum_field")
  232. XCTAssertEqual(proto3ForPresence.fields[3].name, "message_field")
  233. XCTAssertEqual(proto3ForPresence.fields[4].name, "opt_str_field")
  234. XCTAssertEqual(proto3ForPresence.fields[5].name, "opt_int32_field")
  235. XCTAssertEqual(proto3ForPresence.fields[6].name, "opt_enum_field")
  236. XCTAssertEqual(proto3ForPresence.fields[7].name, "opt_message_field")
  237. XCTAssertEqual(proto3ForPresence.fields[8].name, "repeat_str_field")
  238. XCTAssertEqual(proto3ForPresence.fields[9].name, "repeat_int32_field")
  239. XCTAssertEqual(proto3ForPresence.fields[10].name, "repeat_enum_field")
  240. XCTAssertEqual(proto3ForPresence.fields[11].name, "repeat_message_field")
  241. XCTAssertEqual(proto3ForPresence.fields[12].name, "oneof_str_field")
  242. XCTAssertEqual(proto3ForPresence.fields[13].name, "oneof_int32_field")
  243. XCTAssertEqual(proto3ForPresence.fields[14].name, "oneof_enum_field")
  244. XCTAssertEqual(proto3ForPresence.fields[15].name, "oneof_message_field")
  245. XCTAssertFalse(proto3ForPresence.fields[0]._hasOptionalKeyword)
  246. XCTAssertFalse(proto3ForPresence.fields[1]._hasOptionalKeyword)
  247. XCTAssertFalse(proto3ForPresence.fields[2]._hasOptionalKeyword)
  248. XCTAssertFalse(proto3ForPresence.fields[3]._hasOptionalKeyword)
  249. XCTAssertTrue(proto3ForPresence.fields[4]._hasOptionalKeyword)
  250. XCTAssertTrue(proto3ForPresence.fields[5]._hasOptionalKeyword)
  251. XCTAssertTrue(proto3ForPresence.fields[6]._hasOptionalKeyword)
  252. XCTAssertTrue(proto3ForPresence.fields[7]._hasOptionalKeyword)
  253. XCTAssertFalse(proto3ForPresence.fields[8]._hasOptionalKeyword)
  254. XCTAssertFalse(proto3ForPresence.fields[9]._hasOptionalKeyword)
  255. XCTAssertFalse(proto3ForPresence.fields[10]._hasOptionalKeyword)
  256. XCTAssertFalse(proto3ForPresence.fields[11]._hasOptionalKeyword)
  257. XCTAssertFalse(proto3ForPresence.fields[12]._hasOptionalKeyword)
  258. XCTAssertFalse(proto3ForPresence.fields[13]._hasOptionalKeyword)
  259. XCTAssertFalse(proto3ForPresence.fields[14]._hasOptionalKeyword)
  260. XCTAssertFalse(proto3ForPresence.fields[15]._hasOptionalKeyword)
  261. XCTAssertFalse(proto3ForPresence.fields[0].hasPresence)
  262. XCTAssertFalse(proto3ForPresence.fields[1].hasPresence)
  263. XCTAssertFalse(proto3ForPresence.fields[2].hasPresence)
  264. XCTAssertTrue(proto3ForPresence.fields[3].hasPresence)
  265. XCTAssertTrue(proto3ForPresence.fields[4].hasPresence)
  266. XCTAssertTrue(proto3ForPresence.fields[5].hasPresence)
  267. XCTAssertTrue(proto3ForPresence.fields[6].hasPresence)
  268. XCTAssertTrue(proto3ForPresence.fields[7].hasPresence)
  269. XCTAssertFalse(proto3ForPresence.fields[8].hasPresence)
  270. XCTAssertFalse(proto3ForPresence.fields[9].hasPresence)
  271. XCTAssertFalse(proto3ForPresence.fields[10].hasPresence)
  272. XCTAssertFalse(proto3ForPresence.fields[11].hasPresence)
  273. XCTAssertTrue(proto3ForPresence.fields[12].hasPresence)
  274. XCTAssertTrue(proto3ForPresence.fields[13].hasPresence)
  275. XCTAssertTrue(proto3ForPresence.fields[14].hasPresence)
  276. XCTAssertTrue(proto3ForPresence.fields[15].hasPresence)
  277. // Synthetic oneof in proto3 syntax for the 'optional' fields, so
  278. // the lists should NOTE be the same, `realOneofs` one should be a
  279. // prefix of `oneofs`.
  280. XCTAssertTrue(proto3ForPresence.oneofs.count > proto3ForPresence.realOneofs.count)
  281. for (i, o) in proto2ForPresence.realOneofs.enumerated() {
  282. XCTAssert(o === proto2ForPresence.oneofs[i])
  283. }
  284. }
  285. func testExtensions() throws {
  286. // Extensions are a little different in how they have extensionScope and
  287. // containingType, so they are split out to be a clear test of their behaviors.
  288. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  289. let descriptorSet = DescriptorSet(proto: fileSet)
  290. let extendOne = descriptorSet.descriptor(named: "swift_descriptor_test.import.ExtendableOne")!
  291. let extendTwo = descriptorSet.descriptor(named: "swift_descriptor_test.import.ExtendableOne.ExtendableTwo")!
  292. let descriptorTestFile = descriptorSet.files[1]
  293. let topLevelExt = descriptorTestFile.extensions[0]
  294. XCTAssertNil(topLevelExt.extensionScope)
  295. XCTAssertTrue(topLevelExt.containingType === extendOne)
  296. let extScoper = descriptorSet.descriptor(named: "swift_descriptor_test.ScoperForExt")!
  297. let nestedExt1 = descriptorTestFile.messages[3].extensions[0]
  298. let nestedExt2 = descriptorTestFile.messages[3].extensions[1]
  299. XCTAssertTrue(nestedExt1.extensionScope === extScoper)
  300. XCTAssertTrue(nestedExt1.containingType === extendTwo)
  301. XCTAssertTrue(nestedExt2.extensionScope === extScoper)
  302. XCTAssertTrue(nestedExt2.containingType === extendTwo)
  303. XCTAssertTrue(nestedExt1.enumType === descriptorTestFile.enums[0])
  304. XCTAssertTrue(nestedExt2.messageType === descriptorTestFile.messages[1])
  305. XCTAssertTrue(topLevelExt.file === descriptorTestFile)
  306. XCTAssertTrue(nestedExt1.file === descriptorTestFile)
  307. XCTAssertTrue(nestedExt2.file === descriptorTestFile)
  308. }
  309. func testDelimited() throws {
  310. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  311. let descriptorSet = DescriptorSet(proto: fileSet)
  312. let msg = try XCTUnwrap(
  313. descriptorSet.descriptor(named: SwiftDescriptorTest_EditionsMessageForDelimited.protoMessageName)
  314. )
  315. XCTAssertEqual(try XCTUnwrap(msg.field(named: "scalar_field")).type, .int32)
  316. XCTAssertEqual(try XCTUnwrap(msg.field(named: "map_field")).type, .message)
  317. XCTAssertEqual(try XCTUnwrap(msg.field(named: "message_map_field")).type, .message)
  318. XCTAssertEqual(try XCTUnwrap(msg.field(named: "delimited_field")).type, .group)
  319. XCTAssertEqual(try XCTUnwrap(msg.field(named: "length_prefixed_field")).type, .message)
  320. }
  321. func testIsGroupLike_GroupLikeDelimited() throws {
  322. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  323. let descriptorSet = DescriptorSet(proto: fileSet)
  324. let msg = try XCTUnwrap(descriptorSet.descriptor(named: EditionsUnittest_TestDelimited.protoMessageName))
  325. let file = try XCTUnwrap(msg.file)
  326. XCTAssertTrue(try XCTUnwrap(msg.field(named: "grouplike")).isGroupLike)
  327. XCTAssertTrue(try XCTUnwrap(file.extensionField(named: "grouplikefilescope")).isGroupLike)
  328. }
  329. func testIsGroupLike_GroupLikeNotDelimited() throws {
  330. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  331. let descriptorSet = DescriptorSet(proto: fileSet)
  332. let msg = try XCTUnwrap(descriptorSet.descriptor(named: EditionsUnittest_TestDelimited.protoMessageName))
  333. let file = try XCTUnwrap(msg.file)
  334. XCTAssertFalse(try XCTUnwrap(msg.field(named: "lengthprefixed")).isGroupLike)
  335. XCTAssertFalse(try XCTUnwrap(file.extensionField(named: "lengthprefixed")).isGroupLike)
  336. }
  337. func testIsGroupLike_GroupLikeMismatchedName() throws {
  338. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  339. let descriptorSet = DescriptorSet(proto: fileSet)
  340. let msg = try XCTUnwrap(descriptorSet.descriptor(named: EditionsUnittest_TestDelimited.protoMessageName))
  341. let file = try XCTUnwrap(msg.file)
  342. XCTAssertFalse(try XCTUnwrap(msg.field(named: "notgrouplike")).isGroupLike)
  343. XCTAssertFalse(try XCTUnwrap(file.extensionField(named: "not_group_like_scope")).isGroupLike)
  344. }
  345. func testIsGroupLike_GroupLikeMismatchedScope() throws {
  346. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  347. let descriptorSet = DescriptorSet(proto: fileSet)
  348. let msg = try XCTUnwrap(descriptorSet.descriptor(named: EditionsUnittest_TestDelimited.protoMessageName))
  349. let file = try XCTUnwrap(msg.file)
  350. XCTAssertFalse(try XCTUnwrap(msg.field(named: "notgrouplikescope")).isGroupLike)
  351. XCTAssertFalse(try XCTUnwrap(file.extensionField(named: "grouplike")).isGroupLike)
  352. }
  353. func testIsGroupLike_GroupLikeMismatchedFile() throws {
  354. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  355. let descriptorSet = DescriptorSet(proto: fileSet)
  356. let msg = try XCTUnwrap(descriptorSet.descriptor(named: EditionsUnittest_TestDelimited.protoMessageName))
  357. let file = try XCTUnwrap(msg.file)
  358. XCTAssertFalse(try XCTUnwrap(msg.field(named: "messageimport")).isGroupLike)
  359. XCTAssertFalse(try XCTUnwrap(file.extensionField(named: "messageimport")).isGroupLike)
  360. }
  361. func testExtractProto_Options() throws {
  362. let fileSet = try Google_Protobuf_FileDescriptorSet(serializedBytes: fileDescriptorSetBytes)
  363. let descriptorSet = DescriptorSet(proto: fileSet)
  364. let fileDescriptor = descriptorSet.fileDescriptor(named: "pluginlib_descriptor_test.proto")!
  365. // NOTE: There should be a full tests for ExtractProto that validates all the sub descriptor
  366. // protos. But for now, given the function's implementation, just test that the options are
  367. // honored correctly.
  368. // Default:
  369. // - includeSourceCodeInfo = false
  370. // - headerOnly = false
  371. do {
  372. let extract = fileDescriptor.extractProto()
  373. XCTAssertFalse(extract.hasSourceCodeInfo, "Included SourceCodeInfo?")
  374. XCTAssertFalse(extract.messageType.isEmpty, "Missing messages?")
  375. XCTAssertFalse(extract.enumType.isEmpty, "Missing enums?")
  376. XCTAssertFalse(extract.extension.isEmpty, "Missing extensions?")
  377. XCTAssertFalse(extract.service.isEmpty, "Missing services?")
  378. }
  379. var options = ExtractProtoOptions()
  380. options.includeSourceCodeInfo = true
  381. // - includeSourceCodeInfo = true
  382. // - headerOnly = false
  383. do {
  384. let extract = fileDescriptor.extractProto(options: options)
  385. XCTAssertTrue(extract.hasSourceCodeInfo, "Missing SourceCodeInfo?")
  386. XCTAssertFalse(extract.messageType.isEmpty, "Missing messages?")
  387. XCTAssertFalse(extract.enumType.isEmpty, "Missing enums?")
  388. XCTAssertFalse(extract.extension.isEmpty, "Missing extensions?")
  389. XCTAssertFalse(extract.service.isEmpty, "Missing services?")
  390. }
  391. options.headerOnly = true
  392. // - includeSourceCodeInfo = true
  393. // - headerOnly = true
  394. do {
  395. let extract = fileDescriptor.extractProto(options: options)
  396. XCTAssertTrue(extract.hasSourceCodeInfo, "Missing SourceCodeInfo?")
  397. XCTAssertTrue(extract.messageType.isEmpty, "Incuded messages?")
  398. XCTAssertTrue(extract.enumType.isEmpty, "Incuded enums?")
  399. XCTAssertTrue(extract.extension.isEmpty, "Missing extensions?")
  400. XCTAssertTrue(extract.service.isEmpty, "Missing services?")
  401. }
  402. options.includeSourceCodeInfo = false
  403. // - includeSourceCodeInfo = false
  404. // - headerOnly = false
  405. do {
  406. let extract = fileDescriptor.extractProto(options: options)
  407. XCTAssertFalse(extract.hasSourceCodeInfo, "Included SourceCodeInfo?")
  408. XCTAssertTrue(extract.messageType.isEmpty, "Incuded messages?")
  409. XCTAssertTrue(extract.enumType.isEmpty, "Incuded enums?")
  410. XCTAssertTrue(extract.extension.isEmpty, "Missing extensions?")
  411. XCTAssertTrue(extract.service.isEmpty, "Missing services?")
  412. }
  413. }
  414. }