Test_Descriptor_FeatureResolution.swift 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. // Tests/SwiftProtobufPluginLibraryTests/Test_Descriptor.swift - Test Descriptor.swift
  2. //
  3. // Copyright (c) 2014 - 2024 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 XCTest
  13. private let testFeatureSetDefaults =
  14. try! Google_Protobuf_FeatureSetDefaults(
  15. serializedBytes: testFeatureSetDefaultBytes,
  16. extensions: SwiftFeatureTest_TestFeatures_Extensions
  17. )
  18. private struct TestContext {
  19. let descriptorSet: DescriptorSet
  20. var file: FileDescriptor { descriptorSet.files.first! }
  21. init(_ descriptorTextFormat: String) {
  22. let file = try! Google_Protobuf_FileDescriptorProto(
  23. textFormatString: descriptorTextFormat,
  24. extensions: SwiftFeatureTest_TestFeatures_Extensions
  25. )
  26. descriptorSet = DescriptorSet(
  27. protos: [file],
  28. featureSetDefaults: testFeatureSetDefaults,
  29. featureExtensions: [SwiftFeatureTest_Extensions_test]
  30. )
  31. }
  32. }
  33. final class Test_Descriptor_FeatureResolution: XCTestCase {
  34. func testFileLevel_Defaults() throws {
  35. let context = TestContext(
  36. """
  37. name: "test.proto"
  38. edition: EDITION_2023
  39. """
  40. )
  41. let features = context.file.features
  42. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  43. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value1)
  44. }
  45. func testFileLevel_Override() throws {
  46. let context = TestContext(
  47. """
  48. name: "test.proto"
  49. edition: EDITION_2023
  50. options {
  51. features {
  52. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  53. }
  54. }
  55. """
  56. )
  57. let features = context.file.features
  58. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  59. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value2) // File override
  60. }
  61. func testMessageLevel_Defaults() throws {
  62. let context = TestContext(
  63. """
  64. name: "test.proto"
  65. edition: EDITION_2023
  66. message_type {
  67. name: "Top"
  68. nested_type {
  69. name: "Nested"
  70. }
  71. }
  72. """
  73. )
  74. let topFeatures = context.file.messages.first!.features
  75. XCTAssertTrue(topFeatures.hasSwiftFeatureTest_test)
  76. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature1, .value1)
  77. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature2, .value1)
  78. let nestedFeatures = context.file.messages.first!.messages.first!.features
  79. XCTAssertTrue(nestedFeatures.hasSwiftFeatureTest_test)
  80. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature1, .value1)
  81. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature2, .value1)
  82. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature3, .value1)
  83. }
  84. func testMessageLevel_Override() throws {
  85. let context = TestContext(
  86. """
  87. name: "test.proto"
  88. edition: EDITION_2023
  89. options {
  90. features {
  91. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  92. }
  93. }
  94. message_type {
  95. name: "Top"
  96. options {
  97. features {
  98. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  99. }
  100. }
  101. nested_type {
  102. name: "Nested"
  103. options {
  104. features {
  105. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  106. }
  107. }
  108. }
  109. }
  110. """
  111. )
  112. let topFeatures = context.file.messages.first!.features
  113. XCTAssertTrue(topFeatures.hasSwiftFeatureTest_test)
  114. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  115. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature2, .value3) // Top override
  116. let nestedFeatures = context.file.messages.first!.messages.first!.features
  117. XCTAssertTrue(nestedFeatures.hasSwiftFeatureTest_test)
  118. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  119. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature2, .value3) // Top override
  120. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature3, .value4) // Nested override
  121. }
  122. func testEnumLevel_Defaults() throws {
  123. let context = TestContext(
  124. """
  125. name: "test.proto"
  126. edition: EDITION_2023
  127. enum_type {
  128. name: "Top"
  129. value { name: "TOP_UNKNOWN", number: 0 }
  130. value { name: "TOP_ONE", number: 1 }
  131. }
  132. message_type {
  133. name: "MyMessage"
  134. enum_type {
  135. name: "Nested"
  136. value { name: "NESTED_UNKNOWN", number: 0 }
  137. value { name: "NESTED_ONE", number: 1 }
  138. }
  139. }
  140. """
  141. )
  142. let topFeatures = context.file.enums.first!.features
  143. XCTAssertTrue(topFeatures.hasSwiftFeatureTest_test)
  144. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature1, .value1)
  145. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature2, .value1)
  146. let nestedFeatures = context.file.messages.first!.enums.first!.features
  147. XCTAssertTrue(nestedFeatures.hasSwiftFeatureTest_test)
  148. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature1, .value1)
  149. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature2, .value1)
  150. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature3, .value1)
  151. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature4, .value1)
  152. }
  153. func testEnumLevel_Override() throws {
  154. let context = TestContext(
  155. """
  156. name: "test.proto"
  157. edition: EDITION_2023
  158. options {
  159. features {
  160. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  161. }
  162. }
  163. enum_type {
  164. name: "Top"
  165. options {
  166. features {
  167. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  168. }
  169. }
  170. value { name: "TOP_UNKNOWN", number: 0 }
  171. value { name: "TOP_ONE", number: 1 }
  172. }
  173. message_type {
  174. name: "MyMessage"
  175. options {
  176. features {
  177. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  178. }
  179. }
  180. enum_type {
  181. name: "Nested"
  182. options {
  183. features {
  184. [swift_feature_test.test] { feature4: ENUM_FEATURE_VALUE5 }
  185. }
  186. }
  187. value { name: "NESTED_UNKNOWN", number: 0 }
  188. value { name: "NESTED_ONE", number: 1 }
  189. }
  190. }
  191. """
  192. )
  193. let topFeatures = context.file.enums.first!.features
  194. XCTAssertTrue(topFeatures.hasSwiftFeatureTest_test)
  195. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  196. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature2, .value3) // "Top" Enum override
  197. let nestedFeatures = context.file.messages.first!.enums.first!.features
  198. XCTAssertTrue(nestedFeatures.hasSwiftFeatureTest_test)
  199. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  200. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature2, .value1) // default ("Top" Enum override)
  201. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature3, .value4) // Message override
  202. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature4, .value5) // "Nested" Enum override
  203. }
  204. func testEnumValueLevel_Defaults() throws {
  205. let context = TestContext(
  206. """
  207. name: "test.proto"
  208. edition: EDITION_2023
  209. enum_type {
  210. name: "Top"
  211. value { name: "TOP_UNKNOWN", number: 0 }
  212. value { name: "TOP_ONE", number: 1 }
  213. }
  214. """
  215. )
  216. let features = context.file.enums.first!.values.first!.features
  217. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  218. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value1)
  219. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value1)
  220. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value1)
  221. }
  222. func testEnumValueLevel_Override() throws {
  223. let context = TestContext(
  224. """
  225. name: "test.proto"
  226. edition: EDITION_2023
  227. options {
  228. features {
  229. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  230. }
  231. }
  232. enum_type {
  233. name: "MyEnum"
  234. options {
  235. features {
  236. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  237. }
  238. }
  239. value {
  240. name: "TOP_UNKNOWN"
  241. options {
  242. features {
  243. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  244. }
  245. }
  246. number: 0
  247. }
  248. value { name: "TOP_ONE", number: 1 }
  249. }
  250. """
  251. )
  252. let features = context.file.enums.first!.values.first!.features
  253. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  254. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value2) // File override
  255. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value3) // Enum override
  256. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value4) // EnumValue override
  257. }
  258. func testExtensionRangeLevel_Defaults() throws {
  259. let context = TestContext(
  260. """
  261. name: "test.proto"
  262. edition: EDITION_2023
  263. message_type {
  264. name: "MyMessage"
  265. extension_range { start: 1, end: 100 }
  266. }
  267. """
  268. )
  269. let features = context.file.messages.first!.messageExtensionRanges.first!.features
  270. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  271. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value1)
  272. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value1)
  273. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value1)
  274. }
  275. func testExtensionRangeLevel_Override() throws {
  276. let context = TestContext(
  277. """
  278. name: "test.proto"
  279. edition: EDITION_2023
  280. options {
  281. features {
  282. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  283. }
  284. }
  285. message_type {
  286. name: "MyMessage"
  287. options {
  288. features {
  289. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  290. }
  291. }
  292. extension_range {
  293. start: 1
  294. end: 100
  295. options {
  296. features {
  297. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  298. }
  299. }
  300. }
  301. }
  302. """
  303. )
  304. let features = context.file.messages.first!.messageExtensionRanges.first!.features
  305. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  306. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value2) // File override
  307. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value3) // Message override
  308. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value4) // ExtensionRange override
  309. }
  310. func testExtensionLevel_Defaults() throws {
  311. let context = TestContext(
  312. """
  313. name: "test.proto"
  314. edition: EDITION_2023
  315. message_type {
  316. name: "MyMessage"
  317. extension_range { start: 1, end: 100 }
  318. extension {
  319. name: "nested"
  320. json_name: "nested"
  321. number: 2
  322. type: TYPE_STRING
  323. extendee: ".MyMessage"
  324. }
  325. }
  326. extension {
  327. name: "top"
  328. json_name: "top"
  329. number: 1
  330. type: TYPE_STRING
  331. extendee: ".MyMessage"
  332. }
  333. """
  334. )
  335. let topFeatures = context.file.extensions.first!.features
  336. XCTAssertTrue(topFeatures.hasSwiftFeatureTest_test)
  337. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature1, .value1)
  338. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature2, .value1)
  339. let nestedFeatures = context.file.messages.first!.extensions.first!.features
  340. XCTAssertTrue(nestedFeatures.hasSwiftFeatureTest_test)
  341. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature1, .value1)
  342. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature2, .value1)
  343. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature3, .value1)
  344. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature4, .value1)
  345. }
  346. func testExtensionLevel_Override() throws {
  347. let context = TestContext(
  348. """
  349. name: "test.proto"
  350. edition: EDITION_2023
  351. options {
  352. features {
  353. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  354. }
  355. }
  356. message_type {
  357. name: "MyMessage"
  358. options {
  359. features {
  360. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  361. }
  362. }
  363. extension_range { start: 1, end: 100 }
  364. extension {
  365. name: "nested"
  366. json_name: "nested"
  367. number: 2
  368. type: TYPE_STRING
  369. extendee: ".MyMessage"
  370. options {
  371. features {
  372. [swift_feature_test.test] { feature4: ENUM_FEATURE_VALUE5 }
  373. }
  374. }
  375. }
  376. }
  377. extension {
  378. name: "top"
  379. json_name: "top"
  380. number: 1
  381. type: TYPE_STRING
  382. extendee: ".MyMessage"
  383. options {
  384. features {
  385. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  386. }
  387. }
  388. }
  389. """
  390. )
  391. let topFeatures = context.file.extensions.first!.features
  392. XCTAssertTrue(topFeatures.hasSwiftFeatureTest_test)
  393. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  394. XCTAssertEqual(topFeatures.SwiftFeatureTest_test.feature2, .value3) // "top" Extension override
  395. let nestedFeatures = context.file.messages.first!.extensions.first!.features
  396. XCTAssertTrue(nestedFeatures.hasSwiftFeatureTest_test)
  397. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  398. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature2, .value1) // default ("top" Extension override)
  399. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature3, .value4) // Message override
  400. XCTAssertEqual(nestedFeatures.SwiftFeatureTest_test.feature4, .value5) // "nested" Extension override
  401. }
  402. func testMessageFieldLevel_Defaults() throws {
  403. let context = TestContext(
  404. """
  405. name: "test.proto"
  406. edition: EDITION_2023
  407. message_type {
  408. name: "MyMessage"
  409. field {
  410. name: "field"
  411. json_name: "field"
  412. number: 1
  413. type: TYPE_STRING
  414. }
  415. }
  416. """
  417. )
  418. let features = context.file.messages.first!.fields.first!.features
  419. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  420. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value1)
  421. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value1)
  422. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value1)
  423. }
  424. func testMessageFieldLevel_Override() throws {
  425. let context = TestContext(
  426. """
  427. name: "test.proto"
  428. edition: EDITION_2023
  429. options {
  430. features {
  431. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  432. }
  433. }
  434. message_type {
  435. name: "MyMessage"
  436. options {
  437. features {
  438. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  439. }
  440. }
  441. field {
  442. name: "field"
  443. json_name: "field"
  444. number: 1
  445. type: TYPE_STRING
  446. options {
  447. features {
  448. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  449. }
  450. }
  451. }
  452. }
  453. """
  454. )
  455. let features = context.file.messages.first!.fields.first!.features
  456. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  457. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value2) // File override
  458. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value3) // Message override
  459. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value4) // Field override
  460. }
  461. func testMessageOneofFieldLevel_Defaults() throws {
  462. let context = TestContext(
  463. """
  464. name: "test.proto"
  465. edition: EDITION_2023
  466. message_type {
  467. name: "MyMessage"
  468. oneof_decl { name: "my_oneof" }
  469. field {
  470. name: "oneof_field"
  471. json_name: "oneof_field"
  472. number: 1
  473. type: TYPE_STRING
  474. oneof_index: 0
  475. }
  476. field {
  477. name: "not_oneof_field"
  478. json_name: "not_oneof_field"
  479. number: 2
  480. type: TYPE_STRING
  481. }
  482. }
  483. """
  484. )
  485. let oneof = context.file.messages.first!.realOneofs.first!
  486. XCTAssertEqual(oneof.name, "my_oneof")
  487. let oneofFeatures = oneof.features
  488. XCTAssertTrue(oneofFeatures.hasSwiftFeatureTest_test)
  489. XCTAssertEqual(oneofFeatures.SwiftFeatureTest_test.feature1, .value1)
  490. XCTAssertEqual(oneofFeatures.SwiftFeatureTest_test.feature2, .value1)
  491. XCTAssertEqual(oneofFeatures.SwiftFeatureTest_test.feature3, .value1)
  492. let oneofField = context.file.messages.first!.fields.first!
  493. XCTAssertEqual(oneofField.name, "oneof_field")
  494. let oneofFieldFeatures = oneofField.features
  495. XCTAssertTrue(oneofFieldFeatures.hasSwiftFeatureTest_test)
  496. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature1, .value1)
  497. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature2, .value1)
  498. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature3, .value1)
  499. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature4, .value1)
  500. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature5, .value1)
  501. let field = context.file.messages.first!.fields[1]
  502. XCTAssertEqual(field.name, "not_oneof_field")
  503. let fieldFeatures = field.features
  504. XCTAssertTrue(fieldFeatures.hasSwiftFeatureTest_test)
  505. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature1, .value1)
  506. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature2, .value1)
  507. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature3, .value1)
  508. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature4, .value1)
  509. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature5, .value1)
  510. }
  511. func testMessageOneofFieldLevel_Override() throws {
  512. let context = TestContext(
  513. """
  514. name: "test.proto"
  515. edition: EDITION_2023
  516. options {
  517. features {
  518. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE2 }
  519. }
  520. }
  521. message_type {
  522. name: "MyMessage"
  523. options {
  524. features {
  525. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE3 }
  526. }
  527. }
  528. oneof_decl {
  529. name: "my_oneof"
  530. options {
  531. features {
  532. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE4 }
  533. }
  534. }
  535. }
  536. field {
  537. name: "oneof_field"
  538. json_name: "oneof_field"
  539. number: 1
  540. type: TYPE_STRING
  541. oneof_index: 0
  542. options {
  543. features {
  544. [swift_feature_test.test] { feature4: ENUM_FEATURE_VALUE5 }
  545. }
  546. }
  547. }
  548. field {
  549. name: "not_oneof_field"
  550. json_name: "not_oneof_field"
  551. number: 2
  552. type: TYPE_STRING
  553. options {
  554. features {
  555. [swift_feature_test.test] { feature5: ENUM_FEATURE_VALUE6 }
  556. }
  557. }
  558. }
  559. }
  560. """
  561. )
  562. let oneof = context.file.messages.first!.realOneofs.first!
  563. XCTAssertEqual(oneof.name, "my_oneof")
  564. let oneofFeatures = oneof.features
  565. XCTAssertTrue(oneofFeatures.hasSwiftFeatureTest_test)
  566. XCTAssertEqual(oneofFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  567. XCTAssertEqual(oneofFeatures.SwiftFeatureTest_test.feature2, .value3) // Message override
  568. XCTAssertEqual(oneofFeatures.SwiftFeatureTest_test.feature3, .value4) // Oneof override
  569. let oneofField = context.file.messages.first!.fields.first!
  570. XCTAssertEqual(oneofField.name, "oneof_field")
  571. let oneofFieldFeatures = oneofField.features
  572. XCTAssertTrue(oneofFieldFeatures.hasSwiftFeatureTest_test)
  573. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  574. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature2, .value3) // Message override
  575. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature3, .value4) // Oneof override
  576. XCTAssertEqual(oneofFieldFeatures.SwiftFeatureTest_test.feature4, .value5) // "oneof_field" Field override
  577. XCTAssertEqual(
  578. oneofFieldFeatures.SwiftFeatureTest_test.feature5, // default ("not_oneof_field" Field override)
  579. .value1
  580. )
  581. let field = context.file.messages.first!.fields[1]
  582. XCTAssertEqual(field.name, "not_oneof_field")
  583. let fieldFeatures = field.features
  584. XCTAssertTrue(fieldFeatures.hasSwiftFeatureTest_test)
  585. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature1, .value2) // File override
  586. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature2, .value3) // Message override
  587. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature3, .value1) // default (Oneof override)
  588. XCTAssertEqual(
  589. fieldFeatures.SwiftFeatureTest_test.feature4, // default ("oneof_field" Field override)
  590. .value1
  591. )
  592. XCTAssertEqual(fieldFeatures.SwiftFeatureTest_test.feature5, .value6) // "not_oneof_field" Field override
  593. }
  594. func testServiceLevel_Defaults() throws {
  595. let context = TestContext(
  596. """
  597. name: "test.proto"
  598. edition: EDITION_2023
  599. service {
  600. name: "MyService"
  601. }
  602. """
  603. )
  604. let features = context.file.services.first!.features
  605. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  606. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value1)
  607. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value1)
  608. }
  609. func testServiceLevel_Overrides() throws {
  610. let context = TestContext(
  611. """
  612. name: "test.proto"
  613. edition: EDITION_2023
  614. options {
  615. features {
  616. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE3 }
  617. }
  618. }
  619. service {
  620. name: "MyService"
  621. options {
  622. features {
  623. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE4 }
  624. }
  625. }
  626. }
  627. """
  628. )
  629. let features = context.file.services.first!.features
  630. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  631. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value3) // File override
  632. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value4) // Service override
  633. }
  634. func testMethodLevel_Defaults() throws {
  635. let context = TestContext(
  636. """
  637. name: "test.proto"
  638. edition: EDITION_2023
  639. message_type { name: "empty" }
  640. service {
  641. name: "MyService"
  642. method { name: "doSomething" input_type: ".empty" output_type: ".empty" }
  643. }
  644. """
  645. )
  646. let features = context.file.services.first!.methods.first!.features
  647. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  648. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value1)
  649. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value1)
  650. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value1)
  651. }
  652. func testMethodLevel_Overrides() throws {
  653. let context = TestContext(
  654. """
  655. name: "test.proto"
  656. edition: EDITION_2023
  657. options {
  658. features {
  659. [swift_feature_test.test] { feature1: ENUM_FEATURE_VALUE3 }
  660. }
  661. }
  662. message_type { name: "empty" }
  663. service {
  664. name: "MyService"
  665. options {
  666. features {
  667. [swift_feature_test.test] { feature2: ENUM_FEATURE_VALUE4 }
  668. }
  669. }
  670. method {
  671. name: "doSomething"
  672. input_type: ".empty"
  673. output_type: ".empty"
  674. options {
  675. features {
  676. [swift_feature_test.test] { feature3: ENUM_FEATURE_VALUE5 }
  677. }
  678. }
  679. }
  680. }
  681. """
  682. )
  683. let features = context.file.services.first!.methods.first!.features
  684. XCTAssertTrue(features.hasSwiftFeatureTest_test)
  685. XCTAssertEqual(features.SwiftFeatureTest_test.feature1, .value3) // File override
  686. XCTAssertEqual(features.SwiftFeatureTest_test.feature2, .value4) // Service override
  687. XCTAssertEqual(features.SwiftFeatureTest_test.feature3, .value5) // Method override
  688. }
  689. }