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).