File indexing completed on 2023-03-17 10:51:14
0001
0002
0003
0004
0005 #include "cppunit/extensions/HelperMacros.h"
0006
0007 #include "DataFormats/Provenance/interface/EventID.h"
0008 #include "DataFormats/Provenance/interface/ProductID.h"
0009 #include "DataFormats/Provenance/interface/ProductResolverIndexHelper.h"
0010 #include "DataFormats/TestObjects/interface/ToyProducts.h"
0011
0012 #include "FWCore/Utilities/interface/Exception.h"
0013 #include "FWCore/Utilities/interface/ProductKindOfType.h"
0014 #include "FWCore/Utilities/interface/TypeID.h"
0015
0016 #include <iostream>
0017 #include <iomanip>
0018
0019 using namespace edm;
0020
0021 class TestProductResolverIndexHelper : public CppUnit::TestFixture {
0022 CPPUNIT_TEST_SUITE(TestProductResolverIndexHelper);
0023 CPPUNIT_TEST(testCreateEmpty);
0024 CPPUNIT_TEST(testOneEntry);
0025 CPPUNIT_TEST(testManyEntries);
0026 CPPUNIT_TEST_SUITE_END();
0027
0028 public:
0029 void setUp();
0030 void tearDown() {}
0031
0032 void testCreateEmpty();
0033 void testOneEntry();
0034 void testManyEntries();
0035
0036 TypeID typeID_ProductID;
0037 TypeID typeID_EventID;
0038 };
0039
0040
0041 CPPUNIT_TEST_SUITE_REGISTRATION(TestProductResolverIndexHelper);
0042
0043 void TestProductResolverIndexHelper::setUp() {
0044 typeID_ProductID = TypeID(typeid(ProductID));
0045 typeID_EventID = TypeID(typeid(EventID));
0046 }
0047
0048 void TestProductResolverIndexHelper::testCreateEmpty() {
0049 edm::ProductResolverIndexHelper helper;
0050 helper.setFrozen();
0051
0052 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "processA") ==
0053 ProductResolverIndexInvalid);
0054 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_ProductID, "labelA", "instanceA", "processA") ==
0055 ProductResolverIndexInvalid);
0056 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "") ==
0057 ProductResolverIndexInvalid);
0058 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA") == ProductResolverIndexInvalid);
0059
0060 edm::ProductResolverIndexHelper::Matches matches =
0061 helper.relatedIndexes(PRODUCT_TYPE, typeID_ProductID, "label_A", "instance_A");
0062 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0063 matches = helper.relatedIndexes(PRODUCT_TYPE, typeID_ProductID);
0064 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0065
0066 TypeID typeID(typeid(ProductID));
0067 CPPUNIT_ASSERT_THROW(helper.insert(typeID, "labelA", "instanceA", "processA"), cms::Exception);
0068 }
0069
0070 void TestProductResolverIndexHelper::testOneEntry() {
0071 edm::ProductResolverIndexHelper helper;
0072
0073 TypeID typeIDProductID(typeid(ProductID));
0074 helper.insert(typeIDProductID, "labelA", "instanceA", "processA");
0075
0076 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "processA") ==
0077 ProductResolverIndexInvalid);
0078 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_ProductID, "labelA", "instanceA", "processA") ==
0079 ProductResolverIndexInvalid);
0080 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "") ==
0081 ProductResolverIndexInvalid);
0082 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA") == ProductResolverIndexInvalid);
0083
0084 edm::ProductResolverIndexHelper::Matches matches =
0085 helper.relatedIndexes(PRODUCT_TYPE, typeID_ProductID, "label_A", "instance_A");
0086 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0087 matches = helper.relatedIndexes(PRODUCT_TYPE, typeID_ProductID);
0088 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0089
0090 helper.setFrozen();
0091
0092 matches = helper.relatedIndexes(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA");
0093 CPPUNIT_ASSERT(matches.numberOfMatches() == 2);
0094 edm::ProductResolverIndex indexEmptyProcess = matches.index(0);
0095 edm::ProductResolverIndex indexWithProcess = matches.index(1);
0096 CPPUNIT_ASSERT_THROW(matches.index(2), cms::Exception);
0097 CPPUNIT_ASSERT(indexEmptyProcess < 2);
0098 CPPUNIT_ASSERT(indexWithProcess < 2);
0099 CPPUNIT_ASSERT(indexEmptyProcess != indexWithProcess);
0100
0101 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA") == indexEmptyProcess);
0102 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "") == indexEmptyProcess);
0103 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", 0) == indexEmptyProcess);
0104 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "processA") == indexWithProcess);
0105
0106 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instance", "processA") ==
0107 ProductResolverIndexInvalid);
0108 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceAX", "processA") ==
0109 ProductResolverIndexInvalid);
0110 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "label", "instanceA", "processA") ==
0111 ProductResolverIndexInvalid);
0112 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelAX", "instanceA", "processA") ==
0113 ProductResolverIndexInvalid);
0114 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "process") ==
0115 ProductResolverIndexInvalid);
0116 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_ProductID, "labelA", "instanceA", "processAX") ==
0117 ProductResolverIndexInvalid);
0118 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_EventID, "labelA", "instanceA", "processA") ==
0119 ProductResolverIndexInvalid);
0120
0121 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_ProductID, "labelA", "instanceA") == ProductResolverIndexInvalid);
0122 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_ProductID, "labelA", "instanceA", "processA") ==
0123 ProductResolverIndexInvalid);
0124
0125 matches = helper.relatedIndexes(PRODUCT_TYPE, typeID_ProductID);
0126 CPPUNIT_ASSERT(matches.numberOfMatches() == 2);
0127 CPPUNIT_ASSERT(matches.index(0) == indexEmptyProcess);
0128 CPPUNIT_ASSERT(matches.index(1) == indexWithProcess);
0129 CPPUNIT_ASSERT(matches.isFullyResolved(0) == false);
0130 CPPUNIT_ASSERT(matches.isFullyResolved(1) == true);
0131
0132 matches = helper.relatedIndexes(PRODUCT_TYPE, typeID_EventID);
0133 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0134
0135 matches = helper.relatedIndexes(ELEMENT_TYPE, typeID_ProductID);
0136 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0137
0138 matches = helper.relatedIndexes(ELEMENT_TYPE, typeID_ProductID, "labelA", "instanceA");
0139 CPPUNIT_ASSERT(matches.numberOfMatches() == 0);
0140
0141 {
0142 auto indexToModules = helper.indiciesForModulesInProcess("processA");
0143 CPPUNIT_ASSERT(indexToModules.size() == 1);
0144 CPPUNIT_ASSERT(indexToModules.count("labelA") == 1);
0145 auto const& range = indexToModules.equal_range("labelA");
0146 CPPUNIT_ASSERT(std::get<2>(range.first->second) == indexWithProcess);
0147 }
0148
0149 {
0150 auto indexToModules = helper.indiciesForModulesInProcess("processNotHere");
0151 CPPUNIT_ASSERT(indexToModules.size() == 0);
0152 }
0153 }
0154
0155 void TestProductResolverIndexHelper::testManyEntries() {
0156 edm::ProductResolverIndexHelper helper;
0157
0158 TypeID typeIDProductID(typeid(ProductID));
0159 TypeID typeIDEventID(typeid(EventID));
0160 TypeID typeIDVectorInt(typeid(std::vector<int>));
0161 TypeID typeIDSetInt(typeid(std::set<int>));
0162 TypeID typeIDVSimpleDerived(typeid(std::vector<edmtest::SimpleDerived>));
0163
0164 helper.insert(typeIDVectorInt, "labelC", "instanceC", "processC");
0165 helper.insert(typeIDVectorInt, "label", "instance", "process");
0166 helper.insert(typeIDEventID, "labelB", "instanceB", "processB");
0167 helper.insert(typeIDEventID, "label", "instanceB", "processB");
0168 helper.insert(typeIDEventID, "labelX", "instanceB", "processB");
0169 helper.insert(typeIDEventID, "labelB", "instance", "processB");
0170 helper.insert(typeIDEventID, "labelB", "instanceX", "processB");
0171 helper.insert(typeIDEventID, "labelB", "instanceB", "processB1");
0172 helper.insert(typeIDEventID, "labelB", "instanceB", "processB3");
0173 helper.insert(typeIDEventID, "labelB", "instanceB", "processB2");
0174 helper.insert(typeIDProductID, "label", "instance", "process");
0175 helper.insert(typeIDEventID, "label", "instance", "process");
0176 helper.insert(typeIDProductID, "labelA", "instanceA", "processA");
0177 CPPUNIT_ASSERT_THROW(helper.insert(typeIDProductID, "labelA", "instanceA", "processA"), cms::Exception);
0178
0179 helper.insert(typeIDSetInt, "labelC", "instanceC", "processC");
0180
0181 helper.insert(typeIDVSimpleDerived, "labelC", "instanceC", "processC");
0182
0183
0184 helper.setFrozen();
0185
0186
0187 TypeID typeID_int(typeid(int));
0188 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_int, "labelC", "instanceC", "processC") ==
0189 ProductResolverIndexAmbiguous);
0190 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_int, "labelC", "instanceC", "processQ") ==
0191 ProductResolverIndexInvalid);
0192 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_int, "labelC", "instanceC") == 2);
0193 edm::ProductResolverIndexHelper::Matches matches = helper.relatedIndexes(ELEMENT_TYPE, typeID_int);
0194 CPPUNIT_ASSERT(matches.numberOfMatches() == 4);
0195 CPPUNIT_ASSERT(matches.index(0) == 5);
0196 CPPUNIT_ASSERT(matches.index(1) == 3);
0197 CPPUNIT_ASSERT(matches.index(2) == 2);
0198 CPPUNIT_ASSERT(matches.index(3) == ProductResolverIndexAmbiguous);
0199
0200 TypeID typeID_vint(typeid(std::vector<int>));
0201 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_vint, "labelC", "instanceC", "processC") == 0);
0202 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_vint, "labelC", "instanceC") == 1);
0203
0204 TypeID typeID_sint(typeid(std::set<int>));
0205 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_sint, "labelC", "instanceC", "processC") == 25);
0206 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_sint, "labelC", "instanceC") == 26);
0207
0208 TypeID typeID_Simple(typeid(edmtest::Simple));
0209 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_Simple, "labelC", "instanceC") == 30);
0210 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_Simple, "labelC", "instanceC", "processC") == 27);
0211
0212 TypeID typeID_SimpleDerived(typeid(edmtest::SimpleDerived));
0213 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_SimpleDerived, "labelC", "instanceC") == 29);
0214 CPPUNIT_ASSERT(helper.index(ELEMENT_TYPE, typeID_SimpleDerived, "labelC", "instanceC", "processC") == 27);
0215
0216 TypeID typeID_VSimpleDerived(typeid(std::vector<edmtest::SimpleDerived>));
0217 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_VSimpleDerived, "labelC", "instanceC") == 28);
0218 CPPUNIT_ASSERT(helper.index(PRODUCT_TYPE, typeID_VSimpleDerived, "labelC", "instanceC", "processC") == 27);
0219
0220 matches = helper.relatedIndexes(PRODUCT_TYPE, typeID_EventID, "labelB", "instanceB");
0221 CPPUNIT_ASSERT(matches.numberOfMatches() == 5);
0222 ProductResolverIndex indexEmptyProcess = matches.index(0);
0223 ProductResolverIndex indexB = matches.index(1);
0224 ProductResolverIndex indexB1 = matches.index(2);
0225 ProductResolverIndex indexB2 = matches.index(3);
0226 ProductResolverIndex indexB3 = matches.index(4);
0227 CPPUNIT_ASSERT_THROW(matches.index(5), cms::Exception);
0228 CPPUNIT_ASSERT(indexEmptyProcess == 7);
0229 CPPUNIT_ASSERT(indexB == 6);
0230 CPPUNIT_ASSERT(indexB1 == 16);
0231 CPPUNIT_ASSERT(indexB2 == 18);
0232 CPPUNIT_ASSERT(indexB3 == 17);
0233
0234 CPPUNIT_ASSERT(std::string(matches.moduleLabel(4)) == "labelB");
0235 CPPUNIT_ASSERT(std::string(matches.productInstanceName(4)) == "instanceB");
0236 CPPUNIT_ASSERT(std::string(matches.processName(4)) == "processB3");
0237 CPPUNIT_ASSERT(std::string(matches.processName(0)) == "");
0238
0239 matches = helper.relatedIndexes(ELEMENT_TYPE, typeID_Simple);
0240 CPPUNIT_ASSERT(matches.numberOfMatches() == 2);
0241 ProductResolverIndex indexC = matches.index(1);
0242 CPPUNIT_ASSERT_THROW(matches.index(2), cms::Exception);
0243 CPPUNIT_ASSERT(indexC == 27);
0244
0245 {
0246 auto indexToModules = helper.indiciesForModulesInProcess("processA");
0247 CPPUNIT_ASSERT(indexToModules.size() == 1);
0248 }
0249 {
0250 auto indexToModules = helper.indiciesForModulesInProcess("processB");
0251 CPPUNIT_ASSERT(indexToModules.size() == 5);
0252 }
0253 {
0254 auto indexToModules = helper.indiciesForModulesInProcess("processB1");
0255 CPPUNIT_ASSERT(indexToModules.size() == 1);
0256 }
0257 {
0258 auto indexToModules = helper.indiciesForModulesInProcess("processB2");
0259 CPPUNIT_ASSERT(indexToModules.size() == 1);
0260 }
0261 {
0262 auto indexToModules = helper.indiciesForModulesInProcess("processB3");
0263 CPPUNIT_ASSERT(indexToModules.size() == 1);
0264 }
0265 {
0266 auto indexToModules = helper.indiciesForModulesInProcess("processC");
0267 CPPUNIT_ASSERT(indexToModules.size() == 3);
0268 }
0269 }