1 // Copyright 2024 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "public/fpdf_catalog.h"
6
7 #include "core/fpdfapi/parser/cpdf_dictionary.h"
8 #include "core/fpdfapi/parser/cpdf_document.h"
9 #include "core/fpdfapi/parser/cpdf_string.h"
10 #include "fpdfsdk/cpdfsdk_helpers.h"
11 #include "public/fpdf_edit.h"
12 #include "testing/embedder_test.h"
13
14 using FPDFCatalogTest = EmbedderTest;
15
TEST_F(FPDFCatalogTest,SetLanguageInvalidDocument)16 TEST_F(FPDFCatalogTest, SetLanguageInvalidDocument) {
17 // Document cannot be nullptr.
18 EXPECT_FALSE(FPDFCatalog_SetLanguage(nullptr, "en-US"));
19
20 ScopedFPDFDocument doc(FPDF_CreateNewDocument());
21 CPDF_Document* cpdf_doc = CPDFDocumentFromFPDFDocument(doc.get());
22
23 // Language cannot be null.
24 ASSERT_TRUE(cpdf_doc->GetRoot());
25 EXPECT_FALSE(FPDFCatalog_SetLanguage(doc.get(), nullptr));
26
27 // Catalog cannot be nullptr.
28 cpdf_doc->SetRootForTesting(nullptr);
29 EXPECT_FALSE(FPDFCatalog_SetLanguage(doc.get(), "en-US"));
30 }
31
TEST_F(FPDFCatalogTest,SetLanguageNewDocument)32 TEST_F(FPDFCatalogTest, SetLanguageNewDocument) {
33 ScopedFPDFDocument doc(FPDF_CreateNewDocument());
34
35 const CPDF_Dictionary* catalog =
36 CPDFDocumentFromFPDFDocument(doc.get())->GetRoot();
37 ASSERT_TRUE(catalog);
38
39 // The new document shouldn't have any entry for /Lang.
40 EXPECT_FALSE(catalog->GetStringFor("Lang"));
41
42 // Add a new entry.
43 EXPECT_TRUE(FPDFCatalog_SetLanguage(doc.get(), "en-US"));
44
45 RetainPtr<const CPDF_String> result_language = catalog->GetStringFor("Lang");
46 ASSERT_TRUE(result_language);
47 EXPECT_EQ("en-US", result_language->GetString());
48 }
49
TEST_F(FPDFCatalogTest,SetLanguageExistingDocument)50 TEST_F(FPDFCatalogTest, SetLanguageExistingDocument) {
51 ASSERT_TRUE(OpenDocument("tagged_table.pdf"));
52
53 const CPDF_Dictionary* catalog =
54 CPDFDocumentFromFPDFDocument(document())->GetRoot();
55 ASSERT_TRUE(catalog);
56
57 // The PDF already has an existing entry for /Lang.
58 RetainPtr<const CPDF_String> result_language = catalog->GetStringFor("Lang");
59 ASSERT_TRUE(result_language);
60 EXPECT_EQ("en-US", result_language->GetString());
61
62 // Replace the existing entry.
63 EXPECT_TRUE(FPDFCatalog_SetLanguage(document(), "hu"));
64
65 result_language = catalog->GetStringFor("Lang");
66 ASSERT_TRUE(result_language);
67 EXPECT_EQ("hu", result_language->GetString());
68 }
69