TestDataFrame

VerifyIter

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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <numeric>
#include <cstring>
#include <random>
#include "catch.hpp"
#include "DataFormats/Common/interface/DataFrame.h"
#include "DataFormats/Common/interface/DataFrameContainer.h"

namespace {
  struct VerifyIter {
    VerifyIter(const std::vector<edm::DataFrame::data_type>& sv1, const std::vector<edm::DataFrame::data_type>& sv2)
        : n(0), sv1_(sv1), sv2_(sv2) {}
    void operator()(edm::DataFrame const& df) {
      ++n;
      REQUIRE(df.id() == 2000 + n);
      std::vector<edm::DataFrame::data_type> v2(10);
      std::copy(df.begin(), df.end(), v2.begin());
      if (n % 2 == 0)
        REQUIRE(sv1_ == v2);
      else
        REQUIRE(sv2_ == v2);
    }
    unsigned int n;
    const std::vector<edm::DataFrame::data_type>& sv1_;
    const std::vector<edm::DataFrame::data_type>& sv2_;
  };
}  // namespace

class TestDataFrame {
public:
  static auto& get(edm::DataFrameContainer& iC) { return iC.m_data; }
  static auto& get(edm::DataFrame& iC) { return iC.m_data; }
};

TEST_CASE("DataFrameContainer and DataFrame", "[DataFrame]") {
  std::vector<edm::DataFrame::data_type> sv1(10), sv2(10);
  edm::DataFrame::data_type v[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  std::copy(v, v + 10, sv1.begin());
  std::transform(sv1.begin(), sv1.end(), sv2.begin(), [](auto x) { return 10 + x; });

  SECTION("default ctor") {
    edm::DataFrameContainer frames(10, 2);
    REQUIRE(frames.stride() == 10);
    REQUIRE(frames.subdetId() == 2);
    REQUIRE(frames.size() == 0);
    frames.resize(3);
    REQUIRE(frames.size() == 3);
    edm::DataFrame df = frames[1];
    REQUIRE(df.size() == 10);
    REQUIRE(TestDataFrame::get(df) == &TestDataFrame::get(frames).front() + 10);
    df.set(frames, 2);
    REQUIRE(df.size() == 10);
    REQUIRE(TestDataFrame::get(df) == &TestDataFrame::get(frames).front() + 20);
    frames.pop_back();
    REQUIRE(frames.size() == 2);
    REQUIRE(TestDataFrame::get(frames).size() == 20);
  }

  SECTION("filling") {
    edm::DataFrameContainer frames(10, 2);
    for (unsigned int n = 1; n < 5; ++n) {
      unsigned int id = 20 + n;
      frames.push_back(id);
      REQUIRE(frames.size() == n);
      edm::DataFrame df = frames.back();
      REQUIRE(df.size() == 10);
      REQUIRE(df.id() == id);
      if (n % 2 == 0)
        std::copy(sv1.begin(), sv1.end(), df.begin());
      else
        ::memcpy(&df[0], &sv1[0], sizeof(edm::DataFrame::data_type) * frames.stride());
      std::vector<edm::DataFrame::data_type> v2(10);
      std::copy(
          TestDataFrame::get(frames).begin() + (n - 1) * 10, TestDataFrame::get(frames).begin() + n * 10, v2.begin());
      REQUIRE(sv1 == v2);
    }
  }

  SECTION("iterator") {
    edm::DataFrameContainer frames(10, 2);
    for (int n = 1; n < 5; ++n) {
      int id = 2000 + n;
      frames.push_back(id);
      edm::DataFrame df = frames.back();
      if (n % 2 == 0)
        std::copy(sv1.begin(), sv1.end(), df.begin());
      else
        std::copy(sv2.begin(), sv2.end(), df.begin());
    }
    VerifyIter verify(sv1, sv2);
    REQUIRE(std::for_each(frames.begin(), frames.end(), verify).n == 4);
  }

  SECTION("sort") {
    edm::DataFrameContainer frames(10, 2);
    std::vector<unsigned int> ids(100, 1);
    ids[0] = 2001;
    std::partial_sum(ids.begin(), ids.end(), ids.begin());
    std::random_device rd;
    std::mt19937 g(rd());
    std::shuffle(ids.begin(), ids.end(), g);
    for (int n = 0; n < 100; ++n) {
      frames.push_back(ids[n]);
      edm::DataFrame df = frames.back();
      if (ids[n] % 2 == 0)
        std::copy(sv1.begin(), sv1.end(), df.begin());
      else
        std::copy(sv2.begin(), sv2.end(), df.begin());
    }
    frames.sort();
    VerifyIter verify(sv1, sv2);
    REQUIRE(std::for_each(frames.begin(), frames.end(), verify).n == 100);
  }
}