StructuredSwift+ImportTests.swift 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. @Suite("Import")
  20. struct Import {
  21. static let translator = IDLToStructuredSwiftTranslator()
  22. static let allAccessLevels: [CodeGenerator.Config.AccessLevel] = [
  23. .internal, .public, .package,
  24. ]
  25. @Test(
  26. "import rendering",
  27. arguments: allAccessLevels
  28. )
  29. func imports(accessLevel: CodeGenerator.Config.AccessLevel) throws {
  30. var dependencies = [Dependency]()
  31. dependencies.append(Dependency(module: "Foo", accessLevel: .public))
  32. dependencies.append(
  33. Dependency(
  34. item: .init(kind: .typealias, name: "Bar"),
  35. module: "Foo",
  36. accessLevel: .internal
  37. )
  38. )
  39. dependencies.append(
  40. Dependency(
  41. item: .init(kind: .struct, name: "Baz"),
  42. module: "Foo",
  43. accessLevel: .package
  44. )
  45. )
  46. dependencies.append(
  47. Dependency(
  48. item: .init(kind: .class, name: "Bac"),
  49. module: "Foo",
  50. accessLevel: .package
  51. )
  52. )
  53. dependencies.append(
  54. Dependency(
  55. item: .init(kind: .enum, name: "Bap"),
  56. module: "Foo",
  57. accessLevel: .package
  58. )
  59. )
  60. dependencies.append(
  61. Dependency(
  62. item: .init(kind: .protocol, name: "Bat"),
  63. module: "Foo",
  64. accessLevel: .package
  65. )
  66. )
  67. dependencies.append(
  68. Dependency(
  69. item: .init(kind: .let, name: "Baq"),
  70. module: "Foo",
  71. accessLevel: .package
  72. )
  73. )
  74. dependencies.append(
  75. Dependency(
  76. item: .init(kind: .var, name: "Bag"),
  77. module: "Foo",
  78. accessLevel: .package
  79. )
  80. )
  81. dependencies.append(
  82. Dependency(
  83. item: .init(kind: .func, name: "Bak"),
  84. module: "Foo",
  85. accessLevel: .package
  86. )
  87. )
  88. let expected =
  89. """
  90. \(accessLevel.level) import GRPCCore
  91. public import Foo
  92. internal import typealias Foo.Bar
  93. package import struct Foo.Baz
  94. package import class Foo.Bac
  95. package import enum Foo.Bap
  96. package import protocol Foo.Bat
  97. package import let Foo.Baq
  98. package import var Foo.Bag
  99. package import func Foo.Bak
  100. """
  101. let imports = try StructuredSwiftTests.Import.translator.makeImports(
  102. dependencies: dependencies,
  103. accessLevel: accessLevel,
  104. accessLevelOnImports: true,
  105. grpcCoreModuleName: "GRPCCore"
  106. )
  107. #expect(render(imports) == expected)
  108. }
  109. @Test(
  110. "preconcurrency import rendering",
  111. arguments: allAccessLevels
  112. )
  113. func preconcurrencyImports(accessLevel: CodeGenerator.Config.AccessLevel) throws {
  114. var dependencies = [Dependency]()
  115. dependencies.append(
  116. Dependency(
  117. module: "Foo",
  118. preconcurrency: .required,
  119. accessLevel: .internal
  120. )
  121. )
  122. dependencies.append(
  123. Dependency(
  124. item: .init(kind: .enum, name: "Bar"),
  125. module: "Foo",
  126. preconcurrency: .required,
  127. accessLevel: .internal
  128. )
  129. )
  130. dependencies.append(
  131. Dependency(
  132. module: "Baz",
  133. preconcurrency: .requiredOnOS(["Deq", "Der"]),
  134. accessLevel: .internal
  135. )
  136. )
  137. let expected =
  138. """
  139. \(accessLevel.level) import GRPCCore
  140. @preconcurrency internal import Foo
  141. @preconcurrency internal import enum Foo.Bar
  142. #if os(Deq) || os(Der)
  143. @preconcurrency internal import Baz
  144. #else
  145. internal import Baz
  146. #endif
  147. """
  148. let imports = try StructuredSwiftTests.Import.translator.makeImports(
  149. dependencies: dependencies,
  150. accessLevel: accessLevel,
  151. accessLevelOnImports: true,
  152. grpcCoreModuleName: "GRPCCore"
  153. )
  154. #expect(render(imports) == expected)
  155. }
  156. @Test(
  157. "SPI import rendering",
  158. arguments: allAccessLevels
  159. )
  160. func spiImports(accessLevel: CodeGenerator.Config.AccessLevel) throws {
  161. var dependencies = [Dependency]()
  162. dependencies.append(
  163. Dependency(module: "Foo", spi: "Secret", accessLevel: .internal)
  164. )
  165. dependencies.append(
  166. Dependency(
  167. item: .init(kind: .enum, name: "Bar"),
  168. module: "Foo",
  169. spi: "Secret",
  170. accessLevel: .internal
  171. )
  172. )
  173. let expected =
  174. """
  175. \(accessLevel.level) import GRPCCore
  176. @_spi(Secret) internal import Foo
  177. @_spi(Secret) internal import enum Foo.Bar
  178. """
  179. let imports = try StructuredSwiftTests.Import.translator.makeImports(
  180. dependencies: dependencies,
  181. accessLevel: accessLevel,
  182. accessLevelOnImports: true,
  183. grpcCoreModuleName: "GRPCCore"
  184. )
  185. #expect(render(imports) == expected)
  186. }
  187. @Test("gRPC module name")
  188. func grpcModuleName() throws {
  189. let translator = IDLToStructuredSwiftTranslator()
  190. let imports = try translator.makeImports(
  191. dependencies: [],
  192. accessLevel: .public,
  193. accessLevelOnImports: true,
  194. grpcCoreModuleName: "GRPCCoreFoo"
  195. )
  196. let expected =
  197. """
  198. public import GRPCCoreFoo
  199. """
  200. #expect(render(imports) == expected)
  201. }
  202. }
  203. }