Решение на Code Identifier от Георги Петков

Обратно към всички решения

Към профила на Георги Петков

Резултати

  • 19 точки от тестове
  • 0 бонус точки
  • 19 точки общо
  • 14 успешни тест(а)
  • 1 неуспешни тест(а)

Код

/// Необходимо е CodeIdentifier да имплементира Debug, за да можем да го
/// използваме в тестови assertion-и.
///
#[derive(Debug)]
pub struct CodeIdentifier {
id: String,
}
impl CodeIdentifier {
/// Функцията ще върне Option<CodeIdentifier>, което ще бъде:
/// - None: ако входа не е валиден идентификатор. Вижте горе за това
/// какво значи "валиден идентификатор".
/// - Some(code_identifier): Ако входа е валиден.
///
pub fn new(identifier: &str) -> Option<Self> {
let trimmed = identifier.trim();
let mut trimmed_chars = trimmed.chars();
let option_first_char = trimmed_chars.next();
let first_char = match option_first_char {
None => return None,
_ => option_first_char.unwrap(),
};
if !first_char.is_alphabetic() {
return None;
}
let permitted_chars = |x: char| (
x.is_alphabetic() ||
x.is_numeric() ||
x=='_'
);
if !trimmed_chars.all(permitted_chars) {
return None;
}
Some(CodeIdentifier{id: trimmed.to_lowercase()})
}
fn titlecase_word(s: &str) -> String {
let mut chars: Vec<char> = s.chars().collect();
if chars.len() == 0 {
return String::from("");
}
chars[0] = chars[0].to_uppercase().nth(0).unwrap();
chars.into_iter().collect::<String>()
}
/// Конвертира идентификатора до camelcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "someVar"
///
pub fn camelcase(&self) -> String {
let mut words = self.id.split('_');
let mut camelcased_identifier: Vec<String> = Vec::new();
camelcased_identifier.push(words.next().unwrap_or("").to_string());
for word in words {
camelcased_identifier.push(CodeIdentifier::titlecase_word(word));
}
camelcased_identifier.into_iter().collect::<String>()
}
/// Конвертира идентификатора до titlecased вариант (camelcased с първа заглавна буква).
/// - Примерен вход: "some_var"
/// - Примерен изход: "SomeVar"
///
pub fn titlecase(&self) -> String {
let titlecased_words: Vec<String> = self.id
.split('_')
.map(CodeIdentifier::titlecase_word)
.collect();
titlecased_words.into_iter().collect::<String>()
}
/// Конвертира идентификатора до kebabcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some-var"
///
pub fn kebabcase(&self) -> String {
let kebab: String = self.id.chars().map(|x| match x {
'_' => '-',
_ => x,
}).collect();
kebab
}
/// Конвертира идентификатора до underscored вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some_var"
///
/// - Примерен вход: "Some_Var"
/// - Примерен изход: "some_var"
///
pub fn underscore(&self) -> String {
self.id.clone()
}
/// Конвертира идентификатора до screaming-snakecased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "SOME_VAR"
///
pub fn screaming_snakecase(&self) -> String {
self.id.to_uppercase()
}
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20190123-22631-39l6ui/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 5.10s
     Running target/debug/deps/solution-2e785d603b538f71

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-29808948fb50ed3a

running 15 tests
test solution_test::test_both_static_and_dynamic_strings ... ok
test solution_test::test_camelcase_basic ... ok
test solution_test::test_cyrillic1 ... ok
test solution_test::test_digits1 ... ok
test solution_test::test_digits2 ... ok
test solution_test::test_digits3 ... ok
test solution_test::test_kebabcase_basic ... ok
test solution_test::test_multibyte_uppercase ... FAILED
test solution_test::test_normalize_case1 ... ok
test solution_test::test_normalize_case2 ... ok
test solution_test::test_screaming_snakecase_basic ... ok
test solution_test::test_titlecase_basic ... ok
test solution_test::test_underscore_basic ... ok
test solution_test::test_validity ... ok
test solution_test::test_whitespace ... ok

failures:

---- solution_test::test_multibyte_uppercase stdout ----
thread 'solution_test::test_multibyte_uppercase' panicked at 'assertion failed: `(left == right)`
  left: `"someSpecialCase"`,
 right: `"someSSpecialCase"`', tests/solution_test.rs:104:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.


failures:
    solution_test::test_multibyte_uppercase

test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out

error: test failed, to rerun pass '--test solution_test'

История (1 версия и 3 коментара)

Георги качи първо решение на 25.10.2018 14:55 (преди около 3 години)