diff --git a/Cargo.lock b/Cargo.lock index 5196d7b0ecf..8866cd598eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11221,6 +11221,8 @@ dependencies = [ "cairo-vm", "indoc 2.0.5", "starknet-types-core", + "strum 0.25.0", + "strum_macros 0.25.3", "thiserror 1.0.69", ] diff --git a/crates/starknet_os/Cargo.toml b/crates/starknet_os/Cargo.toml index 93112aea041..839828d83f1 100644 --- a/crates/starknet_os/Cargo.toml +++ b/crates/starknet_os/Cargo.toml @@ -7,11 +7,20 @@ license.workspace = true license-file.workspace = true description = "The Starknet OS." +[features] +testing = ["dep:strum", "dep:strum_macros"] + [dependencies] cairo-vm.workspace = true indoc.workspace = true starknet-types-core.workspace = true +strum = { workspace = true, optional = true } +strum_macros = { workspace = true, optional = true } thiserror.workspace = true +[dev-dependencies] +strum.workspace = true +strum_macros.workspace = true + [lints] workspace = true diff --git a/crates/starknet_os/src/hints/enum_definition.rs b/crates/starknet_os/src/hints/enum_definition.rs index c54a9b3a938..1881abf8c72 100644 --- a/crates/starknet_os/src/hints/enum_definition.rs +++ b/crates/starknet_os/src/hints/enum_definition.rs @@ -210,6 +210,10 @@ use crate::hints::transaction_hash::{additional_data_new_segment, data_to_hash_n use crate::hints::types::{HintEnum, HintExtensionImplementation, HintImplementation}; use crate::{define_hint_enum, define_hint_extension_enum}; +#[cfg(test)] +#[path = "enum_definition_test.rs"] +pub mod test; + define_hint_enum!( Hint, ( diff --git a/crates/starknet_os/src/hints/enum_definition_test.rs b/crates/starknet_os/src/hints/enum_definition_test.rs new file mode 100644 index 00000000000..5bb4e5819de --- /dev/null +++ b/crates/starknet_os/src/hints/enum_definition_test.rs @@ -0,0 +1,15 @@ +use std::collections::HashSet; + +use strum::IntoEnumIterator; + +use super::{Hint, HintExtension}; +use crate::hints::types::HintEnum; + +#[test] +fn test_hint_strings_are_unique() { + let hint_strings = Hint::iter().map(|hint| hint.to_str()).collect::>(); + let hint_extension_strings = + HintExtension::iter().map(|hint| hint.to_str()).collect::>(); + let ambiguous_strings = hint_strings.intersection(&hint_extension_strings).collect::>(); + assert!(ambiguous_strings.is_empty(), "Ambiguous hint strings: {ambiguous_strings:?}"); +} diff --git a/crates/starknet_os/src/hints/enum_generation.rs b/crates/starknet_os/src/hints/enum_generation.rs index 262d022d92b..783e26a3587 100644 --- a/crates/starknet_os/src/hints/enum_generation.rs +++ b/crates/starknet_os/src/hints/enum_generation.rs @@ -1,6 +1,7 @@ #[macro_export] macro_rules! define_hint_enum_base { ($enum_name:ident, $(($hint_name:ident, $hint_str:expr)),+ $(,)?) => { + #[cfg_attr(any(test, feature = "testing"), derive(strum_macros::EnumIter))] pub enum $enum_name { $($hint_name),+ }