Skip to main content

calculator_henriquecapi/
lib.rs

1pub mod calc1;
2pub mod calc2;
3
4#[cfg(test)]
5mod tests {
6    // Importamos todas as funções que vamos testar
7    use super::calc1::{add, sub};
8    use super::calc2::{multiply, rate};
9
10    // --- Testes para a função add ---
11    #[test]
12    fn test_add_normal() {
13        // Testa uma soma simples que deve funcionar
14        assert_eq!(add(2, 2), 4);
15    }
16
17    #[test]
18    fn test_add_saturating() {
19        // Testa se a soma satura no valor máximo de u32 em vez de estourar (overflow)
20        assert_eq!(add(u32::MAX, 1), u32::MAX);
21    }
22
23    // --- Testes para a função sub ---
24    #[test]
25    fn test_sub_normal() {
26        // Testa uma subtração simples
27        assert_eq!(sub(10, 5), 5);
28    }
29
30    #[test]
31    fn test_sub_underflow_returns_zero() {
32        // Testa o caso onde o resultado seria negativo.
33        // A função deve retornar 0 para evitar um "underflow".
34        assert_eq!(sub(5, 10), 0);
35    }
36
37    // --- Testes para a função multiply ---
38    #[test]
39    fn test_multiply_normal() {
40        // Testa uma multiplicação simples
41        assert_eq!(multiply(10, 5), 50);
42    }
43
44    #[test]
45    fn test_multiply_by_zero() {
46        // Multiplicar por zero deve sempre resultar em zero
47        assert_eq!(multiply(10, 0), 0);
48    }
49
50    #[test]
51    fn test_multiply_overflow() {
52        // Este teste vai falhar inicialmente, pois a multiplicação padrão causa pânico.
53        // Ele serve para nos forçar a melhorar a função `multiply`.
54        assert_eq!(multiply(u32::MAX, 2), u32::MAX);
55    }
56
57    // --- Testes para a função rate (divisão) ---
58    #[test]
59    fn test_rate_normal() {
60        // Testa uma divisão simples
61        assert_eq!(rate(10, 2), 5);
62    }
63
64    #[test]
65    fn test_rate_integer_truncation() {
66        // A divisão de inteiros descarta a parte fracionária. 10 / 3 = 3.33..., que vira 3.
67        assert_eq!(rate(10, 3), 3);
68    }
69
70    #[test]
71    fn test_rate_division_by_zero_returns_zero() {
72        // A nossa função foi programada para retornar 0 em caso de divisão por zero.
73        // Este teste garante que esse comportamento está funcionando.
74        assert_eq!(rate(10, 0), 0);
75    }
76}