blob: fd1f632e51ccf43a47a67f36d91433398c999c26 [file]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fpdfapi/page/cpdf_page.h"
#include "constants/page_object.h"
#include "core/fpdfapi/page/test_with_page_module.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/cpdf_null.h"
#include "core/fpdfapi/parser/cpdf_reference.h"
#include "core/fpdfapi/parser/cpdf_string.h"
#include "core/fpdfapi/parser/cpdf_test_document.h"
#include "testing/gtest/include/gtest/gtest.h"
using CPDF_PageTest = TestWithPageModule;
TEST_F(CPDF_PageTest, IsValidPageDict) {
EXPECT_FALSE(CPDF_Page::IsValidPageDict(nullptr));
auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>();
page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Page");
EXPECT_TRUE(CPDF_Page::IsValidPageDict(page_dict));
}
TEST_F(CPDF_PageTest, IsValidPageDictWrongTypes) {
auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>();
EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict));
page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Font");
EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict));
page_dict->SetNewFor<CPDF_String>(pdfium::page_object::kType, "Page");
EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict));
page_dict->SetNewFor<CPDF_Null>(pdfium::page_object::kType);
EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict));
}
TEST_F(CPDF_PageTest, IsValidPageDictReference) {
CPDF_TestDocument doc;
auto page_dict = doc.NewIndirect<CPDF_Dictionary>();
page_dict->SetNewFor<CPDF_Reference>(
pdfium::page_object::kType, &doc,
doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Page")));
EXPECT_TRUE(CPDF_Page::IsValidPageDict(page_dict));
page_dict->SetNewFor<CPDF_Reference>(
pdfium::page_object::kType, &doc,
doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Pages")));
EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict));
page_dict->SetNewFor<CPDF_Reference>(
pdfium::page_object::kType, &doc,
doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Null>()));
EXPECT_FALSE(CPDF_Page::IsValidPageDict(page_dict));
}
TEST_F(CPDF_PageTest, IsValidPageDictLoose) {
EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(nullptr));
auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>();
EXPECT_TRUE(CPDF_Page::IsValidPageDictLoose(page_dict));
page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Page");
EXPECT_TRUE(CPDF_Page::IsValidPageDictLoose(page_dict));
}
TEST_F(CPDF_PageTest, IsValidPageDictLooseWrongTypes) {
auto page_dict = pdfium::MakeRetain<CPDF_Dictionary>();
page_dict->SetNewFor<CPDF_Name>(pdfium::page_object::kType, "Font");
EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict));
page_dict->SetNewFor<CPDF_String>(pdfium::page_object::kType, "Page");
EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict));
page_dict->SetNewFor<CPDF_Null>(pdfium::page_object::kType);
EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict));
}
TEST_F(CPDF_PageTest, IsValidPageDictLooseReference) {
CPDF_TestDocument doc;
auto page_dict = doc.NewIndirect<CPDF_Dictionary>();
page_dict->SetNewFor<CPDF_Reference>(
pdfium::page_object::kType, &doc,
doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Page")));
EXPECT_TRUE(CPDF_Page::IsValidPageDictLoose(page_dict));
page_dict->SetNewFor<CPDF_Reference>(
pdfium::page_object::kType, &doc,
doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Name>(nullptr, "Pages")));
EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict));
page_dict->SetNewFor<CPDF_Reference>(
pdfium::page_object::kType, &doc,
doc.AddIndirectObject(pdfium::MakeRetain<CPDF_Null>()));
EXPECT_FALSE(CPDF_Page::IsValidPageDictLoose(page_dict));
}