From 4905b04433e1ccbcbedc2e82c0d377ed471143ad Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 14:58:45 +0100 Subject: [PATCH 1/8] assert in main --- diffusion2d.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/diffusion2d.py b/diffusion2d.py index 51a07f2d..e4f90345 100644 --- a/diffusion2d.py +++ b/diffusion2d.py @@ -38,6 +38,8 @@ def __init__(self): self.dt = None def initialize_domain(self, w=10., h=10., dx=0.1, dy=0.1): + for input in [w, h, dx, dy]: + assert isinstance(input,float) self.w = w self.h = h self.dx = dx @@ -45,7 +47,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., T_hot=700.): + for input in [d, T_cold, T_hot]: + assert isinstance(input, float) self.D = d self.T_cold = T_cold self.T_hot = T_hot From 32402652f3dbb88d84072f010cdd3a63115d0e1f Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 14:59:08 +0100 Subject: [PATCH 2/8] unittest and init --- tests/unit/__init__.py | 0 tests/unit/test_diffusion2d_functions.py | 84 +++++++++++++++++++----- 2 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 tests/unit/__init__.py diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/test_diffusion2d_functions.py b/tests/unit/test_diffusion2d_functions.py index c4277ffd..c9b10073 100644 --- a/tests/unit/test_diffusion2d_functions.py +++ b/tests/unit/test_diffusion2d_functions.py @@ -3,24 +3,78 @@ """ from diffusion2d import SolveDiffusion2D +import unittest +from unittest import TestCase +class TestDiffusion2D(TestCase): + def setUp(self): + # fixture + self.data_domain = [25., 40., 0.25, 0.5] + self.data_params = [10., 20., 1200., 10., 2.] + self.data_condition = [1., 1., 10, 10, 300., 700.] -def test_initialize_domain(): - """ - Check function SolveDiffusion2D.initialize_domain - """ - solver = SolveDiffusion2D() + def test_initialize_domain(self): + """ + Check function SolveDiffusion2D.initialize_domain + """ + solver = SolveDiffusion2D() + w, h, dx, dy = self.data_domain + # test + solver.initialize_domain(w, h, dx, dy) + self.assertEqual(solver.w, w) + self.assertEqual(solver.h, h) + self.assertEqual(solver.dx, dx) + self.assertEqual(solver.dy, dy) + self.assertIsInstance(solver.nx, int) + self.assertEqual(solver.nx, 100) + self.assertIsInstance(solver.ny, int) + self.assertEqual(solver.ny, 80) -def test_initialize_physical_parameters(): - """ - Checks function SolveDiffusion2D.initialize_domain - """ - solver = SolveDiffusion2D() + def test_initialize_physical_parameters(self): + """ + Checks function SolveDiffusion2D.initialize_physical_parameters + """ + solver = SolveDiffusion2D() + d, T_cold, T_hot, solver.dx, solver.dy = self.data_params + solver.initialize_physical_parameters(d, T_cold, T_hot) + expected_dt = 0.192308 + # test + self.assertEqual(solver.D, d) + self.assertEqual(solver.T_cold, T_cold) + self.assertEqual(solver.T_hot, T_hot) + self.assertAlmostEqual(solver.dt, expected_dt, 6) -def test_set_initial_condition(): - """ - Checks function SolveDiffusion2D.get_initial_function - """ - solver = SolveDiffusion2D() + def test_set_initial_condition(self): + """ + Check function SolveDiffusion2D.set_initial_condition + """ + solver = SolveDiffusion2D() + import numpy as np + + # Directly set necessary attributes + solver.dx, solver.dy, solver.nx, solver.ny, solver.T_cold, solver.T_hot = self.data_condition + + # Parameters for the hot circle + r, cx, cy = 2, 5, 5 # Radius and center of the hot circle + r2 = r ** 2 + + # Call the method to generate the computed grid + computed_u = solver.set_initial_condition() + + # Generate the ground truth + expected_u = solver.T_cold * np.ones((solver.nx, solver.ny)) + for i in range(solver.nx): + for j in range(solver.ny): + p2 = (i * solver.dx - cx) ** 2 + (j * solver.dy - cy) ** 2 + if p2 < r2: + expected_u[i, j] = solver.T_hot + + # Assert that the computed and expected grids are the same + self.assertTrue(np.allclose(computed_u, expected_u)) + + +if __name__ == "__main__": + # Run the tests + unittest.main() From d1d03501f2ad4f5b323ff1bfc988807ed6913cd4 Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 14:59:27 +0100 Subject: [PATCH 3/8] pytest integration and init --- tests/integration/__init__.py | 0 tests/integration/test_diffusion2d.py | 35 +++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 tests/integration/__init__.py diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/integration/test_diffusion2d.py b/tests/integration/test_diffusion2d.py index fd026b40..62968273 100644 --- a/tests/integration/test_diffusion2d.py +++ b/tests/integration/test_diffusion2d.py @@ -3,17 +3,48 @@ """ from diffusion2d import SolveDiffusion2D - +import pytest def test_initialize_physical_parameters(): """ Checks function SolveDiffusion2D.initialize_domain """ solver = SolveDiffusion2D() + + # fixture + w, h, dx, dy = [25., 40., 10., 2.] + solver.initialize_domain(w, h, dx, dy) + d, T_cold, T_hot = [10., 20., 1200.] + solver.initialize_physical_parameters(d, T_cold, T_hot) + expected_dt = pytest.approx(0.192308,abs=1e-6) + assert expected_dt == solver.dt def test_set_initial_condition(): """ - Checks function SolveDiffusion2D.get_initial_function + Check function SolveDiffusion2D.set_initial_condition """ solver = SolveDiffusion2D() + import numpy as np + + # Directly set necessary attributes + solver.dx, solver.dy, solver.nx, solver.ny, solver.T_cold, solver.T_hot = [0.1,0.3,100,130,30.,897] + + # Parameters for the hot circle + r, cx, cy = 2, 5, 5 # Radius and center of the hot circle + r2 = r ** 2 + + # Call the method to generate the computed grid + computed_u = solver.set_initial_condition() + + # Generate the ground truth + expected_u = solver.T_cold * np.ones((solver.nx, solver.ny)) + for i in range(solver.nx): + for j in range(solver.ny): + p2 = (i * solver.dx - cx) ** 2 + (j * solver.dy - cy) ** 2 + if p2 < r2: + expected_u[i, j] = solver.T_hot + + # Assert that the computed and expected grids are the same + assert np.allclose(computed_u, expected_u) + From 9a91e8ffa09dc5f8ad556e84d5de1d140e0f2206 Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 14:59:38 +0100 Subject: [PATCH 4/8] init in tests --- tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b From d47bc4944a4ea32e836c0e1af4a53aeb2797da46 Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 14:59:49 +0100 Subject: [PATCH 5/8] coverage report --- coverage-report.pdf | Bin 0 -> 87465 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..09d0400685b8bd7265bb1333613caf3e694110a1 GIT binary patch literal 87465 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%0D2v*KB_aV6 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 c}TL{IzJPv+-+f)!OSQ-B)*EbjKF^Ydnp*UiDP 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 literal 0 HcmV?d00001 From 6ebdb3e1f4a6367d9f8ccfdf0a990522e4ecd938 Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 15:00:00 +0100 Subject: [PATCH 6/8] requirements for tox --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..6cdf7cde --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +numpy +matplotlib +pytest \ No newline at end of file From 932e504b8f78ced82fdedf4f98d29e62773b7f43 Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 15:00:20 +0100 Subject: [PATCH 7/8] tox configuration --- tox.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tox.toml diff --git a/tox.toml b/tox.toml new file mode 100644 index 00000000..44dccb8f --- /dev/null +++ b/tox.toml @@ -0,0 +1,10 @@ +requires = ["tox>=4"] +env_list = ["testing"] + +[env.testing] +description = "Run pytest and unittest" +deps = "-rrequirements.txt" +commands = [ + ["pytest"], + ["python", "-m", "unittest", "discover"] + ] \ No newline at end of file From 211970016b240c7e6fa85a62fd2bc0767f79990b Mon Sep 17 00:00:00 2001 From: Pinku-Neko Date: Wed, 15 Jan 2025 15:00:31 +0100 Subject: [PATCH 8/8] logs in readme --- README.md | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/README.md b/README.md index da66993c..b2fb9c6d 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,152 @@ Please follow the instructions in [python_testing_exercise.md](https://github.co ## Test logs (for submission) ### pytest log +``` +tests\integration\test_diffusion2d.py .. [ 40%] +tests\unit\test_diffusion2d_functions.py F.. [100%] + +============================================================= FAILURES ============================================================= +______________________________________________________ test_initialize_domain ______________________________________________________ + + def test_initialize_domain(): + """ + Check function SolveDiffusion2D.initialize_domain + """ + solver = SolveDiffusion2D() + # fixture + w = 25. + h = 40. + dx = 0.25 + dy = 0.5 + + # test + solver.initialize_domain(w, h, dx, dy) + assert solver.w == w + assert solver.h == h + assert solver.dx == dx + assert solver.dy == dy +> assert (solver.nx == 100) and (isinstance(solver.nx, int)) +E assert (160 == 100) +E + where 160 = .nx + +tests\unit\test_diffusion2d_functions.py:26: AssertionError +===================================================== short test summary info ====================================================== +FAILED tests/unit/test_diffusion2d_functions.py::test_initialize_domain - assert (160 == 100) +=================================================== 1 failed, 4 passed in 0.40s ==================================================== + +``` ### unittest log +``` +Fdt = 192.30769230769232 +FF +====================================================================== +FAIL: test_initialize_domain (tests.unit.test_diffusion2d_functions.TestDiffusion2D) +Check function SolveDiffusion2D.initialize_domain +---------------------------------------------------------------------- +Traceback (most recent call last): + File "D:\SSM\exercise\testing-python-exercise-wt2425\tests\unit\test_diffusion2d_functions.py", line 32, in test_initialize_domain + self.assertEqual(solver.ny, 80) +AssertionError: 50 != 80 + +====================================================================== +FAIL: test_initialize_physical_parameters (tests.unit.test_diffusion2d_functions.TestDiffusion2D) +Checks function SolveDiffusion2D.initialize_physical_parameters +---------------------------------------------------------------------- +Traceback (most recent call last): + File "D:\SSM\exercise\testing-python-exercise-wt2425\tests\unit\test_diffusion2d_functions.py", line 47, in test_initialize_physical_parameters + self.assertAlmostEqual(solver.dt, expected_dt, 6) +AssertionError: 192.30769230769232 != 0.192308 within 6 places (192.11538430769232 difference) + +====================================================================== +FAIL: test_set_initial_condition (tests.unit.test_diffusion2d_functions.TestDiffusion2D) +Check function SolveDiffusion2D.set_initial_condition +---------------------------------------------------------------------- +Traceback (most recent call last): + File "D:\SSM\exercise\testing-python-exercise-wt2425\tests\unit\test_diffusion2d_functions.py", line 75, in test_set_initial_condition + self.assertTrue(np.allclose(computed_u, expected_u)) +AssertionError: False is not true + +---------------------------------------------------------------------- +Ran 3 tests in 0.002s + +FAILED (failures=3) +``` + +## integration test log + +``` +======================================================= test session starts ======================================================== +platform win32 -- Python 3.10.11, pytest-8.3.4, pluggy-1.5.0 +rootdir: D:\SSM\exercise\testing-python-exercise-wt2425 +collected 2 items + +tests\integration\test_diffusion2d.py FF [100%] + +============================================================= FAILURES ============================================================= +_______________________________________________ test_initialize_physical_parameters ________________________________________________ + + def test_initialize_physical_parameters(): + """ + Checks function SolveDiffusion2D.initialize_domain + """ + solver = SolveDiffusion2D() + + # fixture + w, h, dx, dy = [25., 40., 10., 2.] + solver.initialize_domain(w, h, dx, dy) + d, T_cold, T_hot = [10., 20., 1200.] + solver.initialize_physical_parameters(d, T_cold, T_hot) + expected_dt = pytest.approx(0.192308,abs=1e-6) +> assert expected_dt == solver.dt +E assert 0.192308 ± 1.0e-06 == 1.1923076923076923 +E +E comparison failed +E Obtained: 1.1923076923076923 +E Expected: 0.192308 ± 1.0e-06 + +tests\integration\test_diffusion2d.py:20: AssertionError +------------------------------------------------------- Captured stdout call ------------------------------------------------------- +dt = 1.1923076923076923 +____________________________________________________ test_set_initial_condition ____________________________________________________ + + def test_set_initial_condition(): + """ + Check function SolveDiffusion2D.set_initial_condition + """ + solver = SolveDiffusion2D() + import numpy as np + + # Directly set necessary attributes + solver.dx, solver.dy, solver.nx, solver.ny, solver.T_cold, solver.T_hot = [0.1,0.3,100,130,30.,897] + + # Parameters for the hot circle + r, cx, cy = 2, 5, 5 # Radius and center of the hot circle + r2 = r ** 2 + + # Call the method to generate the computed grid + computed_u = solver.set_initial_condition() + + # Generate the ground truth + expected_u = solver.T_cold * np.ones((solver.nx, solver.ny)) + for i in range(solver.nx): + for j in range(solver.ny): + p2 = (i * solver.dx - cx) ** 2 + (j * solver.dy - cy) ** 2 + if p2 < r2: + expected_u[i, j] = solver.T_hot + + # Assert that the computed and expected grids are the same +> assert np.allclose(computed_u, expected_u) +E AssertionError: assert False +E + where False = (array([[30., 30., 30., ..., 30., 30., 30.],\n [30., 30., 30., ..., 30., 30., 30.],\n [30., 30., 30., ..., 30..., 30., 30.],\n [30., 30., 30., ..., 30., 30., 30.],\n [30., 30., 30., ..., 30., 30., 30.]], shape=(100, 130)), array([[30., 30., 30., ..., 30., 30., 30.],\n [30., 30., 30., ..., 30., 30., 30.],\n [30., 30., 30., ..., 30..., 30., 30.],\n [30., 30., 30., ..., 30., 30., 30.],\n [30., 30., 30., ..., 30., 30., 30.]], shape=(100, 130))) +E + where = .allclose + +tests\integration\test_diffusion2d.py:49: AssertionError +===================================================== short test summary info ====================================================== +FAILED tests/integration/test_diffusion2d.py::test_initialize_physical_parameters - assert 0.192308 ± 1.0e-06 == 1.1923076923076923 +FAILED tests/integration/test_diffusion2d.py::test_set_initial_condition - AssertionError: assert False +======================================================== 2 failed in 0.43s ========================================================= +``` ## Citing