File indexing completed on 2025-11-02 10:01:52
0001
0002
0003
0004
0005
0006 #include "catch.hpp"
0007 #include <JANA/JEvent.h>
0008
0009 struct Base {
0010 double base;
0011 Base(double base) : base(base) {};
0012 };
0013
0014 struct Derived : public Base {
0015 double derived;
0016 Derived(double base, double derived) : Base(base), derived(derived) {};
0017 };
0018
0019 struct Unrelated {
0020 double unrelated;
0021 Unrelated(double unrelated) : unrelated(unrelated) {};
0022 };
0023
0024 struct Multiple : public Derived, Unrelated {
0025 double multiple;
0026 Multiple(double base, double derived, double unrelated, double multiple)
0027 : Derived(base, derived), Unrelated(unrelated), multiple(multiple) {};
0028 };
0029
0030 class DerivedFactory : public JFactoryT<Derived> {
0031 public:
0032 DerivedFactory() {
0033 EnableGetAs<Base>();
0034 }
0035 };
0036
0037 class OtherDerivedFactory : public JFactoryT<Derived> {
0038 public:
0039 OtherDerivedFactory() {
0040 EnableGetAs<Base>();
0041 }
0042
0043 void Process(const std::shared_ptr<const JEvent>&) override {
0044 Insert(new Derived(19, 13));
0045 Insert(new Derived(29, 23));
0046 }
0047 };
0048
0049 class UnrelatedFactory : public JFactoryT<Unrelated> {};
0050
0051 class MultipleFactory : public JFactoryT<Multiple> {
0052 public:
0053 MultipleFactory() {
0054 EnableGetAs<Base>();
0055 EnableGetAs<Derived>();
0056 EnableGetAs<Unrelated>();
0057 }
0058 };
0059
0060 class MultipleFactoryMissing : public JFactoryT<Multiple> {
0061 public:
0062 MultipleFactoryMissing() {
0063 EnableGetAs<Derived>();
0064 }
0065 };
0066
0067 TEST_CASE("JFactoryGetAs") {
0068
0069 SECTION("Upcast Derived to Base (single item inserted)") {
0070 DerivedFactory f;
0071 f.Insert(new Derived (7, 22));
0072 auto bases = f.GetAs<Base>();
0073 REQUIRE(bases.size() == 1);
0074 REQUIRE(bases[0]->base == 7);
0075 f.ClearData();
0076 }
0077
0078 SECTION("Upcast Derived to Base (multiple items inserted)") {
0079 DerivedFactory f;
0080 f.Insert(new Derived (7, 22));
0081 f.Insert(new Derived (8, 23));
0082 f.Insert(new Derived (9, 24));
0083 auto bases = f.GetAs<Base>();
0084
0085 REQUIRE(bases.size() == 3);
0086 REQUIRE(bases[0]->base == 7);
0087 REQUIRE(bases[1]->base == 8);
0088 REQUIRE(bases[2]->base == 9);
0089 f.ClearData();
0090 }
0091
0092 SECTION("Upcast Derived to Unrelated (single item inserted)") {
0093 DerivedFactory f;
0094 f.Insert(new Derived (7, 22));
0095 auto bases = f.GetAs<Unrelated>();
0096 REQUIRE(bases.size() == 0);
0097 REQUIRE(bases.size() == 0);
0098 f.ClearData();
0099 }
0100
0101 SECTION("Upcast Derived to Derived (single item inserted)") {
0102 DerivedFactory f;
0103 f.Insert(new Derived(22, 18));
0104 auto deriveds = f.GetAs<Derived>();
0105 REQUIRE(deriveds.size() == 1);
0106 REQUIRE(deriveds[0]->derived == 18);
0107 f.ClearData();
0108 }
0109
0110 SECTION("GetAs doesn't trigger Process()") {
0111 OtherDerivedFactory f;
0112 auto deriveds_before = f.GetAs<Derived>();
0113 REQUIRE(deriveds_before.size() == 0);
0114 f.Process(std::make_shared<JEvent>());
0115 auto deriveds_after = f.GetAs<Derived>();
0116 REQUIRE(deriveds_after.size() == 2);
0117 f.ClearData();
0118 }
0119
0120 SECTION("Upcast Multiple to each of its bases") {
0121 MultipleFactory f;
0122 f.Insert(new Multiple(22, 27, 42, 49));
0123
0124 auto bases = f.GetAs<Base>();
0125 REQUIRE(bases.size() == 1);
0126 REQUIRE(bases[0]->base == 22);
0127
0128 auto deriveds = f.GetAs<Derived>();
0129 REQUIRE(deriveds.size() == 1);
0130 REQUIRE(deriveds[0]->derived == 27);
0131
0132 auto unrelateds = f.GetAs<Unrelated>();
0133 REQUIRE(unrelateds.size() == 1);
0134 REQUIRE(unrelateds[0]->unrelated == 42);
0135
0136 auto multiples = f.GetAs<Multiple>();
0137 REQUIRE(multiples.size() == 1);
0138 REQUIRE(multiples[0]->multiple == 49);
0139
0140 f.ClearData();
0141 }
0142
0143 SECTION("Upcast only succeeds if bases have been enabled") {
0144 MultipleFactoryMissing f;
0145 f.Insert(new Multiple(22, 27, 42, 49));
0146
0147 auto bases = f.GetAs<Base>();
0148 REQUIRE(bases.size() == 0);
0149
0150 auto deriveds = f.GetAs<Derived>();
0151 REQUIRE(deriveds.size() == 1);
0152 REQUIRE(deriveds[0]->derived == 27);
0153
0154 auto unrelateds = f.GetAs<Unrelated>();
0155 REQUIRE(unrelateds.size() == 0);
0156
0157 auto multiples = f.GetAs<Multiple>();
0158 REQUIRE(multiples.size() == 1);
0159 REQUIRE(multiples[0]->base == 22);
0160 REQUIRE(multiples[0]->derived == 27);
0161 REQUIRE(multiples[0]->unrelated == 42);
0162 REQUIRE(multiples[0]->multiple == 49);
0163
0164 f.ClearData();
0165 }
0166 }
0167
0168 TEST_CASE("JEventGetAllChildren") {
0169
0170 auto event = std::make_shared<JEvent>();
0171
0172 SECTION("Single-item JEvent::Insert() can be retrieved via JEvent::GetAllChildren()") {
0173 auto b = new Base(22);
0174 auto d = new Derived(33,44);
0175 auto u = new Unrelated(19);
0176 auto m = new Multiple(1,2,3,4);
0177
0178 event->Insert(b);
0179 event->Insert(u);
0180 event->Insert(d)->EnableGetAs<Base>();
0181
0182 auto f = event->Insert(m);
0183 f->EnableGetAs<Base>();
0184 f->EnableGetAs<Derived>();
0185 f->EnableGetAs<Unrelated>();
0186
0187 auto base_map = event->GetAllChildren<Base>();
0188 REQUIRE(base_map.size() == 3);
0189 REQUIRE(base_map[{"Base",""}].size() == 1);
0190 REQUIRE(base_map[{"Base",""}][0]->base == 22);
0191 REQUIRE(base_map[{"Derived",""}].size() == 1);
0192 REQUIRE(base_map[{"Derived",""}][0]->base == 33);
0193 REQUIRE(base_map[{"Multiple",""}].size() == 1);
0194 REQUIRE(base_map[{"Multiple",""}][0]->base == 1);
0195 }
0196
0197 }