Test_SwiftProtobufNamer.swift 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. // Tests/SwiftProtobufPluginLibraryTests/Test_SwiftProtobufNamer.swift - Test SwiftProtobufNamer.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 SwiftProtobufTestHelpers
  13. import XCTest
  14. final class Test_SwiftProtobufNamer: XCTestCase {
  15. func testEnumValueHandling_AliasNameMatches() throws {
  16. let txt = [
  17. "name: \"test.proto\"",
  18. "syntax: \"proto2\"",
  19. "enum_type {",
  20. " name: \"TestEnum\"",
  21. " options {",
  22. " allow_alias: true",
  23. " }",
  24. " value {",
  25. " name: \"TEST_ENUM_FOO\"",
  26. " number: 0", // Primary
  27. " }",
  28. " value {",
  29. " name: \"TEST_ENUM_BAR\"",
  30. " number: 1",
  31. " }",
  32. " value {",
  33. " name: \"TESTENUM_FOO\"",
  34. " number: 0", // Alias
  35. " }",
  36. " value {",
  37. " name: \"_FOO\"",
  38. " number: 0", // Alias
  39. " }",
  40. " value {",
  41. " name: \"FOO\"",
  42. " number: 0", // Alias
  43. " }",
  44. " value {",
  45. " name: \"TEST_ENUM_ALIAS\"",
  46. " number: 0", // Alias (unique name)
  47. " }",
  48. "}",
  49. ]
  50. let fileProto: Google_Protobuf_FileDescriptorProto
  51. do {
  52. fileProto = try Google_Protobuf_FileDescriptorProto(textFormatStrings: txt)
  53. } catch let e {
  54. XCTFail("Error: \(e)")
  55. return
  56. }
  57. let descriptorSet = DescriptorSet(protos: [fileProto])
  58. let namer =
  59. SwiftProtobufNamer(
  60. currentFile: descriptorSet.fileDescriptor(named: "test.proto")!,
  61. protoFileToModuleMappings: ProtoFileToModuleMappings()
  62. )
  63. let e = descriptorSet.enumDescriptor(named: "TestEnum")!
  64. let values = e.values
  65. XCTAssertEqual(values.count, 6)
  66. // Test relativeName(enumValue:)
  67. XCTAssertEqual(namer.relativeName(enumValue: values[0]), "foo")
  68. XCTAssertEqual(namer.relativeName(enumValue: values[1]), "bar")
  69. XCTAssertEqual(namer.relativeName(enumValue: values[2]), "foo")
  70. XCTAssertEqual(namer.relativeName(enumValue: values[3]), "foo")
  71. XCTAssertEqual(namer.relativeName(enumValue: values[4]), "foo")
  72. XCTAssertEqual(namer.relativeName(enumValue: values[5]), "alias")
  73. }
  74. func testEnumValueHandling_NameCollisions() {
  75. let txt = [
  76. "name: \"test.proto\"",
  77. "syntax: \"proto2\"",
  78. "enum_type {",
  79. " name: \"TestEnum\"",
  80. " value {",
  81. " name: \"TEST_ENUM_FOO\"",
  82. " number: 0", // Collision
  83. " }",
  84. " value {",
  85. " name: \"TEST_ENUM_BAR\"",
  86. " number: 1",
  87. " }",
  88. " value {",
  89. " name: \"TESTENUM_FOO\"",
  90. " number: 2", // Collision
  91. " }",
  92. " value {",
  93. " name: \"_FOO\"",
  94. " number: -1", // Collision - negative value
  95. " }",
  96. "}",
  97. ]
  98. let fileProto: Google_Protobuf_FileDescriptorProto
  99. do {
  100. fileProto = try Google_Protobuf_FileDescriptorProto(textFormatStrings: txt)
  101. } catch let e {
  102. XCTFail("Error: \(e)")
  103. return
  104. }
  105. let descriptorSet = DescriptorSet(protos: [fileProto])
  106. let namer =
  107. SwiftProtobufNamer(
  108. currentFile: descriptorSet.fileDescriptor(named: "test.proto")!,
  109. protoFileToModuleMappings: ProtoFileToModuleMappings()
  110. )
  111. let e = descriptorSet.enumDescriptor(named: "TestEnum")!
  112. let values = e.values
  113. XCTAssertEqual(values.count, 4)
  114. // Test relativeName(enumValue:)
  115. XCTAssertEqual(namer.relativeName(enumValue: values[0]), "foo_0")
  116. XCTAssertEqual(namer.relativeName(enumValue: values[1]), "bar")
  117. XCTAssertEqual(namer.relativeName(enumValue: values[2]), "foo_2")
  118. XCTAssertEqual(namer.relativeName(enumValue: values[3]), "foo_n1")
  119. }
  120. func testEnumValueHandling_NameCollisionsAndAliasMatches() {
  121. let txt = [
  122. "name: \"test.proto\"",
  123. "syntax: \"proto2\"",
  124. "enum_type {",
  125. " name: \"TestEnum\"",
  126. " options {",
  127. " allow_alias: true",
  128. " }",
  129. " value {",
  130. " name: \"TEST_ENUM_FOO\"",
  131. " number: 0", // Collision/Primary0
  132. " }",
  133. " value {",
  134. " name: \"TEST_ENUM_BAR\"",
  135. " number: 1",
  136. " }",
  137. " value {",
  138. " name: \"TESTENUM_FOO\"",
  139. " number: 0", // Alias 0
  140. " }",
  141. " value {",
  142. " name: \"_FOO\"",
  143. " number: 2", // Collision/Primary2
  144. " }",
  145. " value {",
  146. " name: \"FOO\"",
  147. " number: 2", // Alias 2
  148. " }",
  149. " value {",
  150. " name: \"TEST_ENUM_ALIAS\"",
  151. " number: 0", // Alias 0 - Unique name
  152. " }",
  153. " value {",
  154. " name: \"mumble\"",
  155. " number: 1", // Alias 1 - Collision with next alias
  156. " }",
  157. " value {",
  158. " name: \"MUMBLE\"",
  159. " number: 0", // Alias 0 - Collision with previous alias
  160. " }",
  161. "}",
  162. ]
  163. let fileProto: Google_Protobuf_FileDescriptorProto
  164. do {
  165. fileProto = try Google_Protobuf_FileDescriptorProto(textFormatStrings: txt)
  166. } catch let e {
  167. XCTFail("Error: \(e)")
  168. return
  169. }
  170. let descriptorSet = DescriptorSet(protos: [fileProto])
  171. let namer =
  172. SwiftProtobufNamer(
  173. currentFile: descriptorSet.fileDescriptor(named: "test.proto")!,
  174. protoFileToModuleMappings: ProtoFileToModuleMappings()
  175. )
  176. let e = descriptorSet.enumDescriptor(named: "TestEnum")!
  177. let values = e.values
  178. XCTAssertEqual(values.count, 8)
  179. // Test relativeName(enumValue:)
  180. XCTAssertEqual(namer.relativeName(enumValue: values[0]), "foo_0")
  181. XCTAssertEqual(namer.relativeName(enumValue: values[1]), "bar")
  182. XCTAssertEqual(namer.relativeName(enumValue: values[2]), "foo_0")
  183. XCTAssertEqual(namer.relativeName(enumValue: values[3]), "foo_2")
  184. XCTAssertEqual(namer.relativeName(enumValue: values[4]), "foo_2")
  185. XCTAssertEqual(namer.relativeName(enumValue: values[5]), "alias")
  186. XCTAssertEqual(namer.relativeName(enumValue: values[6]), "mumble_1")
  187. XCTAssertEqual(namer.relativeName(enumValue: values[7]), "mumble_0")
  188. }
  189. func testEnumValueHandling_UniqueAliasNameCollisions() {
  190. // Tests were the aliases collided in naming, but not with
  191. // the original.
  192. let txt = [
  193. "name: \"test.proto\"",
  194. "syntax: \"proto2\"",
  195. "enum_type {",
  196. " name: \"AliasedEnum\"",
  197. " options {",
  198. " allow_alias: true",
  199. " }",
  200. " value {",
  201. " name: \"ALIAS_FOO\"",
  202. " number: 0",
  203. " }",
  204. " value {",
  205. " name: \"ALIAS_BAR\"",
  206. " number: 1",
  207. " }",
  208. " value {",
  209. " name: \"ALIAS_BAZ\"",
  210. " number: 2",
  211. " }",
  212. " value {",
  213. " name: \"QUX\"",
  214. " number: 2", // short name merged with the next because they have the same value.
  215. " }",
  216. " value {",
  217. " name: \"qux\"",
  218. " number: 2",
  219. " }",
  220. " value {",
  221. " name: \"bAz\"",
  222. " number: 2",
  223. " }",
  224. "}",
  225. ]
  226. let fileProto: Google_Protobuf_FileDescriptorProto
  227. do {
  228. fileProto = try Google_Protobuf_FileDescriptorProto(textFormatStrings: txt)
  229. } catch let e {
  230. XCTFail("Error: \(e)")
  231. return
  232. }
  233. let descriptorSet = DescriptorSet(protos: [fileProto])
  234. let namer =
  235. SwiftProtobufNamer(
  236. currentFile: descriptorSet.fileDescriptor(named: "test.proto")!,
  237. protoFileToModuleMappings: ProtoFileToModuleMappings()
  238. )
  239. let e = descriptorSet.enumDescriptor(named: "AliasedEnum")!
  240. let values = e.values
  241. XCTAssertEqual(values.count, 6)
  242. XCTAssertEqual(values[0].name, "ALIAS_FOO")
  243. XCTAssertEqual(values[1].name, "ALIAS_BAR")
  244. XCTAssertEqual(values[2].name, "ALIAS_BAZ")
  245. XCTAssertEqual(values[3].name, "QUX")
  246. XCTAssertEqual(values[4].name, "qux")
  247. XCTAssertEqual(values[5].name, "bAz")
  248. // Test relativeName(enumValue:)
  249. XCTAssertEqual(namer.relativeName(enumValue: values[0]), "aliasFoo")
  250. XCTAssertEqual(namer.relativeName(enumValue: values[1]), "aliasBar")
  251. XCTAssertEqual(namer.relativeName(enumValue: values[2]), "aliasBaz")
  252. XCTAssertEqual(namer.relativeName(enumValue: values[3]), "qux")
  253. XCTAssertEqual(namer.relativeName(enumValue: values[4]), "qux")
  254. XCTAssertEqual(namer.relativeName(enumValue: values[5]), "bAz")
  255. }
  256. }