Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:02:33

0001 // -*- C++ -*-
0002 //
0003 // Package:     CondFormats/SerializationHelper
0004 // Class  :     test_catch2_unique_void_ptr
0005 //
0006 // Implementation:
0007 //     [Notes on implementation]
0008 //
0009 // Original Author:  Christopher Jones
0010 //         Created:  Wed, 31 May 2023 15:24:23 GMT
0011 //
0012 
0013 #include "catch.hpp"
0014 #include "CondFormats/SerializationHelper/interface/unique_void_ptr.h"
0015 
0016 using namespace cond::serialization;
0017 
0018 namespace {
0019   struct Counter {
0020     Counter(int& iCount) : count_(iCount) { ++count_; }
0021     ~Counter() { --count_; }
0022 
0023     int& count_;
0024   };
0025 
0026 }  // namespace
0027 
0028 TEST_CASE("Test unique_void_ptr", "[unique_void_ptr]") {
0029   SECTION("default constructor") {
0030     unique_void_ptr ptr;
0031     REQUIRE(ptr.get() == nullptr);
0032   }
0033 
0034   SECTION("destructor") {
0035     int c = 0;
0036     std::unique_ptr<Counter> uptr = std::make_unique<Counter>(c);
0037     REQUIRE(c == 1);
0038     {
0039       auto value = uptr.get();
0040       unique_void_ptr ptr(uptr.release(), [](const void* v) { delete static_cast<const Counter*>(v); });
0041       REQUIRE(value == ptr.get());
0042     }
0043     REQUIRE(c == 0);
0044   }
0045 
0046   SECTION("move constructor") {
0047     int c = 1;
0048     std::unique_ptr<Counter> uptr = std::make_unique<Counter>(c);
0049     REQUIRE(c == 2);
0050     {
0051       auto value = uptr.get();
0052       unique_void_ptr ptr(uptr.release(), [](const void* v) { delete static_cast<const Counter*>(v); });
0053       REQUIRE(value == ptr.get());
0054 
0055       {
0056         unique_void_ptr cpyPtr{std::move(ptr)};
0057         REQUIRE(ptr.get() == nullptr);
0058         REQUIRE(cpyPtr.get() == value);
0059         REQUIRE(c == 2);
0060       }
0061       REQUIRE(c == 1);
0062     }
0063     REQUIRE(c == 1);
0064   }
0065 
0066   SECTION("move operator=") {
0067     int c = 1;
0068     std::unique_ptr<Counter> uptr = std::make_unique<Counter>(c);
0069     REQUIRE(c == 2);
0070     {
0071       auto value = uptr.get();
0072       unique_void_ptr ptr(uptr.release(), [](const void* v) { delete static_cast<const Counter*>(v); });
0073       REQUIRE(value == ptr.get());
0074 
0075       {
0076         int c2 = 0;
0077         std::unique_ptr<Counter> uptr2 = std::make_unique<Counter>(c2);
0078         unique_void_ptr cpyPtr(uptr2.release(), [](const void* v) { delete static_cast<const Counter*>(v); });
0079         REQUIRE(c2 == 1);
0080         cpyPtr = std::move(ptr);
0081 
0082         REQUIRE(ptr.get() == nullptr);
0083         REQUIRE(cpyPtr.get() == value);
0084         REQUIRE(c == 2);
0085         REQUIRE(c2 == 0);
0086       }
0087       REQUIRE(c == 1);
0088     }
0089     REQUIRE(c == 1);
0090   }
0091 }