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
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 }