@@ -117,3 +117,31 @@ def test_scaling_offset_as_list(scale_factor, add_offset):
117117 encoded = coder .encode (original )
118118 roundtripped = coder .decode (encoded )
119119 assert_allclose (original , roundtripped )
120+
121+
122+ @pytest .mark .parametrize ("bits" , [1 , 2 , 4 , 8 ])
123+ def test_decode_unsigned_from_signed (bits ):
124+ unsigned_dtype = np .dtype (f"u{ bits } " )
125+ signed_dtype = np .dtype (f"i{ bits } " )
126+ original_values = np .array ([np .iinfo (unsigned_dtype ).max ], dtype = unsigned_dtype )
127+ encoded = xr .Variable (
128+ ("x" ,), original_values .astype (signed_dtype ), attrs = {"_Unsigned" : "true" }
129+ )
130+ coder = variables .UnsignedIntegerCoder ()
131+ decoded = coder .decode (encoded )
132+ assert decoded .dtype == unsigned_dtype
133+ assert decoded .values == original_values
134+
135+
136+ @pytest .mark .parametrize ("bits" , [1 , 2 , 4 , 8 ])
137+ def test_decode_signed_from_unsigned (bits ):
138+ unsigned_dtype = np .dtype (f"u{ bits } " )
139+ signed_dtype = np .dtype (f"i{ bits } " )
140+ original_values = np .array ([- 1 ], dtype = signed_dtype )
141+ encoded = xr .Variable (
142+ ("x" ,), original_values .astype (unsigned_dtype ), attrs = {"_Unsigned" : "false" }
143+ )
144+ coder = variables .UnsignedIntegerCoder ()
145+ decoded = coder .decode (encoded )
146+ assert decoded .dtype == signed_dtype
147+ assert decoded .values == original_values
0 commit comments