Skip to content

Commit f0943cb

Browse files
committed
[ntuple] test size check in RVec reading
1 parent 7f9b999 commit f0943cb

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

tree/ntuple/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ ROOT_ADD_GTEST(ntuple_extended ntuple_extended.cxx LIBRARIES ROOTNTuple MathCore
9292
if(NOT MSVC OR win_broken_tests)
9393
ROOT_ADD_GTEST(ntuple_largefile1 ntuple_largefile1.cxx LIBRARIES ROOTNTuple MathCore)
9494
ROOT_ADD_GTEST(ntuple_largefile2 ntuple_largefile2.cxx LIBRARIES ROOTNTuple MathCore)
95+
ROOT_ADD_GTEST(ntuple_largevector ntuple_largevector.cxx LIBRARIES ROOTNTuple)
9596
endif()
9697
ROOT_ADD_GTEST(ntuple_randomaccess ntuple_randomaccess.cxx LIBRARIES ROOTNTuple MathCore)
9798

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include "ntuple_test.hxx"
2+
3+
#include <limits>
4+
5+
TEST(RNTuple, LargeVector)
6+
{
7+
FileRaii fileGuard("test_ntuple_large_vector.root");
8+
9+
// write out a vector too large for RVec
10+
{
11+
auto m = RNTupleModel::Create();
12+
auto vec = m->MakeField<std::vector<int8_t>>("v");
13+
auto writer = RNTupleWriter::Recreate(std::move(m), "r", fileGuard.GetPath());
14+
vec->push_back(1);
15+
writer->Fill();
16+
vec->resize(std::numeric_limits<std::int32_t>::max());
17+
writer->Fill();
18+
vec->push_back(2);
19+
writer->Fill();
20+
vec->clear();
21+
writer->Fill();
22+
}
23+
24+
// read them back as the other type
25+
ROOT::RNTupleReadOptions options;
26+
options.SetClusterCache(ROOT::RNTupleReadOptions::EClusterCache::kOff);
27+
auto reader = RNTupleReader::Open("r", fileGuard.GetPath(), options);
28+
ASSERT_EQ(4u, reader->GetNEntries());
29+
30+
auto viewRVec = reader->GetView<ROOT::RVec<int8_t>>("v");
31+
EXPECT_EQ(1u, viewRVec(0).size());
32+
EXPECT_EQ(1, viewRVec(0).at(0));
33+
const auto &v1 = viewRVec(1);
34+
EXPECT_EQ(std::numeric_limits<std::int32_t>::max(), v1.size());
35+
EXPECT_EQ(1, v1.at(0));
36+
EXPECT_EQ(0, v1.at(1000));
37+
EXPECT_THROW(viewRVec(2), ROOT::RException);
38+
EXPECT_TRUE(viewRVec(3).empty());
39+
40+
auto viewVector = reader->GetView<std::vector<int8_t>>("v");
41+
const auto &v3 = viewVector(2);
42+
EXPECT_EQ(static_cast<std::size_t>(std::numeric_limits<std::int32_t>::max()) + 1, v3.size());
43+
EXPECT_EQ(1, v3.at(0));
44+
EXPECT_EQ(0, v3.at(1000));
45+
EXPECT_EQ(2, v3.at(std::numeric_limits<std::int32_t>::max()));
46+
}

0 commit comments

Comments
 (0)