Skip to content

Commit

Permalink
Improve Testing Coverage (#1158)
Browse files Browse the repository at this point in the history
* add tests for subset and cross-section

* fix parameter and add test for da subset

* add test for inverse indices

* remove unused func dec
  • Loading branch information
philipc2 authored Feb 7, 2025
1 parent cd3558a commit c99139d
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 19 deletions.
63 changes: 63 additions & 0 deletions test/test_cross_sections.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,31 @@
current_path = Path(__file__).resolve().parent
quad_hex_grid_path = current_path / 'meshfiles' / "ugrid" / "quad-hexagon" / 'grid.nc'
quad_hex_data_path = current_path / 'meshfiles' / "ugrid" / "quad-hexagon" / 'data.nc'
quad_hex_node_data = current_path / 'meshfiles' / "ugrid" / "quad-hexagon" / 'random-node-data.nc'
cube_sphere_grid = current_path / "meshfiles" / "ugrid" / "outCSne30" / "outCSne30.ug"

from uxarray.grid.intersections import constant_lat_intersections_face_bounds


def test_repr():
uxds = ux.open_dataset(quad_hex_grid_path, quad_hex_data_path)

# grid repr
grid_repr = uxds.uxgrid.cross_section.__repr__()
assert "constant_latitude" in grid_repr
assert "constant_longitude" in grid_repr
assert "constant_latitude_interval" in grid_repr
assert "constant_longitude_interval" in grid_repr

# data array repr
da_repr = uxds['t2m'].cross_section.__repr__()
assert "constant_latitude" in da_repr
assert "constant_longitude" in da_repr
assert "constant_latitude_interval" in da_repr
assert "constant_longitude_interval" in da_repr



def test_constant_lat_cross_section_grid():
uxgrid = ux.open_grid(quad_hex_grid_path)

Expand Down Expand Up @@ -120,6 +141,48 @@ def test_constant_lat_out_of_bounds():
assert len(candidate_faces) == 0



def test_const_lat_interval_da():
uxds = ux.open_dataset(quad_hex_grid_path, quad_hex_data_path)
uxds.uxgrid.normalize_cartesian_coordinates()

res = uxds['t2m'].cross_section.constant_latitude_interval(lats=(-10, 10))

assert len(res) == 4


def test_const_lat_interval_grid():
uxgrid = ux.open_grid(quad_hex_grid_path)

res = uxgrid.cross_section.constant_latitude_interval(lats=(-10, 10))

assert res.n_face == 4

res, indices = uxgrid.cross_section.constant_latitude_interval(lats=(-10, 10), return_face_indices=True)

assert len(indices) == 4

def test_const_lon_interva_da():
uxds = ux.open_dataset(quad_hex_grid_path, quad_hex_data_path)
uxds.uxgrid.normalize_cartesian_coordinates()

res = uxds['t2m'].cross_section.constant_longitude_interval(lons=(-10, 10))

assert len(res) == 4


def test_const_lon_interval_grid():
uxgrid = ux.open_grid(quad_hex_grid_path)

res = uxgrid.cross_section.constant_longitude_interval(lons=(-10, 10))

assert res.n_face == 4

res, indices = uxgrid.cross_section.constant_longitude_interval(lons=(-10, 10), return_face_indices=True)

assert len(indices) == 4


class TestArcs:
def test_latitude_along_arc(self):
node_lon = np.array([-40, -40, 40, 40])
Expand Down
28 changes: 28 additions & 0 deletions test/test_subset.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,24 @@
current_path / "meshfiles" / "ugrid" / "outCSne30" / "var2.nc"
]

quad_hex_grid_path = current_path / 'meshfiles' / "ugrid" / "quad-hexagon" / 'grid.nc'
quad_hex_data_path = current_path / 'meshfiles' / "ugrid" / "quad-hexagon" / 'data.nc'

def test_repr():
uxds = ux.open_dataset(quad_hex_grid_path, quad_hex_data_path)

# grid repr
grid_repr = uxds.uxgrid.subset.__repr__()
assert "bounding_box" in grid_repr
assert "bounding_circle" in grid_repr
assert "nearest_neighbor" in grid_repr

# data array repr
da_repr = uxds['t2m'].subset.__repr__()
assert "bounding_box" in da_repr
assert "bounding_circle" in da_repr
assert "nearest_neighbor" in da_repr


def test_grid_face_isel():
for grid_path in GRID_PATHS:
Expand Down Expand Up @@ -155,3 +173,13 @@ def test_inverse_indices():
# Test isel directly
subset = grid.isel(n_face=[1], inverse_indices=True)
assert subset.inverse_indices.face.values == 1


def test_da_subset():
uxds = ux.open_dataset(quad_hex_grid_path, quad_hex_data_path)

res1 = uxds['t2m'].subset.bounding_box(lon_bounds=(-10, 10), lat_bounds=(-10, 10))
res2 = uxds['t2m'].subset.bounding_circle(center_coord=(0,0), r=10)
res3 = uxds['t2m'].subset.nearest_neighbor(center_coord=(0, 0), k=4)

assert len(res1) == len(res2) == len(res3) == 4
11 changes: 0 additions & 11 deletions uxarray/cross_sections/dataarray_accessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,6 @@ def constant_latitude_interval(
lats : Tuple[float, float]
The latitude interval (min_lat, max_lat) at which to extract the cross-section,
in degrees. Values must be between -90.0 and 90.0
return_face_indices : bool, optional
If True, also returns the indices of the faces that intersect with the
latitude interval.
inverse_indices : Union[List[str], Set[str], bool], optional
Controls storage of original grid indices. Options:
- True: Stores original face indices
Expand Down Expand Up @@ -181,8 +178,6 @@ def constant_longitude_interval(
lons : Tuple[float, float]
The longitude interval (min_lon, max_lon) at which to extract the cross-section,
in degrees. Values must be between -180.0 and 180.0
return_face_indices : bool, optional
If True, also returns the indices of the faces that intersect are within a specifed longitude interval.
inverse_indices : Union[List[str], Set[str], bool], optional
Controls storage of original grid indices. Options:
- True: Stores original face indices
Expand Down Expand Up @@ -215,9 +210,3 @@ def constant_longitude_interval(
faces = self.uxda.uxgrid.get_faces_between_longitudes(lons)

return self.uxda.isel(n_face=faces, inverse_indices=inverse_indices)

def gca(self, *args, **kwargs):
raise NotImplementedError

def gca_gca(self, *args, **kwargs):
raise NotImplementedError
6 changes: 0 additions & 6 deletions uxarray/cross_sections/grid_accessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,6 @@ def constant_longitude(
else:
return grid_at_constant_lon

def gca(self, *args, **kwargs):
raise NotImplementedError

def constant_latitude_interval(
self,
lats: Tuple[float, float],
Expand Down Expand Up @@ -284,6 +281,3 @@ def constant_longitude_interval(
return grid_between_lons, faces
else:
return grid_between_lons

def gca_gca(self, *args, **kwargs):
raise NotImplementedError
6 changes: 4 additions & 2 deletions uxarray/subset/dataarray_accessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ def bounding_box(
- List/Set of strings: Stores specified index types (valid values: "face", "edge", "node")
- False: No index storage (default)
"""
grid = self.uxda.uxgrid.subset.bounding_box(lon_bounds, lat_bounds)
grid = self.uxda.uxgrid.subset.bounding_box(
lon_bounds, lat_bounds, inverse_indices=inverse_indices
)

return self.uxda._slice_from_grid(grid, inverse_indices=inverse_indices)
return self.uxda._slice_from_grid(grid)

def bounding_circle(
self,
Expand Down

0 comments on commit c99139d

Please sign in to comment.