diff --git a/coverage-report.pdf b/coverage-report.pdf new file mode 100644 index 0000000..01c4b60 Binary files /dev/null and b/coverage-report.pdf differ diff --git a/diffusion2d.py b/diffusion2d.py index 51a07f2..90b3c03 100644 --- a/diffusion2d.py +++ b/diffusion2d.py @@ -38,14 +38,22 @@ def __init__(self): self.dt = None def initialize_domain(self, w=10., h=10., dx=0.1, dy=0.1): + assert isinstance(w, float) + assert isinstance(h, float) + assert isinstance(dx, float) + assert isinstance(dy, float) self.w = w self.h = h self.dx = dx self.dy = dy - self.nx = int(w / dx) - self.ny = int(h / dy) - def initialize_physical_parameters(self, d=4., T_cold=300, T_hot=700): + self.nx = int(self.w / self.dx) + self.ny = int(self.h / self.dy) + + def initialize_physical_parameters(self, d=4., T_cold=300., T_hot=700.): + assert isinstance(d, float) + assert isinstance(T_cold, (float)) + assert isinstance(T_hot, (float)) self.D = d self.T_cold = T_cold self.T_hot = T_hot @@ -54,8 +62,6 @@ def initialize_physical_parameters(self, d=4., T_cold=300, T_hot=700): dx2, dy2 = self.dx * self.dx, self.dy * self.dy self.dt = dx2 * dy2 / (2 * self.D * (dx2 + dy2)) - print("dt = {}".format(self.dt)) - def set_initial_condition(self): u = self.T_cold * np.ones((self.nx, self.ny)) @@ -67,7 +73,6 @@ def set_initial_condition(self): p2 = (i * self.dx - cx) ** 2 + (j * self.dy - cy) ** 2 if p2 < r2: u[i, j] = self.T_hot - return u.copy() def do_timestep(self, u_nm1): @@ -109,7 +114,7 @@ def main(): DiffusionSolver.initialize_physical_parameters() u0 = DiffusionSolver.set_initial_condition() - + print(f"Initial condition u0 = {u0}") # Number of timesteps nsteps = 101 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..61b929a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +numpy +matplotlib +pytest +pytest-cov +coverage \ No newline at end of file diff --git a/tests/integration/test_diffusion2d.py b/tests/integration/test_diffusion2d.py index fd026b4..e309a8e 100644 --- a/tests/integration/test_diffusion2d.py +++ b/tests/integration/test_diffusion2d.py @@ -3,17 +3,42 @@ """ from diffusion2d import SolveDiffusion2D +import pytest +import numpy +@pytest.fixture +def solver(): + solver = SolveDiffusion2D() + solver.initialize_domain(10.0, 10.0, 0.1, 0.1) + return solver -def test_initialize_physical_parameters(): +@pytest.mark.parametrize( + ("d", "T_cold", "T_hot", "expected_dt"), + [(5.0, 321.0, 723.0, 0.0005)] +) +def test_initialize_physical_parameters(solver, d, T_cold, T_hot, expected_dt): """ Checks function SolveDiffusion2D.initialize_domain """ - solver = SolveDiffusion2D() + solver.initialize_physical_parameters(d, T_cold, T_hot) + solver.dt == pytest.approx(expected_dt, rel=1e-4) -def test_set_initial_condition(): + +@pytest.mark.parametrize(("T_cold", "T_hot", "radius"), + [(302.0, 700.0, 2.0)]) +def test_set_initial_condition(solver, T_cold, T_hot, radius): """ Checks function SolveDiffusion2D.get_initial_function """ - solver = SolveDiffusion2D() + solver.initialize_physical_parameters(4.0, T_cold, T_hot) + u = solver.set_initial_condition() + + cx = solver.w / radius + cy = solver.h / radius + + assert u.shape == (solver.nx, solver.ny) + + assert numpy.all(u >= T_cold) + assert numpy.all(u <= T_hot) + assert u[int(cx/solver.dx), int(cy/solver.dy)] == T_hot diff --git a/tests/unit/test_diffusion2d_functions.py b/tests/unit/test_diffusion2d_functions.py index c4277ff..6cae834 100644 --- a/tests/unit/test_diffusion2d_functions.py +++ b/tests/unit/test_diffusion2d_functions.py @@ -2,25 +2,68 @@ Tests for functions in class SolveDiffusion2D """ +from unittest.mock import MagicMock from diffusion2d import SolveDiffusion2D +import pytest +import numpy -def test_initialize_domain(): + +@pytest.mark.parametrize(("width", "height", "dx", "dy", "expected_dx", "expected_dy"), + [(11.0,12.0,0.5,0.3, 22, 40)] +) +def test_initialize_domain(width, height, dx, dy, expected_dx, expected_dy): """ Check function SolveDiffusion2D.initialize_domain """ solver = SolveDiffusion2D() + solver.initialize_domain(width, height, dx, dy) + assert solver.nx == expected_dx + assert solver.ny == expected_dy - -def test_initialize_physical_parameters(): +@pytest.mark.parametrize( + ("d", "T_cold", "T_hot", "expected_dt"), + [(5.0, 321.0, 723.0, 0.0005)] +) +def test_initialize_physical_parameters(d, T_cold, T_hot, expected_dt): """ Checks function SolveDiffusion2D.initialize_domain """ solver = SolveDiffusion2D() + solver.w = 10.0 + solver.h = 10.0 + solver.dx = 0.1 + solver.dy = 0.1 + solver.nx = 100 + solver.ny = 100 + + dt = solver.initialize_physical_parameters(d, T_cold, T_hot) + + solver.dt == pytest.approx(expected_dt, rel=1e-4) - -def test_set_initial_condition(): + +@pytest.mark.parametrize(("T_cold", "T_hot"), + [(302.0, 700.0)]) +def test_set_initial_condition(T_cold, T_hot): """ Checks function SolveDiffusion2D.get_initial_function """ + solver = SolveDiffusion2D() + solver.T_cold = T_cold + solver.T_hot = T_hot + solver.w = 10.0 + solver.h = 10.0 + solver.dx = 0.1 + solver.dy = 0.1 + solver.nx = 100 + solver.ny = 100 + + u = solver.set_initial_condition() + assert u.shape == (solver.nx, solver.ny) + assert numpy.all(u >= T_cold) + assert numpy.all(u <= T_hot) + assert u[50, 50] == T_hot + +def test_time_step(): + assert True \ No newline at end of file diff --git a/tox.toml b/tox.toml new file mode 100644 index 0000000..f2a2161 --- /dev/null +++ b/tox.toml @@ -0,0 +1,15 @@ +[tox] +env_list = ["pytest", "report"] +requires = ["tox>=4.0"] + +["testenv:pytest"] +description = "run pytest" +deps = ["-rrequirements.txt"] +commands = ["python3", "-m" ,"pytest"] + +["testenv:report"] +deps = ["-rrequirements.txt"] +commands = [ + ["coverage", "report"], + ["coverage", "json"] +] \ No newline at end of file