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.