#[ test ]
fn test_example_filenames_no_common_typos()
{
let examples_dir = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) )
.join( "examples" );
let entries = std::fs::read_dir( &examples_dir )
.expect( "Failed to read examples directory" );
let mut typo_found = false;
let mut typo_messages = Vec::new();
for entry in entries
{
let entry = entry.expect( "Failed to read directory entry" );
let filename = entry.file_name();
let filename_str = filename.to_string_lossy();
let typo_patterns =
[
( "expaned", "expanded" ),
( "seperate", "separate" ),
( "occured", "occurred" ),
( "defintion", "definition" ),
];
for ( typo, correct ) in typo_patterns
{
if filename_str.contains( typo )
{
typo_found = true;
typo_messages.push
(
format!
(
"File '{filename_str}' contains typo '{typo}' (should be '{correct}')"
)
);
}
}
}
assert!
(
!typo_found,
"Found typos in example filenames:\n{}",
typo_messages.join( "\n" )
);
}
#[ test ]
fn test_example_filenames_follow_conventions()
{
let examples_dir = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) )
.join( "examples" );
let entries = std::fs::read_dir( &examples_dir )
.expect( "Failed to read examples directory" );
for entry in entries
{
let entry = entry.expect( "Failed to read directory entry" );
let filename = entry.file_name();
let filename_str = filename.to_string_lossy();
let is_rust_file = std::path::Path::new( &*filename_str )
.extension()
.is_some_and( | ext | ext.eq_ignore_ascii_case( "rs" ) );
if filename_str == "readme.md" || !is_rust_file
{
continue;
}
let name_without_ext = filename_str.trim_end_matches( ".rs" );
for c in name_without_ext.chars()
{
assert!
(
c.is_lowercase() || c.is_numeric() || c == '_',
"Example filename '{filename_str}' should use lowercase snake_case only"
);
}
}
}