From 44d53cb3d675e785e1e281af488f5d07ff726ebb Mon Sep 17 00:00:00 2001
From: Martin Lange <martin.lange@ufz.de>
Date: Tue, 29 Nov 2022 14:55:36 +0100
Subject: [PATCH] fix copying of xarray data in connector, add tests

---
 src/finam/tools/connect_helper.py |   2 +-
 tests/core/test_schedule.py       | 112 ++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/src/finam/tools/connect_helper.py b/src/finam/tools/connect_helper.py
index 477192ab..9a690680 100644
--- a/src/finam/tools/connect_helper.py
+++ b/src/finam/tools/connect_helper.py
@@ -529,7 +529,7 @@ class ConnectHelper(Loggable):
                 data_1 = assign_time(data, time)
                 out.push_data(data_1, time)
                 data_2 = assign_time(data, info_time)
-                out.push_data(copy.copy(data_2), info_time)
+                out.push_data(data_2.copy(), info_time)
             else:
                 out.push_data(data, time)
                 out.push_data(copy.copy(data), info_time)
diff --git a/tests/core/test_schedule.py b/tests/core/test_schedule.py
index d81dab5d..b71a8fda 100644
--- a/tests/core/test_schedule.py
+++ b/tests/core/test_schedule.py
@@ -897,6 +897,118 @@ class TestComposition(unittest.TestCase):
         self.assertEqual([1, 8, 13], updates["A"])
         self.assertEqual([1, 4, 7, 10], updates["B"])
 
+    def test_starting_time_numpy(self):
+        start_1 = datetime(2000, 1, 2)
+        start_2 = datetime(2000, 1, 8)
+
+        updates = {"A": [], "B": []}
+
+        def lambda_generator(t):
+            return t.day
+
+        def lambda_component(inp, t):
+            return {"Out": np.asarray(1) * fm.UNITS("")}
+
+        def lambda_debugger(name, data, t):
+            updates[name].append(t.day)
+
+        module1 = CallbackGenerator(
+            callbacks={"Out": (lambda_generator, fm.Info(time=None, grid=fm.NoGrid()))},
+            start=start_2,
+            step=timedelta(days=5),
+        )
+        module2 = CallbackComponent(
+            inputs={
+                "In": fm.Info(time=None, grid=fm.NoGrid()),
+            },
+            outputs={
+                "Out": fm.Info(time=None, grid=fm.NoGrid()),
+            },
+            callback=lambda_component,
+            start=start_1,
+            step=timedelta(days=3),
+        )
+        module3 = DebugPushConsumer(
+            inputs={
+                "A": fm.Info(time=None, grid=None),
+                "B": fm.Info(time=None, grid=None),
+            },
+            callbacks={
+                "A": lambda_debugger,
+                "B": lambda_debugger,
+            },
+        )
+
+        composition = Composition([module1, module2, module3])
+        composition.initialize()
+
+        module1.outputs["Out"] >> Scale(1.0) >> module2.inputs["In"]
+        module1.outputs["Out"] >> Scale(1.0) >> module3.inputs["A"]
+        module2.outputs["Out"] >> Scale(1.0) >> module3.inputs["B"]
+
+        composition.connect(datetime(2000, 1, 1))
+
+        composition.run(end_time=datetime(2000, 1, 10))
+
+        self.assertEqual([1, 8, 13], updates["A"])
+        self.assertEqual([1, 2, 5, 8, 11], updates["B"])
+
+    def test_starting_time_xarray(self):
+        start_1 = datetime(2000, 1, 2)
+        start_2 = datetime(2000, 1, 8)
+
+        updates = {"A": [], "B": []}
+
+        def lambda_generator(t):
+            return t.day
+
+        def lambda_component(inp, t):
+            return {"Out": fm.data.assign_time(inp["In"], t)}
+
+        def lambda_debugger(name, data, t):
+            updates[name].append(t.day)
+
+        module1 = CallbackGenerator(
+            callbacks={"Out": (lambda_generator, fm.Info(time=None, grid=fm.NoGrid()))},
+            start=start_2,
+            step=timedelta(days=5),
+        )
+        module2 = CallbackComponent(
+            inputs={
+                "In": fm.Info(time=None, grid=fm.NoGrid()),
+            },
+            outputs={
+                "Out": fm.Info(time=None, grid=fm.NoGrid()),
+            },
+            callback=lambda_component,
+            start=start_1,
+            step=timedelta(days=3),
+        )
+        module3 = DebugPushConsumer(
+            inputs={
+                "A": fm.Info(time=None, grid=None),
+                "B": fm.Info(time=None, grid=None),
+            },
+            callbacks={
+                "A": lambda_debugger,
+                "B": lambda_debugger,
+            },
+        )
+
+        composition = Composition([module1, module2, module3])
+        composition.initialize()
+
+        module1.outputs["Out"] >> Scale(1.0) >> module2.inputs["In"]
+        module1.outputs["Out"] >> Scale(1.0) >> module3.inputs["A"]
+        module2.outputs["Out"] >> Scale(1.0) >> module3.inputs["B"]
+
+        composition.connect(datetime(2000, 1, 1))
+
+        composition.run(end_time=datetime(2000, 1, 10))
+
+        self.assertEqual([1, 8, 13], updates["A"])
+        self.assertEqual([1, 2, 5, 8, 11], updates["B"])
+
 
 if __name__ == "__main__":
     unittest.main()
-- 
GitLab