StructuredSwift+MetadataTests.swift 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /*
  2. * Copyright 2024, 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 Testing
  17. @testable import GRPCCodeGen
  18. extension StructuedSwiftTests {
  19. @Suite("Metadata")
  20. struct Metadata {
  21. @Test("typealias Input = <Name>", arguments: AccessModifier.allCases)
  22. func methodInputTypealias(access: AccessModifier) {
  23. let decl: TypealiasDescription = .methodInput(accessModifier: access, name: "Foo")
  24. let expected = "\(access) typealias Input = Foo"
  25. #expect(render(.typealias(decl)) == expected)
  26. }
  27. @Test("typealias Output = <Name>", arguments: AccessModifier.allCases)
  28. func methodOutputTypealias(access: AccessModifier) {
  29. let decl: TypealiasDescription = .methodOutput(accessModifier: access, name: "Foo")
  30. let expected = "\(access) typealias Output = Foo"
  31. #expect(render(.typealias(decl)) == expected)
  32. }
  33. @Test(
  34. "static let descriptor = GRPCCore.MethodDescriptor(...)",
  35. arguments: AccessModifier.allCases
  36. )
  37. func staticMethodDescriptorProperty(access: AccessModifier) {
  38. let decl: VariableDescription = .methodDescriptor(
  39. accessModifier: access,
  40. literalFullyQualifiedService: "foo.Foo",
  41. literalMethodName: "Bar"
  42. )
  43. let expected = """
  44. \(access) static let descriptor = GRPCCore.MethodDescriptor(
  45. service: GRPCCore.ServiceDescriptor(fullyQualifiedService: "foo.Foo"),
  46. method: "Bar"
  47. )
  48. """
  49. #expect(render(.variable(decl)) == expected)
  50. }
  51. @Test(
  52. "static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService:)",
  53. arguments: AccessModifier.allCases
  54. )
  55. func staticServiceDescriptorProperty(access: AccessModifier) {
  56. let decl: VariableDescription = .serviceDescriptor(
  57. accessModifier: access,
  58. literalFullyQualifiedService: "foo.Bar"
  59. )
  60. let expected = """
  61. \(access) static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "foo.Bar")
  62. """
  63. #expect(render(.variable(decl)) == expected)
  64. }
  65. @Test("extension GRPCCore.ServiceDescriptor { ... }", arguments: AccessModifier.allCases)
  66. func staticServiceDescriptorPropertyExtension(access: AccessModifier) {
  67. let decl: ExtensionDescription = .serviceDescriptor(
  68. accessModifier: access,
  69. propertyName: "foo",
  70. literalFullyQualifiedService: "echo.EchoService"
  71. )
  72. let expected = """
  73. extension GRPCCore.ServiceDescriptor {
  74. \(access) static let foo = GRPCCore.ServiceDescriptor(fullyQualifiedService: "echo.EchoService")
  75. }
  76. """
  77. #expect(render(.extension(decl)) == expected)
  78. }
  79. @Test(
  80. "static let descriptors: [GRPCCore.MethodDescriptor] = [...]",
  81. arguments: AccessModifier.allCases
  82. )
  83. func staticMethodDescriptorsArray(access: AccessModifier) {
  84. let decl: VariableDescription = .methodDescriptorsArray(
  85. accessModifier: access,
  86. methodNamespaceNames: ["Foo", "Bar", "Baz"]
  87. )
  88. let expected = """
  89. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = [
  90. Foo.descriptor,
  91. Bar.descriptor,
  92. Baz.descriptor
  93. ]
  94. """
  95. #expect(render(.variable(decl)) == expected)
  96. }
  97. @Test("enum <Method> { ... }", arguments: AccessModifier.allCases)
  98. func methodNamespaceEnum(access: AccessModifier) {
  99. let decl: EnumDescription = .methodNamespace(
  100. accessModifier: access,
  101. name: "Foo",
  102. literalMethod: "Foo",
  103. literalFullyQualifiedService: "bar.Bar",
  104. inputType: "FooInput",
  105. outputType: "FooOutput"
  106. )
  107. let expected = """
  108. \(access) enum Foo {
  109. \(access) typealias Input = FooInput
  110. \(access) typealias Output = FooOutput
  111. \(access) static let descriptor = GRPCCore.MethodDescriptor(
  112. service: GRPCCore.ServiceDescriptor(fullyQualifiedService: "bar.Bar"),
  113. method: "Foo"
  114. )
  115. }
  116. """
  117. #expect(render(.enum(decl)) == expected)
  118. }
  119. @Test("enum Method { ... }", arguments: AccessModifier.allCases)
  120. func methodsNamespaceEnum(access: AccessModifier) {
  121. let decl: EnumDescription = .methodsNamespace(
  122. accessModifier: access,
  123. literalFullyQualifiedService: "bar.Bar",
  124. methods: [
  125. .init(
  126. documentation: "",
  127. name: .init(base: "Foo", generatedUpperCase: "Foo", generatedLowerCase: "foo"),
  128. isInputStreaming: false,
  129. isOutputStreaming: false,
  130. inputType: "FooInput",
  131. outputType: "FooOutput"
  132. )
  133. ]
  134. )
  135. let expected = """
  136. \(access) enum Method {
  137. \(access) enum Foo {
  138. \(access) typealias Input = FooInput
  139. \(access) typealias Output = FooOutput
  140. \(access) static let descriptor = GRPCCore.MethodDescriptor(
  141. service: GRPCCore.ServiceDescriptor(fullyQualifiedService: "bar.Bar"),
  142. method: "Foo"
  143. )
  144. }
  145. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = [
  146. Foo.descriptor
  147. ]
  148. }
  149. """
  150. #expect(render(.enum(decl)) == expected)
  151. }
  152. @Test("enum Method { ... } (no methods)", arguments: AccessModifier.allCases)
  153. func methodsNamespaceEnumNoMethods(access: AccessModifier) {
  154. let decl: EnumDescription = .methodsNamespace(
  155. accessModifier: access,
  156. literalFullyQualifiedService: "bar.Bar",
  157. methods: []
  158. )
  159. let expected = """
  160. \(access) enum Method {
  161. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = []
  162. }
  163. """
  164. #expect(render(.enum(decl)) == expected)
  165. }
  166. @Test("enum <Service> { ... }", arguments: AccessModifier.allCases)
  167. func serviceNamespaceEnum(access: AccessModifier) {
  168. let decl: EnumDescription = .serviceNamespace(
  169. accessModifier: access,
  170. name: "Foo",
  171. literalFullyQualifiedService: "Foo",
  172. methods: [
  173. .init(
  174. documentation: "",
  175. name: .init(base: "Bar", generatedUpperCase: "Bar", generatedLowerCase: "bar"),
  176. isInputStreaming: false,
  177. isOutputStreaming: false,
  178. inputType: "BarInput",
  179. outputType: "BarOutput"
  180. )
  181. ]
  182. )
  183. let expected = """
  184. \(access) enum Foo {
  185. \(access) static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "Foo")
  186. \(access) enum Method {
  187. \(access) enum Bar {
  188. \(access) typealias Input = BarInput
  189. \(access) typealias Output = BarOutput
  190. \(access) static let descriptor = GRPCCore.MethodDescriptor(
  191. service: GRPCCore.ServiceDescriptor(fullyQualifiedService: "Foo"),
  192. method: "Bar"
  193. )
  194. }
  195. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = [
  196. Bar.descriptor
  197. ]
  198. }
  199. }
  200. """
  201. #expect(render(.enum(decl)) == expected)
  202. }
  203. @Test("enum <Service> { ... } (no methods)", arguments: AccessModifier.allCases)
  204. func serviceNamespaceEnumNoMethods(access: AccessModifier) {
  205. let decl: EnumDescription = .serviceNamespace(
  206. accessModifier: access,
  207. name: "Foo",
  208. literalFullyQualifiedService: "Foo",
  209. methods: []
  210. )
  211. let expected = """
  212. \(access) enum Foo {
  213. \(access) static let descriptor = GRPCCore.ServiceDescriptor(fullyQualifiedService: "Foo")
  214. \(access) enum Method {
  215. \(access) static let descriptors: [GRPCCore.MethodDescriptor] = []
  216. }
  217. }
  218. """
  219. #expect(render(.enum(decl)) == expected)
  220. }
  221. }
  222. }