From 2071f4fb0c87614b6955eb42d636096eef4a246f Mon Sep 17 00:00:00 2001 From: Isik Ozsoy Date: Fri, 16 Jan 2026 01:17:10 +0100 Subject: [PATCH] Unit tests and integration test were implemented. Coverage report was added. --- coverage-report.pdf | Bin 0 -> 54250 bytes diffusion2d.py | 9 ++- requirements.txt | 3 + tests/integration/test_diffusion2d.py | 67 +++++++++++++++++++++-- tests/unit/test_diffusion2d_functions.py | 67 ++++++++++++++++++----- tox.toml | 7 +++ 6 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 coverage-report.pdf create mode 100644 requirements.txt create mode 100644 tox.toml diff --git a/coverage-report.pdf b/coverage-report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9ddde60da11d3c16ad832aa48b723e4f6a1375a5 GIT binary patch literal 54250 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

0>b}$C*Nvx(sanuc8de)JJ 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 300.0) and np.all(solver_u <= 700.0) diff --git a/tests/unit/test_diffusion2d_functions.py b/tests/unit/test_diffusion2d_functions.py index c4277ff..5863374 100644 --- a/tests/unit/test_diffusion2d_functions.py +++ b/tests/unit/test_diffusion2d_functions.py @@ -3,24 +3,65 @@ """ from diffusion2d import SolveDiffusion2D +import numpy as np +import pytest -def test_initialize_domain(): - """ - Check function SolveDiffusion2D.initialize_domain - """ - solver = SolveDiffusion2D() +@pytest.fixture +def solver(): + """Fixture to provide a fresh instance of the solver for each test.""" + return SolveDiffusion2D() -def test_initialize_physical_parameters(): - """ - Checks function SolveDiffusion2D.initialize_domain - """ - solver = SolveDiffusion2D() +def test_initialize_domain(solver): + """initialize_domain sets attributes and computes nx/ny correctly.""" + solver.initialize_domain(w=2.0, h=4.0, dx=0.1, dy=0.1) + + assert solver.nx == 20 + assert solver.ny == 40 + assert solver.dx == 0.1 + assert solver.dy == 0.1 + assert solver.w == 2.0 + assert solver.h == 4.0 + + +def test_initialize_physical_parameters(solver): + """initialize_physical_parameters stores values and computes stable dt.""" + # Manually setting dependencies to avoid calling initialize_domain + solver.dx = 0.1 + solver.dy = 0.1 + + solver.initialize_physical_parameters(d=4.0, T_cold=300.0, T_hot=700.0) + + expected_dt = 0.000625 + assert solver.D == 4.0 + assert solver.T_cold == 300.0 + assert solver.T_hot == 700.0 + + assert pytest.approx(solver.dt) == expected_dt -def test_set_initial_condition(): +def test_set_initial_condition(solver): """ - Checks function SolveDiffusion2D.get_initial_function + Checks function SolveDiffusion2D.set_initial_function """ - solver = SolveDiffusion2D() + solver.nx = 100 + solver.ny = 100 + solver.dx = 0.1 + solver.dy = 0.1 + solver.T_cold = 300.0 + solver.T_hot = 700.0 + + u = solver.set_initial_condition() + + # Check shape + assert u.shape == (100, 100) + + # Check a corner (should be cold) + assert u[0, 0] == 300.0 + + # Check the center (5, 5) -> index (50, 50) (should be hot) + assert u[50, 50] == 700.0 + + # Check that we actually have both temperatures present + assert np.all((u == 300.0) | (u == 700.0)) diff --git a/tox.toml b/tox.toml new file mode 100644 index 0000000..a11b98c --- /dev/null +++ b/tox.toml @@ -0,0 +1,7 @@ +requires = ["tox>=4"] +env_list = ["pytest_testing"] + +[env.pytest_testing] +description = "Run pytest" +deps = ["-r requirements.txt"] +commands = [["python","-m","pytest"]]