14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <memory> 6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <string> 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility> 8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <vector> 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_boolean.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h" 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_name.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_null.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_number.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_reference.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_string.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "testing/gtest/include/gtest/gtest.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid TestArrayAccessors(const CPDF_Array* arr, 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t index, 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* str_val, 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const_str_val, 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int int_val, 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann float float_val, 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* arr_val, 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* dict_val, 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Stream* stream_val) { 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(str_val, arr->GetStringAt(index).c_str()); 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(int_val, arr->GetIntegerAt(index)); 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(float_val, arr->GetNumberAt(index)); 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(float_val, arr->GetFloatAt(index)); 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(arr_val, arr->GetArrayAt(index)); 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(dict_val, arr->GetDictAt(index)); 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(stream_val, arr->GetStreamAt(index)); 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass PDFObjectsTest : public testing::Test { 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public: 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void SetUp() override { 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Initialize different kinds of objects. 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Boolean objects. 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Boolean* boolean_false_obj = new CPDF_Boolean(false); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Boolean* boolean_true_obj = new CPDF_Boolean(true); 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Number objects. 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Number* number_int_obj = new CPDF_Number(1245); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Number* number_float_obj = new CPDF_Number(9.00345f); 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // String objects. 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_String* str_reg_obj = new CPDF_String(nullptr, L"A simple test"); 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_String* str_spec_obj = new CPDF_String(nullptr, L"\t\n"); 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Name object. 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Name* name_obj = new CPDF_Name(nullptr, "space"); 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Array object. 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ArrayObj = new CPDF_Array; 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ArrayObj->InsertNewAt<CPDF_Number>(0, 8902); 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ArrayObj->InsertNewAt<CPDF_Name>(1, "address"); 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Dictionary object. 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DictObj = new CPDF_Dictionary(); 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DictObj->SetNewFor<CPDF_Boolean>("bool", false); 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DictObj->SetNewFor<CPDF_Number>("num", 0.23f); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Stream object. 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char content[] = "abcdefghijklmnopqrstuvwxyz"; 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t buf_len = FX_ArraySize(content); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<uint8_t, FxFreeDeleter> buf(FX_Alloc(uint8_t, buf_len)); 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memcpy(buf.get(), content, buf_len); 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pNewDict = pdfium::MakeUnique<CPDF_Dictionary>(); 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_StreamDictObj = pNewDict.get(); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_StreamDictObj->SetNewFor<CPDF_String>("key1", L" test dict"); 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_StreamDictObj->SetNewFor<CPDF_Number>("key2", -1); 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Stream* stream_obj = 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new CPDF_Stream(std::move(buf), buf_len, std::move(pNewDict)); 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Null Object. 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Null* null_obj = new CPDF_Null; 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // All direct objects. 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* objs[] = {boolean_false_obj, boolean_true_obj, number_int_obj, 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann number_float_obj, str_reg_obj, str_spec_obj, 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann name_obj, m_ArrayObj.Get(), m_DictObj.Get(), 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stream_obj, null_obj}; 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DirectObjTypes = { 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY, 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object::STREAM, CPDF_Object::NULLOBJ}; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(objs); ++i) 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DirectObjs.emplace_back(objs[i]); 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Indirect references to indirect objects. 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder = pdfium::MakeUnique<CPDF_IndirectObjectHolder>(); 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IndirectObjs = {m_ObjHolder->AddIndirectObject(boolean_true_obj->Clone()), 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder->AddIndirectObject(number_int_obj->Clone()), 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder->AddIndirectObject(str_spec_obj->Clone()), 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder->AddIndirectObject(name_obj->Clone()), 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder->AddIndirectObject(m_ArrayObj->Clone()), 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder->AddIndirectObject(m_DictObj->Clone()), 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ObjHolder->AddIndirectObject(stream_obj->Clone())}; 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CPDF_Object* pObj : m_IndirectObjs) { 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_RefObjs.emplace_back( 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new CPDF_Reference(m_ObjHolder.get(), pObj->GetObjNum())); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) { 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (obj1 == obj2) 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (obj1->GetType()) { 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::BOOLEAN: 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj1->GetInteger() == obj2->GetInteger(); 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NUMBER: 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj1->AsNumber()->IsInteger() == obj2->AsNumber()->IsInteger() && 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann obj1->GetInteger() == obj2->GetInteger(); 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::STRING: 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NAME: 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj1->GetString() == obj2->GetString(); 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::ARRAY: { 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Array* array1 = obj1->AsArray(); 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Array* array2 = obj2->AsArray(); 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (array1->GetCount() != array2->GetCount()) 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < array1->GetCount(); ++i) { 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!Equal(array1->GetObjectAt(i), array2->GetObjectAt(i))) 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::DICTIONARY: { 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Dictionary* dict1 = obj1->AsDictionary(); 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Dictionary* dict2 = obj2->AsDictionary(); 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dict1->GetCount() != dict2->GetCount()) 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (CPDF_Dictionary::const_iterator it = dict1->begin(); 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann it != dict1->end(); ++it) { 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!Equal(it->second.get(), dict2->GetObjectFor(it->first))) 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::NULLOBJ: 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::STREAM: { 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Stream* stream1 = obj1->AsStream(); 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Stream* stream2 = obj2->AsStream(); 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!stream1->GetDict() && !stream2->GetDict()) 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Compare dictionaries. 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!Equal(stream1->GetDict(), stream2->GetDict())) 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Compare sizes. 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (stream1->GetRawSize() != stream2->GetRawSize()) 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Compare contents. 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Since this function is used for testing Clone(), only memory based 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // streams need to be handled. 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!stream1->IsMemoryBased() || !stream2->IsMemoryBased()) 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return memcmp(stream1->GetRawData(), stream2->GetRawData(), 164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream1->GetRawSize()) == 0; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case CPDF_Object::REFERENCE: 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return obj1->AsReference()->GetRefObjNum() == 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann obj2->AsReference()->GetRefObjNum(); 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann protected: 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // m_ObjHolder needs to be declared first and destructed last since it also 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // refers to some objects in m_DirectObjs. 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_IndirectObjectHolder> m_ObjHolder; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CPDF_Object>> m_DirectObjs; 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<int> m_DirectObjTypes; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CPDF_Object>> m_RefObjs; 180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann UnownedPtr<CPDF_Dictionary> m_DictObj; 181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann UnownedPtr<CPDF_Dictionary> m_StreamDictObj; 182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann UnownedPtr<CPDF_Array> m_ArrayObj; 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<CPDF_Object*> m_IndirectObjs; 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetString) { 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const direct_obj_results[] = { 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "false", "true", "1245", "9.00345", "A simple test", "\t\n", "space", 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "", "", "", ""}; 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(direct_obj_results[i], m_DirectObjs[i]->GetString().c_str()); 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const indirect_obj_results[] = {"true", "1245", "\t\n", "space", 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "", "", ""}; 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_RefObjs.size(); ++i) { 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(indirect_obj_results[i], m_RefObjs[i]->GetString().c_str()); 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetUnicodeText) { 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const wchar_t* const direct_obj_results[] = { 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann L"", L"", L"", L"", L"A simple test", 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann L"\t\n", L"space", L"", L"", L"abcdefghijklmnopqrstuvwxyz", 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann L""}; 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) { 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(direct_obj_results[i], 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DirectObjs[i]->GetUnicodeText().c_str()); 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& it : m_RefObjs) 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(L"", it->GetUnicodeText().c_str()); 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetNumber) { 219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const float direct_obj_results[] = {0, 0, 1245, 9.00345f, 0, 0, 220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 0, 0, 0, 0, 0}; 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetNumber()); 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const float indirect_obj_results[] = {0, 1245, 0, 0, 0, 0, 0}; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_RefObjs.size(); ++i) 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_obj_results[i], m_RefObjs[i]->GetNumber()); 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetInteger) { 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const int direct_obj_results[] = {0, 1, 1245, 9, 0, 0, 0, 0, 0, 0, 0}; 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetInteger()); 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const int indirect_obj_results[] = {1, 1245, 0, 0, 0, 0, 0}; 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_RefObjs.size(); ++i) 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_obj_results[i], m_RefObjs[i]->GetInteger()); 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetDict) { 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Dictionary* const direct_obj_results[] = { 245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, nullptr, nullptr, nullptr, nullptr, 246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, nullptr, nullptr, m_DictObj.Get(), m_StreamDictObj.Get(), 247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr}; 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetDict()); 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const CPDF_Dictionary* const indirect_obj_results[] = {nullptr, 254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, 255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, 256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, 257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, 258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_DictObj.Get(), 259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_StreamDictObj.Get()}; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_RefObjs.size(); ++i) 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(Equal(indirect_obj_results[i], m_RefObjs[i]->GetDict())); 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetArray) { 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_Array* const direct_obj_results[] = { 266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, 267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nullptr, m_ArrayObj.Get(), nullptr, nullptr, nullptr}; 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->AsArray()); 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& it : m_RefObjs) 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, it->AsArray()); 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, Clone) { 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) { 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Object> obj = m_DirectObjs[i]->Clone(); 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(Equal(m_DirectObjs[i].get(), obj.get())); 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& it : m_RefObjs) { 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Object> obj = it->Clone(); 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(Equal(it.get(), obj.get())); 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetType) { 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjTypes[i], m_DirectObjs[i]->GetType()); 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& it : m_RefObjs) 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::REFERENCE, it->GetType()); 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, GetDirect) { 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->GetDirect()); 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_RefObjs.size(); ++i) 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_IndirectObjs[i], m_RefObjs[i]->GetDirect()); 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, SetString) { 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const set_values[] = {"true", "fake", "3.125f", "097", 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "changed", "", "NewName"}; 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const expected[] = {"true", "false", "3.125", "97", 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "changed", "", "NewName"}; 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(set_values); ++i) { 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_DirectObjs[i]->SetString(set_values[i]); 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(expected[i], m_DirectObjs[i]->GetString().c_str()); 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST_F(PDFObjectsTest, IsTypeAndAsType) { 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check for direct objects. 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_DirectObjs.size(); ++i) { 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::ARRAY) { 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsArray()); 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsArray()); 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsArray()); 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsArray()); 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::BOOLEAN) { 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsBoolean()); 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsBoolean()); 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsBoolean()); 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsBoolean()); 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::NAME) { 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsName()); 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsName()); 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsName()); 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsName()); 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::NUMBER) { 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsNumber()); 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsNumber()); 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsNumber()); 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsNumber()); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::STRING) { 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsString()); 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsString()); 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsString()); 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsString()); 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::DICTIONARY) { 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsDictionary()); 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsDictionary()); 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsDictionary()); 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsDictionary()); 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_DirectObjTypes[i] == CPDF_Object::STREAM) { 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_DirectObjs[i]->IsStream()); 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsStream()); 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsStream()); 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsStream()); 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(m_DirectObjs[i]->IsReference()); 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, m_DirectObjs[i]->AsReference()); 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect references. 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < m_RefObjs.size(); ++i) { 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(m_RefObjs[i]->IsReference()); 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(m_RefObjs[i].get(), m_RefObjs[i]->AsReference()); 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, GetMatrix) { 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann float elems[][6] = {{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {1, 2, 3, 4, 5, 6}, 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {2.3f, 4.05f, 3, -2, -3, 0.0f}, 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {0.05f, 0.1f, 0.56f, 0.67f, 1.34f, 99.9f}}; 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(elems); ++i) { 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Matrix matrix(elems[i][0], elems[i][1], elems[i][2], elems[i][3], 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann elems[i][4], elems[i][5]); 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < 6; ++j) 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->AddNew<CPDF_Number>(elems[i][j]); 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Matrix arr_matrix = arr->GetMatrix(); 40433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(matrix.a, arr_matrix.a); 40533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(matrix.b, arr_matrix.b); 40633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(matrix.c, arr_matrix.c); 40733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(matrix.d, arr_matrix.d); 40833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(matrix.e, arr_matrix.e); 40933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(matrix.f, arr_matrix.f); 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, GetRect) { 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann float elems[][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {1, 2, 5, 6}, 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {2.3f, 4.05f, -3, 0.0f}, 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {0.05f, 0.1f, 1.34f, 99.9f}}; 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(elems); ++i) { 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_FloatRect rect(elems[i]); 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < 4; ++j) 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->AddNew<CPDF_Number>(elems[i][j]); 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_FloatRect arr_rect = arr->GetRect(); 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(rect.left, arr_rect.left); 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(rect.right, arr_rect.right); 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(rect.bottom, arr_rect.bottom); 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(rect.top, arr_rect.top); 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, GetTypeAt) { 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Boolean array. 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const bool vals[] = {true, false, false, true, true}; 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Boolean>(i, vals[i]); 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i] ? "true" : "false", // String value. 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i] ? 1 : 0, // Integer value. 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Integer array. 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const int vals[] = {10, 0, -345, 2089345456, -1000000000, 567, 93658767}; 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Number>(i, vals[i]); 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char buf[33]; 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_itoa(vals[i], buf, 10), // String value. 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Integer value. 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Float value. 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Float array. 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const float vals[] = {0.0f, 0, 10, 10.0f, 0.0345f, 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 897.34f, -2.5f, -1.0f, -345.0f, -0.0f}; 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const expected_str[] = { 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "0", "0", "10", "10", "0.0345", "897.34", "-2.5", "-1", "-345", "0"}; 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Number>(i, vals[i]); 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann expected_str[i], // String value. 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Integer value. 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Float value. 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // String and name array 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const vals[] = {"this", "adsde$%^", "\r\t", "\"012", 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ".", "EYREW", "It is a joke :)"}; 491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto string_array = pdfium::MakeUnique<CPDF_Array>(); 492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto name_array = pdfium::MakeUnique<CPDF_Array>(); 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann string_array->InsertNewAt<CPDF_String>(i, vals[i], false); 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_array->InsertNewAt<CPDF_Name>(i, vals[i]); 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(string_array.get(), i, // Array and index. 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // String value. 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Const string value. 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Integer value. 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(name_array.get(), i, // Array and index. 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // String value. 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Const string value. 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Integer value. 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Null element array. 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Null>(i); 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "", // String value. 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Integer value. 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Array of array. 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* vals[3]; 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i] = arr->AddNew<CPDF_Array>(); 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < 3; ++j) { 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int value = j + 100; 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i]->InsertNewAt<CPDF_Number>(i, value); 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "", // String value. 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Integer value. 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Array value. 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Dictionary value. 5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Dictionary array. 5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* vals[3]; 5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i] = arr->AddNew<CPDF_Dictionary>(); 5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < 3; ++j) { 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::string key("key"); 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char buf[33]; 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key.append(FXSYS_itoa(j, buf, 10)); 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int value = j + 200; 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value); 5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "", // String value. 5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Integer value. 5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Dictionary value. 5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr); // Stream value. 5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Stream array. 5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* vals[3]; 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Stream* stream_vals[3]; 5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i] = new CPDF_Dictionary(); 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < 3; ++j) { 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::string key("key"); 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char buf[33]; 5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann key.append(FXSYS_itoa(j, buf, 10)); 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int value = j + 200; 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value); 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t content[] = "content: this is a stream"; 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t data_size = FX_ArraySize(content); 5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<uint8_t, FxFreeDeleter> data( 5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Alloc(uint8_t, data_size)); 5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memcpy(data.get(), content, data_size); 5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stream_vals[i] = arr->AddNew<CPDF_Stream>(std::move(data), data_size, 5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pdfium::WrapUnique(vals[i])); 6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < 3; ++i) { 6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann TestArrayAccessors(arr.get(), i, // Array and index. 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "", // String value. 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Const string value. 6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Integer value. 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, // Float value. 6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // Array value. 6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann vals[i], // Dictionary value. 6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stream_vals[i]); // Stream value. 6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Mixed array. 6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Boolean>(0, true); 6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Boolean>(1, false); 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Number>(2, 0); 6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Number>(3, -1234); 6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Number>(4, 2345.0f); 6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Number>(5, 0.05f); 6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_String>(6, "", false); 6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_String>(7, "It is a test!", false); 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Name>(8, "NAME"); 6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Name>(9, "test"); 6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->InsertNewAt<CPDF_Null>(10); 6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* arr_val = arr->InsertNewAt<CPDF_Array>(11); 6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr_val->AddNew<CPDF_Number>(1); 6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr_val->AddNew<CPDF_Number>(2); 6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* dict_val = arr->InsertNewAt<CPDF_Dictionary>(12); 6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict_val->SetNewFor<CPDF_String>("key1", "Linda", false); 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict_val->SetNewFor<CPDF_String>("key2", "Zoe", false); 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* stream_dict = new CPDF_Dictionary(); 6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stream_dict->SetNewFor<CPDF_String>("key1", "John", false); 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann stream_dict->SetNewFor<CPDF_String>("key2", "King", false); 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t data[] = "A stream for test"; 6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // The data buffer will be owned by stream object, so it needs to be 6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // dynamically allocated. 6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann size_t buf_size = sizeof(data); 6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<uint8_t, FxFreeDeleter> buf(FX_Alloc(uint8_t, buf_size)); 6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann memcpy(buf.get(), data, buf_size); 6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Stream* stream_val = arr->InsertNewAt<CPDF_Stream>( 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13, std::move(buf), buf_size, pdfium::WrapUnique(stream_dict)); 6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const char* const expected_str[] = { 6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "true", "false", "0", "-1234", "2345", "0.05", "", 6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "It is a test!", "NAME", "test", "", "", "", ""}; 6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const int expected_int[] = {1, 0, 0, -1234, 2345, 0, 0, 6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, 0, 0, 0, 0, 0, 0}; 6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const float expected_float[] = {0, 0, 0, -1234, 2345, 0.05f, 0, 6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, 0, 0, 0, 0, 0, 0}; 6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < arr->GetCount(); ++i) { 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(expected_str[i], arr->GetStringAt(i).c_str()); 6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i)); 6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(expected_float[i], arr->GetNumberAt(i)); 6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(expected_float[i], arr->GetFloatAt(i)); 6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == 11) 6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(arr_val, arr->GetArrayAt(i)); 6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, arr->GetArrayAt(i)); 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == 13) { 6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(stream_dict, arr->GetDictAt(i)); 6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(stream_val, arr->GetStreamAt(i)); 6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, arr->GetStreamAt(i)); 6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == 12) 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(dict_val, arr->GetDictAt(i)); 6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, arr->GetDictAt(i)); 6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, AddNumber) { 6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann float vals[] = {1.0f, -1.0f, 0, 0.456734f, 6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12345.54321f, 0.5f, 1000, 0.000045f}; 6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) 6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->AddNew<CPDF_Number>(vals[i]); 6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); 6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); 6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, AddInteger) { 6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int vals[] = {0, 1, 934435456, 876, 10000, -1, -24354656, -100}; 6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) 6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->AddNew<CPDF_Number>(vals[i]); 6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); 6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, AddStringAndName) { 700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static constexpr const char* vals[] = { 701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "", "a", "ehjhRIOYTTFdfcdnv", "122323", 702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "$#%^&**", " ", "This is a test.\r\n"}; 703d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto string_array = pdfium::MakeUnique<CPDF_Array>(); 704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto name_array = pdfium::MakeUnique<CPDF_Array>(); 7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann string_array->AddNew<CPDF_String>(vals[i], false); 7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name_array->AddNew<CPDF_Name>(vals[i]); 7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(vals); ++i) { 7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::STRING, string_array->GetObjectAt(i)->GetType()); 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(vals[i], string_array->GetObjectAt(i)->GetString().c_str()); 7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::NAME, name_array->GetObjectAt(i)->GetType()); 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_STREQ(vals[i], name_array->GetObjectAt(i)->GetString().c_str()); 7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, AddReferenceAndGetObjectAt) { 718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto holder = pdfium::MakeUnique<CPDF_IndirectObjectHolder>(); 7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Boolean* boolean_obj = new CPDF_Boolean(true); 7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Number* int_obj = new CPDF_Number(-1234); 7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Number* float_obj = new CPDF_Number(2345.089f); 7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_String* str_obj = 7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new CPDF_String(nullptr, "Adsfdsf 343434 %&&*\n", false); 7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Name* name_obj = new CPDF_Name(nullptr, "Title:"); 7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Null* null_obj = new CPDF_Null(); 7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* indirect_objs[] = {boolean_obj, int_obj, float_obj, 7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str_obj, name_obj, null_obj}; 7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1}; 7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr = pdfium::MakeUnique<CPDF_Array>(); 730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto arr1 = pdfium::MakeUnique<CPDF_Array>(); 7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Create two arrays of references by different AddReference() APIs. 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) { 7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann holder->ReplaceIndirectObjectIfHigherGeneration( 7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann obj_nums[i], pdfium::WrapUnique<CPDF_Object>(indirect_objs[i])); 7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr->AddNew<CPDF_Reference>(holder.get(), obj_nums[i]); 7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr1->AddNew<CPDF_Reference>(holder.get(), indirect_objs[i]->GetObjNum()); 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check indirect objects. 7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < FX_ArraySize(obj_nums); ++i) 7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i])); 7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check arrays. 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(arr->GetCount(), arr1->GetCount()); 7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < arr->GetCount(); ++i) { 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::REFERENCE, arr->GetObjectAt(i)->GetType()); 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_objs[i], arr->GetObjectAt(i)->GetDirect()); 7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_objs[i], arr->GetDirectObjectAt(i)); 7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(CPDF_Object::REFERENCE, arr1->GetObjectAt(i)->GetType()); 7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_objs[i], arr1->GetObjectAt(i)->GetDirect()); 7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(indirect_objs[i], arr1->GetDirectObjectAt(i)); 7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, CloneDirectObject) { 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_IndirectObjectHolder objects_holder; 755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto array = pdfium::MakeUnique<CPDF_Array>(); 7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann array->AddNew<CPDF_Reference>(&objects_holder, 1234); 7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_EQ(1U, array->GetCount()); 7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* obj = array->GetObjectAt(0); 7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(obj); 7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(obj->IsReference()); 7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Object> cloned_array_object = array->CloneDirectObject(); 7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_array_object); 7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_array_object->IsArray()); 7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Array> cloned_array = 7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToArray(std::move(cloned_array_object)); 768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_EQ(0U, cloned_array->GetCount()); 7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0); 7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(cloned_obj); 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFArrayTest, ConvertIndirect) { 7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_IndirectObjectHolder objects_holder; 7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto array = pdfium::MakeUnique<CPDF_Array>(); 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObj = array->AddNew<CPDF_Number>(42); 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann array->ConvertToIndirectObjectAt(0, &objects_holder); 7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pRef = array->GetObjectAt(0); 7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pNum = array->GetDirectObjectAt(0); 7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pRef->IsReference()); 7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pNum->IsNumber()); 7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_NE(pObj, pRef); 7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(pObj, pNum); 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(42, array->GetIntegerAt(0)); 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(PDFStreamTest, SetData) { 788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<uint8_t> data(100); 789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto stream = pdfium::MakeUnique<CPDF_Stream>(); 790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->InitStream(data.data(), data.size(), 791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::MakeUnique<CPDF_Dictionary>()); 792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(static_cast<int>(data.size()), 793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->GetIntegerFor("Length")); 794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->SetNewFor<CPDF_String>("Filter", L"SomeFilter"); 796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->SetNewFor<CPDF_String>("DecodeParms", L"SomeParams"); 797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<uint8_t> new_data(data.size() * 2); 799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->SetData(new_data.data(), new_data.size()); 800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // The "Length" field should be updated for new data size. 802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(static_cast<int>(new_data.size()), 803d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->GetIntegerFor("Length")); 804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 805d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // The "Filter" and "DecodeParms" fields should not be changed. 806d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(stream->GetDict()->GetUnicodeTextFor("Filter"), L"SomeFilter"); 807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(stream->GetDict()->GetUnicodeTextFor("DecodeParms"), L"SomeParams"); 808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(PDFStreamTest, SetDataAndRemoveFilter) { 811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<uint8_t> data(100); 812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto stream = pdfium::MakeUnique<CPDF_Stream>(); 813d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->InitStream(data.data(), data.size(), 814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pdfium::MakeUnique<CPDF_Dictionary>()); 815d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(static_cast<int>(data.size()), 816d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->GetIntegerFor("Length")); 817d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->SetNewFor<CPDF_String>("Filter", L"SomeFilter"); 819d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->SetNewFor<CPDF_String>("DecodeParms", L"SomeParams"); 820d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<uint8_t> new_data(data.size() * 2); 822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->SetDataAndRemoveFilter(new_data.data(), new_data.size()); 823d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // The "Length" field should be updated for new data size. 824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(static_cast<int>(new_data.size()), 825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->GetIntegerFor("Length")); 826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // The "Filter" and "DecodeParms" should be removed. 828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_FALSE(stream->GetDict()->KeyExist("Filter")); 829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_FALSE(stream->GetDict()->KeyExist("DecodeParms")); 830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(PDFStreamTest, LengthInDictionaryOnCreate) { 833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static constexpr uint32_t kBufSize = 100; 834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // The length field should be created on stream create. 835d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 836d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::unique_ptr<uint8_t, FxFreeDeleter> data; 837d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann data.reset(FX_Alloc(uint8_t, kBufSize)); 838d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto stream = pdfium::MakeUnique<CPDF_Stream>( 839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::move(data), kBufSize, pdfium::MakeUnique<CPDF_Dictionary>()); 840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(static_cast<int>(kBufSize), 841d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->GetIntegerFor("Length")); 842d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 843d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // The length field should be corrected on stream create. 844d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann { 845d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::unique_ptr<uint8_t, FxFreeDeleter> data; 846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann data.reset(FX_Alloc(uint8_t, kBufSize)); 847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto dict = pdfium::MakeUnique<CPDF_Dictionary>(); 848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dict->SetNewFor<CPDF_Number>("Length", 30000); 849d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto stream = pdfium::MakeUnique<CPDF_Stream>(std::move(data), kBufSize, 850d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::move(dict)); 851d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(static_cast<int>(kBufSize), 852d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann stream->GetDict()->GetIntegerFor("Length")); 853d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFDictionaryTest, CloneDirectObject) { 8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_IndirectObjectHolder objects_holder; 858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto dict = pdfium::MakeUnique<CPDF_Dictionary>(); 8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict->SetNewFor<CPDF_Reference>("foo", &objects_holder, 1234); 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_EQ(1U, dict->GetCount()); 8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* obj = dict->GetObjectFor("foo"); 8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(obj); 8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(obj->IsReference()); 8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Object> cloned_dict_object = dict->CloneDirectObject(); 8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict_object); 8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict_object->IsDictionary()); 8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Dictionary> cloned_dict = 8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToDictionary(std::move(cloned_dict_object)); 871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT_EQ(0U, cloned_dict->GetCount()); 8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* cloned_obj = cloned_dict->GetObjectFor("foo"); 8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(cloned_obj); 8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFObjectTest, CloneCheckLoop) { 8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Create a dictionary/array pair with a reference loop. It takes 8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // some work to do this nowadays, in particular we need the 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // anti-pattern pdfium::WrapUnique(arr.get()). 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto arr_obj = pdfium::MakeUnique<CPDF_Array>(); 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* dict_obj = arr_obj->InsertNewAt<CPDF_Dictionary>(0); 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict_obj->SetFor("arr", pdfium::WrapUnique(arr_obj.get())); 8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Clone this object to see whether stack overflow will be triggered. 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Array> cloned_array = ToArray(arr_obj->Clone()); 8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Cloned object should be the same as the original. 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_array); 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(1u, cloned_array->GetCount()); 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0); 8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict); 8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict->IsDictionary()); 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Recursively referenced object is not cloned. 8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr")); 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Create a dictionary/stream pair with a reference loop. It takes 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // some work to do this nowadays, in particular we need the 8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // anti-pattern pdfium::WrapUnique(dict.get()). 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto dict_obj = pdfium::MakeUnique<CPDF_Dictionary>(); 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Stream* stream_obj = dict_obj->SetNewFor<CPDF_Stream>( 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "stream", nullptr, 0, pdfium::WrapUnique(dict_obj.get())); 9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Clone this object to see whether stack overflow will be triggered. 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Stream> cloned_stream = ToStream(stream_obj->Clone()); 9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Cloned object should be the same as the original. 9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_stream); 9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* cloned_dict = cloned_stream->GetDict(); 9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict); 9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict->IsDictionary()); 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Recursively referenced object is not cloned. 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); 9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann { 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_IndirectObjectHolder objects_holder; 9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Create an object with a reference loop. 9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* dict_obj = objects_holder.NewIndirect<CPDF_Dictionary>(); 9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Array> arr_obj = pdfium::MakeUnique<CPDF_Array>(); 9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arr_obj->InsertNewAt<CPDF_Reference>(0, &objects_holder, 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict_obj->GetObjNum()); 9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* elem0 = arr_obj->GetObjectAt(0); 9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict_obj->SetFor("arr", std::move(arr_obj)); 9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(1u, dict_obj->GetObjNum()); 9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(elem0); 9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(elem0->IsReference()); 9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); 9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Clone this object to see whether stack overflow will be triggered. 9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Dictionary> cloned_dict = 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToDictionary(dict_obj->CloneDirectObject()); 9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Cloned object should be the same as the original. 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_dict); 9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* cloned_arr = cloned_dict->GetObjectFor("arr"); 9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_arr); 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT_TRUE(cloned_arr->IsArray()); 935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(0U, cloned_arr->AsArray()->GetCount()); 9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Recursively referenced object is not cloned. 9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(nullptr, cloned_arr->AsArray()->GetObjectAt(0)); 9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(PDFDictionaryTest, ConvertIndirect) { 9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_IndirectObjectHolder objects_holder; 943d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto dict = pdfium::MakeUnique<CPDF_Dictionary>(); 9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObj = dict->SetNewFor<CPDF_Number>("clams", 42); 9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dict->ConvertToIndirectObjectFor("clams", &objects_holder); 9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pRef = dict->GetObjectFor("clams"); 9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); 9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pRef->IsReference()); 9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pNum->IsNumber()); 9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_NE(pObj, pRef); 9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(pObj, pNum); 9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(42, dict->GetIntegerFor("clams")); 9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannTEST(PDFDictionaryTest, ExtractObjectOnRemove) { 956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto dict = pdfium::MakeUnique<CPDF_Dictionary>(); 957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CPDF_Object* pObj = dict->SetNewFor<CPDF_Number>("child", 42); 958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto extracted_object = dict->RemoveFor("child"); 959d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_EQ(pObj, extracted_object.get()); 960d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann extracted_object = dict->RemoveFor("non_exists_object"); 962d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann EXPECT_FALSE(extracted_object); 963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 964