@@ -117,3 +117,31 @@ def test_scaling_offset_as_list(scale_factor, add_offset):
117
117
encoded = coder .encode (original )
118
118
roundtripped = coder .decode (encoded )
119
119
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