@@ -342,7 +342,7 @@ def test_it_raises_on_dim_not_found(self):
342342 )
343343
344344 # noinspection PyMethodMayBeStatic
345- def test_it_raises_on_on_missing_dtype_or_fill_value (self ):
345+ def test_it_raises_on_missing_dtype_or_fill_value (self ):
346346 with pytest .raises (ValueError ,
347347 match = "Missing 'dtype' in encoding configuration"
348348 " of variable 'b'" ):
@@ -358,3 +358,109 @@ def test_it_raises_on_on_missing_dtype_or_fill_value(self):
358358 },
359359 }
360360 )
361+
362+
363+ class DatasetMetadataSliceCompatibilityTest (unittest .TestCase ):
364+
365+ # noinspection PyMethodMayBeStatic
366+ def test_compatible (self ):
367+ target_md = DatasetMetadata .from_dataset (
368+ xr .Dataset ({
369+ "a" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
370+ dims = ("time" , "y" , "x" )),
371+ "b" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
372+ dims = ("time" , "y" , "x" )),
373+ }),
374+ {},
375+ )
376+ slice_md = DatasetMetadata .from_dataset (
377+ xr .Dataset ({
378+ "a" : xr .DataArray (np .zeros ((1 , 3 , 4 )),
379+ dims = ("time" , "y" , "x" )),
380+ "b" : xr .DataArray (np .zeros ((1 , 3 , 4 )),
381+ dims = ("time" , "y" , "x" )),
382+ }),
383+ {},
384+ )
385+
386+ # Should not raise
387+ target_md .assert_compatible_slice (slice_md , "time" )
388+
389+ # noinspection PyMethodMayBeStatic
390+ def test_raise_on_missing_dimension (self ):
391+ target_md = DatasetMetadata .from_dataset (
392+ xr .Dataset ({
393+ "a" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
394+ dims = ("time" , "y" , "x" )),
395+ "b" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
396+ dims = ("time" , "y" , "x" )),
397+ }),
398+ {},
399+ )
400+ slice_md = DatasetMetadata .from_dataset (
401+ xr .Dataset ({
402+ "a" : xr .DataArray (np .zeros ((1 , 3 )),
403+ dims = ("time" , "y" )),
404+ "b" : xr .DataArray (np .zeros ((1 , 3 )),
405+ dims = ("time" , "y" )),
406+ }),
407+ {},
408+ )
409+
410+ with pytest .raises (ValueError ,
411+ match = "Missing dimension 'x' in slice dataset" ):
412+ target_md .assert_compatible_slice (slice_md , "time" )
413+
414+ # noinspection PyMethodMayBeStatic
415+ def test_raise_on_wrong_dimension_size (self ):
416+ target_md = DatasetMetadata .from_dataset (
417+ xr .Dataset ({
418+ "a" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
419+ dims = ("time" , "y" , "x" )),
420+ "b" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
421+ dims = ("time" , "y" , "x" )),
422+ }),
423+ {},
424+ )
425+ slice_md = DatasetMetadata .from_dataset (
426+ xr .Dataset ({
427+ "a" : xr .DataArray (np .zeros ((12 , 4 , 4 )),
428+ dims = ("time" , "y" , "x" )),
429+ "b" : xr .DataArray (np .zeros ((12 , 4 , 4 )),
430+ dims = ("time" , "y" , "x" )),
431+ }),
432+ {},
433+ )
434+
435+ with pytest .raises (ValueError ,
436+ match = "Wrong size for dimension 'y'"
437+ " in slice dataset: expected 3, but found 4" ):
438+ target_md .assert_compatible_slice (slice_md , "time" )
439+
440+ # noinspection PyMethodMayBeStatic
441+ def test_raise_on_wrong_var_dimensions (self ):
442+ target_md = DatasetMetadata .from_dataset (
443+ xr .Dataset ({
444+ "a" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
445+ dims = ("time" , "y" , "x" )),
446+ "b" : xr .DataArray (np .zeros ((12 , 3 , 4 )),
447+ dims = ("time" , "y" , "x" )),
448+ }),
449+ {},
450+ )
451+ slice_md = DatasetMetadata .from_dataset (
452+ xr .Dataset ({
453+ "a" : xr .DataArray (np .zeros ((1 , 3 )),
454+ dims = ("time" , "y" )),
455+ "b" : xr .DataArray (np .zeros ((1 , 3 , 4 )),
456+ dims = ("time" , "y" , "x" )),
457+ }),
458+ {},
459+ )
460+
461+ with pytest .raises (ValueError ,
462+ match = "Wrong dimensions for variable 'a' in"
463+ " slice dataset:"
464+ " expected \\ ('time', 'y', 'x'\\ ),"
465+ " but found \\ ('time', 'y'\\ )" ):
466+ target_md .assert_compatible_slice (slice_md , "time" )
0 commit comments