Testes: test_raizes
Testes para o módulo codigos.raizes.
Bisseção: validade do intervalo, comportamento em intervalos inválidos e saída em verbose
Newton: convergência básica e comportamento quando a derivada é nula
Secante: convergência básica
pedir_dados_raizes: valida leitura de parâmetros no modo de menu
Conteúdo dos testes:
1"""Testes para o módulo `codigos.raizes`.
2
3- Bisseção: validade do intervalo, comportamento em intervalos inválidos e saída em verbose
4- Newton: convergência básica e comportamento quando a derivada é nula
5- Secante: convergência básica
6- `pedir_dados_raizes`: valida leitura de parâmetros no modo de menu
7"""
8
9import math
10from codigos import raizes
11
12def test_bissecao_basic():
13 """Verifica a convergência básica do método da bisseção.
14
15 - Função: f(x) = x**2 - 4
16 - Intervalo: [0, 3]
17 - Critério: raiz aproximada ~ 2.0 dentro da tolerância fornecida e >0 iterações
18 """
19 raiz, iters = raizes.bissecao('x**2 - 4', 0.0, 3.0, 1e-8, 100)
20 assert raiz is not None
21 assert abs(raiz - 2.0) < 1e-8
22 assert iters > 0
23
24def test_bissecao_invalid_interval():
25 """Confirma que bisseção detecta intervalo inválido (mesmo sinal em extremidades).
26
27 - Função: f(x) = x**2 + 1 (sempre positiva)
28 - Intervalo: [-1, 1]
29 - Resultado esperado: (None, 0) e mensagem de erro
30 """
31 raiz, iters = raizes.bissecao('x**2 + 1', -1.0, 1.0, 1e-8, 10)
32 assert raiz is None
33 assert iters == 0
34
35def test_newton_basic():
36 """Verifica convergência do método de Newton-Raphson para raiz sqrt(2).
37
38 - Função: f(x) = x**2 - 2
39 - Chute: x0 = 1.5
40 - Critério: aproxima sqrt(2) dentro do limiar pedido
41 """
42 raiz, iters = raizes.newton('x**2 - 2', 1.5, 1e-12, 50)
43 assert raiz is not None
44 assert abs(raiz - math.sqrt(2.0)) < 1e-10
45
46def test_newton_derivative_zero():
47 """Testa o comportamento de Newton quando a derivada é zero no ponto inicial.
48
49 - Função: f(x) = x**3, chute x0 = 0 (derivada nula)
50 - Aceita-se raiz 0.0 como comportamento válido (método pode retornar None ou a raiz)
51 """
52 raiz, iters = raizes.newton('x**3', 0.0, 1e-12, 10)
53 assert raiz is not None
54 assert abs(raiz - 0.0) < 1e-12
55
56def test_secante_basic():
57 """Verifica que o método da secante convergente para uma raiz em (0,1).
58
59 - Função: f(x) = x**3 - 0.5
60 - Chutes: x0 = 0.0, x1 = 1.0
61 - Verifica resíduo pequeno em função da raiz encontrada
62 """
63 raiz, iters = raizes.secante('x**3 - 0.5', 0.0, 1.0, 1e-10, 100)
64 assert raiz is not None
65 # verify residual is small
66 fval = (raiz**3 - 0.5)
67 assert abs(fval) < 1e-8
68
69def test_pedir_dados_raizes_for_menu(monkeypatch):
70 """Simula a leitura de parâmetros no modo de menu para a bisseção.
71
72 - Garante que os valores retornados pelo helper sejam corretamente tipados e ordenados
73 """
74 # Simulate inputs for bissecao: func, tol, max_iter, a, b
75 inputs = iter(['x**2 - 4', '1e-8', '100', '0', '3'])
76 monkeypatch.setattr('builtins.input', lambda prompt='': next(inputs))
77 func_str, tol, max_iter, params = raizes.pedir_dados_raizes('bissecao')
78 assert func_str == 'x**2 - 4'
79 assert abs(float(tol) - 1e-8) < 1e-20
80 assert int(max_iter) == 100
81 assert params == (0.0, 3.0)
82
83def test_plotar_funcao_grafico_false(monkeypatch):
84 called = {"show": False}
85 monkeypatch.setattr('matplotlib.pyplot.show', lambda: called.__setitem__('show', True))
86 raizes.plotar_funcao('x**2 - 4', a=-1, b=3, grafico=False)
87 assert called['show'] is False
88
89
90def test_plotar_funcao_grafico_true(monkeypatch):
91 called = {"show": False}
92 monkeypatch.setattr('matplotlib.pyplot.show', lambda: called.__setitem__('show', True))
93 raizes.plotar_funcao('x**2 - 4', a=-1, b=3, grafico=True)
94 assert called['show'] is True
95
96
97def test_bissecao_with_verbose():
98 raiz, iters = raizes.bissecao('x**2 - 4', 0.0, 3.0, 1e-8, 100, verbose=True)
99 assert raiz is not None
100 assert abs(raiz - 2.0) < 1e-8
101 assert iters > 0
102
103def test_plotar_funcao_grafico_false(monkeypatch):
104 """Garante que `plotar_funcao(..., grafico=False)` não chama `plt.show()`.
105
106 - Substitui `plt.show` por stub e verifica que não foi invocado
107 """
108 called = {"show": False}
109 monkeypatch.setattr('matplotlib.pyplot.show', lambda: called.__setitem__('show', True))
110 # Deve retornar sem chamar show
111 raizes.plotar_funcao('x**2 - 4', a=-1, b=3, grafico=False)
112 assert called['show'] is False
113
114
115def test_plotar_funcao_grafico_true(monkeypatch):
116 """Garante que `plotar_funcao(..., grafico=True)` chama `plt.show()`.
117
118 - Substitui `plt.show` e verifica invocação para gráficos ativos
119 """
120 called = {"show": False}
121 monkeypatch.setattr('matplotlib.pyplot.show', lambda: called.__setitem__('show', True))
122 raizes.plotar_funcao('x**2 - 4', a=-1, b=3, grafico=True)
123 assert called['show'] is True
124
125
126def test_bissecao_with_verbose():
127 """Verifica que `bissecao` funciona corretamente em modo `verbose`.
128
129 - Assegura que a execução verbose não altera a solução encontrada
130 """
131 raiz, iters = raizes.bissecao('x**2 - 4', 0.0, 3.0, 1e-8, 100, verbose=True)
132 assert raiz is not None
133 assert abs(raiz - 2.0) < 1e-8
134 assert iters > 0
Resumo das funções de teste:
test_bissecao_basic: Verifica a convergência básica do método da bisseção.
test_bissecao_invalid_interval: Confirma que bisseção detecta intervalo inválido (mesmo sinal em extremidades).
test_newton_basic: Verifica convergência do método de Newton-Raphson para raiz sqrt(2).
test_newton_derivative_zero: Testa o comportamento de Newton quando a derivada é zero no ponto inicial.
test_secante_basic: Verifica que o método da secante convergente para uma raiz em (0,1).
test_pedir_dados_raizes_for_menu: Simula a leitura de parâmetros no modo de menu para a bisseção.
test_plotar_funcao_grafico_false: _Sem docstring._
test_plotar_funcao_grafico_true: _Sem docstring._
test_bissecao_with_verbose: _Sem docstring._
test_plotar_funcao_grafico_false: Garante que plotar_funcao(…, grafico=False) não chama plt.show().
test_plotar_funcao_grafico_true: Garante que plotar_funcao(…, grafico=True) chama plt.show().
test_bissecao_with_verbose: Verifica que bissecao funciona corretamente em modo verbose.