Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve Field test coverage #22

Merged
merged 1 commit into from
Dec 8, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 35 additions & 17 deletions tests/test_field.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
import pytest
import numpy as np
from CADETPythonSimulator.field import Field, FieldInterpolator
import matplotlib.pyplot as plt
# %% Testing utilities


def assert_equal(value, expected, message=""):

Check failure on line 8 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:8:5: D103 Missing docstring in public function

Check failure on line 8 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:8:5: D103 Missing docstring in public function
message = f"Test failed: {message}. Expected {expected}, got {value}."
assert value == expected, message


def assert_shape(shape, expected_shape, message=""):

Check failure on line 13 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:13:5: D103 Missing docstring in public function

Check failure on line 13 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:13:5: D103 Missing docstring in public function
message = f"Test failed: {message}. Expected shape {expected_shape}, got {shape}."
assert shape == expected_shape, message


# %% Initialization

def test_field_initialization():

Check failure on line 20 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:20:5: D103 Missing docstring in public function

Check failure on line 20 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:20:5: D103 Missing docstring in public function
# Scalar field
dimensions = {
"axial": np.linspace(0, 10, 11),
Expand All @@ -26,52 +28,65 @@
assert_equal(viscosity.n_dof, 11 * 6, "Scalar field degrees of freedom")

# Vector field
concentration = Field(name="concentration", dimensions=dimensions, n_components=3)
concentration = Field(name="concentration",
dimensions=dimensions, n_components=3)
assert_shape(concentration.shape, (11, 6, 3), "Vector field shape")
assert_equal(concentration.n_dof, 11 * 6 * 3, "Vector field degrees of freedom")
assert_equal(concentration.n_dof, 11 * 6 * 3,
"Vector field degrees of freedom")

# Custom data
data = np.ones((11, 6, 3))
concentration_with_data = Field(name="concentration", dimensions=dimensions, n_components=3, data=data)
assert_shape(concentration_with_data.shape, (11, 6, 3), "Custom data field shape")
concentration_with_data = Field(
name="concentration", dimensions=dimensions, n_components=3, data=data)
assert_shape(concentration_with_data.shape,
(11, 6, 3), "Custom data field shape")

with pytest.raises(ValueError):
viscosity.data = np.ones((1, 2, 3))


# %% Plotting

def test_plotting():

Check failure on line 50 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:50:5: D103 Missing docstring in public function

Check failure on line 50 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:50:5: D103 Missing docstring in public function
# 1D Plot
dimensions = {"x": np.linspace(0, 10, 11)}
field_1D = Field(name="1D Field", dimensions=dimensions, n_components=2, data=np.random.random((11, 2)))
field_1D = Field(name="1D Field", dimensions=dimensions,
n_components=2, data=np.random.random((11, 2)))
fig, ax = field_1D.plot()
assert isinstance(ax, plt.Axes), "1D plot returns one axis"

# 2D Plot
dimensions = {"x": np.linspace(0, 10, 11), "y": np.linspace(0, 5, 6)}
field_2D = Field(name="2D Field", dimensions=dimensions, n_components=3, data=np.random.random((11, 6, 3)))
field_2D = Field(name="2D Field", dimensions=dimensions,
n_components=3, data=np.random.random((11, 6, 3)))
fig, axes = field_2D.plot()
assert len(axes) == 3, "2D plot returns one axis per component"


# %% Slicing

def test_field_slicing():

Check failure on line 68 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:68:5: D103 Missing docstring in public function

Check failure on line 68 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:68:5: D103 Missing docstring in public function
dimensions = {"axial": np.linspace(0, 10, 11), "radial": np.linspace(0, 5, 6)}
dimensions = {"axial": np.linspace(
0, 10, 11), "radial": np.linspace(0, 5, 6)}
field = Field(name="concentration", dimensions=dimensions, n_components=3)

# Slice along one dimension
field_sliced = field[{"axial": 0}]
assert_equal(len(field_sliced.dimensions), 1, "Field slicing reduces dimensionality")
assert_equal(len(field_sliced.dimensions), 1,
"Field slicing reduces dimensionality")
assert_shape(field_sliced.shape, (6, 3), "Field slicing shape")

# Slice along all dimensions
field_sliced_all = field[{"axial": 0, "radial": 0}]
assert_equal(len(field_sliced_all.dimensions), 0, "Full slicing removes all dimensions")
assert_shape(field_sliced_all.shape, (3,), "Full slicing results in vector")
assert_equal(len(field_sliced_all.dimensions), 0,
"Full slicing removes all dimensions")
assert_shape(field_sliced_all.shape, (3,),
"Full slicing results in vector")


# %% Normalization

def test_field_normalization():

Check failure on line 89 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:89:5: D103 Missing docstring in public function

Check failure on line 89 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:89:5: D103 Missing docstring in public function
# Define dimensions and data
x = np.linspace(0, 10, 11)
y = np.linspace(0, 5, 6)
Expand All @@ -89,17 +104,18 @@

# Test 2: Verify data normalization
normalized_data = normalized_field.data
assert np.isclose(np.min(normalized_data), 0.0), "Normalized data minimum is not 0."
assert np.isclose(np.max(normalized_data), 1.0), "Normalized data maximum is not 1."
assert np.isclose(np.min(normalized_data),
0.0), "Normalized data minimum is not 0."
assert np.isclose(np.max(normalized_data),
1.0), "Normalized data maximum is not 1."

# Test 3: Ensure original field is unchanged
assert np.array_equal(field.data, z), "Original field data was modified."



# %% Interpolation and Resampling

def test_temperature_use_case():

Check failure on line 118 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:118:5: D103 Missing docstring in public function

Check failure on line 118 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (D103)

tests/test_field.py:118:5: D103 Missing docstring in public function
temperature_profile_dimensions = {
"time": np.linspace(0, 3600, 3601),
"axial": np.linspace(0, 0.5, 6),
Expand All @@ -124,7 +140,7 @@

def calculate_parameter(t, x):
T = calculate_temperature_at_t_x(t, x)
k = calculate_adsorption_from_temperature(k_0, k_1, T)

Check failure on line 143 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (F841)

tests/test_field.py:143:9: F841 Local variable `k` is assigned to but never used

Check failure on line 143 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (F821)

tests/test_field.py:143:51: F821 Undefined name `k_0`

Check failure on line 143 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (F841)

tests/test_field.py:143:9: F841 Local variable `k` is assigned to but never used

Check failure on line 143 in tests/test_field.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (F821)

tests/test_field.py:143:51: F821 Undefined name `k_0`

def model_equation(t):
...
Expand All @@ -136,7 +152,8 @@
"radial": np.linspace(0, 5, 6)
}
data = np.random.random((11, 6, 3))
concentration = Field(name="concentration", dimensions=dimensions, n_components=3, data=data)
concentration = Field(name="concentration",
dimensions=dimensions, n_components=3, data=data)

# Interpolated field
interp_field = FieldInterpolator(concentration)
Expand All @@ -146,15 +163,17 @@

def test_resampling():
dimensions = {"x": np.linspace(0, 10, 11), "y": np.linspace(0, 5, 6)}
field = Field(name="concentration", dimensions=dimensions, n_components=2, data=np.random.random((11, 6, 2)))
field = Field(name="concentration", dimensions=dimensions,
n_components=2, data=np.random.random((11, 6, 2)))

# Resample one dimension
resampled_field = field.resample({"x": 50})
assert_shape(resampled_field.shape, (50, 6, 2), "Resampling one dimension")

# Resample all dimensions
resampled_field_all = field.resample({"x": 50, "y": 25})
assert_shape(resampled_field_all.shape, (50, 25, 2), "Resampling all dimensions")
assert_shape(resampled_field_all.shape, (50, 25, 2),
"Resampling all dimensions")


def test_field_interpolation_and_derivatives():
Expand Down Expand Up @@ -203,6 +222,5 @@

# %% Run tests

import pytest
if __name__ == "__main__":
pytest.main('test_field.py')
Loading