TestMapOfVectors

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
#include <vector>
#include <algorithm>
#include "catch.hpp"
#include "DataFormats/Common/interface/MapOfVectors.h"

typedef edm::MapOfVectors<int, int> MII;
typedef MII::TheMap TheMap;

class TestMapOfVectors {
public:
  static auto& keys(MII& m) { return m.m_keys; }
  static auto& offsets(const MII& m) { return m.m_offsets; }
  static auto& data(const MII& m) { return m.m_data; }
};

TEST_CASE("MapOfVectors", "[MapOfVectors]") {
  TheMap om;
  unsigned int tot = 0;
  int v[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  for (int i = 0; i < 10; ++i) {
    tot += i;
    om[i].resize(i);
    std::copy(v, v + i, om[i].begin());
  }

  SECTION("default ctor") {
    MII m;
    REQUIRE(m.size() == 0);
    REQUIRE(m.empty());
    REQUIRE(TestMapOfVectors::keys(m).size() == 0);
    REQUIRE(TestMapOfVectors::offsets(m).size() == 1);
    REQUIRE(TestMapOfVectors::offsets(m)[0] == 0);
    REQUIRE(TestMapOfVectors::data(m).size() == 0);
  }

  SECTION("filling") {
    MII m(om);
    REQUIRE(m.size() == om.size());
    REQUIRE(!m.empty());
    REQUIRE(TestMapOfVectors::keys(m).size() == om.size());
    REQUIRE(TestMapOfVectors::offsets(m).size() == om.size() + 1);
    REQUIRE(TestMapOfVectors::offsets(m)[0] == 0);
    REQUIRE(TestMapOfVectors::offsets(m)[m.size()] == tot);
    REQUIRE(TestMapOfVectors::data(m).size() == tot);
  }

  SECTION("find") {
    MII m(om);
    REQUIRE(m.find(-1) == m.emptyRange());
    for (TheMap::const_iterator p = om.begin(); p != om.end(); ++p) {
      MII::range r = m.find((*p).first);
      REQUIRE(int(r.size()) == (*p).first);
      REQUIRE(std::equal((*p).second.begin(), (*p).second.end(), r.begin()));
    }
  }

  SECTION("iterator") {
    MII m(om);
    TheMap::const_iterator op = om.begin();
    unsigned int lt = 0;
    for (MII::const_iterator p = m.begin(); p != m.end(); ++p) {
      REQUIRE((*p).first == (*op).first);
      REQUIRE(std::equal((*p).second.begin(), (*p).second.end(), (*op).second.begin()));
      lt += (*p).second.size();
      ++op;
    }
    REQUIRE(lt == tot);
  }
}