From 58ee37b1d01c6c9839a0d6723193a0f8e0ec257e Mon Sep 17 00:00:00 2001 From: Vaish-W Date: Mon, 20 Jan 2025 12:16:11 +0100 Subject: [PATCH] [wanivi] Adding tests --- .coverage | Bin 0 -> 53248 bytes README.md | 165 ++++++++++++++++++ __pycache__/diffusion2d.cpython-312.pyc | Bin 0 -> 6753 bytes coverage-report.pdf | Bin 0 -> 85743 bytes diffusion2d.py | 10 +- tests/__init__.py | 1 + tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 159 bytes tests/integration/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 171 bytes ...t_diffusion2d.cpython-312-pytest-8.3.3.pyc | Bin 0 -> 4879 bytes .../test_diffusion2d.cpython-312.pyc | Bin 0 -> 2682 bytes tests/integration/test_diffusion2d.py | 46 ++++- tests/tox.toml | 22 +++ tests/unit/__init__.py | 1 + .../unit/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 164 bytes ...n2d_functions.cpython-312-pytest-8.3.3.pyc | Bin 0 -> 8240 bytes ...test_diffusion2d_functions.cpython-312.pyc | Bin 0 -> 2724 bytes ...usion2d_functions_unittest.cpython-312.pyc | Bin 0 -> 3737 bytes tests/unit/test_diffusion2d_functions.py | 34 +++- .../test_diffusion2d_functions_unittest.py | 47 +++++ 20 files changed, 323 insertions(+), 4 deletions(-) create mode 100644 .coverage create mode 100644 __pycache__/diffusion2d.cpython-312.pyc create mode 100644 coverage-report.pdf create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/integration/__init__.py create mode 100644 tests/integration/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/integration/__pycache__/test_diffusion2d.cpython-312-pytest-8.3.3.pyc create mode 100644 tests/integration/__pycache__/test_diffusion2d.cpython-312.pyc create mode 100644 tests/tox.toml create mode 100644 tests/unit/__init__.py create mode 100644 tests/unit/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/unit/__pycache__/test_diffusion2d_functions.cpython-312-pytest-8.3.3.pyc create mode 100644 tests/unit/__pycache__/test_diffusion2d_functions.cpython-312.pyc create mode 100644 tests/unit/__pycache__/test_diffusion2d_functions_unittest.cpython-312.pyc create mode 100644 tests/unit/test_diffusion2d_functions_unittest.py diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..a78b182c504018b24c52e8a011610e1df9c674ef GIT binary patch literal 53248 zcmeI)+i%-c90zbac9JD+<3csEs+xB8z`AN}x0K7oc-YETLB%eNPJ=-;&q+>NLt=Nf z)5`-w*^nlI_zw{L3yeR2e*g`Hc;N|nLVJNH5JE$O-_MsOS(|AspsC&0YU1np`JB(W zI8K_(T|8?CQq)|pVFltDWl&L7<&+SLqU7l@K#yd~(t@6>&|K|U?zNa#CYL`NFfJ?o znU59Y>c9nKqW_bDLw(=&H*z2LeVVm$721Ib0uX=z1RigJ*2Vs8ad=q0@m^q+>oV}H ziu9uAfzz+gOkbK2m!@AjJ0qfP;&5KjG%+Ejh3Bq_CFzNpU6;aks&>T+Y-d3Pi!wR7 z>B}l#=x7^V>iEFPFg-7sc9l{Ea)ClDd3M9{*2KGVZ9F_6K3gDHgJ=TwvZ zjRnbJwWd?yuHthUD(6CJr;>>|wO=rCcn5Ff_d}}z9Esl(+ zH*#S!ifb#LWxJYCQj?nuqsgv@wEU)*3?vU4B$E{FQ8MWx@g6G9L^e~L9_dw__&Bo^ zFYIY$^=xtPUbPkV2p*UCk?tx4Z)tad`z{0zpZz5(SQH!c&YLOYqv=fX#l5{U&RH-^ z{G7S@b}G#Bt>I9=L4!U&w5}}kmUfn3m1`5rR-HzZCCm1x%hDJeT>%6iSheV2tL!#| zu>JCC*gW~#)6Q=cpuL{h(@|sL;nclfbA8{Y%PL>C{1eGmF}i5^JPP@vqU^eLX*tog zfl|!+bWYnBVIDSKl}@%}_-h{CtXX&Mzseu1FkKz#Ls+}yoX=PwGOD+;*le2s~LC3Xq+*9x~Mm- zB-`<7s;iOQx3k?|F3^BWuXZ}y3EOpW@M?4h9^9fDEJq5-QSob?{21ThtHwQr{xCrR z0uX=z1Rwwb2tWV=5P$##Ah7!cG&QAW`Tjp;{G=Ga(i0{KKmY;|fB*y_009U<00Izz z00efVKz~ZxZzTWWacof4Muy}60XRPS{AB4E|C4{pxT_dJf=?@$AOHafKmY;| zfB*y_009UGMzNOf0Phi>@<4KO5pzY+p{S z1XIsWJs0lw=jjIrf^gBS+O=AfzqdbCHP?S-!{q%Oh`yqKB~9lz{@U>|JqoDZx zzg^#@Q9uYl00Izz00bZa0SG_<0uXq-1vFJt2Ke)T)%Z)HKTHsS00bZa0SG_<0uX=z z1Rwwb2<$=uO&iFC-~TsmE5@J3FUEJqSH_pLf(Zf;fB*y_009U<00Izz00bZafk!LQ zm(kVSzRc8}J3m}K-3TTRv~ZS6>GTFb`1!wrU;Nt pytest tests/unit/test_diffusion2d_functions.py +================================================================ test session starts ================================================================= +platform win32 -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0 +rootdir: D:\COMMAS\SSE\testing-python-exercise-wt2425 +collected 3 items + +tests\unit\test_diffusion2d_functions.py F.. [100%] + +====================================================================== FAILURES====================================================================== +_______________________________________________________________ test_initialize_domain _______________________________________________________________ + + def test_initialize_domain(): + """ + Check function SolveDiffusion2D.initialize_domain + """ + solver = SolveDiffusion2D() + + solver.initialize_domain(w=4.0, h=6.0, dx=0.2, dy=0.3) + + # Assert the values of the domain parameters +> assert solver.nx == 20 # 4.0 / 0.2 +E assert 30 == 20 +E + where 30 = .nx + +tests\unit\test_diffusion2d_functions.py:21: AssertionError +============================================================== short test summary info=============================================================== +FAILED tests/unit/test_diffusion2d_functions.py::test_initialize_domain - assert 30 == 20 +============================================================ 1 failed, 2 passed in 0.59s============================================================= ### unittest log +- Failure: + +.dt = 0.0010000000000000002 +F. +====================================================================== +FAIL: test_initialize_physical_parameters (__main__.TestSolveDiffusion2D.test_initialize_physical_parameters) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "D:\COMMAS\SSE\testing-python-exercise-wt2425\tests\unit\test_diffusion2d_functions_unittest.py", line 31, in test_initialize_physical_parameters + self.assertAlmostEqual(self.solver.dt, expected_dt, places=6, msg="dt calculation is incorrect") +AssertionError: 0.0010000000000000002 != 0.010000000000000002 within 6 places (0.009000000000000001 difference) : dt calculation is incorrect + +---------------------------------------------------------------------- +Ran 3 tests in 0.004s + +FAILED (failures=1) +Backend tkagg is interactive backend. Turning interactive mode on. + + +- After updating formula for dt + +.dt = 0.0010000000000000002 +.. +---------------------------------------------------------------------- +Ran 3 tests in 0.001s + +OK + +- with self.nx = int(h / dx) an intentional bug +Fdt = 0.0010000000000000002 +.. +====================================================================== +FAIL: test_initialize_domain (__main__.TestSolveDiffusion2D.test_initialize_domain) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "D:\COMMAS\SSE\testing-python-exercise-wt2425\tests\unit\test_diffusion2d_functions_unittest.py", line 22, in test_initialize_domain + self.assertEqual(self.solver.nx, 20, "nx calculation is incorrect") +AssertionError: 30 != 20 : nx calculation is incorrect + +---------------------------------------------------------------------- +Ran 3 tests in 0.003s + +FAILED (failures=1) +Backend tkagg is interactive backend. Turning interactive mode on. + +### integration_test log +- with intensional bug in initialize_physical_parameters and set_initial_condition + +================================================================ test session starts================================================================= +platform win32 -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0 +rootdir: D:\COMMAS\SSE\testing-python-exercise-wt2425 +collected 2 items + +tests\integration\test_diffusion2d.py F. [100%] + +====================================================================== FAILURES====================================================================== +________________________________________________________ test_initialize_physical_parameters _________________________________________________________ + + def test_initialize_physical_parameters(): + """ + Integration test for initialize_physical_parameters and initialize_domain + """ + solver = SolveDiffusion2D() + + # Initialize the domain + solver.initialize_domain(w=10.0, h=10.0, dx=0.1, dy=0.1) + + # Initialize physical parameters + D, T_cold, T_hot = 2.5, 250.0, 750.0 + solver.initialize_physical_parameters(d=D, T_cold=T_cold, T_hot=T_hot) + + # Manually compute expected dt + dx2, dy2 = solver.dx ** 2, solver.dy ** 2 + expected_dt = dx2 * dy2 / (2 * D * (dx2 + dy2)) + + # Assert dt is correctly calculated +> assert np.isclose(solver.dt, expected_dt, atol=1e-6), f"Expected dt: {expected_dt}, but got: {solver.dt}" +E AssertionError: Expected dt: 0.0010000000000000002, but got: 0.1 +E assert np.False_ +E + where np.False_ = (0.1, 0.0010000000000000002, atol=1e-06) +E + where = np.isclose +E + and 0.1 = .dt + +tests\integration\test_diffusion2d.py:31: AssertionError +---------------------------------------------------------------- Captured stdout call---------------------------------------------------------------- +dt = 0.1 +============================================================== short test summary info=============================================================== +FAILED tests/integration/test_diffusion2d.py::test_initialize_physical_parameters - AssertionError: Expected dt: 0.0010000000000000002, but got: 0.1 +============================================================ 1 failed, 1 passed in 0.58s============================================================= + +================================================================ test session starts ================================================================= +platform win32 -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0 +rootdir: D:\COMMAS\SSE\testing-python-exercise-wt2425 +collected 2 items + +tests\integration\test_diffusion2d.py .F [100%] + +====================================================================== FAILURES====================================================================== +_____________________________________________________________ test_set_initial_condition _____________________________________________________________ + + def test_set_initial_condition(): + """ + Integration test for set_initial_condition and initialize_domain + """ + solver = SolveDiffusion2D() + + # Initialize the domain + solver.initialize_domain(w=10.0, h=10.0, dx=1.0, dy=1.0) + + # Initialize physical parameters + solver.T_cold = 300.0 + solver.T_hot = 700.0 + + # Set initial conditions + u = solver.set_initial_condition() + + # Manually compute the expected initial condition array + expected_u = np.full((10, 10), 300.0) # Initialize with T_cold + r, cx, cy = 2, 5, 5 + r2 = r ** 2 + for i in range(10): + for j in range(10): + p2 = (i - cx) ** 2 + (j - cy) ** 2 + if p2 < r2: + expected_u[i, j] = 700.0 # Set T_hot for points inside the circle + + # Assert the computed field matches the expected field +> assert np.array_equal(u, expected_u), "The initial condition array is incorrect" +E AssertionError: The initial condition array is incorrect +E assert False +E + where False = (array([[700., 700., 700., 700., 700., 700., 700., 700., 700., 700.],\n [700., 700., 700., 700., 700., 700., 700.,... 700., 700., 700., 700., 700., 700., 700., 700.],\n [700., 700., 700., 700., 700., 700., 700., 700., 700., 700.]]), array([[300., 300., 300., 300., 300., 300., 300., 300., 300., 300.],\n [300., 300., 300., 300., 300., 300., 300.,... 300., 300., 300., 300., 300., 300., 300., 300.],\n [300., 300., 300., 300., 300., 300., 300., 300., 300., 300.]])) +E + where = np.array_equal +tests\integration\test_diffusion2d.py:61: AssertionError +============================================================== short test summary info=============================================================== +FAILED tests/integration/test_diffusion2d.py::test_set_initial_condition - AssertionError: The initial condition array is incorrect +============================================================ 1 failed, 1 passed in 0.57s============================================================= ## Citing The code used in this exercise is based on [Chapter 7 of the book "Learning Scientific Programming with Python"](https://scipython.com/book/chapter-7-matplotlib/examples/the-two-dimensional-diffusion-equation/). diff --git a/__pycache__/diffusion2d.cpython-312.pyc b/__pycache__/diffusion2d.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba3f32d797dd54381a5c3f85c54999aabb3994fd GIT binary patch literal 6753 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 literal 0 HcmV?d00001 diff --git a/coverage-report.pdf b/coverage-report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c1428d0222d1465421b07e6ab319690da29359d0 GIT binary patch literal 85743 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 literal 0 HcmV?d00001 diff --git a/diffusion2d.py b/diffusion2d.py index 51a07f2d..3e588a41 100644 --- a/diffusion2d.py +++ b/diffusion2d.py @@ -38,6 +38,10 @@ def __init__(self): self.dt = None def initialize_domain(self, w=10., h=10., dx=0.1, dy=0.1): + assert isinstance(w, float), "Width (w) must be a float" + assert isinstance(h, float), "Height (h) must be a float" + assert isinstance(dx, float), "dx must be a float" + assert isinstance(dy, float), "dy must be a float" self.w = w self.h = h self.dx = dx @@ -45,7 +49,10 @@ 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), "Diffusion coefficient (d) must be a float" + assert isinstance(T_cold, float), "Cold temperature (T_cold) must be a float" + assert isinstance(T_hot, float), "Hot temperature (T_hot) must be a float" self.D = d self.T_cold = T_cold self.T_hot = T_hot @@ -68,6 +75,7 @@ def set_initial_condition(self): if p2 < r2: u[i, j] = self.T_hot + return u.copy() def do_timestep(self, u_nm1): diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..0145fcae --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +# This file marks the directory as a Python package. diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a05ff2e7ffa63c50955fc365f27015aea7971bbe GIT binary patch literal 159 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 literal 0 HcmV?d00001 diff --git a/tests/integration/__pycache__/test_diffusion2d.cpython-312.pyc b/tests/integration/__pycache__/test_diffusion2d.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31cd1b5e1d92192cacab4a1d0ed742dcbf40bcbb GIT binary patch literal 2682 zcmb_eO>7fK6rR~#+iRQrnV;~_@*|X`g@OwLMG+(rkf03}O+adt%G!9=$p&X_X4il% z8<~oVM5T~i8dFp?oCpesa6r%-rwXY(*d!IvK&47OR2(WngH(xA->kh!lqPKt9eLl( zoA=G^d-LXf>mRDB0tnig9oKt)^da;sSKQ`UK$(#-LL-QvPDC&f;xXpfKC$y02|r;|>@G;9NMnb9N3-n3;z zwRj|{QLSIMb!sV^Ng%ni5R&NE4Aa@|x3Z_(ntQ&!$=i2_?n(?_V7QkF_#OMd{^mC*-B3Wl#{AVdFoi*-<)I{=S?jV8s#NRdBroqOfsKgMdJxe2ghyI z$GjH5$dut$$`eI-B{Gp*41-9ASx~RI6d|?+EQ0v?LVNphYh%}ukJ{Q=+Pm7@k9P56 zHq4%#$+X>@Fn8(~bs9A+edh%`yf?hhF z1gbjLG7)=xv?!@l(g}dnuDX#POcz=PFBQ&zo4%PIYq@!8V0r$?bZBKk999eGM)%xI zjfrE?yZ+Lqa4GbD{)0DOw5<9@<6z@ZY{VEgM%PX3{V8~$DD^*Td-Bec4aGBBvAg$K z_t{eS*`gLNHug_S{iWc68E_m$xp3Po8Jz!L$RLX%6&i#R^?+6>dZ+LfA#k^da`>Oi zmUxNe5^7E$K8JL~oRsrqMIv+JfWn_8XySKCxD|c68*IKMYzo-qtS>8N;F6a2$;v=5 zvswnuDd*1u8JvZ>XvvEgMX8v2}*%DPO5%~Bq)!5UOBH^)O{KP6q919c$|5t zX7=bTsPR1``ni-AR|9k<2jCP7%#uKgVakLkuwFFH1R7@8V7QM7$*{#kaj3x&bS+=I z)+y-4-@X$7Ti~&tg7~j>ymD>+*p;^F<*T9l5Q^4c^Gx1WlDAFD+w(0@j-eGJ^~3dr z)ua0+>(u;->Dv0s$D!=$KzQ087|;e+ky)U6t#U#%HvnGP)<>K@)+ zI5oUsbn|HU?d@ZyZf_{n?HV{dT~jx7_=^kETN{P~g*^qWu=i=L^4f<&>t2bdy8cZy zum6LC2Me1Eom0VvqSR5`(J?7?l!6U(J%pv!Fkd7>646M6iB{TTLc(HFQnP!R*Dx)e z+RUeQTh4^kmoQA`BL+3$o5bWuBxb~QSQwnglI3rJ$4vDn(@y>ynp1- z@S)N0o&C4>-)XwtG$B0n-S<7LxnJ{Gp4@%>$$`nO9h1vXPoXnEqlV`w^oKWuO+2$> K9X^d67ybeYhJhpi literal 0 HcmV?d00001 diff --git a/tests/integration/test_diffusion2d.py b/tests/integration/test_diffusion2d.py index fd026b40..9e8e8a6f 100644 --- a/tests/integration/test_diffusion2d.py +++ b/tests/integration/test_diffusion2d.py @@ -1,19 +1,61 @@ """ Tests for functionality checks in class SolveDiffusion2D """ +import sys +import os +# Add the root directory to the Python path +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))) from diffusion2d import SolveDiffusion2D +import numpy as np def test_initialize_physical_parameters(): """ - Checks function SolveDiffusion2D.initialize_domain + Integration test for initialize_physical_parameters and initialize_domain """ solver = SolveDiffusion2D() + + # Initialize the domain + solver.initialize_domain(w=10.0, h=10.0, dx=0.1, dy=0.1) + + # Initialize physical parameters + D, T_cold, T_hot = 2.5, 250.0, 750.0 + solver.initialize_physical_parameters(d=D, T_cold=T_cold, T_hot=T_hot) + + # Manually compute expected dt + dx2, dy2 = solver.dx ** 2, solver.dy ** 2 + expected_dt = dx2 * dy2 / (2 * D * (dx2 + dy2)) + + # Assert dt is correctly calculated + assert np.isclose(solver.dt, expected_dt, atol=1e-6), f"Expected dt: {expected_dt}, but got: {solver.dt}" def test_set_initial_condition(): """ - Checks function SolveDiffusion2D.get_initial_function + Integration test for set_initial_condition and initialize_domain """ solver = SolveDiffusion2D() + + # Initialize the domain + solver.initialize_domain(w=10.0, h=10.0, dx=1.0, dy=1.0) + + # Initialize physical parameters + solver.T_cold = 300.0 + solver.T_hot = 700.0 + + # Set initial conditions + u = solver.set_initial_condition() + + # Manually compute the expected initial condition array + expected_u = np.full((10, 10), 300.0) # Initialize with T_cold + r, cx, cy = 2, 5, 5 + r2 = r ** 2 + for i in range(10): + for j in range(10): + p2 = (i - cx) ** 2 + (j - cy) ** 2 + if p2 < r2: + expected_u[i, j] = 700.0 # Set T_hot for points inside the circle + + # Assert the computed field matches the expected field + assert np.array_equal(u, expected_u), "The initial condition array is incorrect" diff --git a/tests/tox.toml b/tests/tox.toml new file mode 100644 index 00000000..5dd905e7 --- /dev/null +++ b/tests/tox.toml @@ -0,0 +1,22 @@ +requires = ["tox>=4"] +env_list = ["unittest", "integrationtest", "coverage"] + +[testenv] +description = "Base environment for running tests" +deps = ["pytest>=8", "matplotlib", "numpy", "coverage"] + +[env.unittest] +description = "Run Unit Tests" +commands = [["pytest", "tests/unit/test_diffusion2d_functions.py"]] + +[env.integrationtest] +description = "Run Integration Tests" +commands = [["pytest", "tests/integration/test_diffusion2d.py"]] + +[env.coverage] +description = "Check Coverage" +commands = [ + ["coverage", "run", "-m", "pytest", "tests/"], + ["coverage", "html", "-d", "coverage-html"], + ["coverage", "report", "-m"] +] diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 00000000..0145fcae --- /dev/null +++ b/tests/unit/__init__.py @@ -0,0 +1 @@ +# This file marks the directory as a Python package. diff --git a/tests/unit/__pycache__/__init__.cpython-312.pyc b/tests/unit/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fbcdf5238e243808fd70dbf01335c9ae569f784 GIT binary patch literal 164 zcmX@j%ge<81b5Z?(#?SMV-N=&d}aZPOlPQM&}8&m$xy@u+2XC z6CCUsQ<7R-l9`vTTToe&k)NlVT9I0moLQWzTV7&hVq^-IE{-Y9%PfhBkIw{B@$q^E imA^P_a`RJ4b5iY!Sb=6T0&y{j@sXL4k+Fyw$N~TnqA2YE literal 0 HcmV?d00001 diff --git a/tests/unit/__pycache__/test_diffusion2d_functions.cpython-312-pytest-8.3.3.pyc b/tests/unit/__pycache__/test_diffusion2d_functions.cpython-312-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c854a84954267069365cba5027d87fda14aff3a GIT binary patch literal 8240 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 literal 0 HcmV?d00001 diff --git a/tests/unit/__pycache__/test_diffusion2d_functions_unittest.cpython-312.pyc b/tests/unit/__pycache__/test_diffusion2d_functions_unittest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10031e7993407e98e877d3736fcc525b9805cb58 GIT binary patch literal 3737 zcmb_eO>7fK6rNeH*XuYT34aMOjoeaN3?ymYR-g)z@Taz<1XPFqM2OYavq|hYw!6Cl z>_7@qDuUFOati4s>8VMB1f1I5a%|O$w+S-Z{s@UvZh>&>sqgK2?cl5tl{&KD&dmFp zpZCpsztz>%5NJ~9>j6U`m8w znhNJC8(1$}MY8U>CF@-z#d+8THs+by53v`{=1iX~-D3q{k(bIQ?pfB%REjL6Xtd{YCVkyKpQL9b>R?e*k@_Vy0=g{j$4 zsSzuBv_8cXAgeFKaFQqlZj$tIjE<8&595IH%mdWRc%VYo8y3vXxWIK*9ZP5yPZQ5z z^(7#aL@)82-CiV8X)a5`v?t7|s9*{j?oXYgCa)>UehsBU|C~Mg_L(CmPn-~Z?v1|=4&EGR%OEq*AJI!4K-%ers zwR7MNt1WiU@g_ZQ(m|7B7vP^=-V92)VCq6BCMRPfNg3li6vqgUrBzjl>A=iZWrn?~ z4-A-%ak$>NoQ&rbiKU0-c*+a_JQP(w_SuM>G`SRbOJ!Buh#f>KK3?Wlj2&s6a&C|7 z)w>ICM4P99TqgI$+UtR9fr7Zx5O>acX0s0IP#(dlHC9xayTv_+TZWW`Y?ql#$iex$uQpK(^RhI&!QY}!-}q`n%QV$ z=TLGutvLu{Iy}mFDrP{rkO5#SOk%o*OACc;H0`Jah>Pvq{^x?0i{>`)q}>GqINP>; zf=8r%xnXVBL0`lWBX^<;TYgdUVq{6|eb5w~9KA6*Id)@gw$W(XJ*(dyog2M9HaE7= zXmlJlwjNnHpO1c2h@Lf~XA4o;h{}1T--!0-hth?ibH>oQ!cf*2%H}VP8AD^n2cJJ8 z(KgJFseZJKpE8Q&YBMqtkZzvXj16I@Jv@W#eu^Elxl9qAScTBj(jtf#i0-XJ?*J zES+MIgCKj!sw!tg+Mt|Kp2}n@-bXHILmN4%v>t+T0#vO`m&`)Rfp~Z2h5a^)F=47f zB-??QTfl&mz~Id&u0h>`Jg>C|v(85IJE|fBx=oKZGVDN^jywh677M_x7IPidaqFt^ zBCJ500aBS3`8)hin-(@%Y4O| z_Jn<=C`l=J0VT<-k)+`?8%binR+6xUusJFQyoxoxx)VtokU3&mu%18_D>RE>=xF$4 zjg!Y5^@bk{Uhn(#@dm*gr>hM$-c!`pLIw1UHH##L8%&=B6-*2qd$g=(a%s)vGqOHt z3h@-yGp0}eRI?`dL>kH*AB(HFHnh$)uJ6bCyY&m=;%o2yvVU<$@8YJ@OXS0cr2a3m>xu9J uJw 0 + assert (u == 700.0).sum() > 0 diff --git a/tests/unit/test_diffusion2d_functions_unittest.py b/tests/unit/test_diffusion2d_functions_unittest.py new file mode 100644 index 00000000..0fae459d --- /dev/null +++ b/tests/unit/test_diffusion2d_functions_unittest.py @@ -0,0 +1,47 @@ +""" +Tests for functions in class SolveDiffusion2D using unittest +""" +import sys +import os + +# Add the root directory to the Python path +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))) + +import unittest +from diffusion2d import SolveDiffusion2D + + +class TestSolveDiffusion2D(unittest.TestCase): + def setUp(self): + self.solver = SolveDiffusion2D() + + def test_initialize_domain(self): + self.solver.initialize_domain(w=4.0, h=6.0, dx=0.2, dy=0.3) + + # Verify calculated nx and ny + self.assertEqual(self.solver.nx, 20, "nx calculation is incorrect") + self.assertEqual(self.solver.ny, 20, "ny calculation is incorrect") + + def test_initialize_physical_parameters(self): + self.solver.dx = 0.1 + self.solver.dy = 0.1 + self.solver.initialize_physical_parameters(d=2.5, T_cold=250.0, T_hot=750.0) + + expected_dt = (self.solver.dx ** 2) * (self.solver.dy ** 2) / (2 * 2.5 * ((self.solver.dx ** 2) + (self.solver.dy ** 2))) + self.assertAlmostEqual(self.solver.dt, expected_dt, places=6, msg="dt calculation is incorrect") + + def test_set_initial_condition(self): + self.solver.initialize_domain(w=10.0, h=10.0, dx=1.0, dy=1.0) + self.solver.T_cold = 300.0 + self.solver.T_hot = 700.0 + + u = self.solver.set_initial_condition() + + # Verify shape and temperature values + self.assertEqual(u.shape, (10, 10), "Initial condition array shape is incorrect") + self.assertGreater((u == 300.0).sum(), 0, "T_cold is not set correctly") + self.assertGreater((u == 700.0).sum(), 0, "T_hot is not set correctly") + + +if __name__ == "__main__": + unittest.main()