Libraries

Articles in Section

Одноразовые библиотеки

Если библиотека нужна лишь в 1 функции, можно в ней объявить её использование.

pub fn hash_password(password: &str) -> String {
    use sha2::Digest;
    // ... тело функции ...
}

Library Unit-tests

Примеры:

pub fn greet_user(name: &str) -> String {
    format!("Hello {name}")
}

pub fn login(username: &str, password: &str) -> bool {
    username == "admin" && password == "P@ssw0rd"
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_greet_user() {
        assert_eq!("Hello Alex", greet_user("Alex"));
    }

    #[test]
    fn test_login() {
        assert!(login("admin", "P@ssw0rd"));
    }
}

Запуск тестов - командой cargo test

Паника в процессе тестов

Можно поймать панику во всём тесте с помощью ключа #[should_panic]:

    #[test]
    #[should_panic(expected = "assertion failed")]
    fn test_example() {
        let room_nums = [1, 2, 3, 4];
        let max_length = room_nums.len();
        let index_out_of_bounds = room_nums.get(max_length + 1);
        assert!(index_out_of_bounds.is_some()); // паника будет тут
    }

❗Если паники по факту не будет, тест провалится.

Можно перехватить панику в конкретной команде с помощью std::panic::catch_unwind():

    #[test]
    fn test_example() {
        let room_nums = [1, 2, 3, 4];
        let max_length = room_nums.len();
        // проверка-перехват паники:
        let result = std::panic::catch_unwind(|| room_nums.get(max_length + 1));
    }