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}