| // Copyright 2017 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "public/fpdf_catalog.h" |
| |
| #include "core/fpdfapi/cpdf_modulemgr.h" |
| #include "core/fpdfapi/parser/cpdf_document.h" |
| #include "core/fpdfapi/parser/cpdf_number.h" |
| #include "core/fpdfapi/parser/cpdf_parser.h" |
| #include "core/fpdfapi/parser/cpdf_string.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "testing/test_support.h" |
| |
| #ifdef PDF_ENABLE_XFA |
| #include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" |
| #endif // PDF_ENABLE_XFA |
| |
| class CPDF_TestDocument : public CPDF_Document { |
| public: |
| CPDF_TestDocument() : CPDF_Document(nullptr) {} |
| |
| void SetRoot(CPDF_Dictionary* root) { |
| m_pRootDict = root; |
| GetRoot(); |
| } |
| }; |
| |
| #ifdef PDF_ENABLE_XFA |
| class CPDF_TestXFAContext : public CPDFXFA_Context { |
| public: |
| CPDF_TestXFAContext() |
| : CPDFXFA_Context(pdfium::MakeUnique<CPDF_TestDocument>()) {} |
| |
| void SetRoot(CPDF_Dictionary* root) { |
| reinterpret_cast<CPDF_TestDocument*>(GetPDFDoc())->SetRoot(root); |
| } |
| |
| CPDF_IndirectObjectHolder* GetHolder() { return GetPDFDoc(); } |
| }; |
| using CPDF_TestPdfDocument = CPDF_TestXFAContext; |
| #else // PDF_ENABLE_XFA |
| using CPDF_TestPdfDocument = CPDF_TestDocument; |
| #endif // PDF_ENABLE_XFA |
| |
| class PDFCatalogTest : public testing::Test { |
| public: |
| void SetUp() override { |
| CPDF_ModuleMgr::Get()->Init(); |
| |
| m_pDoc = pdfium::MakeUnique<CPDF_TestPdfDocument>(); |
| |
| // Setup the root directory. |
| m_pRootObj = pdfium::MakeUnique<CPDF_Dictionary>(); |
| } |
| |
| void TearDown() override { |
| m_pDoc.reset(); |
| CPDF_ModuleMgr::Destroy(); |
| } |
| |
| protected: |
| std::unique_ptr<CPDF_TestPdfDocument> m_pDoc; |
| std::unique_ptr<CPDF_Dictionary> m_pRootObj; |
| }; |
| |
| TEST_F(PDFCatalogTest, IsTagged) { |
| // Null doc |
| EXPECT_FALSE(FPDFCatalog_IsTagged(nullptr)); |
| |
| // No root |
| m_pDoc->SetRoot(nullptr); |
| EXPECT_FALSE(FPDFCatalog_IsTagged(m_pDoc.get())); |
| |
| // Empty root |
| m_pDoc->SetRoot(m_pRootObj.get()); |
| EXPECT_FALSE(FPDFCatalog_IsTagged(m_pDoc.get())); |
| |
| // Root with other key |
| m_pRootObj->SetNewFor<CPDF_String>("OTHER_KEY", "other value", false); |
| EXPECT_FALSE(FPDFCatalog_IsTagged(m_pDoc.get())); |
| |
| // Root with empty MarkInfo |
| CPDF_Dictionary* markInfoDict = |
| m_pRootObj->SetNewFor<CPDF_Dictionary>("MarkInfo"); |
| EXPECT_FALSE(FPDFCatalog_IsTagged(m_pDoc.get())); |
| |
| // MarkInfo present but Marked is 0 |
| markInfoDict->SetNewFor<CPDF_Number>("Marked", 0); |
| EXPECT_FALSE(FPDFCatalog_IsTagged(m_pDoc.get())); |
| |
| // MarkInfo present and Marked is 1, PDF is considered tagged. |
| markInfoDict->SetNewFor<CPDF_Number>("Marked", 1); |
| EXPECT_TRUE(FPDFCatalog_IsTagged(m_pDoc.get())); |
| } |