2
0

StructuredSwift+ImportTests.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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: [SourceGenerator.Config.AccessLevel] = [
  23. .internal, .public, .package,
  24. ]
  25. @Test(
  26. "import rendering",
  27. arguments: allAccessLevels
  28. )
  29. func imports(accessLevel: SourceGenerator.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. )
  106. #expect(render(imports) == expected)
  107. }
  108. @Test(
  109. "preconcurrency import rendering",
  110. arguments: allAccessLevels
  111. )
  112. func preconcurrencyImports(accessLevel: SourceGenerator.Config.AccessLevel) throws {
  113. var dependencies = [Dependency]()
  114. dependencies.append(
  115. Dependency(
  116. module: "Foo",
  117. preconcurrency: .required,
  118. accessLevel: .internal
  119. )
  120. )
  121. dependencies.append(
  122. Dependency(
  123. item: .init(kind: .enum, name: "Bar"),
  124. module: "Foo",
  125. preconcurrency: .required,
  126. accessLevel: .internal
  127. )
  128. )
  129. dependencies.append(
  130. Dependency(
  131. module: "Baz",
  132. preconcurrency: .requiredOnOS(["Deq", "Der"]),
  133. accessLevel: .internal
  134. )
  135. )
  136. let expected =
  137. """
  138. \(accessLevel.level) import GRPCCore
  139. @preconcurrency internal import Foo
  140. @preconcurrency internal import enum Foo.Bar
  141. #if os(Deq) || os(Der)
  142. @preconcurrency internal import Baz
  143. #else
  144. internal import Baz
  145. #endif
  146. """
  147. let imports = try StructuredSwiftTests.Import.translator.makeImports(
  148. dependencies: dependencies,
  149. accessLevel: accessLevel,
  150. accessLevelOnImports: true
  151. )
  152. #expect(render(imports) == expected)
  153. }
  154. @Test(
  155. "SPI import rendering",
  156. arguments: allAccessLevels
  157. )
  158. func spiImports(accessLevel: SourceGenerator.Config.AccessLevel) throws {
  159. var dependencies = [Dependency]()
  160. dependencies.append(
  161. Dependency(module: "Foo", spi: "Secret", accessLevel: .internal)
  162. )
  163. dependencies.append(
  164. Dependency(
  165. item: .init(kind: .enum, name: "Bar"),
  166. module: "Foo",
  167. spi: "Secret",
  168. accessLevel: .internal
  169. )
  170. )
  171. let expected =
  172. """
  173. \(accessLevel.level) import GRPCCore
  174. @_spi(Secret) internal import Foo
  175. @_spi(Secret) internal import enum Foo.Bar
  176. """
  177. let imports = try StructuredSwiftTests.Import.translator.makeImports(
  178. dependencies: dependencies,
  179. accessLevel: accessLevel,
  180. accessLevelOnImports: true
  181. )
  182. #expect(render(imports) == expected)
  183. }
  184. }
  185. }