diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2025-01-12 12:07:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-12 12:07:59 +0100 |
| commit | 1b45dad34e64b7836f853068369f21dba92f90fd (patch) | |
| tree | aa2c0797df7f79bca4c03d4498960767faf05e5e | |
| parent | b53239668a016cb5f94f8b38fe1fa7fc33e4d869 (diff) | |
| parent | 33ce74f308ac0d849b9cd4d88f3ebdb4238be18a (diff) | |
| download | rust-1b45dad34e64b7836f853068369f21dba92f90fd.tar.gz rust-1b45dad34e64b7836f853068369f21dba92f90fd.zip | |
Rollup merge of #135397 - lqd:compiletest-enums, r=jieyouxu
compiletest: add erroneous variant to `string_enum`s conversions error As requested in #135392, this adds which variant caused the string conversion failure. r? jieyouxu fixes #135392
| -rw-r--r-- | src/tools/compiletest/src/common.rs | 10 | ||||
| -rw-r--r-- | src/tools/compiletest/src/tests.rs | 27 |
2 files changed, 34 insertions, 3 deletions
diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index 36f876bcdc6..4e2510ed9ab 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -39,18 +39,22 @@ macro_rules! string_enum { } impl FromStr for $name { - type Err = (); + type Err = String; - fn from_str(s: &str) -> Result<Self, ()> { + fn from_str(s: &str) -> Result<Self, Self::Err> { match s { $($repr => Ok(Self::$variant),)* - _ => Err(()), + _ => Err(format!(concat!("unknown `", stringify!($name), "` variant: `{}`"), s)), } } } } } +// Make the macro visible outside of this module, for tests. +#[cfg(test)] +pub(crate) use string_enum; + string_enum! { #[derive(Clone, Copy, PartialEq, Debug)] pub enum Mode { diff --git a/src/tools/compiletest/src/tests.rs b/src/tools/compiletest/src/tests.rs index fec746904de..43c6dc0a67e 100644 --- a/src/tools/compiletest/src/tests.rs +++ b/src/tools/compiletest/src/tests.rs @@ -66,3 +66,30 @@ fn is_test_test() { assert!(!is_test(&OsString::from("#a_dog_gif"))); assert!(!is_test(&OsString::from("~a_temp_file"))); } + +#[test] +fn string_enums() { + // These imports are needed for the macro-generated code + use std::fmt; + use std::str::FromStr; + + crate::common::string_enum! { + #[derive(Clone, Copy, Debug, PartialEq)] + enum Animal { + Cat => "meow", + Dog => "woof", + } + } + + // General assertions, mostly to silence the dead code warnings + assert_eq!(Animal::VARIANTS.len(), 2); + assert_eq!(Animal::STR_VARIANTS.len(), 2); + + // Correct string conversions + assert_eq!(Animal::Cat, "meow".parse().unwrap()); + assert_eq!(Animal::Dog, "woof".parse().unwrap()); + + // Invalid conversions + let animal = "nya".parse::<Animal>(); + assert_eq!("unknown `Animal` variant: `nya`", animal.unwrap_err()); +} |
