Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-05-02 05:09:36

0001 #include "Utilities/Testing/interface/CppUnit_testdriver.icpp"  //gives main
0002 #include <cppunit/extensions/HelperMacros.h>
0003 
0004 #include "TClass.h"
0005 #include "TList.h"
0006 #include "TDataMember.h"
0007 
0008 #include <string>
0009 #include <unordered_map>
0010 #include <iostream>
0011 #include <cassert>
0012 
0013 using std::string;
0014 using std::unordered_map;
0015 
0016 class TestSchemaEvolution : public CppUnit::TestFixture {
0017   CPPUNIT_TEST_SUITE(TestSchemaEvolution);
0018   CPPUNIT_TEST(checkVersions);
0019   CPPUNIT_TEST_SUITE_END();
0020 
0021 public:
0022   TestSchemaEvolution() = default;
0023   ~TestSchemaEvolution() override = default;
0024   void setUp() override {}
0025   void tearDown() override {}
0026   void checkVersions();
0027 
0028 private:
0029   void fillBaseline();
0030   void gatherAllClasses();
0031   void runComparison();
0032   void loopOnDataMembers(TClass *);
0033   void loopOnBases(TClass *);
0034   void analyseClass(TClass *);
0035 
0036   unordered_map<string, short> unique_classes_;
0037   unordered_map<string, short> unique_classes_current_;
0038 };
0039 
0040 CPPUNIT_TEST_SUITE_REGISTRATION(TestSchemaEvolution);
0041 
0042 void TestSchemaEvolution::fillBaseline() {
0043   unique_classes_current_.insert(std::make_pair("vector<double>", 6));
0044   unique_classes_current_.insert(std::make_pair("TF1", 12));
0045   unique_classes_current_.insert(std::make_pair("TH3S", 4));
0046   unique_classes_current_.insert(std::make_pair("TAtt3D", 1));
0047   unique_classes_current_.insert(std::make_pair("TH3", 6));
0048   unique_classes_current_.insert(std::make_pair("TH3F", 4));
0049   unique_classes_current_.insert(std::make_pair("TH2D", 4));
0050   unique_classes_current_.insert(std::make_pair("TH2S", 4));
0051   unique_classes_current_.insert(std::make_pair("TArrayI", 1));
0052   unique_classes_current_.insert(std::make_pair("TH2I", 4));
0053   unique_classes_current_.insert(std::make_pair("TH2F", 4));
0054   unique_classes_current_.insert(std::make_pair("TH1I", 3));
0055   unique_classes_current_.insert(std::make_pair("TString", 2));
0056   unique_classes_current_.insert(std::make_pair("TAttLine", 2));
0057   unique_classes_current_.insert(std::make_pair("TObject", 1));
0058   unique_classes_current_.insert(std::make_pair("TH3D", 4));
0059   unique_classes_current_.insert(std::make_pair("TH1S", 3));
0060   unique_classes_current_.insert(std::make_pair("TH3I", 4));
0061   unique_classes_current_.insert(std::make_pair("TAttFill", 2));
0062   unique_classes_current_.insert(std::make_pair("TNamed", 1));
0063   unique_classes_current_.insert(std::make_pair("TH1F", 3));
0064   unique_classes_current_.insert(std::make_pair("TH2", 5));
0065   unique_classes_current_.insert(std::make_pair("TH1", 8));
0066   unique_classes_current_.insert(std::make_pair("TProfile", 7));
0067 #if ROOT_VERSION_CODE < ROOT_VERSION(6, 33, 0)
0068   unique_classes_current_.insert(std::make_pair("TAttMarker", 2));
0069 #else
0070   unique_classes_current_.insert(std::make_pair("TAttMarker", 3));
0071 #endif
0072   unique_classes_current_.insert(std::make_pair("TArray", 1));
0073   unique_classes_current_.insert(std::make_pair("TAxis", 10));
0074   unique_classes_current_.insert(std::make_pair("TProfile2D", 8));
0075   unique_classes_current_.insert(std::make_pair("TH1D", 3));
0076   unique_classes_current_.insert(std::make_pair("TArrayS", 1));
0077   unique_classes_current_.insert(std::make_pair("TAttAxis", 4));
0078   unique_classes_current_.insert(std::make_pair("TArrayD", 1));
0079   unique_classes_current_.insert(std::make_pair("TArrayF", 1));
0080 }
0081 
0082 void TestSchemaEvolution::runComparison() {
0083   CPPUNIT_ASSERT(unique_classes_current_.size() == unique_classes_.size());
0084   for (auto cl : unique_classes_) {
0085     std::cout << "Checking " << cl.first << " " << cl.second << std::endl;
0086     //std::cout << "unique_classes_current_.insert(std::make_pair(\"" << cl.first << "\", " << cl.second << "));" << std::endl;
0087     CPPUNIT_ASSERT(unique_classes_.find(cl.first) != unique_classes_.end());
0088     CPPUNIT_ASSERT(unique_classes_[cl.first] == unique_classes_current_[cl.first]);
0089   }
0090 }
0091 
0092 void TestSchemaEvolution::checkVersions() {
0093   fillBaseline();
0094   gatherAllClasses();
0095   runComparison();
0096 }
0097 
0098 void TestSchemaEvolution::gatherAllClasses() {
0099   static const char *classes[] = {"TH1F",
0100                                   "TH1S",
0101                                   "TH1D",
0102                                   "TH1I",
0103                                   "TH2F",
0104                                   "TH2S",
0105                                   "TH2D",
0106                                   "TH2I",
0107                                   "TH3F",
0108                                   "TH3S",
0109                                   "TH3D",
0110                                   "TH3I",
0111                                   "TProfile",
0112                                   "TProfile2D",
0113                                   "TF1",
0114                                   nullptr};
0115 
0116   int i = 0;
0117   while (classes[i]) {
0118     TClass *tcl = TClass::GetClass(classes[i]);
0119     if (!tcl)
0120       continue;
0121     unique_classes_.insert(std::make_pair(classes[i], tcl->GetClassVersion()));
0122     analyseClass(tcl);
0123     ++i;
0124   }
0125 }
0126 
0127 void TestSchemaEvolution::loopOnDataMembers(TClass *tcl) {
0128   TList *dms = tcl->GetListOfDataMembers();
0129   TIter next(dms);
0130   while (TObject *obj = next()) {
0131     TClass *cl = TClass::GetClass(((TDataMember *)obj)->GetFullTypeName());
0132     if (cl && cl->HasDictionary()) {
0133       unique_classes_.insert(std::make_pair(cl->GetName(), cl->GetClassVersion()));
0134       analyseClass(cl);
0135     }
0136   }
0137 }
0138 
0139 void TestSchemaEvolution::loopOnBases(TClass *tcl) {
0140   TList *bases = tcl->GetListOfBases();
0141   TIter next(bases);
0142   while (TObject *obj = next()) {
0143     TClass *cl = TClass::GetClass(obj->GetName());
0144     if (cl && cl->HasDictionary()) {
0145       unique_classes_.insert(std::make_pair(cl->GetName(), cl->GetClassVersion()));
0146       analyseClass(cl);
0147     }
0148   }
0149 }
0150 
0151 void TestSchemaEvolution::analyseClass(TClass *cl) {
0152   loopOnBases(cl);
0153   loopOnDataMembers(cl);
0154 }