Testes: test_integracoes

Testes para o módulo codigos.integracoes.

Verifica fórmula de erro de truncamento, regras Newton-Cotes (Trapézio, Simpson 1/3, Simpson 3/8), e comportamento em modo verbose e não-interativo.

Conteúdo dos testes:

  1"""Testes para o módulo `codigos.integracoes`.
  2
  3Verifica fórmula de erro de truncamento, regras Newton-Cotes (Trapézio,
  4Simpson 1/3, Simpson 3/8), e comportamento em modo verbose e não-interativo.
  5"""
  6
  7from codigos import integracoes as ig
  8import pytest
  9
 10
 11def test_erro_truncamento_composta():
 12    """Verifica as fórmulas de estimativa de erro de truncamento para regras compostas."""
 13    a, b = 0.0, 1.0
 14    # derivada_max = 1 for testing
 15    assert abs(ig.erro_truncamento_composta(a, b, 1, 1.0, 'trapezio') - (-1/12)) < 1e-12
 16    assert abs(ig.erro_truncamento_composta(a, b, 1, 1.0, 'simpson13') - (-(1**5)/180)) < 1e-12
 17    assert abs(ig.erro_truncamento_composta(a, b, 1, 1.0, 'simpson38') - (-(1**5)/80)) < 1e-12
 18
 19
 20def test_trapezio_composta_simple(monkeypatch):
 21    """Integra f(x)=x no intervalo [0,1] usando Trapézio composta e compara com 0.5."""
 22    monkeypatch.setattr(ig, 'pedir_m_ou_h', lambda a, b, regra: (10, (b-a)/10))
 23    # avoid interactive plotting and error estimation: patch input to always 'n'
 24    monkeypatch.setattr('builtins.input', lambda *args, **kwargs: 'n')
 25    res = ig.trapezio_composta('x', 0.0, 1.0)
 26    assert abs(res - 0.5) < 1e-3
 27
 28
 29def test_erro_truncamento_composta_values():
 30    """Valida valores numéricos das fórmulas de erro para casos concretos."""
 31    a, b, m, derivada_max = 0.0, 1.0, 10, 1.0
 32    expected = -((b-a)**3) / (12 * m**2) * derivada_max
 33    assert pytest.approx(ig.erro_truncamento_composta(a, b, m, derivada_max, 'trapezio')) == expected
 34    # Simpson 1/3
 35    expected_s13 = -((b-a)**5) / (180 * m**4) * derivada_max
 36    assert pytest.approx(ig.erro_truncamento_composta(a, b, m, derivada_max, 'simpson13')) == expected_s13
 37    # Simpson 3/8
 38    expected_s38 = -((b-a)**5) / (80 * m**4) * derivada_max
 39    assert pytest.approx(ig.erro_truncamento_composta(a, b, m, derivada_max, 'simpson38')) == expected_s38
 40
 41
 42def test_newton_cotes_trapezio_linear(monkeypatch):
 43    """Integral de f(x)=x no intervalo [0,1] com Newton-Cotes (trapézio simples)."""
 44    # Prevent interactive plotting prompt
 45    monkeypatch.setattr('builtins.input', lambda prompt='': 'n')
 46    # integral of x from 0 to 1 = 0.5
 47    res = ig.newton_cotes('x', 0.0, 1.0, 1)
 48    assert pytest.approx(res, rel=1e-12) == 0.5
 49
 50
 51def test_newton_cotes_verbose_and_vectorized(monkeypatch, capsys):
 52    """Verifica que caminho vetorizado e verbose imprimem uma linha de resultado."""
 53    # avoid plotting and interactive prompts
 54    monkeypatch.setattr(ig, 'plotar_funcao_e_aproximacao', lambda *args, **kwargs: None)
 55    # call with verbose True to enable details and plotting flag
 56    res = ig.newton_cotes('x', 0.0, 1.0, 1, verbose=True)
 57    captured = capsys.readouterr()
 58    assert "Resultado pela" in captured.out
 59    assert pytest.approx(res, rel=1e-12) == 0.5
 60
 61
 62def test_trapezio_composta_verbose_estimativa(monkeypatch, capsys):
 63    """Verifica estimativa automática de erro em modo verbose para Trapézio composta."""
 64    # provide a fixed m via pedir_m_ou_h
 65    monkeypatch.setattr(ig, 'pedir_m_ou_h', lambda a, b, regra: (10, (b-a)/10))
 66    monkeypatch.setattr(ig, 'plotar_funcao_e_aproximacao', lambda *args, **kwargs: None)
 67    res = ig.trapezio_composta('x', 0.0, 1.0, verbose=True)
 68    captured = capsys.readouterr()
 69    assert "Erro de truncamento estimado" in captured.out or "Resultado pela Regra" in captured.out
 70    assert pytest.approx(res, rel=1e-12) == 0.5
 71
 72
 73def test_newton_cotes_invalid_limits():
 74    """Limites inválidos devem provocar exceções apropriadas."""
 75    import pytest
 76    with pytest.raises(TypeError):
 77        ig.newton_cotes('x', 'a', 1.0, 1)
 78    with pytest.raises(ValueError):
 79        ig.newton_cotes('x', 0.0, 0.0, 1)
 80
 81
 82def test_newton_cotes_simpson_on_quadratic(monkeypatch):
 83    """Simpson 1/3 deve integrar x**2 exatamente em [0,1]"""
 84    monkeypatch.setattr('builtins.input', lambda prompt='': 'n')
 85    # integral of x**2 from 0 to 1 = 1/3
 86    res = ig.newton_cotes('x**2', 0.0, 1.0, 2)
 87    assert pytest.approx(res, rel=1e-12) == 1.0/3.0
 88
 89
 90def test_trapezio_composta_monkeypatch(monkeypatch):
 91    """Teste com m fixo via monkeypatch para Trapézio composta."""
 92    # Make pedir_m_ou_h return m=4, h=0.25 for interval 0..1
 93    monkeypatch.setattr(ig, 'pedir_m_ou_h', lambda a, b, regra: (4, 0.25))
 94    # Prevent interactive plotting/error prompts (always 'n')
 95    monkeypatch.setattr('builtins.input', lambda prompt='': 'n')
 96    res = ig.trapezio_composta('x', 0.0, 1.0)
 97    assert pytest.approx(res, rel=1e-12) == 0.5
 98
 99
100def test_simpson_1_3_composta_monkeypatch(monkeypatch):
101    """Simpson 1/3 composta com m par (m=4)."""
102    # m must be even; choose m=4
103    monkeypatch.setattr(ig, 'pedir_m_ou_h', lambda a, b, regra: (4, 0.25))
104    monkeypatch.setattr('builtins.input', lambda prompt='': 'n')
105    res = ig.simpson_1_3_composta('x**2', 0.0, 1.0)
106    assert pytest.approx(res, rel=1e-12) == 1.0/3.0
107
108
109def test_simpson_3_8_composta_monkeypatch(monkeypatch):
110    """Simpson 3/8 composta com m múltiplo de 3 (m=3)."""
111    # m must be multiple of 3; choose m=3
112    monkeypatch.setattr(ig, 'pedir_m_ou_h', lambda a, b, regra: (3, (1.0/3.0)))
113    monkeypatch.setattr('builtins.input', lambda prompt='': 'n')
114    res = ig.simpson_3_8_composta('x**3', 0.0, 1.0)
115    # integral of x^3 from 0 to1 = 1/4
116    assert pytest.approx(res, rel=1e-12) == 0.25

Resumo das funções de teste:

  • test_erro_truncamento_composta: Verifica as fórmulas de estimativa de erro de truncamento para regras compostas.

  • test_trapezio_composta_simple: Integra f(x)=x no intervalo [0,1] usando Trapézio composta e compara com 0.5.

  • test_erro_truncamento_composta_values: Valida valores numéricos das fórmulas de erro para casos concretos.

  • test_newton_cotes_trapezio_linear: Integral de f(x)=x no intervalo [0,1] com Newton-Cotes (trapézio simples).

  • test_newton_cotes_verbose_and_vectorized: Verifica que caminho vetorizado e verbose imprimem uma linha de resultado.

  • test_trapezio_composta_verbose_estimativa: Verifica estimativa automática de erro em modo verbose para Trapézio composta.

  • test_newton_cotes_invalid_limits: Limites inválidos devem provocar exceções apropriadas.

  • test_newton_cotes_simpson_on_quadratic: Simpson 1/3 deve integrar x**2 exatamente em [0,1]

  • test_trapezio_composta_monkeypatch: Teste com m fixo via monkeypatch para Trapézio composta.

  • test_simpson_1_3_composta_monkeypatch: Simpson 1/3 composta com m par (m=4).

  • test_simpson_3_8_composta_monkeypatch: Simpson 3/8 composta com m múltiplo de 3 (m=3).