22# Permissions are hereby granted under the terms of the MIT License:
33# https://opensource.org/licenses/MIT.
44
5+ import datetime
56import json
67import unittest
7- from datetime import datetime
88
99import numpy as np
1010import xarray as xr
@@ -149,25 +149,76 @@ def test_yes(self):
149149
150150
151151class EvalExprTest (unittest .TestCase ):
152- def test_all_cases (self ):
152+ def test_scalar_result (self ):
153153 # scalars
154154 self .assertEqual (None , eval_expr ("None" , {}))
155155 self .assertEqual (True , eval_expr ("True" , {}))
156156 self .assertEqual (13 , eval_expr ("13" , {}))
157+ self .assertEqual ("nan" , eval_expr ("float('NaN')" , {}))
157158 self .assertEqual (0.5 , eval_expr ("0.5" , {}))
158159 self .assertEqual ("ABC" , eval_expr ("'ABC'" , {}))
159- time = datetime .fromisoformat ("2024-01-02T10:20:30" )
160+ time = datetime .date .fromisoformat ("2024-01-02" )
161+ self .assertEqual (
162+ "2024-01-02" ,
163+ eval_expr ("time" , dict (time = time )),
164+ )
165+ time = datetime .datetime .fromisoformat ("2024-01-02T10:20:30" )
160166 self .assertEqual (
161167 "2024-01-02T10:20:30" ,
162168 eval_expr ("time" , dict (time = time )),
163169 )
170+ with pytest .raises (
171+ ValueError , match = "cannot serialize value of type <class 'object'>"
172+ ):
173+ eval_expr ("obj" , dict (obj = object ()))
164174
175+ def test_dict_result (self ):
176+ self .assertEqual ({}, eval_expr ("d" , dict (d = {})))
177+ self .assertEqual (
178+ {
179+ "b" : True ,
180+ "i" : 13 ,
181+ "t" : [1 , "B" , {}],
182+ "f" : 13.2 ,
183+ "d" : "2020-05-04" ,
184+ "np_a" : [0.1 , 0.2 ],
185+ "xr_a" : [0.3 , 0.4 ],
186+ },
187+ eval_expr (
188+ "d" ,
189+ dict (
190+ d = {
191+ "b" : True ,
192+ "i" : 13 ,
193+ "t" : (1 , "B" , {}),
194+ "f" : 13.2 ,
195+ "d" : datetime .date .fromisoformat ("2020-05-04" ),
196+ "np_a" : np .array ([0.1 , 0.2 ]),
197+ "xr_a" : xr .DataArray (np .array ([0.3 , 0.4 ])),
198+ }
199+ ),
200+ ),
201+ )
202+
203+ def test_array_1d_result (self ):
165204 # arrays
166205 self .assert_array_ok ([True , False ])
167206 self .assert_array_ok ([3 , 4 , 5 ])
168207 self .assert_array_ok ([11.05 , 11.15 , 11.25 ])
208+ self .assert_array_ok ([11.05 , "nan" , 11.25 ], dtype = "float64" )
169209 self .assert_array_ok (["A" , "B" ])
170210 self .assert_array_ok (["2024-01-02T10:20:30" ], dtype = "datetime64[s]" )
211+ with pytest .raises (
212+ ValueError ,
213+ match = (
214+ "cannot serialize 0-d array"
215+ " of type <class 'numpy.ndarray'>, dtype=dtype\\ ('O'\\ )"
216+ ),
217+ ):
218+ eval_expr ("a" , dict (a = xr .DataArray ([object (), object ()])))
219+
220+ def test_array_2d_result (self ):
221+ self .assert_array_ok ([[3 , 4 ], [5 , 6 ]])
171222
172223 def assert_array_ok (self , a : list , dtype = None ):
173224 # Test list
@@ -192,7 +243,7 @@ def assert_array_ok(self, a: list, dtype=None):
192243 )
193244
194245 # Test xarray-DataArray
195- xr_a = xr .DataArray (np_a , dims = "x" )
246+ xr_a = xr .DataArray (np_a )
196247 self .assertEqual (
197248 a ,
198249 eval_expr ("a" , dict (a = xr_a )),
0 commit comments