Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-02 10:01:52

0001 
0002 // Copyright 2020, Jefferson Science Associates, LLC.
0003 // Subject to the terms in the LICENSE file found in the top-level directory.
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 }