File indexing completed on 2024-04-06 12:03:55
0001
0002 #include <algorithm>
0003
0004 #include "cppunit/extensions/HelperMacros.h"
0005 #include "DataFormats/Common/interface/TestHandle.h"
0006 #include "DataFormats/Common/interface/ContainerMask.h"
0007 #include "DataFormats/Common/interface/RefProd.h"
0008 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0009
0010 #include <vector>
0011
0012 class testContainerMask : public CppUnit::TestFixture {
0013 CPPUNIT_TEST_SUITE(testContainerMask);
0014 CPPUNIT_TEST(testVector);
0015 CPPUNIT_TEST(testDetSetVector);
0016 CPPUNIT_TEST_SUITE_END();
0017
0018 public:
0019 void setUp() {}
0020 void tearDown() {}
0021 void testVector();
0022 void testDetSetVector();
0023 };
0024
0025 CPPUNIT_TEST_SUITE_REGISTRATION(testContainerMask);
0026
0027 void testContainerMask::testVector() {
0028 const unsigned int values[] = {0, 1, 2, 3};
0029 const bool flags[] = {true, false, true, false};
0030 const unsigned int kSize = 4;
0031 std::vector<unsigned int> c(values, values + kSize);
0032 std::vector<bool> mask(flags, flags + kSize);
0033 CPPUNIT_ASSERT(mask.size() == c.size());
0034 CPPUNIT_ASSERT(mask.size() == kSize);
0035
0036 typedef std::vector<unsigned int> ContainerType;
0037 edm::TestHandle<ContainerType> h(&c, edm::ProductID(1, 1));
0038
0039 const edm::RefProd<ContainerType> rp(h);
0040
0041 edm::ContainerMask<ContainerType> cMask(rp, mask);
0042
0043 CPPUNIT_ASSERT(cMask.size() == mask.size());
0044
0045 unsigned int index = 0;
0046 for (std::vector<bool>::iterator it = mask.begin(), itEnd = mask.end(); it != itEnd; ++it, ++index) {
0047 CPPUNIT_ASSERT(*it == cMask.mask(index));
0048 }
0049
0050 index = 0;
0051 for (std::vector<unsigned int>::iterator it = c.begin(), itEnd = c.end(); it != itEnd; ++it, ++index) {
0052 CPPUNIT_ASSERT(mask[index] == cMask.mask(&(*it)));
0053 }
0054
0055 {
0056 std::vector<bool> alternate(4, false);
0057 alternate[1] = true;
0058 cMask.applyOrTo(alternate);
0059 CPPUNIT_ASSERT(alternate[0]);
0060 CPPUNIT_ASSERT(alternate[1]);
0061 CPPUNIT_ASSERT(alternate[2]);
0062 CPPUNIT_ASSERT(!alternate[3]);
0063 }
0064 {
0065 std::vector<bool> alternate(3, false);
0066 cMask.copyMaskTo(alternate);
0067 CPPUNIT_ASSERT(alternate[0]);
0068 CPPUNIT_ASSERT(!alternate[1]);
0069 CPPUNIT_ASSERT(alternate[2]);
0070 CPPUNIT_ASSERT(!alternate[3]);
0071 }
0072 }
0073
0074 void testContainerMask::testDetSetVector() {
0075 const bool flags[] = {true, false, true, false};
0076 const unsigned int kSize = 4;
0077 edmNew::DetSetVector<unsigned int> c;
0078 {
0079 edmNew::DetSetVector<unsigned int>::FastFiller filler(c, 0);
0080 filler.push_back(0);
0081 filler.push_back(1);
0082 }
0083 {
0084 edmNew::DetSetVector<unsigned int>::FastFiller filler(c, 1);
0085 filler.push_back(2);
0086 filler.push_back(3);
0087 }
0088 std::vector<bool> mask(flags, flags + kSize);
0089 CPPUNIT_ASSERT(mask.size() == c.dataSize());
0090 CPPUNIT_ASSERT(mask.size() == kSize);
0091
0092 typedef edmNew::DetSetVector<unsigned int> ContainerType;
0093
0094 edm::TestHandle<ContainerType> h(&c, edm::ProductID(1, 1));
0095
0096 const edm::RefProd<ContainerType> rp(h);
0097
0098 edm::ContainerMask<ContainerType> cMask(rp, mask);
0099
0100 CPPUNIT_ASSERT(cMask.size() == mask.size());
0101
0102 unsigned int index = 0;
0103 for (std::vector<bool>::iterator it = mask.begin(), itEnd = mask.end(); it != itEnd; ++it, ++index) {
0104 CPPUNIT_ASSERT(*it == cMask.mask(index));
0105 }
0106
0107 index = 0;
0108 for (std::vector<unsigned int>::const_iterator it = c.data().begin(), itEnd = c.data().end(); it != itEnd;
0109 ++it, ++index) {
0110 CPPUNIT_ASSERT(mask[index] == cMask.mask(&(*it)));
0111 }
0112
0113 std::vector<bool> alternate(4, false);
0114 alternate[1] = true;
0115 cMask.applyOrTo(alternate);
0116 CPPUNIT_ASSERT(alternate[0]);
0117 CPPUNIT_ASSERT(alternate[1]);
0118 CPPUNIT_ASSERT(alternate[2]);
0119 CPPUNIT_ASSERT(!alternate[3]);
0120 }