Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-08-24 09:50:40

0001 #include "catch.hpp"
0002 
0003 #include "DataFormats/Common/interface/RefToBase.h"
0004 #include "DataFormats/Common/interface/Ref.h"
0005 #include "DataFormats/Common/interface/TestHandle.h"
0006 
0007 #include <vector>
0008 
0009 namespace testreftobase {
0010   struct Base {
0011     virtual ~Base() {}
0012     virtual int val() const = 0;
0013   };
0014 
0015   struct Inherit1 : public Base {
0016     virtual int val() const { return 1; }
0017   };
0018   struct Inherit2 : public Base {
0019     virtual int val() const { return 2; }
0020   };
0021 }  // namespace testreftobase
0022 
0023 using namespace testreftobase;
0024 
0025 TEST_CASE("test RefToBase", "[RefToBase]") {
0026   SECTION("Class type") {
0027     using namespace edm;
0028 
0029     std::vector<Inherit1> v1(2, Inherit1());
0030 
0031     TestHandle<std::vector<Inherit1> > h1(&v1, ProductID(1, 1));
0032     Ref<std::vector<Inherit1> > r1(h1, 1);
0033     RefToBase<Base> b1(r1);
0034 
0035     SECTION("Value check") {
0036       CHECK(&(*b1) == static_cast<Base*>(&(v1[1])));
0037       CHECK(b1.operator->() == b1.get());
0038       CHECK(b1.get() == static_cast<Base*>(&(v1[1])));
0039       CHECK(b1.id() == ProductID(1, 1));
0040     }
0041     SECTION("Copy constructor") {
0042       //copy constructor
0043       RefToBase<Base> b2(b1);
0044       CHECK(&(*b2) == static_cast<Base*>(&(v1[1])));
0045       CHECK(b2.id() == b1.id());
0046     }
0047 
0048     SECTION("operator=") {
0049       //operator=
0050       RefToBase<Base> b3;
0051       CHECK(b3.isNull());
0052       CHECK(!(b3.isNonnull()));
0053       CHECK(!b3);
0054       b3 = b1;
0055       CHECK(&(*b3) == static_cast<Base*>(&(v1[1])));
0056       CHECK(b3.id() == b1.id());
0057       CHECK(!(b3.isNull()));
0058       CHECK(b3.isNonnull());
0059       CHECK(!(!b3));
0060     }
0061 
0062     SECTION("castTo inheriting type") { CHECK(b1.castTo<Ref<std::vector<Inherit1> > >() == r1); }
0063     SECTION("castTo incorrect inherting type") {
0064       CHECK_THROWS_AS(b1.castTo<Ref<std::vector<Inherit2> > >(), cms::Exception);
0065     }
0066     /*
0067     Uncomment to test compile time failure
0068     SECTION("castTo unrelated type") {
0069       b1.castTo<Ref<std::vector<std::string> > >();
0070     } */
0071   }
0072 
0073   SECTION("builtin type") {
0074     using namespace edm;
0075     std::vector<int> v1(2, 3);
0076 
0077     TestHandle<std::vector<int> > h1(&v1, ProductID(1, 1));
0078     Ref<std::vector<int> > r1(h1, 1);
0079     RefToBase<int> b1(r1);
0080 
0081     SECTION("Value check") {
0082       CHECK(&(*b1) == &v1[1]);
0083       CHECK(b1.operator->() == b1.get());
0084       CHECK(b1.get() == (&(v1[1])));
0085       CHECK(b1.id() == ProductID(1, 1));
0086     }
0087     SECTION("castTo Ref") { CHECK(b1.castTo<Ref<std::vector<int> > >() == r1); }
0088     /* uncomment to test compile time failure
0089     SECTION("bad castTo Ref") { b1.castTo<Ref<std::vector<double> > >(); }
0090     */
0091   }
0092 }