Skip to content

Commit fb3284d

Browse files
committed
[ntuple] test I/O rules for streamer fields
1 parent 2034c23 commit fb3284d

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

tree/ntuple/test/StreamerField.hxx

+10
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,14 @@ struct PolyContainer {
5454
std::unique_ptr<PolyBase> fPoly;
5555
};
5656

57+
template <typename T>
58+
struct OldStreamerName {
59+
T fValue;
60+
};
61+
62+
template <typename T>
63+
struct NewStreamerName {
64+
T fValue;
65+
};
66+
5767
#endif // ROOT_RNTuple_Test_StreamerField

tree/ntuple/test/StreamerFieldLinkDef.h

+4
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@
1212
#pragma link C++ class PolyB + ;
1313
#pragma link C++ options = rntupleStreamerMode(true) class PolyContainer + ;
1414

15+
#pragma link C++ options = rntupleStreamerMode(true), version(3) class OldStreamerName < int> + ;
16+
#pragma link C++ options = rntupleStreamerMode(true), version(3) class NewStreamerName < int> + ;
17+
#pragma read sourceClass = "OldStreamerName<int>" targetClass = "NewStreamerName<int>" version = "[3]"
18+
1519
#endif

tree/ntuple/test/rfield_streamer.cxx

+22
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,25 @@ TEST(RField, StreamerMergeIncremental)
305305
EXPECT_TRUE(seenStreamerInfos[2]);
306306
EXPECT_TRUE(seenStreamerInfos[3]);
307307
}
308+
309+
TEST(RField, StreamerSchemaEvolution)
310+
{
311+
FileRaii fileGuard("test_ntuple_rfield_streamer_schema_evolution.root");
312+
{
313+
auto model = RNTupleModel::Create();
314+
model->AddField(RFieldBase::Create("f", "OldStreamerName<int>").Unwrap());
315+
auto writer = RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath());
316+
auto ptrF = writer->GetModel().GetDefaultEntry().GetPtr<OldStreamerName<int>>("f");
317+
ptrF->fValue = 137;
318+
writer->Fill();
319+
}
320+
321+
auto model = RNTupleModel::Create();
322+
model->AddField(RFieldBase::Create("f", "NewStreamerName<int>").Unwrap());
323+
auto reader = RNTupleReader::Open(std::move(model), "ntpl", fileGuard.GetPath());
324+
325+
ASSERT_EQ(1U, reader->GetNEntries());
326+
auto ptrF = reader->GetModel().GetDefaultEntry().GetPtr<NewStreamerName<int>>("f");
327+
reader->LoadEntry(0);
328+
EXPECT_EQ(137, ptrF->fValue);
329+
}

0 commit comments

Comments
 (0)