diff --git a/tree/tree/test/TChainRegressions.cxx b/tree/tree/test/TChainRegressions.cxx index 97cdd8a31abab..2e89c7f4b0d2e 100644 --- a/tree/tree/test/TChainRegressions.cxx +++ b/tree/tree/test/TChainRegressions.cxx @@ -9,13 +9,78 @@ class TTreeCache; +// https://its.cern.ch/jira/browse/ROOT-7973 +TEST(TChain, WrongCacheReadTwoTrees) +{ + const auto treename1 = "tree1"; + const auto treename2 = "tree2"; + const auto filename1 = "tchain7973_file1.root"; + const auto filename2 = "tchain7973_file2.root"; + { + TFile f(filename1, "RECREATE"); + TTree t1(treename1, treename1); + int var = 0; + t1.Branch("bInt", &var); + var = 1; + t1.Fill(); + TTree t2(treename2, treename2); + double var2 = 0.0; + t2.Branch("bDouble", &var2); + var2 = 2.0; + t2.Fill(); + f.Write(); + f.Close(); + } + { + TFile f(filename2, "RECREATE"); + TTree t1(treename1, treename1); + int var = 0; + t1.Branch("bInt", &var); + var = 3; + t1.Fill(); + f.Write(); + f.Close(); + } + { + TChain chain(treename1); + chain.AddFile(filename1); + chain.AddFile(filename2); + int var = 0; + chain.SetBranchAddress("bInt", &var); + + // first entry in first file in chain + Long64_t entry = 0; + Long64_t treeEntry = chain.LoadTree(entry); + EXPECT_EQ(treeEntry, 0); + EXPECT_NE(chain.GetEntry(entry), 0); + EXPECT_EQ(var, 1); + + // read another tree from the same file + TFile *f1 = chain.GetTree()->GetCurrentFile(); + TTree *t2 = f1->Get("tree2"); + double var2 = 0.0; + t2->SetBranchAddress("bDouble", &var2); + EXPECT_NE(t2->GetEntry(0), 0); + EXPECT_FLOAT_EQ(var2, 2.); + + // first entry in second file in chain + Long64_t entry2 = 1; + Long64_t treeEntry2 = chain.LoadTree(entry2); + EXPECT_EQ(treeEntry2, 0); + EXPECT_NE(chain.GetEntry(entry2), 0); + EXPECT_EQ(var, 3); + } + gSystem->Unlink(filename1); + gSystem->Unlink(filename2); +} + // ROOT-10672 TEST(TChain, GetReadCacheBug) { const auto treename = "tree"; const auto filename = "tchain_getreadcachebug.root"; { - TFile f(filename, "recreate"); + TFile f(filename, "RECREATE"); ASSERT_FALSE(f.IsZombie()); TTree t(treename, treename); t.Fill();