|
16 | 16 |
|
17 | 17 | TEST(TFile, WriteObjectTObject)
|
18 | 18 | {
|
19 |
| - auto filename{"tfile_writeobject_tobject.root"}; |
20 |
| - auto tnamed_name{"mytnamed_name"}; |
21 |
| - auto tnamed_title{"mytnamed_title"}; |
22 |
| - |
23 |
| - { |
24 |
| - TNamed mytnamed{tnamed_name, tnamed_title}; |
25 |
| - TFile f{filename, "recreate"}; |
26 |
| - f.WriteObject(&mytnamed, mytnamed.GetName()); |
27 |
| - f.Close(); |
28 |
| - } |
29 |
| - |
30 |
| - TFile input{filename}; |
31 |
| - auto named = input.Get<TNamed>(tnamed_name); |
32 |
| - auto keyptr = static_cast<TKey *>(input.GetListOfKeys()->At(0)); |
33 |
| - |
34 |
| - EXPECT_STREQ(named->GetName(), tnamed_name); |
35 |
| - EXPECT_STREQ(named->GetTitle(), tnamed_title); |
36 |
| - EXPECT_STREQ(keyptr->GetName(), tnamed_name); |
37 |
| - EXPECT_STREQ(keyptr->GetTitle(), tnamed_title); |
38 |
| - |
39 |
| - input.Close(); |
40 |
| - gSystem->Unlink(filename); |
| 19 | + auto filename{"tfile_writeobject_tobject.root"}; |
| 20 | + auto tnamed_name{"mytnamed_name"}; |
| 21 | + auto tnamed_title{"mytnamed_title"}; |
| 22 | + |
| 23 | + { |
| 24 | + TNamed mytnamed{tnamed_name, tnamed_title}; |
| 25 | + TFile f{filename, "recreate"}; |
| 26 | + f.WriteObject(&mytnamed, mytnamed.GetName()); |
| 27 | + f.Close(); |
| 28 | + } |
| 29 | + |
| 30 | + TFile input{filename}; |
| 31 | + auto named = input.Get<TNamed>(tnamed_name); |
| 32 | + auto keyptr = static_cast<TKey *>(input.GetListOfKeys()->At(0)); |
| 33 | + |
| 34 | + EXPECT_STREQ(named->GetName(), tnamed_name); |
| 35 | + EXPECT_STREQ(named->GetTitle(), tnamed_title); |
| 36 | + EXPECT_STREQ(keyptr->GetName(), tnamed_name); |
| 37 | + EXPECT_STREQ(keyptr->GetTitle(), tnamed_title); |
| 38 | + |
| 39 | + input.Close(); |
| 40 | + gSystem->Unlink(filename); |
41 | 41 | }
|
42 | 42 |
|
43 | 43 | TEST(TFile, WriteObjectVector)
|
44 | 44 | {
|
45 |
| - auto filename{"tfile_writeobject_vector.root"}; |
46 |
| - auto vec_name{"object name"}; // Decided arbitrarily |
| 45 | + auto filename{"tfile_writeobject_vector.root"}; |
| 46 | + auto vec_name{"object name"}; // Decided arbitrarily |
47 | 47 |
|
48 |
| - { |
49 |
| - std::vector<int> myvec{1,2,3,4,5}; |
50 |
| - TFile f{filename, "recreate"}; |
51 |
| - f.WriteObject(&myvec, vec_name); |
52 |
| - f.Close(); |
53 |
| - } |
| 48 | + { |
| 49 | + std::vector<int> myvec{1, 2, 3, 4, 5}; |
| 50 | + TFile f{filename, "recreate"}; |
| 51 | + f.WriteObject(&myvec, vec_name); |
| 52 | + f.Close(); |
| 53 | + } |
54 | 54 |
|
55 |
| - TFile input{filename}; |
56 |
| - auto retvecptr = input.Get<std::vector<int>>(vec_name); |
57 |
| - const auto &retvec = *retvecptr; |
58 |
| - auto retkey = static_cast<TKey *>(input.GetListOfKeys()->At(0)); |
| 55 | + TFile input{filename}; |
| 56 | + auto retvecptr = input.Get<std::vector<int>>(vec_name); |
| 57 | + const auto &retvec = *retvecptr; |
| 58 | + auto retkey = static_cast<TKey *>(input.GetListOfKeys()->At(0)); |
59 | 59 |
|
60 |
| - std::vector<int> expected{1,2,3,4,5}; |
| 60 | + std::vector<int> expected{1, 2, 3, 4, 5}; |
61 | 61 |
|
62 |
| - ASSERT_EQ(retvec.size(), expected.size()); |
63 |
| - for (std::size_t i = 0; i < retvec.size(); ++i) { |
64 |
| - EXPECT_EQ(retvec[i], expected[i]); |
65 |
| - } |
| 62 | + ASSERT_EQ(retvec.size(), expected.size()); |
| 63 | + for (std::size_t i = 0; i < retvec.size(); ++i) { |
| 64 | + EXPECT_EQ(retvec[i], expected[i]); |
| 65 | + } |
66 | 66 |
|
67 |
| - EXPECT_STREQ(retkey->GetName(), vec_name); |
68 |
| - EXPECT_STREQ(retkey->GetTitle(), ""); // Objects that don't derive from TObject have no title |
| 67 | + EXPECT_STREQ(retkey->GetName(), vec_name); |
| 68 | + EXPECT_STREQ(retkey->GetTitle(), ""); // Objects that don't derive from TObject have no title |
69 | 69 |
|
70 |
| - input.Close(); |
71 |
| - gSystem->Unlink(filename); |
| 70 | + input.Close(); |
| 71 | + gSystem->Unlink(filename); |
72 | 72 | }
|
73 | 73 |
|
74 | 74 | // Tests ROOT-9857
|
@@ -142,22 +142,22 @@ TEST(TFile, ReadWithoutGlobalRegistrationNet)
|
142 | 142 | TestReadWithoutGlobalRegistrationIfPossible(netFile);
|
143 | 143 | }
|
144 | 144 | #endif
|
145 |
| -#endif |
| 145 | +#endif |
146 | 146 |
|
147 | 147 | // https://github.com/root-project/root/issues/16189
|
148 | 148 | TEST(TFile, k630forwardCompatibility)
|
149 | 149 | {
|
150 | 150 | gEnv->SetValue("TFile.v630forwardCompatibility", 1);
|
151 | 151 | const std::string filename{"filek30.root"};
|
152 | 152 | // Testing that the flag is also set when creating the file from scratch (as opposed to "UPDATE")
|
153 |
| - TFile filec{filename.c_str(),"RECREATE"}; |
154 |
| - ASSERT_EQ(filec.TestBit(TFile::k630forwardCompatibility), true); |
| 153 | + TFile filec{filename.c_str(), "RECREATE"}; |
| 154 | + ASSERT_EQ(filec.TestBit(TFile::k630forwardCompatibility), true); |
155 | 155 | filec.Close();
|
156 |
| - TFile filer{filename.c_str(),"READ"}; |
157 |
| - ASSERT_EQ(filer.TestBit(TFile::k630forwardCompatibility), true); |
| 156 | + TFile filer{filename.c_str(), "READ"}; |
| 157 | + ASSERT_EQ(filer.TestBit(TFile::k630forwardCompatibility), true); |
158 | 158 | filer.Close();
|
159 |
| - TFile fileu{filename.c_str(),"UPDATE"}; |
160 |
| - ASSERT_EQ(fileu.TestBit(TFile::k630forwardCompatibility), true); |
| 159 | + TFile fileu{filename.c_str(), "UPDATE"}; |
| 160 | + ASSERT_EQ(fileu.TestBit(TFile::k630forwardCompatibility), true); |
161 | 161 | fileu.Close();
|
162 | 162 | gSystem->Unlink(filename.c_str());
|
163 | 163 | }
|
@@ -203,3 +203,51 @@ TEST(TFile, MakeSubDirectory)
|
203 | 203 | EXPECT_EQ(std::string(gDirectory->GetPath()), "dirTest17824.root:/a/b/c");
|
204 | 204 | EXPECT_EQ(std::string(gDirectory->GetName()), "c");
|
205 | 205 | }
|
| 206 | + |
| 207 | +TEST(TFile, WalkTKeys) |
| 208 | +{ |
| 209 | + struct FileRaii { |
| 210 | + std::string fFilename; |
| 211 | + FileRaii(std::string_view fname) : fFilename(fname) {} |
| 212 | + ~FileRaii() { gSystem->Unlink(fFilename.c_str()); } |
| 213 | + } fileGuard("tfile_walk_tkeys.root"); |
| 214 | + |
| 215 | + TFile outFile(fileGuard.fFilename.c_str(), "RECREATE"); |
| 216 | + |
| 217 | + std::string foo = "foo"; |
| 218 | + outFile.WriteObject(&foo, "foo"); |
| 219 | + |
| 220 | + // Write an object with an extremely long name (> 128 chars but < 256) |
| 221 | + static const char kLongKey[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 222 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 223 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; |
| 224 | + static_assert(std::size(kLongKey) > 128); |
| 225 | + static_assert(std::size(kLongKey) < 256); |
| 226 | + outFile.WriteObject(&foo, kLongKey); |
| 227 | + |
| 228 | + // Write an object with an even longer name (> 256 chars) |
| 229 | + static const char kLongerKey[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 230 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 231 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 232 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 233 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" |
| 234 | + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; |
| 235 | + static_assert(std::size(kLongerKey) > 256); |
| 236 | + outFile.WriteObject(&foo, kLongerKey); |
| 237 | + outFile.Close(); |
| 238 | + |
| 239 | + TFile inFile(fileGuard.fFilename.c_str(), "READ"); |
| 240 | + auto keys = inFile.WalkTKeys(); |
| 241 | + auto it = keys.begin(); |
| 242 | + EXPECT_EQ(it->fKeyName, "tfile_walk_tkeys.root"); |
| 243 | + EXPECT_EQ(it->fClassName, "TFile"); |
| 244 | + ++it; |
| 245 | + EXPECT_EQ(it->fKeyName, "foo"); |
| 246 | + EXPECT_EQ(it->fClassName, "string"); |
| 247 | + ++it; |
| 248 | + EXPECT_EQ(it->fKeyName, kLongKey); |
| 249 | + EXPECT_EQ(it->fClassName, "string"); |
| 250 | + ++it; |
| 251 | + EXPECT_EQ(it->fKeyName, kLongerKey); |
| 252 | + EXPECT_EQ(it->fClassName, "string"); |
| 253 | +} |
0 commit comments