pub fn validate_license_plate(plate: &str) -> bool {
if plate.is_empty() {
return false;
}
let chars: Vec<char> = plate.chars().collect();
let char_count = chars.len();
if !is_chinese_char(chars[0]) {
return false;
}
if !chars[1].is_ascii_uppercase() {
return false;
}
match char_count {
7 => {
chars[2..]
.iter()
.all(|&c| c.is_ascii_uppercase() || c.is_ascii_digit())
}
8 => {
chars[2..]
.iter()
.all(|&c| c.is_ascii_uppercase() || c.is_ascii_digit())
}
_ => false,
}
}
fn is_chinese_char(c: char) -> bool {
('\u{4e00}'..='\u{9fa5}').contains(&c)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_traditional_plates() {
println!("\n=== 测试传统车牌(7位)===");
let test_cases = vec!["京A12345", "沪B88888", "粤C1234E", "苏D5678F"];
for plate in test_cases {
let result = validate_license_plate(plate);
println!(
"车牌 '{}' ({}位) 验证结果: {}",
plate,
plate.chars().count(),
result
);
assert!(result, "传统车牌 '{}' 应该验证通过", plate);
}
}
#[test]
fn test_valid_new_energy_plates() {
println!("\n=== 测试新能源车牌(8位)===");
let test_cases = vec![
"京AD12345", "沪AF88888", "粤BA12345", "苏CF12345", ];
for plate in test_cases {
let char_count = plate.chars().count();
let result = validate_license_plate(plate);
println!("车牌 '{}' ({}位) 验证结果: {}", plate, char_count, result);
assert!(result, "新能源车牌 '{}' 应该验证通过", plate);
}
}
#[test]
fn test_invalid_plates() {
println!("\n=== 测试无效车牌 ===");
let test_cases = vec![
("", false), ("京A1234", false), ("京A1234567", false), ("京12345", false), ("京A12#45", false), ("京Aa1234", false), ("京A1234@", false), ("X京A12345", false), ("京A 1234", false), ("京A123456", true), ("粤BA123456", false), ];
for (plate, expected) in test_cases {
let char_count = plate.chars().count();
let result = validate_license_plate(plate);
println!(
"车牌 '{}' ({}位) 验证结果: {}, 期望: {}",
plate, char_count, result, expected
);
assert_eq!(result, expected, "车牌 '{}' 验证失败", plate);
}
}
}