Skip to content

Commit 9851b52

Browse files
committed
[ntuple] add integration test for streamer field evolution
1 parent a7f514a commit 9851b52

File tree

7 files changed

+190
-0
lines changed

7 files changed

+190
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
ROOTTEST_GENERATE_DICTIONARY(
2+
event_v2_dict
3+
${CMAKE_CURRENT_SOURCE_DIR}/Event_v2.hxx
4+
LINKDEF ${CMAKE_CURRENT_SOURCE_DIR}/Event_v2_LinkDef.h
5+
NO_ROOTMAP NO_CXXMODULE
6+
FIXTURES_SETUP generated_event_v2_dictionary
7+
)
8+
9+
ROOTTEST_GENERATE_EXECUTABLE(
10+
write_event
11+
LIBRARIES Core RIO ROOTNTuple
12+
FIXTURES_REQUIRED generated_event_v2_dictionary
13+
FIXTURES_SETUP write_event_excutable)
14+
15+
target_sources(
16+
write_event
17+
PRIVATE write_event.cxx event_v2_dict.cxx
18+
)
19+
20+
ROOTTEST_ADD_TEST(write_event
21+
EXEC ./write_event
22+
FIXTURES_REQUIRED write_event_excutable
23+
FIXTURES_SETUP written_event)
24+
25+
ROOTTEST_GENERATE_DICTIONARY(
26+
event_v3_dict
27+
${CMAKE_CURRENT_SOURCE_DIR}/Event_v3.hxx
28+
LINKDEF ${CMAKE_CURRENT_SOURCE_DIR}/Event_v3_LinkDef.h
29+
NO_ROOTMAP NO_CXXMODULE
30+
FIXTURES_SETUP generated_event_v3_dictionary
31+
)
32+
33+
ROOTTEST_GENERATE_EXECUTABLE(
34+
read_event
35+
LIBRARIES Core RIO ROOTNTuple
36+
FIXTURES_REQUIRED generated_event_v3_dictionary
37+
FIXTURES_SETUP read_event_executable)
38+
39+
target_sources(
40+
read_event
41+
PRIVATE read_event.cxx event_v3_dict.cxx
42+
)
43+
44+
ROOTTEST_ADD_TEST(read_event
45+
EXEC ./read_event
46+
FIXTURES_REQUIRED read_event_executable written_event)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifndef EVENT_V2_H
2+
#define EVENT_V2_H
3+
4+
#include <RtypesCore.h>
5+
6+
#include <memory>
7+
8+
struct StreamerBase {
9+
int fBase = 0;
10+
virtual ~StreamerBase() = default;
11+
12+
ClassDef(StreamerBase, 2)
13+
};
14+
15+
struct StreamerDerived : public StreamerBase {
16+
int fFirst = 1;
17+
int fSecond = 2;
18+
virtual ~StreamerDerived() = default;
19+
20+
ClassDef(StreamerDerived, 2)
21+
};
22+
23+
struct StreamerContainer {
24+
std::unique_ptr<StreamerBase> fPtr;
25+
26+
ClassDefNV(StreamerContainer, 2)
27+
};
28+
29+
struct Event {
30+
int fX = 137;
31+
StreamerContainer fField;
32+
33+
ClassDefNV(Event, 2)
34+
};
35+
36+
#endif // EVENT_V2_H
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifdef __ROOTCLING__
2+
3+
#pragma link C++ class StreamerBase+;
4+
#pragma link C++ class StreamerDerived+;
5+
#pragma link C++ options = rntupleStreamerMode(true) class StreamerContainer+;
6+
#pragma link C++ class Event+;
7+
8+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifndef EVENT_V3_H
2+
#define EVENT_V3_H
3+
4+
#include <RtypesCore.h>
5+
6+
#include <memory>
7+
8+
struct StreamerBase {
9+
int fBase = 0;
10+
virtual ~StreamerBase() = default;
11+
12+
ClassDef(StreamerBase, 2)
13+
};
14+
15+
struct StreamerDerived : public StreamerBase {
16+
int fSecond = 2;
17+
int fFirst = 1;
18+
virtual ~StreamerDerived() = default;
19+
20+
ClassDef(StreamerDerived, 3)
21+
};
22+
23+
struct StreamerContainer {
24+
std::unique_ptr<StreamerBase> fPtr;
25+
26+
ClassDefNV(StreamerContainer, 2)
27+
};
28+
29+
struct Event {
30+
StreamerContainer fField;
31+
int fY = 42;
32+
33+
ClassDefNV(Event, 3)
34+
};
35+
36+
#endif // EVENT_V3_H
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifdef __ROOTCLING__
2+
3+
#pragma link C++ class StreamerBase+;
4+
#pragma link C++ class StreamerDerived+;
5+
#pragma link C++ options = rntupleStreamerMode(true) class StreamerContainer+;
6+
#pragma link C++ class Event+;
7+
8+
#pragma read sourceClass = "StreamerBase" source = "int fBase;" version = "[2]" \
9+
targetClass = "StreamerBase" target = "fBase" \
10+
code = "{ fBase = onfile.fBase + 1000; }"
11+
12+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <ROOT/RNTupleReader.hxx>
2+
3+
#include "Event_v3.hxx"
4+
5+
#include <cstdio>
6+
7+
int main()
8+
{
9+
auto reader = ROOT::RNTupleReader::Open("ntpl", "root_test_streamerfield.root");
10+
11+
auto ptrEvent = reader->GetModel().GetDefaultEntry().GetPtr<Event>("event");
12+
13+
reader->LoadEntry(0);
14+
15+
if (!dynamic_cast<const ROOT::RStreamerField *>(&reader->GetModel().GetConstField("event.fField")))
16+
return 10;
17+
18+
if (!ptrEvent->fField.fPtr)
19+
return 1;
20+
auto derived = dynamic_cast<StreamerDerived *>(ptrEvent->fField.fPtr.get());
21+
if (!derived)
22+
return 2;
23+
if (derived->fBase != 1000)
24+
return 3;
25+
if (derived->fFirst != 1)
26+
return 4;
27+
if (derived->fSecond != 2)
28+
return 5;
29+
if (ptrEvent->fY != 42)
30+
return 6;
31+
32+
std::remove("root_test_streamerfield.root");
33+
return 0;
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include <ROOT/RNTupleModel.hxx>
2+
#include <ROOT/RNTupleWriter.hxx>
3+
4+
#include "Event_v2.hxx"
5+
6+
#include <memory>
7+
8+
int main()
9+
{
10+
auto model = ROOT::RNTupleModel::Create();
11+
auto field = model->MakeField<Event>("event");
12+
auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", "root_test_streamerfield.root");
13+
14+
field->fField.fPtr = std::unique_ptr<StreamerBase>(new StreamerDerived());
15+
writer->Fill();
16+
17+
return 0;
18+
}

0 commit comments

Comments
 (0)