Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: core/fpdfapi/parser/cpdf_document_unittest.cpp

Issue 2489283003: Make AddIndirectObject() take a unique_ptr. (Closed)
Patch Set: Fix test Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/fpdfapi/parser/cpdf_document.h" 5 #include "core/fpdfapi/parser/cpdf_document.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "core/fpdfapi/cpdf_modulemgr.h" 9 #include "core/fpdfapi/cpdf_modulemgr.h"
10 #include "core/fpdfapi/parser/cpdf_array.h" 10 #include "core/fpdfapi/parser/cpdf_array.h"
11 #include "core/fpdfapi/parser/cpdf_dictionary.h" 11 #include "core/fpdfapi/parser/cpdf_dictionary.h"
12 #include "core/fpdfapi/parser/cpdf_linearized_header.h" 12 #include "core/fpdfapi/parser/cpdf_linearized_header.h"
13 #include "core/fpdfapi/parser/cpdf_parser.h" 13 #include "core/fpdfapi/parser/cpdf_parser.h"
14 #include "core/fxcrt/fx_memory.h" 14 #include "core/fxcrt/fx_memory.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/base/ptr_util.h"
16 17
17 namespace { 18 namespace {
18 19
19 CPDF_Dictionary* CreatePageTreeNode(CPDF_Array* kids, 20 CPDF_Dictionary* CreatePageTreeNode(std::unique_ptr<CPDF_Array> kids,
20 CPDF_Document* pDoc, 21 CPDF_Document* pDoc,
21 int count) { 22 int count) {
22 CPDF_Dictionary* pageNode = new CPDF_Dictionary(); 23 CPDF_Array* pUnowned = pDoc->AddIndirectObject(std::move(kids))->AsArray();
24 CPDF_Dictionary* pageNode = pDoc->NewIndirect<CPDF_Dictionary>();
23 pageNode->SetStringFor("Type", "Pages"); 25 pageNode->SetStringFor("Type", "Pages");
24 pageNode->SetReferenceFor("Kids", pDoc, pDoc->AddIndirectObject(kids)); 26 pageNode->SetReferenceFor("Kids", pDoc, pUnowned);
25 pageNode->SetIntegerFor("Count", count); 27 pageNode->SetIntegerFor("Count", count);
26 uint32_t pageNodeRef = pDoc->AddIndirectObject(pageNode); 28 for (size_t i = 0; i < pUnowned->GetCount(); i++)
27 for (size_t i = 0; i < kids->GetCount(); i++) 29 pUnowned->GetDictAt(i)->SetReferenceFor("Parent", pDoc, pageNode);
28 kids->GetDictAt(i)->SetReferenceFor("Parent", pDoc, pageNodeRef);
29 return pageNode; 30 return pageNode;
30 } 31 }
31 32
32 CPDF_Dictionary* CreateNumberedPage(size_t number) { 33 std::unique_ptr<CPDF_Dictionary> CreateNumberedPage(size_t number) {
33 CPDF_Dictionary* page = new CPDF_Dictionary(); 34 auto page = pdfium::MakeUnique<CPDF_Dictionary>();
34 page->SetStringFor("Type", "Page"); 35 page->SetStringFor("Type", "Page");
35 page->SetIntegerFor("PageNumbering", number); 36 page->SetIntegerFor("PageNumbering", number);
36 return page; 37 return page;
37 } 38 }
38 39
39 class CPDF_TestDocumentForPages : public CPDF_Document { 40 class CPDF_TestDocumentForPages : public CPDF_Document {
40 public: 41 public:
41 CPDF_TestDocumentForPages() : CPDF_Document(nullptr) { 42 CPDF_TestDocumentForPages() : CPDF_Document(nullptr) {
42 // Set up test 43 // Set up test
43 CPDF_Array* zeroToTwo = new CPDF_Array(); 44 auto zeroToTwo = pdfium::MakeUnique<CPDF_Array>();
44 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(0))); 45 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(0)));
45 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(1))); 46 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(1)));
46 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(2))); 47 zeroToTwo->AddReference(this, AddIndirectObject(CreateNumberedPage(2)));
47 CPDF_Dictionary* branch1 = CreatePageTreeNode(zeroToTwo, this, 3); 48 CPDF_Dictionary* branch1 =
49 CreatePageTreeNode(std::move(zeroToTwo), this, 3);
48 50
49 CPDF_Array* zeroToThree = new CPDF_Array(); 51 auto zeroToThree = pdfium::MakeUnique<CPDF_Array>();
50 zeroToThree->AddReference(this, branch1->GetObjNum()); 52 zeroToThree->AddReference(this, branch1->GetObjNum());
51 zeroToThree->AddReference(this, AddIndirectObject(CreateNumberedPage(3))); 53 zeroToThree->AddReference(this, AddIndirectObject(CreateNumberedPage(3)));
52 CPDF_Dictionary* branch2 = CreatePageTreeNode(zeroToThree, this, 4); 54 CPDF_Dictionary* branch2 =
55 CreatePageTreeNode(std::move(zeroToThree), this, 4);
53 56
54 CPDF_Array* fourFive = new CPDF_Array(); 57 auto fourFive = pdfium::MakeUnique<CPDF_Array>();
55 fourFive->AddReference(this, AddIndirectObject(CreateNumberedPage(4))); 58 fourFive->AddReference(this, AddIndirectObject(CreateNumberedPage(4)));
56 fourFive->AddReference(this, AddIndirectObject(CreateNumberedPage(5))); 59 fourFive->AddReference(this, AddIndirectObject(CreateNumberedPage(5)));
57 CPDF_Dictionary* branch3 = CreatePageTreeNode(fourFive, this, 2); 60 CPDF_Dictionary* branch3 = CreatePageTreeNode(std::move(fourFive), this, 2);
58 61
59 CPDF_Array* justSix = new CPDF_Array(); 62 auto justSix = pdfium::MakeUnique<CPDF_Array>();
60 justSix->AddReference(this, AddIndirectObject(CreateNumberedPage(6))); 63 justSix->AddReference(this, AddIndirectObject(CreateNumberedPage(6)));
61 CPDF_Dictionary* branch4 = CreatePageTreeNode(justSix, this, 1); 64 CPDF_Dictionary* branch4 = CreatePageTreeNode(std::move(justSix), this, 1);
62 65
63 CPDF_Array* allPages = new CPDF_Array(); 66 auto allPages = pdfium::MakeUnique<CPDF_Array>();
64 allPages->AddReference(this, branch2->GetObjNum()); 67 allPages->AddReference(this, branch2);
65 allPages->AddReference(this, branch3->GetObjNum()); 68 allPages->AddReference(this, branch3);
66 allPages->AddReference(this, branch4->GetObjNum()); 69 allPages->AddReference(this, branch4);
67 CPDF_Dictionary* pagesDict = CreatePageTreeNode(allPages, this, 7); 70 CPDF_Dictionary* pagesDict =
71 CreatePageTreeNode(std::move(allPages), this, 7);
68 72
69 m_pOwnedRootDict.reset(new CPDF_Dictionary()); 73 m_pOwnedRootDict = pdfium::MakeUnique<CPDF_Dictionary>();
70 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict->GetObjNum()); 74 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict);
71 m_pRootDict = m_pOwnedRootDict.get(); 75 m_pRootDict = m_pOwnedRootDict.get();
72 m_PageList.SetSize(7); 76 m_PageList.SetSize(7);
73 } 77 }
74 78
75 private: 79 private:
76 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict; 80 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict;
77 }; 81 };
78 82
79 class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document { 83 class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document {
80 public: 84 public:
81 CPDF_TestDocumentWithPageWithoutPageNum() : CPDF_Document(nullptr) { 85 CPDF_TestDocumentWithPageWithoutPageNum() : CPDF_Document(nullptr) {
82 // Set up test 86 // Set up test
83 CPDF_Array* allPages = new CPDF_Array(); 87 auto allPages = pdfium::MakeUnique<CPDF_Array>();
84 allPages->AddReference(this, AddIndirectObject(CreateNumberedPage(0))); 88 allPages->AddReference(this, AddIndirectObject(CreateNumberedPage(0)));
85 allPages->AddReference(this, AddIndirectObject(CreateNumberedPage(1))); 89 allPages->AddReference(this, AddIndirectObject(CreateNumberedPage(1)));
86 // Page without pageNum. 90 // Page without pageNum.
87 allPages->Add(CreateNumberedPage(2)); 91 allPages->Add(CreateNumberedPage(2).release());
88 CPDF_Dictionary* pagesDict = CreatePageTreeNode(allPages, this, 3); 92 CPDF_Dictionary* pagesDict =
89 93 CreatePageTreeNode(std::move(allPages), this, 3);
90 m_pOwnedRootDict.reset(new CPDF_Dictionary()); 94 m_pOwnedRootDict.reset(new CPDF_Dictionary());
91 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict->GetObjNum()); 95 m_pOwnedRootDict->SetReferenceFor("Pages", this, pagesDict->GetObjNum());
92 m_pRootDict = m_pOwnedRootDict.get(); 96 m_pRootDict = m_pOwnedRootDict.get();
93 m_PageList.SetSize(3); 97 m_PageList.SetSize(3);
94 } 98 }
95 99
96 private: 100 private:
97 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict; 101 std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict;
98 }; 102 };
99 103
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 // can be not exists in this case. 183 // can be not exists in this case.
180 // (case, when hint table is used to page check in CPDF_DataAvail). 184 // (case, when hint table is used to page check in CPDF_DataAvail).
181 CPDF_Document document(pdfium::MakeUnique<CPDF_Parser>()); 185 CPDF_Document document(pdfium::MakeUnique<CPDF_Parser>());
182 auto dict = pdfium::MakeUnique<CPDF_Dictionary>(); 186 auto dict = pdfium::MakeUnique<CPDF_Dictionary>();
183 dict->SetBooleanFor("Linearized", true); 187 dict->SetBooleanFor("Linearized", true);
184 const int page_count = 100; 188 const int page_count = 100;
185 dict->SetIntegerFor("N", page_count); 189 dict->SetIntegerFor("N", page_count);
186 TestLinearized linearized(dict.get()); 190 TestLinearized linearized(dict.get());
187 document.LoadLinearizedDoc(&linearized); 191 document.LoadLinearizedDoc(&linearized);
188 ASSERT_EQ(page_count, document.GetPageCount()); 192 ASSERT_EQ(page_count, document.GetPageCount());
189 CPDF_Object* page_stub = new CPDF_Dictionary(); 193 CPDF_Object* page_stub = document.NewIndirect<CPDF_Dictionary>();
190 const uint32_t obj_num = document.AddIndirectObject(page_stub); 194 const uint32_t obj_num = page_stub->GetObjNum();
191 const int test_page_num = 33; 195 const int test_page_num = 33;
192 196
193 EXPECT_FALSE(document.IsPageLoaded(test_page_num)); 197 EXPECT_FALSE(document.IsPageLoaded(test_page_num));
194 EXPECT_EQ(nullptr, document.GetPage(test_page_num)); 198 EXPECT_EQ(nullptr, document.GetPage(test_page_num));
195 199
196 document.SetPageObjNum(test_page_num, obj_num); 200 document.SetPageObjNum(test_page_num, obj_num);
197
198 EXPECT_TRUE(document.IsPageLoaded(test_page_num)); 201 EXPECT_TRUE(document.IsPageLoaded(test_page_num));
199 EXPECT_EQ(page_stub, document.GetPage(test_page_num)); 202 EXPECT_EQ(page_stub, document.GetPage(test_page_num));
200 } 203 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698