Skip to content

Commit 90b5d4b

Browse files
committed
[ntuple] test size check in RVec reading
1 parent 79c23df commit 90b5d4b

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-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: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "ntuple_test.hxx"
2+
3+
#include <limits>
4+
5+
TEST(RNTuple, DISABLED_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+
ROOT::RNTupleReadOptions options;
25+
options.SetClusterCache(ROOT::RNTupleReadOptions::EClusterCache::kOff);
26+
auto reader = RNTupleReader::Open("r", fileGuard.GetPath(), options);
27+
ASSERT_EQ(4u, reader->GetNEntries());
28+
29+
auto viewRVec = reader->GetView<ROOT::RVec<int8_t>>("v");
30+
EXPECT_EQ(1u, viewRVec(0).size());
31+
EXPECT_EQ(1, viewRVec(0).at(0));
32+
const auto &v1 = viewRVec(1);
33+
EXPECT_EQ(std::numeric_limits<std::int32_t>::max(), v1.size());
34+
EXPECT_EQ(1, v1.at(0));
35+
EXPECT_EQ(0, v1.at(1000));
36+
EXPECT_THROW(viewRVec(2), ROOT::RException);
37+
EXPECT_TRUE(viewRVec(3).empty());
38+
39+
auto viewVector = reader->GetView<std::vector<int8_t>>("v");
40+
const auto &v3 = viewVector(2);
41+
EXPECT_EQ(static_cast<std::size_t>(std::numeric_limits<std::int32_t>::max()) + 1, v3.size());
42+
EXPECT_EQ(1, v3.at(0));
43+
EXPECT_EQ(0, v3.at(1000));
44+
EXPECT_EQ(2, v3.at(std::numeric_limits<std::int32_t>::max()));
45+
}

0 commit comments

Comments
 (0)