@@ -573,3 +573,37 @@ async def test_use_consolidated_false(
573573 assert len ([x async for x in good .members ()]) == 2
574574 assert good .metadata .consolidated_metadata
575575 assert sorted (good .metadata .consolidated_metadata .metadata ) == ["a" , "b" ]
576+
577+
578+ @pytest .mark .parametrize ("fill_value" , [np .nan , np .inf , - np .inf ])
579+ async def test_consolidated_metadata_encodes_special_chars (
580+ memory_store : Store , zarr_format : ZarrFormat , fill_value : float
581+ ):
582+ root = await group (store = memory_store , zarr_format = zarr_format )
583+ _child = await root .create_group ("child" , attributes = {"test" : fill_value })
584+ _time = await root .create_array ("time" , shape = (12 ,), dtype = np .float64 , fill_value = fill_value )
585+ await zarr .api .asynchronous .consolidate_metadata (memory_store )
586+
587+ root = await group (store = memory_store , zarr_format = zarr_format )
588+ root_buffer = root .metadata .to_buffer_dict (default_buffer_prototype ())
589+
590+ if zarr_format == 2 :
591+ root_metadata = json .loads (root_buffer [".zmetadata" ].to_bytes ().decode ("utf-8" ))["metadata" ]
592+ elif zarr_format == 3 :
593+ root_metadata = json .loads (root_buffer ["zarr.json" ].to_bytes ().decode ("utf-8" ))[
594+ "consolidated_metadata"
595+ ]["metadata" ]
596+
597+ if np .isnan (fill_value ):
598+ expected_fill_value = "NaN"
599+ elif np .isneginf (fill_value ):
600+ expected_fill_value = "-Infinity"
601+ elif np .isinf (fill_value ):
602+ expected_fill_value = "Infinity"
603+
604+ if zarr_format == 2 :
605+ assert root_metadata ["child/.zattrs" ]["test" ] == expected_fill_value
606+ assert root_metadata ["time/.zarray" ]["fill_value" ] == expected_fill_value
607+ elif zarr_format == 3 :
608+ assert root_metadata ["child" ]["attributes" ]["test" ] == expected_fill_value
609+ assert root_metadata ["time" ]["fill_value" ] == expected_fill_value
0 commit comments