OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/fpdfapi/parser/cpdf_array.h" | 5 #include "core/fpdfapi/parser/cpdf_array.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "core/fpdfapi/parser/cpdf_number.h" | 9 #include "core/fpdfapi/parser/cpdf_number.h" |
10 #include "core/fpdfapi/parser/cpdf_reference.h" | 10 #include "core/fpdfapi/parser/cpdf_reference.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 #include "third_party/base/ptr_util.h" | 12 #include "third_party/base/ptr_util.h" |
13 | 13 |
14 TEST(cpdf_array, RemoveAt) { | 14 TEST(cpdf_array, RemoveAt) { |
15 { | 15 { |
16 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | 16 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
17 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 17 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); |
18 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 18 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
19 arr->AddInteger(elems[i]); | 19 arr->AddNew<CPDF_Number>(elems[i]); |
20 arr->RemoveAt(3, 3); | 20 arr->RemoveAt(3, 3); |
21 int expected[] = {1, 2, 3, 7, 8, 9, 10}; | 21 int expected[] = {1, 2, 3, 7, 8, 9, 10}; |
22 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); | 22 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); |
23 for (size_t i = 0; i < FX_ArraySize(expected); ++i) | 23 for (size_t i = 0; i < FX_ArraySize(expected); ++i) |
24 EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); | 24 EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); |
25 arr->RemoveAt(4, 2); | 25 arr->RemoveAt(4, 2); |
26 int expected2[] = {1, 2, 3, 7, 10}; | 26 int expected2[] = {1, 2, 3, 7, 10}; |
27 EXPECT_EQ(FX_ArraySize(expected2), arr->GetCount()); | 27 EXPECT_EQ(FX_ArraySize(expected2), arr->GetCount()); |
28 for (size_t i = 0; i < FX_ArraySize(expected2); ++i) | 28 for (size_t i = 0; i < FX_ArraySize(expected2); ++i) |
29 EXPECT_EQ(expected2[i], arr->GetIntegerAt(i)); | 29 EXPECT_EQ(expected2[i], arr->GetIntegerAt(i)); |
30 } | 30 } |
31 { | 31 { |
32 // When the range is out of bound, RemoveAt has no effect. | 32 // When the range is out of bound, RemoveAt has no effect. |
33 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | 33 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
34 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 34 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); |
35 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 35 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
36 arr->AddInteger(elems[i]); | 36 arr->AddNew<CPDF_Number>(elems[i]); |
37 arr->RemoveAt(8, 5); | 37 arr->RemoveAt(8, 5); |
38 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); | 38 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); |
39 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 39 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
40 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); | 40 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); |
41 arr->RemoveAt(0, 12); | 41 arr->RemoveAt(0, 12); |
42 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); | 42 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); |
43 arr->RemoveAt(11, 1); | 43 arr->RemoveAt(11, 1); |
44 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); | 44 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); |
45 } | 45 } |
46 } | 46 } |
47 | 47 |
48 TEST(cpdf_array, InsertAt) { | 48 TEST(cpdf_array, InsertAt) { |
49 { | 49 { |
50 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | 50 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
51 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 51 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
52 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 52 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
53 arr->InsertAt(i, new CPDF_Number(elems[i])); | 53 arr->InsertNewAt<CPDF_Number>(i, elems[i]); |
54 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); | 54 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); |
55 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 55 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
56 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); | 56 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); |
57 arr->InsertAt(3, new CPDF_Number(33)); | 57 arr->InsertNewAt<CPDF_Number>(3, 33); |
58 arr->InsertAt(6, new CPDF_Number(55)); | 58 arr->InsertNewAt<CPDF_Number>(6, 55); |
59 arr->InsertAt(12, new CPDF_Number(12)); | 59 arr->InsertNewAt<CPDF_Number>(12, 12); |
60 int expected[] = {1, 2, 3, 33, 4, 5, 55, 6, 7, 8, 9, 10, 12}; | 60 int expected[] = {1, 2, 3, 33, 4, 5, 55, 6, 7, 8, 9, 10, 12}; |
61 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); | 61 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); |
62 for (size_t i = 0; i < FX_ArraySize(expected); ++i) | 62 for (size_t i = 0; i < FX_ArraySize(expected); ++i) |
63 EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); | 63 EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); |
64 } | 64 } |
65 { | 65 { |
66 // When the position to insert is beyond the upper bound, | 66 // When the position to insert is beyond the upper bound, |
67 // an element is inserted at that position while other unfilled | 67 // an element is inserted at that position while other unfilled |
68 // positions have nullptr. | 68 // positions have nullptr. |
69 int elems[] = {1, 2}; | 69 int elems[] = {1, 2}; |
70 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 70 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
71 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 71 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
72 arr->InsertAt(i, new CPDF_Number(elems[i])); | 72 arr->InsertNewAt<CPDF_Number>(i, elems[i]); |
73 arr->InsertAt(10, new CPDF_Number(10)); | 73 arr->InsertNewAt<CPDF_Number>(10, 10); |
74 EXPECT_EQ(11u, arr->GetCount()); | 74 EXPECT_EQ(11u, arr->GetCount()); |
75 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 75 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
76 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); | 76 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); |
77 for (size_t i = FX_ArraySize(elems); i < 10; ++i) | 77 for (size_t i = FX_ArraySize(elems); i < 10; ++i) |
78 EXPECT_EQ(nullptr, arr->GetObjectAt(i)); | 78 EXPECT_EQ(nullptr, arr->GetObjectAt(i)); |
79 EXPECT_EQ(10, arr->GetIntegerAt(10)); | 79 EXPECT_EQ(10, arr->GetIntegerAt(10)); |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
83 TEST(cpdf_array, Clone) { | 83 TEST(cpdf_array, Clone) { |
84 { | 84 { |
85 // Basic case. | 85 // Basic case. |
86 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | 86 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
87 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 87 auto arr = pdfium::MakeUnique<CPDF_Array>(); |
88 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 88 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
89 arr->InsertAt(i, new CPDF_Number(elems[i])); | 89 arr->InsertNewAt<CPDF_Number>(i, elems[i]); |
90 std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->Clone()); | 90 std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->Clone()); |
91 EXPECT_EQ(arr->GetCount(), arr2->GetCount()); | 91 EXPECT_EQ(arr->GetCount(), arr2->GetCount()); |
92 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { | 92 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { |
93 // Clone() always create new objects. | 93 // Clone() always create new objects. |
94 EXPECT_NE(arr->GetObjectAt(i), arr2->GetObjectAt(i)); | 94 EXPECT_NE(arr->GetObjectAt(i), arr2->GetObjectAt(i)); |
95 EXPECT_EQ(arr->GetIntegerAt(i), arr2->GetIntegerAt(i)); | 95 EXPECT_EQ(arr->GetIntegerAt(i), arr2->GetIntegerAt(i)); |
96 } | 96 } |
97 } | 97 } |
98 { | 98 { |
99 // Clone() with and without dereferencing reference objects. | 99 // Clone() with and without dereferencing reference objects. |
100 static const size_t kNumOfRows = 3; | 100 static const size_t kNumOfRows = 3; |
101 static const size_t kNumOfRowElems = 5; | 101 static const size_t kNumOfRowElems = 5; |
102 int elems[kNumOfRows][kNumOfRowElems] = { | 102 int elems[kNumOfRows][kNumOfRowElems] = { |
103 {1, 2, 3, 4, 5}, {10, 9, 8, 7, 6}, {11, 12, 13, 14, 15}}; | 103 {1, 2, 3, 4, 5}, {10, 9, 8, 7, 6}, {11, 12, 13, 14, 15}}; |
104 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 104 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); |
105 // Indirect references to indirect objects. | 105 // Indirect references to indirect objects. |
106 std::unique_ptr<CPDF_IndirectObjectHolder> obj_holder( | 106 std::unique_ptr<CPDF_IndirectObjectHolder> obj_holder( |
107 new CPDF_IndirectObjectHolder()); | 107 new CPDF_IndirectObjectHolder()); |
108 for (size_t i = 0; i < kNumOfRows; ++i) { | 108 for (size_t i = 0; i < kNumOfRows; ++i) { |
109 CPDF_Array* arr_elem = new CPDF_Array; | 109 auto arr_elem = pdfium::MakeUnique<CPDF_Array>(); |
110 for (size_t j = 0; j < kNumOfRowElems; ++j) { | 110 for (size_t j = 0; j < kNumOfRowElems; ++j) { |
111 std::unique_ptr<CPDF_Number> obj(new CPDF_Number(elems[i][j])); | 111 std::unique_ptr<CPDF_Number> obj(new CPDF_Number(elems[i][j])); |
112 // Starts object number from 1. | 112 // Starts object number from 1. |
113 int obj_num = i * kNumOfRowElems + j + 1; | 113 int obj_num = i * kNumOfRowElems + j + 1; |
114 obj_holder->ReplaceIndirectObjectIfHigherGeneration(obj_num, | 114 obj_holder->ReplaceIndirectObjectIfHigherGeneration(obj_num, |
115 std::move(obj)); | 115 std::move(obj)); |
116 arr_elem->InsertAt(j, new CPDF_Reference(obj_holder.get(), obj_num)); | 116 arr_elem->InsertNewAt<CPDF_Reference>(j, obj_holder.get(), obj_num); |
117 } | 117 } |
118 arr->InsertAt(i, arr_elem); | 118 arr->InsertAt(i, std::move(arr_elem)); |
119 } | 119 } |
120 ASSERT_EQ(kNumOfRows, arr->GetCount()); | 120 ASSERT_EQ(kNumOfRows, arr->GetCount()); |
121 // Not dereferencing reference objects means just creating new references | 121 // Not dereferencing reference objects means just creating new references |
122 // instead of new copies of direct objects. | 122 // instead of new copies of direct objects. |
123 std::unique_ptr<CPDF_Array> arr1 = ToArray(arr->Clone()); | 123 std::unique_ptr<CPDF_Array> arr1 = ToArray(arr->Clone()); |
124 EXPECT_EQ(arr->GetCount(), arr1->GetCount()); | 124 EXPECT_EQ(arr->GetCount(), arr1->GetCount()); |
125 // Dereferencing reference objects creates new copies of direct objects. | 125 // Dereferencing reference objects creates new copies of direct objects. |
126 std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->CloneDirectObject()); | 126 std::unique_ptr<CPDF_Array> arr2 = ToArray(arr->CloneDirectObject()); |
127 EXPECT_EQ(arr->GetCount(), arr2->GetCount()); | 127 EXPECT_EQ(arr->GetCount(), arr2->GetCount()); |
128 for (size_t i = 0; i < kNumOfRows; ++i) { | 128 for (size_t i = 0; i < kNumOfRows; ++i) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 162 } |
163 } | 163 } |
164 } | 164 } |
165 } | 165 } |
166 | 166 |
167 TEST(cpdf_array, Iterator) { | 167 TEST(cpdf_array, Iterator) { |
168 int elems[] = {-23, -11, 3, 455, 2345877, | 168 int elems[] = {-23, -11, 3, 455, 2345877, |
169 0, 7895330, -12564334, 10000, -100000}; | 169 0, 7895330, -12564334, 10000, -100000}; |
170 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); | 170 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); |
171 for (size_t i = 0; i < FX_ArraySize(elems); ++i) | 171 for (size_t i = 0; i < FX_ArraySize(elems); ++i) |
172 arr->InsertAt(i, new CPDF_Number(elems[i])); | 172 arr->InsertNewAt<CPDF_Number>(i, elems[i]); |
173 size_t index = 0; | 173 size_t index = 0; |
174 for (const auto& it : *arr) | 174 for (const auto& it : *arr) |
175 EXPECT_EQ(elems[index++], it->AsNumber()->GetInteger()); | 175 EXPECT_EQ(elems[index++], it->AsNumber()->GetInteger()); |
176 } | 176 } |
OLD | NEW |