From b33781d51a16cd46f45d7346846acfe409d755d3 Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 11:51:00 +0100 Subject: [PATCH 1/8] add unit and integration tests --- diffusion2d.py | 7 +++- tests/integration/test_diffusion2d.py | 17 ++++++++- tests/unit/test_diffusion2d_functions.py | 48 ++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/diffusion2d.py b/diffusion2d.py index 51a07f2..59f69ea 100644 --- a/diffusion2d.py +++ b/diffusion2d.py @@ -38,6 +38,7 @@ def __init__(self): self.dt = None def initialize_domain(self, w=10., h=10., dx=0.1, dy=0.1): + assert(isinstance(w, float) and isinstance(h, float) and isinstance(dx, float) and isinstance(dy, float)) self.w = w self.h = h self.dx = dx @@ -45,7 +46,9 @@ def initialize_domain(self, w=10., h=10., dx=0.1, dy=0.1): self.nx = int(w / dx) self.ny = int(h / dy) - def initialize_physical_parameters(self, d=4., T_cold=300, T_hot=700): + def initialize_physical_parameters(self, d=4., T_cold=300.0, T_hot=700.0): + assert(isinstance(d, float) and isinstance(T_cold, float) and isinstance(T_hot, float)) + self.D = d self.T_cold = T_cold self.T_hot = T_hot @@ -68,6 +71,8 @@ def set_initial_condition(self): if p2 < r2: u[i, j] = self.T_hot + print(u) + return u.copy() def do_timestep(self, u_nm1): diff --git a/tests/integration/test_diffusion2d.py b/tests/integration/test_diffusion2d.py index fd026b4..cd58ed8 100644 --- a/tests/integration/test_diffusion2d.py +++ b/tests/integration/test_diffusion2d.py @@ -3,7 +3,7 @@ """ from diffusion2d import SolveDiffusion2D - +import pytest def test_initialize_physical_parameters(): """ @@ -11,9 +11,24 @@ def test_initialize_physical_parameters(): """ solver = SolveDiffusion2D() + solver.initialize_domain() + solver.initialize_physical_parameters(5.0, 300.0, 700.0) + + solver.initialize_physical_parameters(5.0, 300.0, 700.0) + assert solver.dt == pytest.approx(0.0005, rel=1e-4) + + solver.initialize_physical_parameters(5.0, 500.0, 800.0) + assert solver.dt == pytest.approx(0.0005, rel=1e-4) + + with pytest.raises(AssertionError): + solver.initialize_physical_parameters(5, 500, 800) + def test_set_initial_condition(): """ Checks function SolveDiffusion2D.get_initial_function """ solver = SolveDiffusion2D() + + solver.initialize_domain(8.0, 8.0, 1.0, 1.0) + solver.initialize_physical_parameters(4.0, 0.0, 1.0) diff --git a/tests/unit/test_diffusion2d_functions.py b/tests/unit/test_diffusion2d_functions.py index c4277ff..24217e1 100644 --- a/tests/unit/test_diffusion2d_functions.py +++ b/tests/unit/test_diffusion2d_functions.py @@ -4,6 +4,8 @@ from diffusion2d import SolveDiffusion2D +import pytest +import numpy as np def test_initialize_domain(): """ @@ -11,6 +13,14 @@ def test_initialize_domain(): """ solver = SolveDiffusion2D() + solver.initialize_domain(1.5, 2.0, 0.2, 0.2) + + assert solver.nx == 7 + assert solver.ny == 10 + + with pytest.raises(AssertionError): + solver.initialize_domain(1, 2, 0.2, 0.2) + def test_initialize_physical_parameters(): """ @@ -18,9 +28,47 @@ def test_initialize_physical_parameters(): """ solver = SolveDiffusion2D() + solver.dx = 0.1 + solver.dy = 0.1 + solver.nx = 100 + solver.ny = 100 + + solver.initialize_physical_parameters(5.0, 300.0, 700.0) + assert solver.dt == pytest.approx(0.0005, rel=1e-4) + + solver.initialize_physical_parameters(5.0, 500.0, 800.0) + assert solver.dt == pytest.approx(0.0005, rel=1e-4) + + with pytest.raises(AssertionError): + solver.initialize_physical_parameters(5, 500, 800) + def test_set_initial_condition(): """ Checks function SolveDiffusion2D.get_initial_function """ solver = SolveDiffusion2D() + + solver.T_cold = 0.0 + solver.T_hot = 1.0 + solver.dx = 1.0 + solver.dy = 1.0 + solver.nx = 8 + solver.ny = 8 + + # 8x8 domain with circle at (5,5) + expected_field = np.array( + [[0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 1., 1., 1., 0.], + [0., 0., 0., 0., 1., 1., 1., 0.], + [0., 0., 0., 0., 1., 1., 1., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.]] + ) + + actual_field = solver.set_initial_condition() + + error_norm = np.linalg.norm(expected_field - actual_field) + assert 0 == pytest.approx(error_norm, abs=1e-14) From ecfcc4779f0fad76b6f7c70023f80b0534db5cbb Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 11:51:56 +0100 Subject: [PATCH 2/8] add test coverage report --- coverage-report.pdf | Bin 0 -> 47518 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 coverage-report.pdf diff --git a/coverage-report.pdf b/coverage-report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7920f3d7658515081c5340176db6f6b5e78b824b GIT binary patch literal 47518 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

s1Z#^7%oG$ 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 N{IpF>$UdH`{{^VI&J6$n literal 0 HcmV?d00001 From 7ea2906b974271b821d0c44dfcbf92cefae6612e Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 13:25:57 +0100 Subject: [PATCH 3/8] add missing test --- tests/integration/test_diffusion2d.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/integration/test_diffusion2d.py b/tests/integration/test_diffusion2d.py index cd58ed8..a0647f0 100644 --- a/tests/integration/test_diffusion2d.py +++ b/tests/integration/test_diffusion2d.py @@ -3,7 +3,9 @@ """ from diffusion2d import SolveDiffusion2D -import pytest + +import pytest +import numpy as np def test_initialize_physical_parameters(): """ @@ -32,3 +34,20 @@ def test_set_initial_condition(): solver.initialize_domain(8.0, 8.0, 1.0, 1.0) solver.initialize_physical_parameters(4.0, 0.0, 1.0) + + # 8x8 domain with circle at (5,5) + expected_field = np.array( + [[0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.], + [0., 0., 0., 0., 1., 1., 1., 0.], + [0., 0., 0., 0., 1., 1., 1., 0.], + [0., 0., 0., 0., 1., 1., 1., 0.], + [0., 0., 0., 0., 0., 0., 0., 0.]] + ) + + actual_field = solver.set_initial_condition() + + error_norm = np.linalg.norm(expected_field - actual_field) + assert 0 == pytest.approx(error_norm, abs=1e-14) From 1234260e5f478904e34568bf47b13607c83c62ec Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 13:26:17 +0100 Subject: [PATCH 4/8] update report --- coverage-report.pdf | Bin 47518 -> 46944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/coverage-report.pdf b/coverage-report.pdf index 7920f3d7658515081c5340176db6f6b5e78b824b..1e553e9d662e03fd4272dfb88aa1717a8517f8dc 100644 GIT binary patch delta 20792 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 V44JCc$jhjvsLm)UX=HB9_&+5h@gV>J From c6f1cf38a02cafc978aecf38cbf28392910e6650 Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 13:26:33 +0100 Subject: [PATCH 5/8] add tox configuration and requirements --- requirements.txt | 16 ++++++++++++++++ tox.toml | 8 ++++++++ 2 files changed, 24 insertions(+) create mode 100644 requirements.txt create mode 100644 tox.toml diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..84f6782 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +contourpy==1.3.3 +coverage==7.13.1 +cycler==0.12.1 +fonttools==4.61.1 +iniconfig==2.3.0 +kiwisolver==1.4.9 +matplotlib==3.10.8 +numpy==2.4.1 +packaging==25.0 +pillow==12.1.0 +pluggy==1.6.0 +Pygments==2.19.2 +pyparsing==3.3.1 +pytest==9.0.2 +python-dateutil==2.9.0.post0 +six==1.17.0 diff --git a/tox.toml b/tox.toml new file mode 100644 index 0000000..b1d0b4f --- /dev/null +++ b/tox.toml @@ -0,0 +1,8 @@ +[tox] +envlist = ["test"] +requires = ["tox>=4"] + +[env.test] +description = "Run test suite with pytest." +deps = "-r requirements.txt" +commands = [["python","-m","pytest"]] From 0dc43b97751738e867c91d7f093497c92c5a6054 Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 13:27:33 +0100 Subject: [PATCH 6/8] gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f80bf4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.venv +__pycache__ +htmlcov +.pytest_cache +.coverage \ No newline at end of file From 65975bb754d11b1440dbc64f35bf77f851f51bf7 Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 13:34:07 +0100 Subject: [PATCH 7/8] remove print in set_initial_condition() --- diffusion2d.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/diffusion2d.py b/diffusion2d.py index 59f69ea..8919154 100644 --- a/diffusion2d.py +++ b/diffusion2d.py @@ -71,8 +71,6 @@ def set_initial_condition(self): if p2 < r2: u[i, j] = self.T_hot - print(u) - return u.copy() def do_timestep(self, u_nm1): From 657f1d0e8491224466ea7ebba63400922d030560 Mon Sep 17 00:00:00 2001 From: FabioTucciarone Date: Sat, 17 Jan 2026 13:39:21 +0100 Subject: [PATCH 8/8] simplify requirements.txt --- requirements.txt | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/requirements.txt b/requirements.txt index 84f6782..e072a28 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,3 @@ -contourpy==1.3.3 -coverage==7.13.1 -cycler==0.12.1 -fonttools==4.61.1 -iniconfig==2.3.0 -kiwisolver==1.4.9 -matplotlib==3.10.8 -numpy==2.4.1 -packaging==25.0 -pillow==12.1.0 -pluggy==1.6.0 -Pygments==2.19.2 -pyparsing==3.3.1 -pytest==9.0.2 -python-dateutil==2.9.0.post0 -six==1.17.0 +matplotlib +numpy +pytest \ No newline at end of file