@layerzerolabs/protocol-stellar-v2 0.2.21 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.turbo/turbo-build.log +347 -271
  2. package/.turbo/turbo-lint.log +277 -208
  3. package/.turbo/turbo-test.log +1700 -1370
  4. package/Cargo.lock +22 -51
  5. package/Cargo.toml +6 -1
  6. package/contracts/common-macros/src/auth.rs +10 -9
  7. package/contracts/common-macros/src/contract_ttl.rs +1 -4
  8. package/contracts/common-macros/src/error.rs +1 -3
  9. package/contracts/common-macros/src/lib.rs +65 -61
  10. package/contracts/common-macros/src/storage.rs +212 -65
  11. package/contracts/common-macros/src/tests/auth.rs +75 -6
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
  13. package/contracts/common-macros/src/tests/error.rs +9 -21
  14. package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
  15. package/contracts/common-macros/src/tests/mod.rs +2 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  22. package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
  23. package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
  24. package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
  25. package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
  26. package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
  27. package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
  28. package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
  29. package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
  30. package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
  31. package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
  32. package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
  33. package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  34. package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
  35. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  36. package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
  37. package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
  38. package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
  39. package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
  40. package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
  41. package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
  42. package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
  43. package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
  44. package/contracts/common-macros/src/ttl_configurable.rs +1 -4
  45. package/contracts/common-macros/src/upgradeable.rs +21 -3
  46. package/contracts/endpoint-v2/Cargo.toml +0 -4
  47. package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
  48. package/contracts/endpoint-v2/src/errors.rs +26 -1
  49. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
  50. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
  51. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  52. package/contracts/endpoint-v2/src/lib.rs +0 -1
  53. package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
  54. package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
  55. package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
  56. package/contracts/endpoint-v2/src/storage.rs +9 -1
  57. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  58. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
  59. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
  65. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
  66. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
  67. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
  68. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
  70. package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
  71. package/contracts/layerzero-views/src/tests/mod.rs +1 -0
  72. package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
  73. package/contracts/layerzero-views/src/types.rs +2 -3
  74. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
  75. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
  76. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
  77. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
  78. package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
  79. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
  80. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
  81. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
  82. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
  83. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
  84. package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
  85. package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
  86. package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
  87. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
  88. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
  89. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
  90. package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
  91. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
  92. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
  93. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
  94. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
  95. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
  96. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
  97. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
  98. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
  99. package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
  100. package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
  101. package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
  102. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  103. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
  104. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
  105. package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
  106. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
  107. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
  108. package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
  109. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
  110. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
  111. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
  112. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
  113. package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
  114. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
  115. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
  117. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
  118. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
  119. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
  121. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
  124. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
  125. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
  126. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
  127. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
  128. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
  129. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
  130. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
  131. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
  132. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
  133. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
  134. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
  135. package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
  136. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
  137. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
  141. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
  158. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
  159. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
  160. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
  161. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
  163. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
  164. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
  165. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
  166. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
  167. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
  168. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
  169. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
  170. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
  171. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
  172. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
  173. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
  174. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
  175. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
  176. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
  177. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
  178. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
  179. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
  180. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
  181. package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
  182. package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
  183. package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
  184. package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
  185. package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
  186. package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
  187. package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
  188. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
  189. package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
  190. package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
  191. package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
  192. package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
  193. package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
  194. package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
  195. package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
  196. package/contracts/message-libs/uln-302/src/errors.rs +21 -0
  197. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
  198. package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
  199. package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
  200. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  201. package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
  202. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
  203. package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
  204. package/contracts/oapps/counter/Cargo.toml +2 -0
  205. package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
  206. package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
  207. package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
  208. package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
  209. package/contracts/oapps/counter/src/tests/mod.rs +1 -0
  210. package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
  211. package/contracts/oapps/oapp/src/lib.rs +0 -3
  212. package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
  213. package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
  214. package/contracts/oapps/oft/src/lib.rs +3 -0
  215. package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
  216. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
  217. package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
  218. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
  219. package/contracts/oapps/oft/src/tests/mod.rs +2 -0
  220. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
  221. package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
  222. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
  223. package/contracts/oapps/oft-core/src/lib.rs +2 -2
  224. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
  225. package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
  226. package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
  227. package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
  228. package/contracts/utils/src/auth.rs +2 -2
  229. package/contracts/utils/src/buffer_reader.rs +61 -10
  230. package/contracts/utils/src/buffer_writer.rs +35 -20
  231. package/contracts/utils/src/bytes_ext.rs +1 -2
  232. package/contracts/utils/src/errors.rs +5 -3
  233. package/contracts/utils/src/multisig.rs +59 -36
  234. package/contracts/utils/src/option_ext.rs +3 -3
  235. package/contracts/utils/src/ownable.rs +12 -6
  236. package/contracts/utils/src/tests/auth.rs +179 -0
  237. package/contracts/utils/src/tests/buffer_reader.rs +203 -1
  238. package/contracts/utils/src/tests/buffer_writer.rs +176 -5
  239. package/contracts/utils/src/tests/mod.rs +2 -0
  240. package/contracts/utils/src/tests/multisig.rs +170 -141
  241. package/contracts/utils/src/tests/option_ext.rs +1 -1
  242. package/contracts/utils/src/tests/ownable.rs +156 -161
  243. package/contracts/utils/src/tests/test_helper.rs +21 -1
  244. package/contracts/utils/src/tests/testing_utils.rs +84 -2
  245. package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
  246. package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
  247. package/contracts/utils/src/tests/upgradeable.rs +115 -6
  248. package/contracts/utils/src/ttl_configurable.rs +22 -12
  249. package/contracts/utils/src/ttl_extendable.rs +1 -3
  250. package/contracts/utils/src/upgradeable.rs +21 -24
  251. package/contracts/workers/dvn/src/auth.rs +1 -1
  252. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  253. package/contracts/workers/dvn/src/storage.rs +1 -1
  254. package/contracts/workers/dvn/src/tests/auth.rs +136 -3
  255. package/contracts/workers/dvn/src/tests/mod.rs +0 -1
  256. package/contracts/workers/dvn/src/tests/setup.rs +4 -10
  257. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
  258. package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
  259. package/contracts/workers/worker/src/worker.rs +1 -1
  260. package/docs/oft-guide.md +5 -5
  261. package/package.json +5 -7
  262. package/sdk/.turbo/turbo-test.log +662 -466
  263. package/sdk/LICENSE +23 -0
  264. package/sdk/dist/generated/bml.d.ts +101 -106
  265. package/sdk/dist/generated/bml.js +108 -26
  266. package/sdk/dist/generated/counter.d.ts +123 -484
  267. package/sdk/dist/generated/counter.js +103 -25
  268. package/sdk/dist/generated/dvn.d.ts +141 -699
  269. package/sdk/dist/generated/dvn.js +106 -28
  270. package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
  271. package/sdk/dist/generated/dvn_fee_lib.js +27 -24
  272. package/sdk/dist/generated/endpoint.d.ts +158 -836
  273. package/sdk/dist/generated/endpoint.js +107 -29
  274. package/sdk/dist/generated/executor.d.ts +139 -671
  275. package/sdk/dist/generated/executor.js +106 -28
  276. package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
  277. package/sdk/dist/generated/executor_fee_lib.js +106 -28
  278. package/sdk/dist/generated/executor_helper.d.ts +95 -92
  279. package/sdk/dist/generated/executor_helper.js +103 -25
  280. package/sdk/dist/generated/layerzero_view.d.ts +178 -335
  281. package/sdk/dist/generated/layerzero_view.js +172 -33
  282. package/sdk/dist/generated/oft.d.ts +137 -680
  283. package/sdk/dist/generated/oft.js +103 -25
  284. package/sdk/dist/generated/price_feed.d.ts +45 -444
  285. package/sdk/dist/generated/price_feed.js +27 -24
  286. package/sdk/dist/generated/sml.d.ts +119 -428
  287. package/sdk/dist/generated/sml.js +103 -25
  288. package/sdk/dist/generated/treasury.d.ts +109 -288
  289. package/sdk/dist/generated/treasury.js +103 -25
  290. package/sdk/dist/generated/uln302.d.ts +190 -527
  291. package/sdk/dist/generated/uln302.js +170 -31
  292. package/sdk/dist/generated/upgrader.d.ts +14 -34
  293. package/sdk/dist/generated/upgrader.js +24 -21
  294. package/sdk/package.json +3 -4
  295. package/sdk/test/counter-sml.test.ts +218 -142
  296. package/sdk/test/counter-uln.test.ts +189 -145
  297. package/sdk/test/oft-sml.test.ts +173 -156
  298. package/sdk/test/suites/constants.ts +7 -1
  299. package/sdk/test/suites/globalSetup.ts +140 -74
  300. package/sdk/turbo.json +1 -1
  301. package/tools/ts-bindings-gen/Cargo.toml +4 -4
  302. package/tools/ts-bindings-gen/src/main.rs +4 -0
  303. package/turbo.json +3 -0
  304. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
  305. package/contracts/endpoint-v2/src/constants.rs +0 -52
  306. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
  307. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
  308. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
  309. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
  310. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
  311. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
  312. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
  313. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
  314. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
  315. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
  316. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
  317. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
  318. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
  319. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
  320. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
  321. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
  322. package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
  323. package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
  324. package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
  325. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
  326. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
  327. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
  328. /package/contracts/oapps/oapp/src/{macro_tests → tests}/test_macros.rs +0 -0
@@ -1,12 +1,12 @@
1
1
  use quote::quote;
2
2
 
3
- use crate::tests::test_helpers::{assert_panics_contains, non_enum_item_inputs};
3
+ use crate::tests::test_helpers::{assert_panics_contains, filter_item_inputs_excluding_labels};
4
4
 
5
5
  #[test]
6
6
  fn test_non_enum_input() {
7
- for (case, input) in non_enum_item_inputs() {
7
+ for (case, input) in filter_item_inputs_excluding_labels(&["enum"]) {
8
8
  assert_panics_contains(case, "failed to parse enum", || {
9
- crate::storage::generate_storage(quote! {}, input.clone());
9
+ crate::storage::generate_storage(input.clone());
10
10
  });
11
11
  }
12
12
  }
@@ -36,7 +36,7 @@ fn test_tuple_variant_rejected() {
36
36
 
37
37
  for (case, input) in cases {
38
38
  assert_panics_contains(case, "only unit variants or named fields are supported", || {
39
- crate::storage::generate_storage(quote! {}, input.clone());
39
+ crate::storage::generate_storage(input.clone());
40
40
  });
41
41
  }
42
42
  }
@@ -62,9 +62,20 @@ fn test_attribute_errors() {
62
62
  }
63
63
  },
64
64
  ),
65
+ (
66
+ "invalid storage type with another valid storage type",
67
+ "failed to parse storage type",
68
+ quote! {
69
+ enum TestEnum {
70
+ #[persistent(u32)]
71
+ #[instance]
72
+ Counter,
73
+ }
74
+ },
75
+ ),
65
76
  (
66
77
  "missing type param",
67
- "failed to parse storage variant for Counter",
78
+ "failed to parse storage type for",
68
79
  quote! {
69
80
  enum TestEnum {
70
81
  #[instance]
@@ -74,7 +85,7 @@ fn test_attribute_errors() {
74
85
  ),
75
86
  (
76
87
  "invalid type param",
77
- "failed to parse storage variant for",
88
+ "failed to parse storage type for",
78
89
  quote! {
79
90
  enum TestEnum {
80
91
  #[persistent(u32, String)]
@@ -86,7 +97,7 @@ fn test_attribute_errors() {
86
97
 
87
98
  for (case, expected, input) in cases_storage_type {
88
99
  assert_panics_contains(case, expected, || {
89
- crate::storage::generate_storage(quote! {}, input.clone());
100
+ crate::storage::generate_storage(input.clone());
90
101
  });
91
102
  }
92
103
 
@@ -140,7 +151,7 @@ fn test_attribute_errors() {
140
151
 
141
152
  for (case, expected, input) in cases_default {
142
153
  assert_panics_contains(case, expected, || {
143
- crate::storage::generate_storage(quote! {}, input.clone());
154
+ crate::storage::generate_storage(input.clone());
144
155
  });
145
156
  }
146
157
 
@@ -194,7 +205,7 @@ fn test_attribute_errors() {
194
205
 
195
206
  for (case, expected, input) in cases_name {
196
207
  assert_panics_contains(case, expected, || {
197
- crate::storage::generate_storage(quote! {}, input.clone());
208
+ crate::storage::generate_storage(input.clone());
198
209
  });
199
210
  }
200
211
 
@@ -206,11 +217,22 @@ fn test_attribute_errors() {
206
217
  Counter,
207
218
  }
208
219
  };
209
- crate::storage::generate_storage(quote! {}, input);
220
+ crate::storage::generate_storage(input);
210
221
  });
211
222
 
212
223
  // Test #[no_ttl_extension] validation
213
224
  let cases_no_ttl = vec![
225
+ (
226
+ "no_ttl_extension does not accept arguments",
227
+ "does not accept arguments",
228
+ quote! {
229
+ enum TestEnum {
230
+ #[persistent(u32)]
231
+ #[no_ttl_extension(foo)]
232
+ Counter,
233
+ }
234
+ },
235
+ ),
214
236
  (
215
237
  "multiple no_ttl_extension",
216
238
  "multiple #[no_ttl_extension]",
@@ -310,26 +332,7 @@ fn test_attribute_errors() {
310
332
 
311
333
  for (case, expected, input) in cases_no_ttl {
312
334
  assert_panics_contains(case, expected, || {
313
- crate::storage::generate_storage(quote! {}, input.clone());
314
- });
315
- }
316
-
317
- // Test that #[storage] does not accept arguments
318
- let cases_attr = vec![
319
- ("unknown arg", "does not accept arguments", quote! { unknown }),
320
- ("key-value arg", "does not accept arguments", quote! { unknown = SomeType }),
321
- ("function-like arg", "does not accept arguments", quote! { foo(bar) }),
322
- ];
323
- let input = quote! {
324
- enum TestEnum {
325
- #[instance(u32)]
326
- Counter,
327
- }
328
- };
329
-
330
- for (case, expected, attr) in cases_attr {
331
- assert_panics_contains(case, expected, || {
332
- crate::storage::generate_storage(attr.clone(), input.clone());
335
+ crate::storage::generate_storage(input.clone());
333
336
  });
334
337
  }
335
338
  }
@@ -340,146 +343,68 @@ fn test_attribute_errors() {
340
343
 
341
344
  /// Comprehensive snapshot test covering all storage macro features:
342
345
  /// - All storage types: instance, persistent, temporary
343
- /// - Unit variants and named field variants
346
+ /// - Unit variants and named field variants (single and multiple fields)
344
347
  /// - Default values (with and without)
345
- /// - TTL extension control (TTL extended by default for persistent storage, opt-out with #[no_ttl_extension])
348
+ /// - TTL extension control (auto for persistent, opt-out with #[no_ttl_extension])
346
349
  /// - Custom name attribute
347
- /// - Function naming rules: snake_case conversion (UserBalance -> user_balance) and custom name override
348
- /// - Primitive type detection: u32/i64/bool passed by value, u8/usize/String/Vec/Address passed by reference
349
- /// - Clone behavior: primitive types not cloned, non-primitive types cloned in key construction
350
- /// - Field extraction: Unit variants have no fields, Named variants extract fields in order
351
- /// - Doc comments and visibility
350
+ /// - snake_case naming conversion (TempData -> temp_data)
351
+ /// - Primitive vs non-primitive key types (by value vs by reference + clone)
352
+ ///
353
+ /// Note: Primitive type detection is exhaustively tested in test_is_primitive_type_* unit tests.
354
+ /// This snapshot only needs one of each to verify the generated code integrates correctly.
352
355
  #[test]
353
356
  fn snapshot_generated_storage_code() {
354
357
  let input = quote! {
355
358
  /// Enum-level doc comment
356
359
  pub enum StorageKeys {
357
- /// Instance storage with default value (no auto TTL for instance)
360
+ /// Instance storage with default value
358
361
  #[instance(u32)]
359
362
  #[default(0)]
360
363
  Counter,
361
364
 
362
- /// Persistent storage with named field and default (has auto TTL by default)
365
+ /// Persistent storage with single field and default (auto TTL)
363
366
  #[persistent(String)]
364
- #[default("hello".to_string())]
367
+ #[default(String::from_str(env, "hello"))]
365
368
  Message { sender: Address },
366
369
 
367
- /// Temporary storage (no auto TTL for temporary)
370
+ /// Temporary storage with single field
368
371
  #[temporary(bool)]
369
372
  Flag { key: String },
370
373
 
371
- /// Persistent storage with multiple fields (no default)
372
- #[persistent(Vec<u8>)]
373
- Data { id: u64, name: String },
374
-
375
374
  /// Persistent storage without fields or default
376
375
  #[persistent(Address)]
377
376
  Owner,
378
377
 
379
- /// Persistent storage with custom name override
378
+ /// Custom #[name()] override
380
379
  #[persistent(Option<Address>)]
381
380
  #[name("custom_key_name")]
382
381
  OptionalData { key: BytesN<32> },
383
382
 
384
- /// Temporary storage (no auto TTL for temporary)
383
+ /// Temporary storage unit variant (also tests snake_case: TempData -> temp_data)
385
384
  #[temporary(u64)]
386
385
  TempData,
387
386
 
388
- /// Test snake_case naming: UserBalance -> user_balance
387
+ /// Primitive key type: passed by value, no clone
389
388
  #[persistent(u32)]
390
- UserBalance { user: Address },
389
+ PrimitiveKey { key: u32 },
391
390
 
392
- /// Test custom name override: #[name("custom")] -> custom
393
- #[persistent(u32)]
394
- #[name("custom")]
395
- AnotherVariant { key: Address },
396
-
397
- /// Test primitive types: passed by value, not cloned
398
- #[persistent(u32)]
399
- U32Value { key: u32 },
400
- #[persistent(i64)]
401
- I64Value { key: i64 },
402
- #[persistent(bool)]
403
- BoolValue { key: bool },
404
-
405
- /// Test non-primitive types: passed by reference, cloned
406
- #[persistent(u32)]
407
- U8Value { key: u8 },
408
- #[persistent(u32)]
409
- UsizeValue { key: usize },
410
- #[persistent(String)]
411
- StringValue { key: String },
412
- #[persistent(Vec<u32>)]
413
- VecValue { key: Vec<u32> },
414
- #[persistent(Address)]
415
- AddressValue { key: Address },
416
-
417
- /// Test Unit variant: no fields
418
- #[persistent(u32)]
419
- UnitVariant,
391
+ /// Non-primitive key type: passed by reference, cloned
392
+ #[instance(u32)]
393
+ NonPrimitiveKey { key: String },
420
394
 
421
- /// Test Named variant: fields extracted in order
395
+ /// Multiple fields with mixed primitive/non-primitive types
422
396
  #[persistent(u32)]
423
397
  NamedVariant { first: u32, second: String, third: Address },
424
398
 
425
- /// Test #[no_ttl_extension] opt-out for persistent storage
399
+ /// #[no_ttl_extension] opt-out for persistent storage
426
400
  #[persistent(u64)]
427
401
  #[no_ttl_extension]
428
402
  CachedValue { key: Address },
429
403
  }
430
404
  };
431
405
 
432
- let result = crate::storage::generate_storage(quote! {}, input);
406
+ let result = crate::storage::generate_storage(input);
433
407
  let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
434
408
 
435
409
  insta::assert_snapshot!(formatted);
436
410
  }
437
-
438
- // ============================================
439
- // is_primitive_type Unit Tests
440
- // ============================================
441
-
442
- #[test]
443
- fn test_is_primitive_type_recognizes_primitive_types() {
444
- let primitives = ["u32", "i32", "u64", "i64", "u128", "i128", "bool"];
445
- for ty_str in primitives {
446
- let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
447
- assert!(crate::storage::is_primitive_type(&ty), "{ty_str} should be recognized as primitive");
448
- }
449
- }
450
-
451
- #[test]
452
- fn test_is_primitive_type_rejects_non_primitive_types() {
453
- let non_primitives = [
454
- "u8", // not in primitive list
455
- "usize", // not in primitive list
456
- "String",
457
- "Address",
458
- "Vec<u8>",
459
- "Option<u32>",
460
- "std::u32", // multi-segment path
461
- "soroban_sdk::Address",
462
- ];
463
-
464
- for ty_str in non_primitives {
465
- let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
466
- assert!(!crate::storage::is_primitive_type(&ty), "{ty_str} should NOT be recognized as primitive");
467
- }
468
- }
469
-
470
- #[test]
471
- fn test_is_primitive_type_rejects_other_type_variants() {
472
- let other_variants = [
473
- ("&u32", "reference"),
474
- ("&mut u32", "mutable reference"),
475
- ("(u32, i32)", "tuple"),
476
- ("[u32; 4]", "array"),
477
- ("[u32]", "slice"),
478
- ("!", "never"),
479
- ];
480
-
481
- for (ty_str, label) in other_variants {
482
- let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
483
- assert!(!crate::storage::is_primitive_type(&ty), "{label} type {ty_str} should NOT be recognized as primitive");
484
- }
485
- }
@@ -0,0 +1,48 @@
1
+ //! Unit tests for the `is_primitive_type` function.
2
+
3
+ use crate::storage::test::is_primitive_type_for_test;
4
+
5
+ #[test]
6
+ fn test_recognizes_primitive_types() {
7
+ let primitives = ["u32", "i32", "u64", "i64", "u128", "i128", "bool"];
8
+ for ty_str in primitives {
9
+ let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
10
+ assert!(is_primitive_type_for_test(&ty), "{ty_str} should be recognized as primitive");
11
+ }
12
+ }
13
+
14
+ #[test]
15
+ fn test_rejects_non_primitive_types() {
16
+ let non_primitives = [
17
+ "u8", // not in primitive list
18
+ "usize", // not in primitive list
19
+ "String",
20
+ "Address",
21
+ "Vec<u8>",
22
+ "Option<u32>",
23
+ "std::u32", // multi-segment path
24
+ "soroban_sdk::Address",
25
+ ];
26
+
27
+ for ty_str in non_primitives {
28
+ let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
29
+ assert!(!is_primitive_type_for_test(&ty), "{ty_str} should NOT be recognized as primitive");
30
+ }
31
+ }
32
+
33
+ #[test]
34
+ fn test_rejects_other_type_variants() {
35
+ let other_variants = [
36
+ ("&u32", "reference"),
37
+ ("&mut u32", "mutable reference"),
38
+ ("(u32, i32)", "tuple"),
39
+ ("[u32; 4]", "array"),
40
+ ("[u32]", "slice"),
41
+ ("!", "never"),
42
+ ];
43
+
44
+ for (ty_str, label) in other_variants {
45
+ let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
46
+ assert!(!is_primitive_type_for_test(&ty), "{label} type {ty_str} should NOT be recognized as primitive");
47
+ }
48
+ }
@@ -0,0 +1,16 @@
1
+ mod extract_fields;
2
+ mod gen_accessor_methods;
3
+ mod gen_args;
4
+ mod gen_enum_variant;
5
+ mod gen_key;
6
+ mod gen_params;
7
+ mod generate_storage;
8
+ mod is_primitive_type;
9
+ mod parse_default;
10
+ mod parse_name;
11
+ mod parse_no_ttl_extension;
12
+ mod parse_storage_type;
13
+ mod storage_kind;
14
+ mod test_setup;
15
+ mod validate_attrs;
16
+ mod variant_config;
@@ -0,0 +1,164 @@
1
+ //! Unit tests for the `parse_default` function.
2
+
3
+ use crate::storage::test::parse_default_for_test;
4
+ use quote::quote;
5
+
6
+ use super::test_setup::parse_attrs;
7
+
8
+ #[test]
9
+ fn test_no_default_returns_none() {
10
+ let attrs = parse_attrs(quote! {
11
+ enum Test {
12
+ #[persistent(u32)]
13
+ Variant,
14
+ }
15
+ });
16
+
17
+ let result = parse_default_for_test(&attrs);
18
+ assert!(result.is_ok());
19
+ assert!(result.unwrap().is_none());
20
+ }
21
+
22
+ #[test]
23
+ fn test_parses_integer_default() {
24
+ let attrs = parse_attrs(quote! {
25
+ enum Test {
26
+ #[persistent(u32)]
27
+ #[default(42)]
28
+ Variant,
29
+ }
30
+ });
31
+
32
+ let result = parse_default_for_test(&attrs);
33
+ assert!(result.is_ok());
34
+ let default = result.unwrap();
35
+ assert!(default.is_some());
36
+ assert_eq!(quote!(#default).to_string(), "42");
37
+ }
38
+
39
+ #[test]
40
+ fn test_parses_zero_default() {
41
+ let attrs = parse_attrs(quote! {
42
+ enum Test {
43
+ #[persistent(u32)]
44
+ #[default(0)]
45
+ Variant,
46
+ }
47
+ });
48
+
49
+ let result = parse_default_for_test(&attrs);
50
+ assert!(result.is_ok());
51
+ let default = result.unwrap();
52
+ assert!(default.is_some());
53
+ assert_eq!(quote!(#default).to_string(), "0");
54
+ }
55
+
56
+ #[test]
57
+ fn test_parses_boolean_default() {
58
+ let attrs = parse_attrs(quote! {
59
+ enum Test {
60
+ #[persistent(bool)]
61
+ #[default(true)]
62
+ Variant,
63
+ }
64
+ });
65
+
66
+ let result = parse_default_for_test(&attrs);
67
+ assert!(result.is_ok());
68
+ let default = result.unwrap();
69
+ assert!(default.is_some());
70
+ assert_eq!(quote!(#default).to_string(), "true");
71
+ }
72
+
73
+ #[test]
74
+ fn test_parses_method_call_default() {
75
+ let attrs = parse_attrs(quote! {
76
+ enum Test {
77
+ #[persistent(String)]
78
+ #[default(String::from_str(env, "hello"))]
79
+ Variant,
80
+ }
81
+ });
82
+
83
+ let result = parse_default_for_test(&attrs);
84
+ assert!(result.is_ok());
85
+ let default = result.unwrap();
86
+ assert!(default.is_some());
87
+ let default_str = quote!(#default).to_string();
88
+ assert!(default_str.contains("String :: from_str"));
89
+ }
90
+
91
+ #[test]
92
+ fn test_error_multiple_defaults() {
93
+ let attrs = parse_attrs(quote! {
94
+ enum Test {
95
+ #[persistent(u32)]
96
+ #[default(0)]
97
+ #[default(1)]
98
+ Variant,
99
+ }
100
+ });
101
+
102
+ let result = parse_default_for_test(&attrs);
103
+ assert!(result.is_err());
104
+ let err = result.unwrap_err();
105
+ assert!(err.contains("multiple default values specified"));
106
+ }
107
+
108
+ #[test]
109
+ fn test_error_default_without_parens() {
110
+ let attrs = parse_attrs(quote! {
111
+ enum Test {
112
+ #[persistent(u32)]
113
+ #[default]
114
+ Variant,
115
+ }
116
+ });
117
+
118
+ let result = parse_default_for_test(&attrs);
119
+ assert!(result.is_err());
120
+ let err = result.unwrap_err();
121
+ assert!(err.contains("failed to parse default value"));
122
+ }
123
+
124
+ #[test]
125
+ fn test_error_default_empty_parens() {
126
+ let attrs = parse_attrs(quote! {
127
+ enum Test {
128
+ #[persistent(u32)]
129
+ #[default()]
130
+ Variant,
131
+ }
132
+ });
133
+
134
+ let result = parse_default_for_test(&attrs);
135
+ assert!(result.is_err());
136
+ let err = result.unwrap_err();
137
+ assert!(err.contains("failed to parse default value"));
138
+ }
139
+
140
+ #[test]
141
+ fn test_empty_attrs_returns_none() {
142
+ let attrs: Vec<syn::Attribute> = vec![];
143
+
144
+ let result = parse_default_for_test(&attrs);
145
+ assert!(result.is_ok());
146
+ assert!(result.unwrap().is_none());
147
+ }
148
+
149
+ #[test]
150
+ fn test_parses_negative_default() {
151
+ let attrs = parse_attrs(quote! {
152
+ enum Test {
153
+ #[persistent(i64)]
154
+ #[default(-100)]
155
+ Variant,
156
+ }
157
+ });
158
+
159
+ let result = parse_default_for_test(&attrs);
160
+ assert!(result.is_ok());
161
+ let default = result.unwrap();
162
+ assert!(default.is_some());
163
+ assert_eq!(quote!(#default).to_string(), "- 100");
164
+ }
@@ -0,0 +1,159 @@
1
+ //! Unit tests for the `parse_name` function.
2
+
3
+ use crate::storage::test::parse_name_for_test;
4
+ use quote::quote;
5
+
6
+ use super::test_setup::parse_attrs;
7
+
8
+ #[test]
9
+ fn test_no_name_returns_none() {
10
+ let attrs = parse_attrs(quote! {
11
+ enum Test {
12
+ #[persistent(u32)]
13
+ Variant,
14
+ }
15
+ });
16
+
17
+ let result = parse_name_for_test(&attrs);
18
+ assert!(result.is_ok());
19
+ assert!(result.unwrap().is_none());
20
+ }
21
+
22
+ #[test]
23
+ fn test_parses_custom_name() {
24
+ let attrs = parse_attrs(quote! {
25
+ enum Test {
26
+ #[persistent(u32)]
27
+ #[name("custom_name")]
28
+ Variant,
29
+ }
30
+ });
31
+
32
+ let result = parse_name_for_test(&attrs);
33
+ assert!(result.is_ok());
34
+ let name = result.unwrap();
35
+ assert_eq!(name, Some("custom_name".to_string()));
36
+ }
37
+
38
+ #[test]
39
+ fn test_parses_name_with_underscores() {
40
+ let attrs = parse_attrs(quote! {
41
+ enum Test {
42
+ #[persistent(u32)]
43
+ #[name("my_custom_storage_key")]
44
+ Variant,
45
+ }
46
+ });
47
+
48
+ let result = parse_name_for_test(&attrs);
49
+ assert!(result.is_ok());
50
+ let name = result.unwrap();
51
+ assert_eq!(name, Some("my_custom_storage_key".to_string()));
52
+ }
53
+
54
+ #[test]
55
+ fn test_error_multiple_names() {
56
+ let attrs = parse_attrs(quote! {
57
+ enum Test {
58
+ #[persistent(u32)]
59
+ #[name("first")]
60
+ #[name("second")]
61
+ Variant,
62
+ }
63
+ });
64
+
65
+ let result = parse_name_for_test(&attrs);
66
+ assert!(result.is_err());
67
+ let err = result.unwrap_err();
68
+ assert!(err.contains("multiple name attributes specified"));
69
+ }
70
+
71
+ #[test]
72
+ fn test_error_name_without_parens() {
73
+ let attrs = parse_attrs(quote! {
74
+ enum Test {
75
+ #[persistent(u32)]
76
+ #[name]
77
+ Variant,
78
+ }
79
+ });
80
+
81
+ let result = parse_name_for_test(&attrs);
82
+ assert!(result.is_err());
83
+ let err = result.unwrap_err();
84
+ assert!(err.contains("failed to parse name attribute"));
85
+ }
86
+
87
+ #[test]
88
+ fn test_error_name_empty_parens() {
89
+ let attrs = parse_attrs(quote! {
90
+ enum Test {
91
+ #[persistent(u32)]
92
+ #[name()]
93
+ Variant,
94
+ }
95
+ });
96
+
97
+ let result = parse_name_for_test(&attrs);
98
+ assert!(result.is_err());
99
+ let err = result.unwrap_err();
100
+ assert!(err.contains("failed to parse name attribute"));
101
+ }
102
+
103
+ #[test]
104
+ fn test_error_name_with_integer() {
105
+ let attrs = parse_attrs(quote! {
106
+ enum Test {
107
+ #[persistent(u32)]
108
+ #[name(123)]
109
+ Variant,
110
+ }
111
+ });
112
+
113
+ let result = parse_name_for_test(&attrs);
114
+ assert!(result.is_err());
115
+ let err = result.unwrap_err();
116
+ assert!(err.contains("failed to parse name attribute"));
117
+ }
118
+
119
+ #[test]
120
+ fn test_error_name_with_identifier() {
121
+ let attrs = parse_attrs(quote! {
122
+ enum Test {
123
+ #[persistent(u32)]
124
+ #[name(some_ident)]
125
+ Variant,
126
+ }
127
+ });
128
+
129
+ let result = parse_name_for_test(&attrs);
130
+ assert!(result.is_err());
131
+ let err = result.unwrap_err();
132
+ assert!(err.contains("failed to parse name attribute"));
133
+ }
134
+
135
+ #[test]
136
+ fn test_empty_attrs_returns_none() {
137
+ let attrs: Vec<syn::Attribute> = vec![];
138
+
139
+ let result = parse_name_for_test(&attrs);
140
+ assert!(result.is_ok());
141
+ assert!(result.unwrap().is_none());
142
+ }
143
+
144
+ #[test]
145
+ fn test_parses_name_with_special_chars() {
146
+ let attrs = parse_attrs(quote! {
147
+ enum Test {
148
+ #[persistent(u32)]
149
+ #[name("key_v2_beta")]
150
+ Variant,
151
+ }
152
+ });
153
+
154
+ let result = parse_name_for_test(&attrs);
155
+ assert!(result.is_ok());
156
+ let name = result.unwrap();
157
+ assert_eq!(name, Some("key_v2_beta".to_string()));
158
+ }
159
+