1515from emsarray .conventions import get_dataset_convention
1616from emsarray .conventions .grid import CFGrid1D , CFGridKind , CFGridTopology
1717from emsarray .operations import geometry
18- from tests .utils import box , mask_from_strings
18+ from tests .utils import assert_property_not_cached , box , mask_from_strings
1919
2020
2121def make_dataset (
@@ -24,6 +24,7 @@ def make_dataset(
2424 height : int ,
2525 depth : int = 5 ,
2626 time_size : int = 4 ,
27+ bounds : bool = False ,
2728) -> xr .Dataset :
2829 longitude_name = 'lon'
2930 latitude_name = 'lat'
@@ -116,18 +117,39 @@ def make_dataset(
116117 },
117118 )
118119
120+ data_vars = [
121+ time , lat , lon , depth_var ,
122+ botz , eta , temp ,
123+ ]
124+
125+ if bounds :
126+ lon_grid = np .concatenate ([
127+ lon .values - 0.08 ,
128+ [lon .values [- 1 ] + 0.02 ]
129+ ])
130+ lat_grid = np .concatenate ([
131+ lat .values - 0.07 ,
132+ [lat .values [- 1 ] + 0.03 ]
133+ ])
134+ lon_bounds = xr .DataArray (
135+ np .c_ [lon_grid [:- 1 ], lon_grid [1 :]],
136+ dims = [longitude_name , 'bounds' ],
137+ name = "lon_bounds" ,
138+ )
139+ lat_bounds = xr .DataArray (
140+ np .c_ [lat_grid [:- 1 ], lat_grid [1 :]],
141+ dims = [latitude_name , 'bounds' ],
142+ name = "lat_bounds" ,
143+ )
144+ lon .attrs ['bounds' ] = lon_bounds .name
145+ lat .attrs ['bounds' ] = lat_bounds .name
146+ data_vars += [lon_bounds , lat_bounds ]
147+
119148 dataset = xr .Dataset (
120- data_vars = {var .name : var for var in [
121- time , lat , lon , depth_var ,
122- botz , eta , temp
123- ]},
149+ data_vars = {var .name : var for var in data_vars },
124150 attrs = {
125- 'title' : "COMPAS defalt version" ,
126- 'paramhead' : "Example COMPAS grid" ,
127- 'paramfile' : "in.prm" ,
128- 'version' : "v1.0 rev(1234)" ,
129- 'Conventions' : "UGRID-1.0" ,
130- 'start_index' : 0 ,
151+ 'title' : "Example CFGrid1D" ,
152+ 'Conventions' : "CF-1.4" ,
131153 },
132154 )
133155 dataset .encoding ['unlimited_dims' ] = {'time' }
@@ -157,7 +179,7 @@ def test_varnames():
157179
158180
159181def test_polygons_no_bounds ():
160- dataset = make_dataset (width = 3 , height = 4 )
182+ dataset = make_dataset (width = 3 , height = 4 , bounds = False )
161183 polygons = dataset .ems .polygons
162184
163185 # Should be one item for every face
@@ -175,27 +197,7 @@ def test_polygons_no_bounds():
175197
176198
177199def test_polygons_bounds ():
178- dataset = make_dataset (width = 3 , height = 4 )
179- lon_grid = np .concatenate ([
180- dataset ['lon' ].values - 0.08 ,
181- [dataset ['lon' ].values [- 1 ] + 0.02 ]
182- ])
183- lat_grid = np .concatenate ([
184- dataset ['lat' ].values - 0.07 ,
185- [dataset ['lat' ].values [- 1 ] + 0.03 ]
186- ])
187- dataset = dataset .assign ({
188- 'lon_bounds' : xr .DataArray (
189- np .c_ [lon_grid [:- 1 ], lon_grid [1 :]],
190- dims = [dataset ['lon' ].dims [0 ], 'bounds' ],
191- ),
192- 'lat_bounds' : xr .DataArray (
193- np .c_ [lat_grid [:- 1 ], lat_grid [1 :]],
194- dims = [dataset ['lat' ].dims [0 ], 'bounds' ],
195- ),
196- })
197- dataset ['lon' ].attrs ['bounds' ] = 'lon_bounds'
198- dataset ['lat' ].attrs ['bounds' ] = 'lat_bounds'
200+ dataset = make_dataset (width = 3 , height = 4 , bounds = True )
199201 assert_allclose (dataset .ems .topology .longitude_bounds , dataset ['lon_bounds' ])
200202 assert_allclose (dataset .ems .topology .latitude_bounds , dataset ['lat_bounds' ])
201203
@@ -210,6 +212,32 @@ def test_polygons_bounds():
210212 tolerance = 1e-6 )
211213
212214
215+ def test_bounds_no_bounds ():
216+ dataset = make_dataset (width = 3 , height = 4 , bounds = False )
217+ assert_allclose (dataset .ems .bounds , (- 0.05 , - 0.05 , 0.25 , 0.35 ))
218+ assert_property_not_cached (dataset .ems , 'geometry' )
219+
220+
221+ def test_bounds_with_bounds ():
222+ dataset = make_dataset (width = 3 , height = 4 , bounds = True )
223+ assert_allclose (dataset .ems .bounds , (- 0.08 , - 0.07 , 0.22 , 0.33 ))
224+ assert_property_not_cached (dataset .ems , 'geometry' )
225+
226+
227+ def test_geometry ():
228+ dataset = make_dataset (width = 3 , height = 4 , bounds = False )
229+ assert_geometries_equal (
230+ dataset .ems .geometry ,
231+ Polygon ([
232+ (0.25 , - 0.05 ),
233+ (0.25 , 0.35 ),
234+ (- 0.05 , 0.35 ),
235+ (- 0.05 , - 0.05 ),
236+ (0.25 , - 0.05 ),
237+ ]),
238+ tolerance = 1e-6 )
239+
240+
213241def test_selector_for_index ():
214242 dataset = make_dataset (width = 11 , height = 7 , depth = 5 )
215243 convention : CFGrid1D = dataset .ems
0 commit comments