362 for (size_t i = 0; i < m_DirectObjs.size(); ++i) {
363 if (m_DirectObjTypes[i] == CPDF_Object::kArray) {
364 EXPECT_TRUE(m_DirectObjs[i]->IsArray());
365 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsArray());
367 EXPECT_FALSE(m_DirectObjs[i]->IsArray());
368 EXPECT_FALSE(m_DirectObjs[i]->AsArray());
371 if (m_DirectObjTypes[i] == CPDF_Object::kBoolean) {
372 EXPECT_TRUE(m_DirectObjs[i]->IsBoolean());
373 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsBoolean());
375 EXPECT_FALSE(m_DirectObjs[i]->IsBoolean());
376 EXPECT_FALSE(m_DirectObjs[i]->AsBoolean());
379 if (m_DirectObjTypes[i] == CPDF_Object::kName) {
380 EXPECT_TRUE(m_DirectObjs[i]->IsName());
381 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsName());
383 EXPECT_FALSE(m_DirectObjs[i]->IsName());
384 EXPECT_FALSE(m_DirectObjs[i]->AsName());
387 if (m_DirectObjTypes[i] == CPDF_Object::kNumber) {
388 EXPECT_TRUE(m_DirectObjs[i]->IsNumber());
389 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsNumber());
391 EXPECT_FALSE(m_DirectObjs[i]->IsNumber());
392 EXPECT_FALSE(m_DirectObjs[i]->AsNumber());
395 if (m_DirectObjTypes[i] == CPDF_Object::kString) {
396 EXPECT_TRUE(m_DirectObjs[i]->IsString());
397 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsString());
399 EXPECT_FALSE(m_DirectObjs[i]->IsString());
400 EXPECT_FALSE(m_DirectObjs[i]->AsString());
403 if (m_DirectObjTypes[i] == CPDF_Object::kDictionary) {
404 EXPECT_TRUE(m_DirectObjs[i]->IsDictionary());
405 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsDictionary());
407 EXPECT_FALSE(m_DirectObjs[i]->IsDictionary());
408 EXPECT_FALSE(m_DirectObjs[i]->AsDictionary());
411 if (m_DirectObjTypes[i] == CPDF_Object::kStream) {
412 EXPECT_TRUE(m_DirectObjs[i]->IsStream());
413 EXPECT_EQ(m_DirectObjs[i].Get(), m_DirectObjs[i]->AsStream());
415 EXPECT_FALSE(m_DirectObjs[i]->IsStream());
416 EXPECT_FALSE(m_DirectObjs[i]->AsStream());
419 EXPECT_FALSE(m_DirectObjs[i]->IsReference());
420 EXPECT_FALSE(m_DirectObjs[i]->AsReference());
423 for (size_t i = 0; i < m_RefObjs.size(); ++i) {
424 EXPECT_TRUE(m_RefObjs[i]->IsReference());
425 EXPECT_EQ(m_RefObjs[i].Get(), m_RefObjs[i]->AsReference());
498 constexpr auto vals =
499 fxcrt::ToArray<
const bool>({
true,
false,
false,
true,
true});
501 for (size_t i = 0; i < vals.size(); ++i) {
502 arr->InsertNewAt<CPDF_Boolean>(i, vals[i]);
504 for (size_t i = 0; i < vals.size(); ++i) {
505 TestArrayAccessors(arr.Get(), i,
506 vals[i] ?
"true" :
"false",
517 constexpr auto vals =
fxcrt::ToArray<
const int>(
518 {10, 0, -345, 2089345456, -1000000000, 567, 93658767});
520 for (size_t i = 0; i < vals.size(); ++i) {
521 arr->InsertNewAt<CPDF_Number>(i, vals[i]);
523 for (size_t i = 0; i < vals.size(); ++i) {
525 TestArrayAccessors(arr.Get(), i,
526 FXSYS_itoa(vals[i], buf, 10),
537 constexpr auto vals =
fxcrt::ToArray<
const float>(
538 {0.0f, 0, 10, 10.0f, 0.0345f, 897.34f, -2.5f, -1.0f, -345.0f, -0.0f});
540 for (size_t i = 0; i < vals.size(); ++i) {
541 arr->InsertNewAt<CPDF_Number>(i, vals[i]);
543 constexpr auto expected_str =
544 fxcrt::ToArray<
const char*>({
"0",
"0",
"10",
"10",
".034499999",
545 "897.34003",
"-2.5",
"-1",
"-345",
"0"});
546 for (size_t i = 0; i < vals.size(); ++i) {
547 TestArrayAccessors(arr.Get(), i,
559 constexpr auto vals =
fxcrt::ToArray<
const char*>(
560 {
"this",
"adsde$%^",
"\r\t",
"\"012",
".",
"EYREW",
"It is a joke :)"});
563 for (size_t i = 0; i < vals.size(); ++i) {
564 string_array->InsertNewAt<CPDF_String>(i, vals[i]);
565 name_array->InsertNewAt<CPDF_Name>(i, vals[i]);
567 for (size_t i = 0; i <
std::size(vals); ++i) {
568 TestArrayAccessors(string_array.Get(), i,
576 TestArrayAccessors(name_array.Get(), i,
589 for (size_t i = 0; i < 3; ++i)
590 arr->InsertNewAt<CPDF_Null>(i);
591 for (size_t i = 0; i < 3; ++i) {
592 TestArrayAccessors(arr.Get(), i,
606 for (size_t i = 0; i < 3; ++i) {
608 for (size_t j = 0; j < 3; ++j) {
610 vals[i]->InsertNewAt<CPDF_Number>(j, value);
613 for (size_t i = 0; i < 3; ++i) {
614 TestArrayAccessors(arr.Get(), i,
628 for (size_t i = 0; i < 3; ++i) {
630 for (size_t j = 0; j < 3; ++j) {
631 std::string key(
"key");
633 key.append(FXSYS_itoa(j, buf, 10));
635 vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value);
638 for (size_t i = 0; i < 3; ++i) {
639 TestArrayAccessors(arr.Get(), i,
656 for (size_t i = 0; i < 3; ++i) {
658 for (size_t j = 0; j < 3; ++j) {
659 std::string key(
"key");
661 key.append(FXSYS_itoa(j, buf, 10));
663 vals[i]->SetNewFor<CPDF_Number>(key.c_str(), value);
665 static constexpr uint8_t kContents[] =
"content: this is a stream";
666 stream_vals[i] = object_holder.NewIndirect<CPDF_Stream>(
667 DataVector<uint8_t>(
std::begin(kContents),
std::end(kContents)),
669 arr->AppendNew<CPDF_Reference>(&object_holder,
670 stream_vals[i]->GetObjNum());
672 for (size_t i = 0; i < 3; ++i) {
673 TestArrayAccessors(arr.Get(), i,
680 stream_vals[i].Get());
688 arr->InsertNewAt<CPDF_Boolean>(0,
true);
689 arr->InsertNewAt<CPDF_Boolean>(1,
false);
690 arr->InsertNewAt<CPDF_Number>(2, 0);
691 arr->InsertNewAt<CPDF_Number>(3, -1234);
692 arr->InsertNewAt<CPDF_Number>(4, 2345.0f);
693 arr->InsertNewAt<CPDF_Number>(5, 0.05f);
694 arr->InsertNewAt<CPDF_String>(6,
"");
695 arr->InsertNewAt<CPDF_String>(7,
"It is a test!");
696 arr->InsertNewAt<CPDF_Name>(8,
"NAME");
697 arr->InsertNewAt<CPDF_Name>(9,
"test");
698 arr->InsertNewAt<CPDF_Null>(10);
700 auto arr_val = arr->InsertNewAt<
CPDF_Array>(11);
701 arr_val->AppendNew<CPDF_Number>(1);
702 arr_val->AppendNew<CPDF_Number>(2);
705 dict_val->SetNewFor<CPDF_String>(
"key1",
"Linda");
706 dict_val->SetNewFor<CPDF_String>(
"key2",
"Zoe");
709 stream_dict->SetNewFor<CPDF_String>(
"key1",
"John");
710 stream_dict->SetNewFor<CPDF_String>(
"key2",
"King");
711 static constexpr uint8_t kData[] =
"A stream for test";
714 auto stream_val = object_holder.NewIndirect<CPDF_Stream>(
715 DataVector<uint8_t>(
std::begin(kData),
std::end(kData)), stream_dict);
716 arr->InsertNewAt<CPDF_Reference>(13, &object_holder,
717 stream_val->GetObjNum());
718 constexpr auto expected_str =
fxcrt::ToArray<
const char*>(
719 {
"true",
"false",
"0",
"-1234",
"2345",
".050000001",
"",
720 "It is a test!",
"NAME",
"test",
"",
"",
"",
""});
721 constexpr auto expected_int =
fxcrt::ToArray<
const int>(
722 {1, 0, 0, -1234, 2345, 0, 0, 0, 0, 0, 0, 0, 0, 0});
723 constexpr auto expected_float =
fxcrt::ToArray<
const float>(
724 {0, 0, 0, -1234, 2345, 0.05f, 0, 0, 0, 0, 0, 0, 0, 0});
725 for (size_t i = 0; i < arr->size(); ++i) {
726 EXPECT_EQ(expected_str[i], arr->GetByteStringAt(i));
727 EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i));
728 EXPECT_EQ(expected_float[i], arr->GetFloatAt(i));
730 EXPECT_EQ(arr_val, arr->GetArrayAt(i));
732 EXPECT_FALSE(arr->GetArrayAt(i));
735 EXPECT_EQ(stream_dict, arr->GetDictAt(i));
736 EXPECT_EQ(stream_val, arr->GetStreamAt(i));
738 EXPECT_FALSE(arr->GetStreamAt(i));
740 EXPECT_EQ(dict_val, arr->GetDictAt(i));
742 EXPECT_FALSE(arr->GetDictAt(i));
794 auto boolean_obj =
pdfium::MakeRetain<CPDF_Boolean>(
true);
795 auto int_obj =
pdfium::MakeRetain<CPDF_Number>(-1234);
796 auto float_obj =
pdfium::MakeRetain<CPDF_Number>(2345.089f);
798 pdfium::MakeRetain<CPDF_String>(
nullptr,
"Adsfdsf 343434 %&&*\n");
799 auto name_obj =
pdfium::MakeRetain<CPDF_Name>(
nullptr,
"Title:");
800 auto null_obj =
pdfium::MakeRetain<CPDF_Null>();
802 {boolean_obj, int_obj, float_obj, str_obj, name_obj, null_obj});
803 auto obj_nums =
fxcrt::ToArray<
int>({2, 4, 7, 2345, 799887, 1});
807 for (size_t i = 0; i <
std::size(indirect_objs); ++i) {
808 holder->ReplaceIndirectObjectIfHigherGeneration(obj_nums[i],
810 arr->AppendNew<CPDF_Reference>(holder.get(), obj_nums[i]);
811 arr1->AppendNew<CPDF_Reference>(holder.get(),
812 indirect_objs[i]->GetObjNum());
815 for (size_t i = 0; i <
std::size(obj_nums); ++i)
816 EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i]));
818 EXPECT_EQ(arr->size(), arr1->size());
819 for (size_t i = 0; i < arr->size(); ++i) {
821 EXPECT_EQ(indirect_objs[i], arr->GetObjectAt(i)->GetDirect());
822 EXPECT_EQ(indirect_objs[i], arr->GetDirectObjectAt(i));
824 EXPECT_EQ(indirect_objs[i], arr1->GetObjectAt(i)->GetDirect());
825 EXPECT_EQ(indirect_objs[i], arr1->GetDirectObjectAt(i));
956 dict_obj->SetFor(
"arr", arr_obj);
960 ASSERT_TRUE(cloned_array);
961 EXPECT_EQ(1u, cloned_array->size());
963 ASSERT_TRUE(cloned_dict);
964 ASSERT_TRUE(cloned_dict->IsDictionary());
966 EXPECT_FALSE(cloned_dict->AsDictionary()->GetObjectFor(
"arr"));
967 dict_obj->RemoveFor(
"arr");
974 arr_obj->InsertNewAt<CPDF_Reference>(0, &objects_holder,
975 dict_obj->GetObjNum());
977 dict_obj->SetFor(
"arr",
std::move(arr_obj));
978 EXPECT_EQ(1u, dict_obj->GetObjNum());
980 ASSERT_TRUE(elem0->IsReference());
981 EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum());
982 EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect());
986 ToDictionary(dict_obj->CloneDirectObject());
988 ASSERT_TRUE(cloned_dict);
990 ASSERT_TRUE(cloned_arr);
991 ASSERT_TRUE(cloned_arr->IsArray());
992 EXPECT_EQ(0U, cloned_arr->AsArray()->size());
994 EXPECT_FALSE(cloned_arr->AsArray()->GetObjectAt(0));
995 dict_obj->RemoveFor(
"arr");