From fab6d3bba32e4c4750f91f437b50eb4fbda634b9 Mon Sep 17 00:00:00 2001
From: jmcarcell <jmcarcell@users.noreply.github.com>
Date: Mon, 9 Dec 2024 19:23:12 +0100
Subject: [PATCH] Add a test that uses a Writer with a plain Gaudi Functional
 algorithm

---
 test/k4FWCoreTest/CMakeLists.txt              |  1 +
 .../options/ExampleGaudiFunctional.py         | 41 +++++++++++++++++++
 .../ExampleGaudiFunctionalProducer.cpp        | 38 +++++++++++++++++
 3 files changed, 80 insertions(+)
 create mode 100644 test/k4FWCoreTest/options/ExampleGaudiFunctional.py
 create mode 100644 test/k4FWCoreTest/src/components/ExampleGaudiFunctionalProducer.cpp

diff --git a/test/k4FWCoreTest/CMakeLists.txt b/test/k4FWCoreTest/CMakeLists.txt
index 9340b296..3c66fec6 100644
--- a/test/k4FWCoreTest/CMakeLists.txt
+++ b/test/k4FWCoreTest/CMakeLists.txt
@@ -188,6 +188,7 @@ set_tests_properties(FunctionalWrongImport PROPERTIES PASS_REGULAR_EXPRESSION "I
 add_test_with_env(FunctionalReadNthEvent options/ExampleFunctionalReadNthEvent.py PROPERTIES DEPENDS FunctionalProducer ADD_TO_CHECK_FILES)
 add_test_with_env(FunctionalProducerRNTuple options/ExampleFunctionalProducerRNTuple.py ADD_TO_CHECK_FILES)
 add_test_with_env(FunctionalTTreeToRNTuple options/ExampleFunctionalTTreeToRNTuple.py PROPERTIES DEPENDS FunctionalProducer ADD_TO_CHECK_FILES)
+add_test_with_env(GaudiFunctional options/ExampleGaudiFunctional.py)
 
 
 # The following is done to make the tests work without installing the files in
diff --git a/test/k4FWCoreTest/options/ExampleGaudiFunctional.py b/test/k4FWCoreTest/options/ExampleGaudiFunctional.py
new file mode 100644
index 00000000..0162f80d
--- /dev/null
+++ b/test/k4FWCoreTest/options/ExampleGaudiFunctional.py
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2014-2024 Key4hep-Project.
+#
+# This file is part of Key4hep.
+# See https://key4hep.github.io/key4hep-doc/ for further info.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This is an example reading from a file and using a producer to create new
+# data
+
+from Gaudi.Configuration import INFO
+from Configurables import ExampleGaudiFunctionalProducer
+from Configurables import EventDataSvc
+from k4FWCore import ApplicationMgr, IOSvc
+
+svc = IOSvc("IOSvc")
+svc.Output = "functional_transformer.root"
+
+producer = ExampleGaudiFunctionalProducer(
+    "Producer", OutputCollectionName="Output"
+)
+
+mgr = ApplicationMgr(
+    TopAlg=[producer],
+    EvtSel="NONE",
+    EvtMax=3,
+    ExtSvc=[EventDataSvc("EventDataSvc")],
+    OutputLevel=INFO,
+)
diff --git a/test/k4FWCoreTest/src/components/ExampleGaudiFunctionalProducer.cpp b/test/k4FWCoreTest/src/components/ExampleGaudiFunctionalProducer.cpp
new file mode 100644
index 00000000..171036d4
--- /dev/null
+++ b/test/k4FWCoreTest/src/components/ExampleGaudiFunctionalProducer.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2014-2024 Key4hep-Project.
+ *
+ * This file is part of Key4hep.
+ * See https://key4hep.github.io/key4hep-doc/ for further info.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Gaudi/Functional/Producer.h"
+
+#include <string>
+
+using BaseClass_t = Gaudi::Functional::Traits::BaseClass_t<Gaudi::Algorithm>;
+
+struct ExampleGaudiFunctionalProducer final : Gaudi::Functional::Producer<int(), BaseClass_t> {
+  // The pair in KeyValues can be changed from python and it corresponds
+  // to the name of the output collection
+  ExampleGaudiFunctionalProducer(const std::string& name, ISvcLocator* svcLoc)
+    : Producer(name, svcLoc, KeyValue{"OutputCollectionName", "OutputCollection"}) {}
+
+  // This is the function that will be called to produce the data
+  int operator()() const override {
+    return 3;
+  }
+};
+
+DECLARE_COMPONENT(ExampleGaudiFunctionalProducer)