Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_objects_unittest.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects_unittest.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects_unittest.cpp |
index 10cfecf042c2e0148660312ad6d9ecd2f878f7d5..9de31c8673fae309e8e8eb5a410aed5e20f3b332 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects_unittest.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects_unittest.cpp |
@@ -1,160 +1,375 @@ |
-// Copyright 2016 PDFium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "core/include/fpdfapi/fpdf_objects.h" |
- |
-#include <memory> |
-#include <vector> |
- |
-#include "core/include/fxcrt/fx_basic.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-class PDFObjectsTest : public testing::Test { |
- public: |
- void SetUp() override { |
- // Initialize different kinds of objects. |
- // Boolean objects. |
- CPDF_Boolean* boolean_false_obj = new CPDF_Boolean(false); |
- CPDF_Boolean* boolean_true_obj = new CPDF_Boolean(true); |
- // Number objects. |
- CPDF_Number* number_int_obj = new CPDF_Number(1245); |
- CPDF_Number* number_float_obj = new CPDF_Number(9.00345f); |
- // String objects. |
- CPDF_String* str_reg_obj = new CPDF_String(L"A simple test"); |
- CPDF_String* str_spec_obj = new CPDF_String(L"\t\n"); |
- // Name object. |
- CPDF_Name* name_obj = new CPDF_Name("space"); |
- // Array object. |
- CPDF_Array* array_obj = new CPDF_Array; |
- array_obj->InsertAt(0, new CPDF_Number(8902)); |
- array_obj->InsertAt(1, new CPDF_Name("address")); |
- // Dictionary object. |
- m_DictObj = new CPDF_Dictionary; |
- m_DictObj->SetAt("bool", new CPDF_Boolean(false)); |
- m_DictObj->SetAt("num", new CPDF_Number(0.23f)); |
- // Stream object. |
- const char content[] = "abcdefghijklmnopqrstuvwxyz"; |
- size_t buf_len = FX_ArraySize(content); |
- uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len)); |
- memcpy(buf, content, buf_len); |
- m_StreamDictObj = new CPDF_Dictionary; |
- m_StreamDictObj->SetAt("key1", new CPDF_String(L" test dict")); |
- m_StreamDictObj->SetAt("key2", new CPDF_Number(-1)); |
- CPDF_Stream* stream_obj = new CPDF_Stream(buf, buf_len, m_StreamDictObj); |
- // Null Object. |
- CPDF_Null* null_obj = new CPDF_Null; |
- // All direct objects. |
- CPDF_Object* objs[] = {boolean_false_obj, boolean_true_obj, number_int_obj, |
- number_float_obj, str_reg_obj, str_spec_obj, |
- name_obj, array_obj, m_DictObj, |
- stream_obj, null_obj}; |
- for (int i = 0; i < FX_ArraySize(objs); ++i) |
- m_DirectObjs.emplace_back(objs[i]); |
- |
- // Indirect references to indirect objects. |
- m_ObjHolder.reset(new CPDF_IndirectObjectHolder(nullptr)); |
- CPDF_Object* referred_objs[] = { |
- boolean_true_obj, number_int_obj, str_spec_obj, name_obj, |
- array_obj, m_DictObj, stream_obj}; |
- for (int i = 0; i < FX_ArraySize(referred_objs); ++i) { |
- m_ObjHolder->AddIndirectObject(referred_objs[i]); |
- m_RefObjs.emplace_back( |
- new CPDF_Reference(m_ObjHolder.get(), referred_objs[i]->GetObjNum())); |
- } |
- } |
- |
- protected: |
- using ScopedObj = std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>>; |
- |
- // m_ObjHolder needs to be declared first and destructed last since it also |
- // refers to some objects in m_DirectObjs. |
- std::unique_ptr<CPDF_IndirectObjectHolder> m_ObjHolder; |
- std::vector<ScopedObj> m_DirectObjs; |
- std::vector<ScopedObj> m_RefObjs; |
- CPDF_Dictionary* m_DictObj; |
- CPDF_Dictionary* m_StreamDictObj; |
-}; |
- |
-TEST_F(PDFObjectsTest, GetString) { |
- const char* direct_obj_results[] = { |
- "false", "true", "1245", "9.00345", "A simple test", "\t\n", "space", |
- "", "", "", ""}; |
- // Check for direct objects. |
- for (int i = 0; i < m_DirectObjs.size(); ++i) |
- EXPECT_STREQ(m_DirectObjs[i]->GetString().c_str(), direct_obj_results[i]); |
- |
- // Check indirect references. |
- const char* indirect_obj_results[] = {"true", "1245", "\t\n", "space", |
- "", "", ""}; |
- for (int i = 0; i < m_RefObjs.size(); ++i) { |
- EXPECT_STREQ(m_RefObjs[i]->GetString().c_str(), indirect_obj_results[i]); |
- } |
-} |
- |
-TEST_F(PDFObjectsTest, GetConstString) { |
- const char* direct_obj_results[] = { |
- nullptr, nullptr, nullptr, nullptr, "A simple test", "\t\n", |
- "space", nullptr, nullptr, nullptr, nullptr}; |
- // Check for direct objects. |
- for (int i = 0; i < m_DirectObjs.size(); ++i) { |
- if (!direct_obj_results[i]) { |
- EXPECT_EQ(m_DirectObjs[i]->GetConstString().GetCStr(), |
- direct_obj_results[i]); |
- } else { |
- EXPECT_STREQ(m_DirectObjs[i]->GetConstString().GetCStr(), |
- direct_obj_results[i]); |
- } |
- } |
- // Check indirect references. |
- const char* indirect_obj_results[] = {nullptr, nullptr, "\t\n", "space", |
- nullptr, nullptr, nullptr}; |
- for (int i = 0; i < m_RefObjs.size(); ++i) { |
- if (!indirect_obj_results[i]) |
- EXPECT_EQ(m_RefObjs[i]->GetConstString().GetCStr(), nullptr); |
- else { |
- EXPECT_STREQ(m_RefObjs[i]->GetConstString().GetCStr(), |
- indirect_obj_results[i]); |
- } |
- } |
-} |
- |
-TEST_F(PDFObjectsTest, GetNumber) { |
- const FX_FLOAT direct_obj_results[] = {0, 0, 1245, 9.00345f, 0, 0, |
- 0, 0, 0, 0, 0}; |
- // Check for direct objects. |
- for (int i = 0; i < m_DirectObjs.size(); ++i) |
- EXPECT_EQ(m_DirectObjs[i]->GetNumber(), direct_obj_results[i]); |
- |
- // Check indirect references. |
- const FX_FLOAT indirect_obj_results[] = {0, 1245, 0, 0, 0, 0, 0}; |
- for (int i = 0; i < m_RefObjs.size(); ++i) |
- EXPECT_EQ(m_RefObjs[i]->GetNumber(), indirect_obj_results[i]); |
-} |
- |
-TEST_F(PDFObjectsTest, GetInteger) { |
- const int direct_obj_results[] = {0, 1, 1245, 9, 0, 0, 0, 0, 0, 0, 0}; |
- // Check for direct objects. |
- for (int i = 0; i < m_DirectObjs.size(); ++i) |
- EXPECT_EQ(m_DirectObjs[i]->GetInteger(), direct_obj_results[i]); |
- |
- // Check indirect references. |
- const int indirect_obj_results[] = {1, 1245, 0, 0, 0, 0, 0}; |
- for (int i = 0; i < m_RefObjs.size(); ++i) |
- EXPECT_EQ(m_RefObjs[i]->GetInteger(), indirect_obj_results[i]); |
-} |
- |
-TEST_F(PDFObjectsTest, GetDict) { |
- const CPDF_Dictionary* direct_obj_results[] = { |
- nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, |
- nullptr, nullptr, m_DictObj, m_StreamDictObj, nullptr}; |
- // Check for direct objects. |
- for (int i = 0; i < m_DirectObjs.size(); ++i) |
- EXPECT_EQ(m_DirectObjs[i]->GetDict(), direct_obj_results[i]); |
- |
- // Check indirect references. |
- const CPDF_Dictionary* indirect_obj_results[] = { |
- nullptr, nullptr, nullptr, nullptr, nullptr, m_DictObj, m_StreamDictObj}; |
- for (int i = 0; i < m_RefObjs.size(); ++i) |
- EXPECT_EQ(m_RefObjs[i]->GetDict(), indirect_obj_results[i]); |
-} |
+// Copyright 2016 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "core/include/fpdfapi/fpdf_objects.h" |
+ |
+#include <memory> |
+#include <vector> |
+ |
+#include "core/include/fxcrt/fx_basic.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+class PDFObjectsTest : public testing::Test { |
+ public: |
+ void SetUp() override { |
+ // Initialize different kinds of objects. |
+ // Boolean objects. |
+ CPDF_Boolean* boolean_false_obj = new CPDF_Boolean(false); |
+ CPDF_Boolean* boolean_true_obj = new CPDF_Boolean(true); |
+ // Number objects. |
+ CPDF_Number* number_int_obj = new CPDF_Number(1245); |
+ CPDF_Number* number_float_obj = new CPDF_Number(9.00345f); |
+ // String objects. |
+ CPDF_String* str_reg_obj = new CPDF_String(L"A simple test"); |
+ CPDF_String* str_spec_obj = new CPDF_String(L"\t\n"); |
+ // Name object. |
+ CPDF_Name* name_obj = new CPDF_Name("space"); |
+ // Array object. |
+ m_ArrayObj = new CPDF_Array; |
+ m_ArrayObj->InsertAt(0, new CPDF_Number(8902)); |
+ m_ArrayObj->InsertAt(1, new CPDF_Name("address")); |
+ // Dictionary object. |
+ m_DictObj = new CPDF_Dictionary; |
+ m_DictObj->SetAt("bool", new CPDF_Boolean(false)); |
+ m_DictObj->SetAt("num", new CPDF_Number(0.23f)); |
+ // Stream object. |
+ const char content[] = "abcdefghijklmnopqrstuvwxyz"; |
+ size_t buf_len = FX_ArraySize(content); |
+ uint8_t* buf = reinterpret_cast<uint8_t*>(malloc(buf_len)); |
+ memcpy(buf, content, buf_len); |
+ m_StreamDictObj = new CPDF_Dictionary; |
+ m_StreamDictObj->SetAt("key1", new CPDF_String(L" test dict")); |
+ m_StreamDictObj->SetAt("key2", new CPDF_Number(-1)); |
+ CPDF_Stream* stream_obj = new CPDF_Stream(buf, buf_len, m_StreamDictObj); |
+ // Null Object. |
+ CPDF_Null* null_obj = new CPDF_Null; |
+ // All direct objects. |
+ CPDF_Object* objs[] = {boolean_false_obj, boolean_true_obj, number_int_obj, |
+ number_float_obj, str_reg_obj, str_spec_obj, |
+ name_obj, m_ArrayObj, m_DictObj, |
+ stream_obj, null_obj}; |
+ m_DirectObjTypes = { |
+ CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, |
+ CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, |
+ CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY, |
+ CPDF_Object::STREAM, CPDF_Object::NULLOBJ}; |
+ for (size_t i = 0; i < FX_ArraySize(objs); ++i) |
+ m_DirectObjs.emplace_back(objs[i]); |
+ |
+ // Indirect references to indirect objects. |
+ m_ObjHolder.reset(new CPDF_IndirectObjectHolder(nullptr)); |
+ m_IndirectObjs = {boolean_true_obj, number_int_obj, str_spec_obj, name_obj, |
+ m_ArrayObj, m_DictObj, stream_obj}; |
+ for (size_t i = 0; i < m_IndirectObjs.size(); ++i) { |
+ m_ObjHolder->AddIndirectObject(m_IndirectObjs[i]); |
+ m_RefObjs.emplace_back(new CPDF_Reference( |
+ m_ObjHolder.get(), m_IndirectObjs[i]->GetObjNum())); |
+ } |
+ } |
+ |
+ bool Equal(CPDF_Object* obj1, CPDF_Object* obj2) { |
+ if (obj1 == obj2) |
+ return true; |
+ if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) |
+ return false; |
+ switch (obj1->GetType()) { |
+ case CPDF_Object::BOOLEAN: |
+ return obj1->GetInteger() == obj2->GetInteger(); |
+ case CPDF_Object::NUMBER: |
+ return obj1->AsNumber()->IsInteger() == obj2->AsNumber()->IsInteger() && |
+ obj1->GetInteger() == obj2->GetInteger(); |
+ case CPDF_Object::STRING: |
+ case CPDF_Object::NAME: |
+ return obj1->GetString() == obj2->GetString(); |
+ case CPDF_Object::ARRAY: { |
+ const CPDF_Array* array1 = obj1->AsArray(); |
+ const CPDF_Array* array2 = obj2->AsArray(); |
+ if (array1->GetCount() != array2->GetCount()) |
+ return false; |
+ for (size_t i = 0; i < array1->GetCount(); ++i) { |
+ if (!Equal(array1->GetElement(i), array2->GetElement(i))) |
+ return false; |
+ } |
+ return true; |
+ } |
+ case CPDF_Object::DICTIONARY: { |
+ const CPDF_Dictionary* dict1 = obj1->AsDictionary(); |
+ const CPDF_Dictionary* dict2 = obj2->AsDictionary(); |
+ if (dict1->GetCount() != dict2->GetCount()) |
+ return false; |
+ for (CPDF_Dictionary::const_iterator it = dict1->begin(); |
+ it != dict1->end(); ++it) { |
+ if (!Equal(it->second, dict2->GetElement(it->first))) |
+ return false; |
+ } |
+ return true; |
+ } |
+ case CPDF_Object::NULLOBJ: |
+ return true; |
+ case CPDF_Object::STREAM: { |
+ const CPDF_Stream* stream1 = obj1->AsStream(); |
+ const CPDF_Stream* stream2 = obj2->AsStream(); |
+ if (!stream1->GetDict() && !stream2->GetDict()) |
+ return true; |
+ // Compare dictionaries. |
+ if (!Equal(stream1->GetDict(), stream2->GetDict())) |
+ return false; |
+ // Compare sizes. |
+ if (stream1->GetRawSize() != stream2->GetRawSize()) |
+ return false; |
+ // Compare contents. |
+ // Since this function is used for testing Clone(), only memory based |
+ // streams need to be handled. |
+ if (!stream1->IsMemoryBased() || !stream2->IsMemoryBased()) |
+ return false; |
+ return FXSYS_memcmp(stream1->GetRawData(), stream2->GetRawData(), |
+ stream1->GetRawSize()) == 0; |
+ } |
+ case CPDF_Object::REFERENCE: |
+ return obj1->AsReference()->GetRefObjNum() == |
+ obj2->AsReference()->GetRefObjNum(); |
+ } |
+ return false; |
+ } |
+ |
+ protected: |
+ using ScopedObj = std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>>; |
+ |
+ // m_ObjHolder needs to be declared first and destructed last since it also |
+ // refers to some objects in m_DirectObjs. |
+ std::unique_ptr<CPDF_IndirectObjectHolder> m_ObjHolder; |
+ std::vector<ScopedObj> m_DirectObjs; |
+ std::vector<int> m_DirectObjTypes; |
+ std::vector<ScopedObj> m_RefObjs; |
+ CPDF_Dictionary* m_DictObj; |
+ CPDF_Dictionary* m_StreamDictObj; |
+ CPDF_Array* m_ArrayObj; |
+ std::vector<CPDF_Object*> m_IndirectObjs; |
+}; |
+ |
+TEST_F(PDFObjectsTest, GetString) { |
+ const char* direct_obj_results[] = { |
+ "false", "true", "1245", "9.00345", "A simple test", "\t\n", "space", |
+ "", "", "", ""}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_STREQ(m_DirectObjs[i]->GetString().c_str(), direct_obj_results[i]); |
+ |
+ // Check indirect references. |
+ const char* indirect_obj_results[] = {"true", "1245", "\t\n", "space", |
+ "", "", ""}; |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) { |
+ EXPECT_STREQ(m_RefObjs[i]->GetString().c_str(), indirect_obj_results[i]); |
+ } |
+} |
+ |
+TEST_F(PDFObjectsTest, GetConstString) { |
+ const char* direct_obj_results[] = { |
+ nullptr, nullptr, nullptr, nullptr, "A simple test", "\t\n", |
+ "space", nullptr, nullptr, nullptr, nullptr}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) { |
+ if (!direct_obj_results[i]) { |
+ EXPECT_EQ(m_DirectObjs[i]->GetConstString().GetCStr(), |
+ direct_obj_results[i]); |
+ } else { |
+ EXPECT_STREQ(m_DirectObjs[i]->GetConstString().GetCStr(), |
+ direct_obj_results[i]); |
+ } |
+ } |
+ // Check indirect references. |
+ const char* indirect_obj_results[] = {nullptr, nullptr, "\t\n", "space", |
+ nullptr, nullptr, nullptr}; |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) { |
+ if (!indirect_obj_results[i]) { |
+ EXPECT_EQ(m_RefObjs[i]->GetConstString().GetCStr(), nullptr); |
+ } else { |
+ EXPECT_STREQ(m_RefObjs[i]->GetConstString().GetCStr(), |
+ indirect_obj_results[i]); |
+ } |
+ } |
+} |
+ |
+TEST_F(PDFObjectsTest, GetUnicodeText) { |
+ const wchar_t* direct_obj_results[] = { |
+ L"", L"", L"", L"", L"A simple test", |
+ L"\t\n", L"space", L"", L"", L"abcdefghijklmnopqrstuvwxyz", |
+ L""}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_STREQ(m_DirectObjs[i]->GetUnicodeText().c_str(), |
+ direct_obj_results[i]); |
+ |
+ // Check indirect references. |
+ for (const auto& it : m_RefObjs) |
+ EXPECT_STREQ(it->GetUnicodeText().c_str(), L""); |
+} |
+ |
+TEST_F(PDFObjectsTest, GetNumber) { |
+ const FX_FLOAT direct_obj_results[] = {0, 0, 1245, 9.00345f, 0, 0, |
+ 0, 0, 0, 0, 0}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_EQ(m_DirectObjs[i]->GetNumber(), direct_obj_results[i]); |
+ |
+ // Check indirect references. |
+ const FX_FLOAT indirect_obj_results[] = {0, 1245, 0, 0, 0, 0, 0}; |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) |
+ EXPECT_EQ(m_RefObjs[i]->GetNumber(), indirect_obj_results[i]); |
+} |
+ |
+TEST_F(PDFObjectsTest, GetInteger) { |
+ const int direct_obj_results[] = {0, 1, 1245, 9, 0, 0, 0, 0, 0, 0, 0}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_EQ(m_DirectObjs[i]->GetInteger(), direct_obj_results[i]); |
+ |
+ // Check indirect references. |
+ const int indirect_obj_results[] = {1, 1245, 0, 0, 0, 0, 0}; |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) |
+ EXPECT_EQ(m_RefObjs[i]->GetInteger(), indirect_obj_results[i]); |
+} |
+ |
+TEST_F(PDFObjectsTest, GetDict) { |
+ const CPDF_Dictionary* direct_obj_results[] = { |
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, |
+ nullptr, nullptr, m_DictObj, m_StreamDictObj, nullptr}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_EQ(m_DirectObjs[i]->GetDict(), direct_obj_results[i]); |
+ |
+ // Check indirect references. |
+ const CPDF_Dictionary* indirect_obj_results[] = { |
+ nullptr, nullptr, nullptr, nullptr, nullptr, m_DictObj, m_StreamDictObj}; |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) |
+ EXPECT_EQ(m_RefObjs[i]->GetDict(), indirect_obj_results[i]); |
+} |
+ |
+TEST_F(PDFObjectsTest, GetArray) { |
+ const CPDF_Array* direct_obj_results[] = { |
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, |
+ nullptr, m_ArrayObj, nullptr, nullptr, nullptr}; |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_EQ(m_DirectObjs[i]->GetArray(), direct_obj_results[i]); |
+ |
+ // Check indirect references. |
+ for (const auto& it : m_RefObjs) |
+ EXPECT_EQ(it->GetArray(), nullptr); |
+} |
+ |
+TEST_F(PDFObjectsTest, Clone) { |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) { |
+ ScopedObj obj(m_DirectObjs[i]->Clone()); |
+ EXPECT_TRUE(Equal(m_DirectObjs[i].get(), obj.get())); |
+ } |
+ |
+ // Check indirect references. |
+ for (const auto& it : m_RefObjs) { |
+ ScopedObj obj(it->Clone()); |
+ EXPECT_TRUE(Equal(it.get(), obj.get())); |
+ } |
+} |
+ |
+TEST_F(PDFObjectsTest, GetType) { |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_EQ(m_DirectObjs[i]->GetType(), m_DirectObjTypes[i]); |
+ |
+ // Check indirect references. |
+ for (const auto& it : m_RefObjs) |
+ EXPECT_EQ(it->GetType(), CPDF_Object::REFERENCE); |
+} |
+ |
+TEST_F(PDFObjectsTest, GetDirect) { |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) |
+ EXPECT_EQ(m_DirectObjs[i]->GetDirect(), m_DirectObjs[i].get()); |
+ |
+ // Check indirect references. |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) |
+ EXPECT_EQ(m_RefObjs[i]->GetDirect(), m_IndirectObjs[i]); |
+} |
+ |
+TEST_F(PDFObjectsTest, SetString) { |
+ // Check for direct objects. |
+ const char* const set_values[] = {"true", "fake", "3.125f", "097", |
+ "changed", "", "NewName"}; |
+ const char* expected[] = {"true", "false", "3.125", "97", |
+ "changed", "", "NewName"}; |
+ for (size_t i = 0; i < FX_ArraySize(set_values); ++i) { |
+ m_DirectObjs[i]->SetString(set_values[i]); |
+ EXPECT_STREQ(m_DirectObjs[i]->GetString().c_str(), expected[i]); |
+ } |
+} |
+ |
+TEST_F(PDFObjectsTest, IsTypeAndAsType) { |
+ // Check for direct objects. |
+ for (size_t i = 0; i < m_DirectObjs.size(); ++i) { |
+ if (m_DirectObjTypes[i] == CPDF_Object::ARRAY) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsArray()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsArray(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsArray()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsArray(), nullptr); |
+ } |
+ |
+ if (m_DirectObjTypes[i] == CPDF_Object::BOOLEAN) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsBoolean()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsBoolean(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsBoolean()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsBoolean(), nullptr); |
+ } |
+ |
+ if (m_DirectObjTypes[i] == CPDF_Object::NAME) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsName()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsName(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsName()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsName(), nullptr); |
+ } |
+ |
+ if (m_DirectObjTypes[i] == CPDF_Object::NUMBER) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsNumber()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsNumber(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsNumber()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsNumber(), nullptr); |
+ } |
+ |
+ if (m_DirectObjTypes[i] == CPDF_Object::STRING) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsString()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsString(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsString()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsString(), nullptr); |
+ } |
+ |
+ if (m_DirectObjTypes[i] == CPDF_Object::DICTIONARY) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsDictionary()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsDictionary(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsDictionary()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsDictionary(), nullptr); |
+ } |
+ |
+ if (m_DirectObjTypes[i] == CPDF_Object::STREAM) { |
+ EXPECT_TRUE(m_DirectObjs[i]->IsStream()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsStream(), m_DirectObjs[i].get()); |
+ } else { |
+ EXPECT_FALSE(m_DirectObjs[i]->IsStream()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsStream(), nullptr); |
+ } |
+ |
+ EXPECT_FALSE(m_DirectObjs[i]->IsReference()); |
+ EXPECT_EQ(m_DirectObjs[i]->AsReference(), nullptr); |
+ } |
+ // Check indirect references. |
+ for (size_t i = 0; i < m_RefObjs.size(); ++i) { |
+ EXPECT_TRUE(m_RefObjs[i]->IsReference()); |
+ EXPECT_EQ(m_RefObjs[i]->AsReference(), m_RefObjs[i].get()); |
+ } |
+} |