StructuredSwift+ImportTests.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*
  2. * Copyright 2025, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import GRPCCodeGen
  17. import Testing
  18. extension StructuredSwiftTests {
  19. @available(gRPCSwift 2.0, *)
  20. static let translator = IDLToStructuredSwiftTranslator()
  21. @available(gRPCSwift 2.0, *)
  22. static let allAccessLevels: [CodeGenerator.Config.AccessLevel] = [
  23. .internal, .public, .package,
  24. ]
  25. @Suite("Import")
  26. struct Import {
  27. @Test(
  28. "import rendering",
  29. arguments: allAccessLevels
  30. )
  31. @available(gRPCSwift 2.0, *)
  32. func imports(accessLevel: CodeGenerator.Config.AccessLevel) throws {
  33. var dependencies = [Dependency]()
  34. dependencies.append(Dependency(module: "Foo", accessLevel: .public))
  35. dependencies.append(
  36. Dependency(
  37. item: .init(kind: .typealias, name: "Bar"),
  38. module: "Foo",
  39. accessLevel: .internal
  40. )
  41. )
  42. dependencies.append(
  43. Dependency(
  44. item: .init(kind: .struct, name: "Baz"),
  45. module: "Foo",
  46. accessLevel: .package
  47. )
  48. )
  49. dependencies.append(
  50. Dependency(
  51. item: .init(kind: .class, name: "Bac"),
  52. module: "Foo",
  53. accessLevel: .package
  54. )
  55. )
  56. dependencies.append(
  57. Dependency(
  58. item: .init(kind: .enum, name: "Bap"),
  59. module: "Foo",
  60. accessLevel: .package
  61. )
  62. )
  63. dependencies.append(
  64. Dependency(
  65. item: .init(kind: .protocol, name: "Bat"),
  66. module: "Foo",
  67. accessLevel: .package
  68. )
  69. )
  70. dependencies.append(
  71. Dependency(
  72. item: .init(kind: .let, name: "Baq"),
  73. module: "Foo",
  74. accessLevel: .package
  75. )
  76. )
  77. dependencies.append(
  78. Dependency(
  79. item: .init(kind: .var, name: "Bag"),
  80. module: "Foo",
  81. accessLevel: .package
  82. )
  83. )
  84. dependencies.append(
  85. Dependency(
  86. item: .init(kind: .func, name: "Bak"),
  87. module: "Foo",
  88. accessLevel: .package
  89. )
  90. )
  91. let expected =
  92. """
  93. \(accessLevel.level) import GRPCCore
  94. public import Foo
  95. internal import typealias Foo.Bar
  96. package import struct Foo.Baz
  97. package import class Foo.Bac
  98. package import enum Foo.Bap
  99. package import protocol Foo.Bat
  100. package import let Foo.Baq
  101. package import var Foo.Bag
  102. package import func Foo.Bak
  103. """
  104. let imports = try StructuredSwiftTests.translator.makeImports(
  105. dependencies: dependencies,
  106. accessLevel: accessLevel,
  107. accessLevelOnImports: true,
  108. grpcCoreModuleName: "GRPCCore"
  109. )
  110. #expect(render(imports) == expected)
  111. }
  112. @Test(
  113. "preconcurrency import rendering",
  114. arguments: StructuredSwiftTests.allAccessLevels
  115. )
  116. @available(gRPCSwift 2.0, *)
  117. func preconcurrencyImports(accessLevel: CodeGenerator.Config.AccessLevel) throws {
  118. var dependencies = [Dependency]()
  119. dependencies.append(
  120. Dependency(
  121. module: "Foo",
  122. preconcurrency: .required,
  123. accessLevel: .internal
  124. )
  125. )
  126. dependencies.append(
  127. Dependency(
  128. item: .init(kind: .enum, name: "Bar"),
  129. module: "Foo",
  130. preconcurrency: .required,
  131. accessLevel: .internal
  132. )
  133. )
  134. dependencies.append(
  135. Dependency(
  136. module: "Baz",
  137. preconcurrency: .requiredOnOS(["Deq", "Der"]),
  138. accessLevel: .internal
  139. )
  140. )
  141. let expected =
  142. """
  143. \(accessLevel.level) import GRPCCore
  144. @preconcurrency internal import Foo
  145. @preconcurrency internal import enum Foo.Bar
  146. #if os(Deq) || os(Der)
  147. @preconcurrency internal import Baz
  148. #else
  149. internal import Baz
  150. #endif
  151. """
  152. let imports = try StructuredSwiftTests.translator.makeImports(
  153. dependencies: dependencies,
  154. accessLevel: accessLevel,
  155. accessLevelOnImports: true,
  156. grpcCoreModuleName: "GRPCCore"
  157. )
  158. #expect(render(imports) == expected)
  159. }
  160. @Test(
  161. "SPI import rendering",
  162. arguments: StructuredSwiftTests.allAccessLevels
  163. )
  164. @available(gRPCSwift 2.0, *)
  165. func spiImports(accessLevel: CodeGenerator.Config.AccessLevel) throws {
  166. var dependencies = [Dependency]()
  167. dependencies.append(
  168. Dependency(module: "Foo", spi: "Secret", accessLevel: .internal)
  169. )
  170. dependencies.append(
  171. Dependency(
  172. item: .init(kind: .enum, name: "Bar"),
  173. module: "Foo",
  174. spi: "Secret",
  175. accessLevel: .internal
  176. )
  177. )
  178. let expected =
  179. """
  180. \(accessLevel.level) import GRPCCore
  181. @_spi(Secret) internal import Foo
  182. @_spi(Secret) internal import enum Foo.Bar
  183. """
  184. let imports = try StructuredSwiftTests.translator.makeImports(
  185. dependencies: dependencies,
  186. accessLevel: accessLevel,
  187. accessLevelOnImports: true,
  188. grpcCoreModuleName: "GRPCCore"
  189. )
  190. #expect(render(imports) == expected)
  191. }
  192. @Test("gRPC module name")
  193. @available(gRPCSwift 2.0, *)
  194. func grpcModuleName() throws {
  195. let translator = IDLToStructuredSwiftTranslator()
  196. let imports = try translator.makeImports(
  197. dependencies: [],
  198. accessLevel: .public,
  199. accessLevelOnImports: true,
  200. grpcCoreModuleName: "GRPCCoreFoo"
  201. )
  202. let expected =
  203. """
  204. public import GRPCCoreFoo
  205. """
  206. #expect(render(imports) == expected)
  207. }
  208. }
  209. }