File indexing completed on 2026-04-17 07:47:50
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Utilities/Logger.hpp"
0012 #include "ActsExamples/Framework/DataHandle.hpp"
0013 #include "ActsExamples/Framework/Sequencer.hpp"
0014 #include "ActsExamples/Framework/WhiteBoard.hpp"
0015 #include "ActsExamples/Io/Podio/PodioCollectionDataHandle.hpp"
0016 #include "ActsTests/CommonHelpers/WhiteBoardUtilities.hpp"
0017
0018 #include <memory>
0019
0020 #include <edm4hep/MCParticleCollection.h>
0021 #include <edm4hep/TrackCollection.h>
0022 #include <podio/CollectionBase.h>
0023
0024 using namespace ActsExamples;
0025 using Acts::Logging::ScopedFailureThreshold;
0026
0027 namespace ActsTests {
0028
0029 namespace {
0030 static const auto logger =
0031 Acts::getDefaultLogger("PodioHandleTest", Acts::Logging::VERBOSE);
0032 }
0033
0034 BOOST_AUTO_TEST_SUITE(PodioCollectionDataHandleSuite)
0035
0036 BOOST_AUTO_TEST_CASE(EmulationCompatibility) {
0037 ScopedFailureThreshold st(Acts::Logging::Level::FATAL);
0038
0039 DummySequenceElement dummyElement;
0040
0041 DataHandleBase::StateMapType state;
0042 WhiteBoard::AliasMapType aliases;
0043
0044 PodioCollectionWriteHandle<edm4hep::TrackCollection> writeHandle{
0045 &dummyElement, "OutputTracks"};
0046 PodioCollectionReadHandle<edm4hep::TrackCollection> typedReadHandle{
0047 &dummyElement, "InputTracks"};
0048 ConsumeDataHandle<std::unique_ptr<podio::CollectionBase>> baseConsumeHandle{
0049 &dummyElement, "InputPodioWriter"};
0050 PodioCollectionReadHandle<edm4hep::MCParticleCollection> wrongTypedReadHandle{
0051 &dummyElement, "InputParticles"};
0052
0053 writeHandle.initialize("tracks");
0054 typedReadHandle.initialize("tracks");
0055 baseConsumeHandle.initialize("tracks");
0056 wrongTypedReadHandle.initialize("tracks");
0057
0058 writeHandle.emulate(state, aliases, *logger);
0059
0060 BOOST_CHECK_NO_THROW(typedReadHandle.emulate(state, aliases, *logger));
0061 BOOST_CHECK_THROW(wrongTypedReadHandle.emulate(state, aliases, *logger),
0062 SequenceConfigurationException);
0063 BOOST_CHECK_NO_THROW(baseConsumeHandle.emulate(state, aliases, *logger));
0064 }
0065
0066 BOOST_AUTO_TEST_CASE(RuntimeTypedReadAndBaseConsume) {
0067 DummySequenceElement dummyElement;
0068 WhiteBoard wb;
0069
0070 PodioCollectionWriteHandle<edm4hep::TrackCollection> writeHandle{
0071 &dummyElement, "OutputTracks"};
0072 PodioCollectionReadHandle<edm4hep::TrackCollection> typedReadHandle{
0073 &dummyElement, "InputTracks"};
0074 ConsumeDataHandle<std::unique_ptr<podio::CollectionBase>> baseConsumeHandle{
0075 &dummyElement, "InputPodioWriter"};
0076
0077 writeHandle.initialize("tracks");
0078 typedReadHandle.initialize("tracks");
0079 baseConsumeHandle.initialize("tracks");
0080
0081 edm4hep::TrackCollection tracks;
0082 writeHandle(wb, std::move(tracks));
0083
0084 const auto& readTracks = typedReadHandle(wb);
0085 BOOST_CHECK_EQUAL(readTracks.size(), 0u);
0086
0087 auto baseCollection = baseConsumeHandle(wb);
0088 BOOST_REQUIRE(baseCollection != nullptr);
0089 BOOST_CHECK(dynamic_cast<edm4hep::TrackCollection*>(baseCollection.get()) !=
0090 nullptr);
0091 }
0092
0093 BOOST_AUTO_TEST_CASE(RuntimeTypeMismatchOnRead) {
0094 DummySequenceElement dummyElement;
0095 WhiteBoard wb;
0096
0097 WriteDataHandle<std::unique_ptr<podio::CollectionBase>> baseWriteHandle{
0098 &dummyElement, "BaseWrite"};
0099 PodioCollectionReadHandle<edm4hep::TrackCollection> typedReadHandle{
0100 &dummyElement, "InputTracks"};
0101
0102 baseWriteHandle.initialize("collections");
0103 typedReadHandle.initialize("collections");
0104
0105 baseWriteHandle(wb, std::make_unique<edm4hep::MCParticleCollection>());
0106
0107 BOOST_CHECK_THROW(typedReadHandle(wb), std::out_of_range);
0108 }
0109
0110 BOOST_AUTO_TEST_SUITE_END()
0111
0112 }