ConstChecker

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
/*----------------------------------------------------------------------

Test program for edm::propagate_const_array class.

 ----------------------------------------------------------------------*/

#include <catch.hpp>
#include "FWCore/Utilities/interface/get_underlying_safe.h"
#include "FWCore/Utilities/interface/propagate_const_array.h"

namespace {
  class ConstChecker {
  public:
    int value() { return 0; }

    int const value() const { return 1; }
  };

  // used to check that edm::propagate_const_array<T[]> works with incomplete types
  class Incomplete;

}  // namespace

TEST_CASE("propagate_const_array basic operations", "[propagate_const_array]") {
  SECTION("test propagate_const_array<T[]>") {
    ConstChecker checker[10];
    edm::propagate_const_array<ConstChecker[]> pChecker(checker);

    REQUIRE(0 == pChecker[1].value());
    REQUIRE(0 == pChecker.get()[1].value());
    REQUIRE(0 == get_underlying_safe(pChecker)[1].value());

    const edm::propagate_const_array<ConstChecker[]> pConstChecker(checker);

    REQUIRE(1 == pConstChecker[1].value());
    REQUIRE(1 == pConstChecker.get()[1].value());
    REQUIRE(1 == get_underlying_safe(pConstChecker)[1].value());
  }

  // test for edm::propagate_const_array<shared_ptr<T>>
  SECTION("test for edm::propagate_const_array<shared_ptr<T>>") {
    // std::make_shared<T[]> requires C++20
    auto checker = std::shared_ptr<ConstChecker[]>(new ConstChecker[10]);
    edm::propagate_const_array<std::shared_ptr<ConstChecker[]>> pChecker(checker);

    REQUIRE(0 == pChecker[1].value());
    REQUIRE(0 == pChecker.get()[1].value());
    REQUIRE(0 == get_underlying_safe(pChecker)[1].value());

    const edm::propagate_const_array<std::shared_ptr<ConstChecker[]>> pConstChecker(checker);

    REQUIRE(1 == pConstChecker[1].value());
    REQUIRE(1 == pConstChecker.get()[1].value());
    REQUIRE(1 == get_underlying_safe(pConstChecker)[1].value());
  }

  SECTION("test for edm::propagate_const_array<unique_ptr<T>>") {
    auto checker = std::make_unique<ConstChecker[]>(10);
    edm::propagate_const_array<std::unique_ptr<ConstChecker[]>> pChecker(std::move(checker));

    REQUIRE(0 == pChecker[1].value());
    REQUIRE(0 == pChecker.get()[1].value());
    REQUIRE(0 == get_underlying_safe(pChecker)[1].value());

    const edm::propagate_const_array<std::unique_ptr<ConstChecker[]>> pConstChecker(
        std::make_unique<ConstChecker[]>(10));

    REQUIRE(1 == pConstChecker[1].value());
    REQUIRE(1 == pConstChecker.get()[1].value());
  }

  SECTION("test for edm::propagate_const_array<T[]> with incomplete types") {
    edm::propagate_const_array<Incomplete[]> pIncomplete(nullptr);

    REQUIRE(nullptr == get_underlying(pIncomplete));
  }
}