Base

Inherit1

Inherit2

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#include "catch.hpp"

#include "DataFormats/Common/interface/RefToBase.h"
#include "DataFormats/Common/interface/Ref.h"
#include "DataFormats/Common/interface/TestHandle.h"

#include <vector>

namespace testreftobase {
  struct Base {
    virtual ~Base() {}
    virtual int val() const = 0;
  };

  struct Inherit1 : public Base {
    virtual int val() const { return 1; }
  };
  struct Inherit2 : public Base {
    virtual int val() const { return 2; }
  };
}  // namespace testreftobase

using namespace testreftobase;

TEST_CASE("test RefToBase", "[RefToBase]") {
  SECTION("Class type") {
    using namespace edm;

    std::vector<Inherit1> v1(2, Inherit1());

    TestHandle<std::vector<Inherit1> > h1(&v1, ProductID(1, 1));
    Ref<std::vector<Inherit1> > r1(h1, 1);
    RefToBase<Base> b1(r1);

    SECTION("Value check") {
      CHECK(&(*b1) == static_cast<Base*>(&(v1[1])));
      CHECK(b1.operator->() == b1.get());
      CHECK(b1.get() == static_cast<Base*>(&(v1[1])));
      CHECK(b1.id() == ProductID(1, 1));
    }
    SECTION("Copy constructor") {
      //copy constructor
      RefToBase<Base> b2(b1);
      CHECK(&(*b2) == static_cast<Base*>(&(v1[1])));
      CHECK(b2.id() == b1.id());
    }

    SECTION("operator=") {
      //operator=
      RefToBase<Base> b3;
      CHECK(b3.isNull());
      CHECK(!(b3.isNonnull()));
      CHECK(!b3);
      b3 = b1;
      CHECK(&(*b3) == static_cast<Base*>(&(v1[1])));
      CHECK(b3.id() == b1.id());
      CHECK(!(b3.isNull()));
      CHECK(b3.isNonnull());
      CHECK(!(!b3));
    }

    SECTION("castTo inheriting type") { CHECK(b1.castTo<Ref<std::vector<Inherit1> > >() == r1); }
    SECTION("castTo incorrect inherting type") {
      CHECK_THROWS_AS(b1.castTo<Ref<std::vector<Inherit2> > >(), cms::Exception);
    }
    /*
    Uncomment to test compile time failure
    SECTION("castTo unrelated type") {
      b1.castTo<Ref<std::vector<std::string> > >();
    } */
  }

  SECTION("builtin type") {
    using namespace edm;
    std::vector<int> v1(2, 3);

    TestHandle<std::vector<int> > h1(&v1, ProductID(1, 1));
    Ref<std::vector<int> > r1(h1, 1);
    RefToBase<int> b1(r1);

    SECTION("Value check") {
      CHECK(&(*b1) == &v1[1]);
      CHECK(b1.operator->() == b1.get());
      CHECK(b1.get() == (&(v1[1])));
      CHECK(b1.id() == ProductID(1, 1));
    }
    SECTION("castTo Ref") { CHECK(b1.castTo<Ref<std::vector<int> > >() == r1); }
    /* uncomment to test compile time failure
    SECTION("bad castTo Ref") { b1.castTo<Ref<std::vector<double> > >(); }
    */
  }
}