5#include "core/fpdfdoc/cpdf_pagelabel.h"
11#include "core/fpdfapi/page/test_with_page_module.h"
12#include "core/fpdfapi/parser/cpdf_array.h"
13#include "core/fpdfapi/parser/cpdf_dictionary.h"
14#include "core/fpdfapi/parser/cpdf_name.h"
15#include "core/fpdfapi/parser/cpdf_number.h"
16#include "core/fpdfapi/parser/cpdf_string.h"
17#include "core/fpdfapi/parser/cpdf_test_document.h"
18#include "core/fxcrt/retain_ptr.h"
19#include "testing/gmock/include/gmock/gmock.h"
20#include "testing/gtest/include/gtest/gtest.h"
23using testing::Optional;
30 std::optional<
int> starting_number;
33void AddNumKeyValue(
CPDF_Array* nums,
int key,
const NumValue& value) {
34 nums->AppendNew<CPDF_Number>(key);
36 page_label_dict->SetNewFor<CPDF_Name>(
"Type",
"PageLabel");
38 page_label_dict->SetNewFor<CPDF_Name>(
"S", value.style);
41 page_label_dict->SetNewFor<CPDF_String>(
"P", value.prefix);
43 if (value.starting_number.has_value()) {
44 page_label_dict->SetNewFor<CPDF_Number>(
"St",
45 value.starting_number.value());
50 auto limits = node->SetNewFor<
CPDF_Array>(
"Limits");
51 limits->AppendNew<CPDF_Number>(least);
52 limits->AppendNew<CPDF_Number>(greatest);
87 constexpr char kKids[] =
"Kids";
88 constexpr char kNums[] =
"Nums";
90 auto page_labels_root_kids = page_labels_root->SetNewFor<
CPDF_Array>(kKids);
93 AddLimitsArray(kid1.Get(), 0, 8000);
94 auto kids1_kids = kid1->SetNewFor<
CPDF_Array>(kKids);
98 AddLimitsArray(grand_kid2.Get(), 0, 5000);
99 auto grand_kid2_kids = grand_kid2->SetNewFor<
CPDF_Array>(kKids);
103 AddLimitsArray(grand_kid3.Get(), 8000, 8000);
104 auto nums = grand_kid3->SetNewFor<
CPDF_Array>(kNums);
107 {.style =
nullptr, .prefix =
"x", .starting_number =
std::nullopt});
109 AddLimitsArray(great_grand_kid4.Get(), 0, 900);
110 nums = great_grand_kid4->SetNewFor<
CPDF_Array>(kNums);
113 {.style =
"R", .prefix =
nullptr, .starting_number =
std::nullopt});
114 AddNumKeyValue(nums.Get(), 100,
115 {.style =
"A", .prefix =
"abc", .starting_number = 5});
116 AddNumKeyValue(nums.Get(), 900,
117 {.style =
"D", .prefix =
nullptr, .starting_number = 999});
119 AddLimitsArray(great_grand_kid5.Get(), 3000, 5000);
120 nums = great_grand_kid5->SetNewFor<
CPDF_Array>(kNums);
123 {.style =
"r", .prefix =
nullptr, .starting_number =
std::nullopt});
126 {.style =
"a", .prefix =
nullptr, .starting_number =
std::nullopt});
141 auto page_labels_dict = root_dict->SetNewFor<
CPDF_Dictionary>(
"PageLabels");
142 FillPageLabelsTreeDict(page_labels_dict.Get());
144 doc_ = std::make_unique<CPDF_TestDocument>();
145 doc_->SetRoot(std::move(root_dict));
146 for (
int page_index = 0; page_index < 10001; ++page_index) {
147 ASSERT_TRUE(doc_->CreateNewPage(page_index));
150 page_label_ = std::make_unique<CPDF_PageLabel>(doc_.get());
163 std::unique_ptr<CPDF_TestDocument> doc_;
164 std::unique_ptr<CPDF_PageLabel> page_label_;
168 EXPECT_THAT(page_label()->GetLabel(-1), Eq(
std::nullopt));
169 EXPECT_THAT(page_label()->GetLabel(0), Optional(
WideString(L"I"
)));
170 EXPECT_THAT(page_label()->GetLabel(1), Optional(
WideString(L"II"
)));
171 EXPECT_THAT(page_label()->GetLabel(37), Optional(
WideString(L"XXXVIII"
)));
172 EXPECT_THAT(page_label()->GetLabel(99), Optional(
WideString(L"C"
)));
173 EXPECT_THAT(page_label()->GetLabel(100), Optional(
WideString(L"abcE"
)));
174 EXPECT_THAT(page_label()->GetLabel(101), Optional(
WideString(L"abcF"
)));
175 EXPECT_THAT(page_label()->GetLabel(525),
177 EXPECT_THAT(page_label()->GetLabel(899),
178 Optional(
WideString(L"abcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
)));
179 EXPECT_THAT(page_label()->GetLabel(900), Optional(
WideString(L"999"
)));
180 EXPECT_THAT(page_label()->GetLabel(901), Optional(
WideString(L"1000"
)));
181 EXPECT_THAT(page_label()->GetLabel(1234), Optional(
WideString(L"1333"
)));
182 EXPECT_THAT(page_label()->GetLabel(2999), Optional(
WideString(L"3098"
)));
183 EXPECT_THAT(page_label()->GetLabel(3000), Optional(
WideString(L"i"
)));
184 EXPECT_THAT(page_label()->GetLabel(3001), Optional(
WideString(L"ii"
)));
185 EXPECT_THAT(page_label()->GetLabel(3579), Optional(
WideString(L"dlxxx"
)));
186 EXPECT_THAT(page_label()->GetLabel(4999), Optional(
WideString(L"mm"
)));
187 EXPECT_THAT(page_label()->GetLabel(5000), Optional(
WideString(L"a"
)));
188 EXPECT_THAT(page_label()->GetLabel(5001), Optional(
WideString(L"b"
)));
189 EXPECT_THAT(page_label()->GetLabel(7654),
191 L"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
192 L"cccccccccccccccccccccccccccccccccccccccccccc"
)));
194 page_label()->GetLabel(7999),
196 L"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
197 L"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
)));
198 EXPECT_THAT(page_label()->GetLabel(8000), Optional(
WideString(L"x"
)));
199 EXPECT_THAT(page_label()->GetLabel(8001), Optional(
WideString(L"x"
)));
200 EXPECT_THAT(page_label()->GetLabel(10000), Optional(
WideString(L"x"
)));
201 EXPECT_THAT(page_label()->GetLabel(10001), Eq(
std::nullopt));
205 for (
int i = 0; i < 10001; ++i) {
206 page_label()->GetLabel(i);
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
const CPDF_PageLabel * page_label() const
~PageLabelTest() override=default
WideString(const wchar_t *ptr)
TEST_F(PageLabelTest, GetLabel)
fxcrt::WideString WideString