@@ -281,6 +281,33 @@ def graph(use_promotion: bool):
281281 [v [1 ] for v in results [op .__name__ + "-rev" ]], [comp (y , x ) for x , y in zip (xv , yv )], op .__name__
282282 )
283283
284+ def test_arithmetic_time_ops (self ):
285+ """Test datetime/timedelta arithmetic operations between edges."""
286+
287+ @csp .graph
288+ def graph ():
289+ dt1 = datetime (2020 , 1 , 1 , 12 , 0 , 0 )
290+ dt2 = datetime (2020 , 1 , 1 , 10 , 0 , 0 )
291+ td = timedelta (hours = 2 )
292+ dt1_edge = csp .const (dt1 )
293+ dt2_edge = csp .const (dt2 )
294+ td_edge = csp .const (td )
295+
296+ # datetime - datetime -> timedelta
297+ csp .add_graph_output ("dt_sub_dt" , dt1_edge - dt2_edge )
298+
299+ # datetime + timedelta -> datetime
300+ csp .add_graph_output ("dt_plus_td" , dt1_edge + td_edge )
301+
302+ # datetime - timedelta -> datetime
303+ csp .add_graph_output ("dt_minus_td" , dt1_edge - td_edge )
304+
305+ st = datetime (2020 , 1 , 1 )
306+ results = csp .run (graph , starttime = st , endtime = st + timedelta (seconds = 1 ))
307+ self .assertEqual (results ["dt_sub_dt" ][0 ][1 ], timedelta (hours = 2 ))
308+ self .assertEqual (results ["dt_plus_td" ][0 ][1 ], datetime (2020 , 1 , 1 , 14 , 0 , 0 ))
309+ self .assertEqual (results ["dt_minus_td" ][0 ][1 ], datetime (2020 , 1 , 1 , 10 , 0 , 0 ))
310+
284311 def test_boolean_ops (self ):
285312 def graph ():
286313 x = csp .default (csp .curve (bool , [(timedelta (seconds = s ), s % 2 == 0 ) for s in range (1 , 20 )]), False )
0 commit comments