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

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

Issue 2478253002: Revert of Remove CPDF_Object::Release() in favor of direct delete (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fpdfapi/parser/cpdf_array.cpp ('k') | core/fpdfapi/parser/cpdf_data_avail.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/fpdfapi/parser/cpdf_array.h" 5 #include "core/fpdfapi/parser/cpdf_array.h"
6 #include "core/fpdfapi/parser/cpdf_number.h" 6 #include "core/fpdfapi/parser/cpdf_number.h"
7 #include "core/fpdfapi/parser/cpdf_reference.h" 7 #include "core/fpdfapi/parser/cpdf_reference.h"
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 12
13 namespace {
14
15 using ScopedArray = std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>>;
16
17 } // namespace
18
13 TEST(cpdf_array, RemoveAt) { 19 TEST(cpdf_array, RemoveAt) {
14 { 20 {
15 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 21 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
16 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 22 ScopedArray arr(new CPDF_Array);
17 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 23 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
18 arr->AddInteger(elems[i]); 24 arr->AddInteger(elems[i]);
19 arr->RemoveAt(3, 3); 25 arr->RemoveAt(3, 3);
20 int expected[] = {1, 2, 3, 7, 8, 9, 10}; 26 int expected[] = {1, 2, 3, 7, 8, 9, 10};
21 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); 27 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount());
22 for (size_t i = 0; i < FX_ArraySize(expected); ++i) 28 for (size_t i = 0; i < FX_ArraySize(expected); ++i)
23 EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); 29 EXPECT_EQ(expected[i], arr->GetIntegerAt(i));
24 arr->RemoveAt(4, 2); 30 arr->RemoveAt(4, 2);
25 int expected2[] = {1, 2, 3, 7, 10}; 31 int expected2[] = {1, 2, 3, 7, 10};
26 EXPECT_EQ(FX_ArraySize(expected2), arr->GetCount()); 32 EXPECT_EQ(FX_ArraySize(expected2), arr->GetCount());
27 for (size_t i = 0; i < FX_ArraySize(expected2); ++i) 33 for (size_t i = 0; i < FX_ArraySize(expected2); ++i)
28 EXPECT_EQ(expected2[i], arr->GetIntegerAt(i)); 34 EXPECT_EQ(expected2[i], arr->GetIntegerAt(i));
29 } 35 }
30 { 36 {
31 // When the range is out of bound, RemoveAt has no effect. 37 // When the range is out of bound, RemoveAt has no effect.
32 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 38 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
33 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 39 ScopedArray arr(new CPDF_Array);
34 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 40 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
35 arr->AddInteger(elems[i]); 41 arr->AddInteger(elems[i]);
36 arr->RemoveAt(8, 5); 42 arr->RemoveAt(8, 5);
37 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); 43 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount());
38 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 44 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
39 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); 45 EXPECT_EQ(elems[i], arr->GetIntegerAt(i));
40 arr->RemoveAt(0, 12); 46 arr->RemoveAt(0, 12);
41 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); 47 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount());
42 arr->RemoveAt(11, 1); 48 arr->RemoveAt(11, 1);
43 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); 49 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount());
44 } 50 }
45 } 51 }
46 52
47 TEST(cpdf_array, InsertAt) { 53 TEST(cpdf_array, InsertAt) {
48 { 54 {
49 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 55 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
50 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 56 ScopedArray arr(new CPDF_Array);
51 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 57 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
52 arr->InsertAt(i, new CPDF_Number(elems[i])); 58 arr->InsertAt(i, new CPDF_Number(elems[i]));
53 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); 59 EXPECT_EQ(FX_ArraySize(elems), arr->GetCount());
54 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 60 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
55 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); 61 EXPECT_EQ(elems[i], arr->GetIntegerAt(i));
56 arr->InsertAt(3, new CPDF_Number(33)); 62 arr->InsertAt(3, new CPDF_Number(33));
57 arr->InsertAt(6, new CPDF_Number(55)); 63 arr->InsertAt(6, new CPDF_Number(55));
58 arr->InsertAt(12, new CPDF_Number(12)); 64 arr->InsertAt(12, new CPDF_Number(12));
59 int expected[] = {1, 2, 3, 33, 4, 5, 55, 6, 7, 8, 9, 10, 12}; 65 int expected[] = {1, 2, 3, 33, 4, 5, 55, 6, 7, 8, 9, 10, 12};
60 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); 66 EXPECT_EQ(FX_ArraySize(expected), arr->GetCount());
61 for (size_t i = 0; i < FX_ArraySize(expected); ++i) 67 for (size_t i = 0; i < FX_ArraySize(expected); ++i)
62 EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); 68 EXPECT_EQ(expected[i], arr->GetIntegerAt(i));
63 } 69 }
64 { 70 {
65 // When the position to insert is beyond the upper bound, 71 // When the position to insert is beyond the upper bound,
66 // an element is inserted at that position while other unfilled 72 // an element is inserted at that position while other unfilled
67 // positions have nullptr. 73 // positions have nullptr.
68 int elems[] = {1, 2}; 74 int elems[] = {1, 2};
69 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 75 ScopedArray arr(new CPDF_Array);
70 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 76 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
71 arr->InsertAt(i, new CPDF_Number(elems[i])); 77 arr->InsertAt(i, new CPDF_Number(elems[i]));
72 arr->InsertAt(10, new CPDF_Number(10)); 78 arr->InsertAt(10, new CPDF_Number(10));
73 EXPECT_EQ(11u, arr->GetCount()); 79 EXPECT_EQ(11u, arr->GetCount());
74 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 80 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
75 EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); 81 EXPECT_EQ(elems[i], arr->GetIntegerAt(i));
76 for (size_t i = FX_ArraySize(elems); i < 10; ++i) 82 for (size_t i = FX_ArraySize(elems); i < 10; ++i)
77 EXPECT_EQ(nullptr, arr->GetObjectAt(i)); 83 EXPECT_EQ(nullptr, arr->GetObjectAt(i));
78 EXPECT_EQ(10, arr->GetIntegerAt(10)); 84 EXPECT_EQ(10, arr->GetIntegerAt(10));
79 } 85 }
80 } 86 }
81 87
82 TEST(cpdf_array, Clone) { 88 TEST(cpdf_array, Clone) {
83 { 89 {
84 // Basic case. 90 // Basic case.
85 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 91 int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
86 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 92 ScopedArray arr(new CPDF_Array);
87 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 93 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
88 arr->InsertAt(i, new CPDF_Number(elems[i])); 94 arr->InsertAt(i, new CPDF_Number(elems[i]));
89 std::unique_ptr<CPDF_Array> arr2(arr->Clone()->AsArray()); 95 ScopedArray arr2(arr->Clone()->AsArray());
90 EXPECT_EQ(arr->GetCount(), arr2->GetCount()); 96 EXPECT_EQ(arr->GetCount(), arr2->GetCount());
91 for (size_t i = 0; i < FX_ArraySize(elems); ++i) { 97 for (size_t i = 0; i < FX_ArraySize(elems); ++i) {
92 // Clone() always create new objects. 98 // Clone() always create new objects.
93 EXPECT_NE(arr->GetObjectAt(i), arr2->GetObjectAt(i)); 99 EXPECT_NE(arr->GetObjectAt(i), arr2->GetObjectAt(i));
94 EXPECT_EQ(arr->GetIntegerAt(i), arr2->GetIntegerAt(i)); 100 EXPECT_EQ(arr->GetIntegerAt(i), arr2->GetIntegerAt(i));
95 } 101 }
96 } 102 }
97 { 103 {
98 // Clone() with and without dereferencing reference objects. 104 // Clone() with and without dereferencing reference objects.
99 static const size_t kNumOfRows = 3; 105 static const size_t kNumOfRows = 3;
100 static const size_t kNumOfRowElems = 5; 106 static const size_t kNumOfRowElems = 5;
101 int elems[kNumOfRows][kNumOfRowElems] = { 107 int elems[kNumOfRows][kNumOfRowElems] = {
102 {1, 2, 3, 4, 5}, {10, 9, 8, 7, 6}, {11, 12, 13, 14, 15}}; 108 {1, 2, 3, 4, 5}, {10, 9, 8, 7, 6}, {11, 12, 13, 14, 15}};
103 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 109 ScopedArray arr(new CPDF_Array);
104 // Indirect references to indirect objects. 110 // Indirect references to indirect objects.
105 std::unique_ptr<CPDF_IndirectObjectHolder> obj_holder( 111 std::unique_ptr<CPDF_IndirectObjectHolder> obj_holder(
106 new CPDF_IndirectObjectHolder()); 112 new CPDF_IndirectObjectHolder());
107 for (size_t i = 0; i < kNumOfRows; ++i) { 113 for (size_t i = 0; i < kNumOfRows; ++i) {
108 CPDF_Array* arr_elem = new CPDF_Array; 114 CPDF_Array* arr_elem = new CPDF_Array;
109 for (size_t j = 0; j < kNumOfRowElems; ++j) { 115 for (size_t j = 0; j < kNumOfRowElems; ++j) {
110 CPDF_Number* obj = new CPDF_Number(elems[i][j]); 116 CPDF_Number* obj = new CPDF_Number(elems[i][j]);
111 // Starts object number from 1. 117 // Starts object number from 1.
112 int obj_num = i * kNumOfRowElems + j + 1; 118 int obj_num = i * kNumOfRowElems + j + 1;
113 obj_holder->ReplaceIndirectObjectIfHigherGeneration(obj_num, obj); 119 obj_holder->ReplaceIndirectObjectIfHigherGeneration(obj_num, obj);
114 arr_elem->InsertAt(j, new CPDF_Reference(obj_holder.get(), obj_num)); 120 arr_elem->InsertAt(j, new CPDF_Reference(obj_holder.get(), obj_num));
115 } 121 }
116 arr->InsertAt(i, arr_elem); 122 arr->InsertAt(i, arr_elem);
117 } 123 }
118 ASSERT_EQ(kNumOfRows, arr->GetCount()); 124 ASSERT_EQ(kNumOfRows, arr->GetCount());
119 // Not dereferencing reference objects means just creating new references 125 // Not dereferencing reference objects means just creating new references
120 // instead of new copies of direct objects. 126 // instead of new copies of direct objects.
121 std::unique_ptr<CPDF_Array> arr1(arr->Clone()->AsArray()); 127 ScopedArray arr1(arr->Clone()->AsArray());
122 EXPECT_EQ(arr->GetCount(), arr1->GetCount()); 128 EXPECT_EQ(arr->GetCount(), arr1->GetCount());
123 // Dereferencing reference objects creates new copies of direct objects. 129 // Dereferencing reference objects creates new copies of direct objects.
124 std::unique_ptr<CPDF_Array> arr2(arr->CloneDirectObject()->AsArray()); 130 ScopedArray arr2(arr->CloneDirectObject()->AsArray());
125 EXPECT_EQ(arr->GetCount(), arr2->GetCount()); 131 EXPECT_EQ(arr->GetCount(), arr2->GetCount());
126 for (size_t i = 0; i < kNumOfRows; ++i) { 132 for (size_t i = 0; i < kNumOfRows; ++i) {
127 CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray(); 133 CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray();
128 CPDF_Array* arr1_elem = arr1->GetObjectAt(i)->AsArray(); 134 CPDF_Array* arr1_elem = arr1->GetObjectAt(i)->AsArray();
129 CPDF_Array* arr2_elem = arr2->GetObjectAt(i)->AsArray(); 135 CPDF_Array* arr2_elem = arr2->GetObjectAt(i)->AsArray();
130 EXPECT_NE(arr_elem, arr1_elem); 136 EXPECT_NE(arr_elem, arr1_elem);
131 EXPECT_NE(arr_elem, arr2_elem); 137 EXPECT_NE(arr_elem, arr2_elem);
132 for (size_t j = 0; j < kNumOfRowElems; ++j) { 138 for (size_t j = 0; j < kNumOfRowElems; ++j) {
133 auto elem_obj = arr_elem->GetObjectAt(j); 139 auto elem_obj = arr_elem->GetObjectAt(j);
134 auto elem_obj1 = arr1_elem->GetObjectAt(j); 140 auto elem_obj1 = arr1_elem->GetObjectAt(j);
(...skipping 23 matching lines...) Expand all
158 EXPECT_EQ(elems[i][j], 164 EXPECT_EQ(elems[i][j],
159 arr2->GetObjectAt(i)->AsArray()->GetIntegerAt(j)); 165 arr2->GetObjectAt(i)->AsArray()->GetIntegerAt(j));
160 } 166 }
161 } 167 }
162 } 168 }
163 } 169 }
164 170
165 TEST(cpdf_array, Iterator) { 171 TEST(cpdf_array, Iterator) {
166 int elems[] = {-23, -11, 3, 455, 2345877, 172 int elems[] = {-23, -11, 3, 455, 2345877,
167 0, 7895330, -12564334, 10000, -100000}; 173 0, 7895330, -12564334, 10000, -100000};
168 std::unique_ptr<CPDF_Array> arr(new CPDF_Array); 174 ScopedArray arr(new CPDF_Array);
169 for (size_t i = 0; i < FX_ArraySize(elems); ++i) 175 for (size_t i = 0; i < FX_ArraySize(elems); ++i)
170 arr->InsertAt(i, new CPDF_Number(elems[i])); 176 arr->InsertAt(i, new CPDF_Number(elems[i]));
171 size_t index = 0; 177 size_t index = 0;
172 for (const auto& it : *arr) 178 for (const auto& it : *arr)
173 EXPECT_EQ(elems[index++], it->AsNumber()->GetInteger()); 179 EXPECT_EQ(elems[index++], it->AsNumber()->GetInteger());
174 } 180 }
OLDNEW
« no previous file with comments | « core/fpdfapi/parser/cpdf_array.cpp ('k') | core/fpdfapi/parser/cpdf_data_avail.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698