test_case_core/
utils.rs

1use proc_macro2::{Ident, Span};
2use quote::ToTokens;
3
4pub fn escape_test_name(input: impl AsRef<str>) -> Ident {
5    if input.as_ref().is_empty() {
6        return Ident::new("_empty", Span::call_site());
7    }
8
9    let mut last_under = false;
10    let mut ident: String = input
11        .as_ref()
12        .to_ascii_lowercase()
13        .chars()
14        .filter_map(|c| match c {
15            c if c.is_alphanumeric() => {
16                last_under = false;
17                Some(c.to_ascii_lowercase())
18            }
19            _ if !last_under => {
20                last_under = true;
21                Some('_')
22            }
23            _ => None,
24        })
25        .collect();
26
27    if !ident.starts_with(|c: char| c == '_' || c.is_ascii_alphabetic()) {
28        ident = format!("_{ident}");
29    }
30
31    Ident::new(&ident, Span::call_site())
32}
33
34pub fn fmt_syn(syn: &(impl ToTokens + Clone)) -> String {
35    syn.clone().into_token_stream().to_string()
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    mod escape_test_name {
43        use super::*;
44
45        #[test]
46        fn converts_arbitrary_test_names() {
47            assert_eq!(
48                escape_test_name("word"),
49                Ident::new("word", Span::call_site())
50            );
51            assert_eq!(
52                escape_test_name("a simple sentence"),
53                Ident::new("a_simple_sentence", Span::call_site())
54            );
55            assert_eq!(
56                escape_test_name("extra  spaces  inbetween"),
57                Ident::new("extra_spaces_inbetween", Span::call_site())
58            );
59            assert_eq!(
60                escape_test_name(" extra end and start spaces "),
61                Ident::new("_extra_end_and_start_spaces_", Span::call_site())
62            );
63            assert_eq!(
64                escape_test_name("abcdefghijklmnoqprstuwvxyz1234567890"),
65                Ident::new("abcdefghijklmnoqprstuwvxyz1234567890", Span::call_site())
66            );
67        }
68
69        #[test]
70        fn converts_to_lowercase() {
71            assert_eq!(
72                escape_test_name("ALL UPPER"),
73                Ident::new("all_upper", Span::call_site())
74            );
75            assert_eq!(
76                escape_test_name("MiXeD CaSe"),
77                Ident::new("mixed_case", Span::call_site())
78            );
79        }
80
81        #[test]
82        fn handles_numeric_first_char() {
83            assert_eq!(
84                escape_test_name("1test"),
85                Ident::new("_1test", Span::call_site())
86            );
87        }
88
89        #[test]
90        fn omits_unicode() {
91            assert_eq!(
92                escape_test_name("from⟶to"),
93                Ident::new("from_to", Span::call_site())
94            );
95        }
96
97        #[test]
98        fn handles_empty_input() {
99            assert_eq!(
100                escape_test_name(""),
101                Ident::new("_empty", Span::call_site())
102            );
103        }
104    }
105}