pub fn to_pascal_case(name: &str) -> String {
let mut result = String::new();
let mut capitalize_next = true;
for c in name.chars() {
match c {
'-' | '_' => {
capitalize_next = true;
}
'!' => {
}
'?' => {
result.push('P');
capitalize_next = true;
}
'=' => {
result.push_str("Eq");
capitalize_next = true;
}
'>' => {
result.push_str("Gt");
capitalize_next = true;
}
'<' => {
result.push_str("Lt");
capitalize_next = true;
}
'+' => {
result.push_str("Plus");
capitalize_next = true;
}
'*' => {
result.push_str("Star");
capitalize_next = true;
}
'/' => {
result.push_str("Slash");
capitalize_next = true;
}
_ => {
if capitalize_next {
result.extend(c.to_uppercase());
capitalize_next = false;
} else {
result.push(c);
}
}
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_names() {
assert_eq!(to_pascal_case("map"), "Map");
assert_eq!(to_pascal_case("car"), "Car");
assert_eq!(to_pascal_case("cdr"), "Cdr");
assert_eq!(to_pascal_case("cons"), "Cons");
assert_eq!(to_pascal_case("list"), "List");
}
#[test]
fn test_hyphenated_names() {
assert_eq!(to_pascal_case("set-car!"), "SetCar");
assert_eq!(to_pascal_case("set-cdr!"), "SetCdr");
assert_eq!(to_pascal_case("make-vector"), "MakeVector");
assert_eq!(to_pascal_case("vector-ref"), "VectorRef");
assert_eq!(to_pascal_case("exact-integer?"), "ExactIntegerP");
}
#[test]
fn test_predicates() {
assert_eq!(to_pascal_case("null?"), "NullP");
assert_eq!(to_pascal_case("pair?"), "PairP");
assert_eq!(to_pascal_case("number?"), "NumberP");
assert_eq!(to_pascal_case("zero?"), "ZeroP");
assert_eq!(to_pascal_case("eq?"), "EqP");
}
#[test]
fn test_operators() {
assert_eq!(to_pascal_case("+"), "Plus");
assert_eq!(to_pascal_case("*"), "Star");
assert_eq!(to_pascal_case("/"), "Slash");
assert_eq!(to_pascal_case("="), "Eq");
assert_eq!(to_pascal_case(">"), "Gt");
assert_eq!(to_pascal_case("<"), "Lt");
assert_eq!(to_pascal_case(">="), "GtEq");
assert_eq!(to_pascal_case("<="), "LtEq");
}
#[test]
fn test_conversion_arrows() {
assert_eq!(to_pascal_case("char->integer"), "CharGtInteger");
assert_eq!(to_pascal_case("integer->char"), "IntegerGtChar");
assert_eq!(to_pascal_case("vector->list"), "VectorGtList");
assert_eq!(to_pascal_case("list->vector"), "ListGtVector");
}
#[test]
fn test_exclamation_stripping() {
assert_eq!(to_pascal_case("vector-set!"), "VectorSet");
assert_eq!(to_pascal_case("vector-fill!"), "VectorFill");
assert_eq!(to_pascal_case("string-set!"), "StringSet");
}
}