File indexing completed on 2023-03-17 10:49:31
0001 #include "cppunit/extensions/HelperMacros.h"
0002 #include "DataFormats/Common/interface/RefToBase.h"
0003 #include "DataFormats/Common/interface/Ref.h"
0004 #include "DataFormats/Common/interface/TestHandle.h"
0005
0006 #include <vector>
0007
0008 class testRefToBase : public CppUnit::TestFixture {
0009 CPPUNIT_TEST_SUITE(testRefToBase);
0010 CPPUNIT_TEST(check);
0011 CPPUNIT_TEST_SUITE_END();
0012
0013 public:
0014 void setUp() {}
0015 void tearDown() {}
0016 void check();
0017 };
0018
0019 CPPUNIT_TEST_SUITE_REGISTRATION(testRefToBase);
0020 namespace testreftobase {
0021 struct Base {
0022 virtual ~Base() {}
0023 virtual int val() const = 0;
0024 };
0025
0026 struct Inherit1 : public Base {
0027 virtual int val() const { return 1; }
0028 };
0029 struct Inherit2 : public Base {
0030 virtual int val() const { return 2; }
0031 };
0032 }
0033
0034 using namespace testreftobase;
0035
0036 void testRefToBase::check() {
0037 using namespace edm;
0038
0039 std::vector<Inherit1> v1(2, Inherit1());
0040 std::vector<Inherit2> v2(2, Inherit2());
0041
0042 TestHandle<std::vector<Inherit1> > h1(&v1, ProductID(1, 1));
0043 Ref<std::vector<Inherit1> > r1(h1, 1);
0044 RefToBase<Base> b1(r1);
0045 CPPUNIT_ASSERT(&(*b1) == static_cast<Base*>(&(v1[1])));
0046 CPPUNIT_ASSERT(b1.operator->() == b1.get());
0047 CPPUNIT_ASSERT(b1.get() == static_cast<Base*>(&(v1[1])));
0048 CPPUNIT_ASSERT(b1.id() == ProductID(1, 1));
0049
0050
0051 RefToBase<Base> b2(b1);
0052 CPPUNIT_ASSERT(&(*b2) == static_cast<Base*>(&(v1[1])));
0053 CPPUNIT_ASSERT(b2.id() == b1.id());
0054
0055
0056 RefToBase<Base> b3;
0057 CPPUNIT_ASSERT(b3.isNull());
0058 CPPUNIT_ASSERT(!(b3.isNonnull()));
0059 CPPUNIT_ASSERT(!b3);
0060 b3 = b1;
0061 CPPUNIT_ASSERT(&(*b3) == static_cast<Base*>(&(v1[1])));
0062 CPPUNIT_ASSERT(b3.id() == b1.id());
0063 CPPUNIT_ASSERT(!(b3.isNull()));
0064 CPPUNIT_ASSERT(b3.isNonnull());
0065 CPPUNIT_ASSERT(!(!b3));
0066
0067 CPPUNIT_ASSERT(b1.castTo<Ref<std::vector<Inherit1> > >() == r1);
0068 bool throwed = false;
0069 try {
0070 b1.castTo<Ref<std::vector<Inherit2> > >();
0071 } catch (edm::Exception const& e) {
0072 throwed = true;
0073 }
0074 CPPUNIT_ASSERT(throwed);
0075 }