OLD | NEW |
1 // Copyright 2015 PDFium Authors. All rights reserved. | 1 // Copyright 2015 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 "../../public/fpdf_text.h" | 5 #include "../../public/fpdf_text.h" |
6 #include "../../public/fpdfview.h" | 6 #include "../../public/fpdfview.h" |
7 #include "../../testing/embedder_test.h" | 7 #include "../../testing/embedder_test.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace { | 10 namespace { |
11 | 11 |
12 static bool check_unsigned_shorts(const char* expected, | 12 static bool check_unsigned_shorts(const char* expected, |
13 const unsigned short* actual, | 13 const unsigned short* actual, |
14 size_t length) { | 14 size_t length) { |
15 if (length > strlen(expected) + 1) { | 15 if (length > strlen(expected) + 1) { |
16 return false; | 16 return false; |
17 } | 17 } |
18 for (size_t i = 0; i < length; ++i) { | 18 for (size_t i = 0; i < length; ++i) { |
19 if (actual[i] != static_cast<unsigned short>(expected[i])) { | 19 if (actual[i] != static_cast<unsigned short>(expected[i])) { |
20 return false; | 20 return false; |
21 } | 21 } |
22 } | 22 } |
23 return true; | 23 return true; |
24 } | 24 } |
25 | 25 |
26 } // namespace | 26 } // namespace |
27 | 27 |
28 class FPDFTextEmbeddertest : public EmbedderTest { | 28 class FPDFTextEmbeddertest : public EmbedderTest {}; |
29 }; | |
30 | 29 |
31 TEST_F(FPDFTextEmbeddertest, Text) { | 30 TEST_F(FPDFTextEmbeddertest, Text) { |
32 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); | 31 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); |
33 FPDF_PAGE page = LoadPage(0); | 32 FPDF_PAGE page = LoadPage(0); |
34 EXPECT_NE(nullptr, page); | 33 EXPECT_NE(nullptr, page); |
35 | 34 |
36 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 35 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
37 EXPECT_NE(nullptr, textpage); | 36 EXPECT_NE(nullptr, textpage); |
38 | 37 |
39 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; | 38 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; |
(...skipping 16 matching lines...) Expand all Loading... |
56 double left = 0.0; | 55 double left = 0.0; |
57 double right = 0.0; | 56 double right = 0.0; |
58 double bottom = 0.0; | 57 double bottom = 0.0; |
59 double top = 0.0; | 58 double top = 0.0; |
60 FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); | 59 FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); |
61 EXPECT_NEAR(41.071, left, 0.001); | 60 EXPECT_NEAR(41.071, left, 0.001); |
62 EXPECT_NEAR(46.243, right, 0.001); | 61 EXPECT_NEAR(46.243, right, 0.001); |
63 EXPECT_NEAR(49.844, bottom, 0.001); | 62 EXPECT_NEAR(49.844, bottom, 0.001); |
64 EXPECT_NEAR(55.520, top, 0.001); | 63 EXPECT_NEAR(55.520, top, 0.001); |
65 | 64 |
66 EXPECT_EQ(4, FPDFText_GetCharIndexAtPos( | 65 EXPECT_EQ(4, FPDFText_GetCharIndexAtPos(textpage, 42.0, 50.0, 1.0, 1.0)); |
67 textpage, 42.0, 50.0, 1.0, 1.0)); | 66 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 0.0, 0.0, 1.0, 1.0)); |
68 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | 67 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 199.0, 199.0, 1.0, 1.0)); |
69 textpage, 0.0, 0.0, 1.0, 1.0)); | |
70 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | |
71 textpage, 199.0, 199.0, 1.0, 1.0)); | |
72 | 68 |
73 // Test out of range indicies. | 69 // Test out of range indicies. |
74 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | 70 EXPECT_EQ(-1, |
75 textpage, 42.0, 10000000.0, 1.0, 1.0)); | 71 FPDFText_GetCharIndexAtPos(textpage, 42.0, 10000000.0, 1.0, 1.0)); |
76 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos( | 72 EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, -1.0, 50.0, 1.0, 1.0)); |
77 textpage, -1.0, 50.0, 1.0, 1.0)); | |
78 | 73 |
79 // Count does not include the terminating NUL in the string literal. | 74 // Count does not include the terminating NUL in the string literal. |
80 EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); | 75 EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); |
81 | 76 |
82 left = 0.0; | 77 left = 0.0; |
83 right = 0.0; | 78 right = 0.0; |
84 bottom = 0.0; | 79 bottom = 0.0; |
85 top = 0.0; | 80 top = 0.0; |
86 FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); | 81 FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); |
87 EXPECT_NEAR(20.847, left, 0.001); | 82 EXPECT_NEAR(20.847, left, 0.001); |
(...skipping 15 matching lines...) Expand all Loading... |
103 left = -2.0; | 98 left = -2.0; |
104 right = -2.0; | 99 right = -2.0; |
105 bottom = -2.0; | 100 bottom = -2.0; |
106 top = -2.0; | 101 top = -2.0; |
107 FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); | 102 FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); |
108 EXPECT_EQ(0.0, left); | 103 EXPECT_EQ(0.0, left); |
109 EXPECT_EQ(0.0, right); | 104 EXPECT_EQ(0.0, right); |
110 EXPECT_EQ(0.0, bottom); | 105 EXPECT_EQ(0.0, bottom); |
111 EXPECT_EQ(0.0, top); | 106 EXPECT_EQ(0.0, top); |
112 | 107 |
113 EXPECT_EQ(9, FPDFText_GetBoundedText( | 108 EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); |
114 textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); | |
115 | 109 |
116 // Extract starting at character 4 as above. | 110 // Extract starting at character 4 as above. |
117 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 111 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
118 EXPECT_EQ(1, FPDFText_GetBoundedText( | 112 EXPECT_EQ(1, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, |
119 textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 1)); | 113 fixed_buffer, 1)); |
120 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); | 114 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); |
121 EXPECT_EQ(0xbdbd, fixed_buffer[1]); | 115 EXPECT_EQ(0xbdbd, fixed_buffer[1]); |
122 | 116 |
123 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 117 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
124 EXPECT_EQ(9, FPDFText_GetBoundedText( | 118 EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, |
125 textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 9)); | 119 fixed_buffer, 9)); |
126 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); | 120 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); |
127 EXPECT_EQ(0xbdbd, fixed_buffer[9]); | 121 EXPECT_EQ(0xbdbd, fixed_buffer[9]); |
128 | 122 |
129 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 123 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
130 EXPECT_EQ(10, FPDFText_GetBoundedText( | 124 EXPECT_EQ(10, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, |
131 textpage, 41.0, 56.0, 82.0, 48.0, fixed_buffer, 128)); | 125 fixed_buffer, 128)); |
132 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); | 126 EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); |
133 EXPECT_EQ(0u, fixed_buffer[9]); | 127 EXPECT_EQ(0u, fixed_buffer[9]); |
134 EXPECT_EQ(0xbdbd, fixed_buffer[10]); | 128 EXPECT_EQ(0xbdbd, fixed_buffer[10]); |
135 | 129 |
136 FPDFText_ClosePage(textpage); | 130 FPDFText_ClosePage(textpage); |
137 UnloadPage(page); | 131 UnloadPage(page); |
138 } | 132 } |
139 | 133 |
140 TEST_F(FPDFTextEmbeddertest, TextSearch) { | 134 TEST_F(FPDFTextEmbeddertest, TextSearch) { |
141 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); | 135 EXPECT_TRUE(OpenDocument("testing/resources/hello_world.pdf")); |
142 FPDF_PAGE page = LoadPage(0); | 136 FPDF_PAGE page = LoadPage(0); |
143 EXPECT_NE(nullptr, page); | 137 EXPECT_NE(nullptr, page); |
144 | 138 |
145 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 139 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
146 EXPECT_NE(nullptr, textpage); | 140 EXPECT_NE(nullptr, textpage); |
147 | 141 |
148 // Avoid issues with system wchar_t width vs. FPDF_WideString. | 142 // Avoid issues with system wchar_t width vs. FPDF_WideString. |
149 const unsigned short nope[] = { 'n', 'o', 'p', 'e', '\0' }; | 143 const unsigned short nope[] = {'n', 'o', 'p', 'e', '\0'}; |
150 const unsigned short world[] = { 'w', 'o', 'r', 'l', 'd', '\0' }; | 144 const unsigned short world[] = {'w', 'o', 'r', 'l', 'd', '\0'}; |
151 const unsigned short world_caps[] = { 'W', 'O', 'R', 'L', 'D', '\0' }; | 145 const unsigned short world_caps[] = {'W', 'O', 'R', 'L', 'D', '\0'}; |
152 const unsigned short world_substr[] = { 'o', 'r', 'l', 'd', '\0' }; | 146 const unsigned short world_substr[] = {'o', 'r', 'l', 'd', '\0'}; |
153 | 147 |
154 // No occurences of "nope" in test page. | 148 // No occurences of "nope" in test page. |
155 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope, 0, 0); | 149 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope, 0, 0); |
156 EXPECT_NE(nullptr, search); | 150 EXPECT_NE(nullptr, search); |
157 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 151 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
158 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 152 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
159 | 153 |
160 // Advancing finds nothing. | 154 // Advancing finds nothing. |
161 EXPECT_FALSE(FPDFText_FindNext(search)); | 155 EXPECT_FALSE(FPDFText_FindNext(search)); |
162 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 156 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 190 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
197 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 191 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
198 | 192 |
199 // Found position unchanged when fails to retreat. | 193 // Found position unchanged when fails to retreat. |
200 EXPECT_FALSE(FPDFText_FindPrev(search)); | 194 EXPECT_FALSE(FPDFText_FindPrev(search)); |
201 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 195 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
202 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 196 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
203 FPDFText_FindClose(search); | 197 FPDFText_FindClose(search); |
204 | 198 |
205 // Exact search unaffected by case sensitiity and whole word flags. | 199 // Exact search unaffected by case sensitiity and whole word flags. |
206 search = FPDFText_FindStart( | 200 search = FPDFText_FindStart(textpage, world, |
207 textpage, world, FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); | 201 FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); |
208 EXPECT_NE(nullptr, search); | 202 EXPECT_NE(nullptr, search); |
209 EXPECT_TRUE(FPDFText_FindNext(search)); | 203 EXPECT_TRUE(FPDFText_FindNext(search)); |
210 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 204 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
211 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 205 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
212 FPDFText_FindClose(search); | 206 FPDFText_FindClose(search); |
213 | 207 |
214 // Default is case-insensitive, so matching agaist caps works. | 208 // Default is case-insensitive, so matching agaist caps works. |
215 search = FPDFText_FindStart(textpage, world_caps, 0, 0); | 209 search = FPDFText_FindStart(textpage, world_caps, 0, 0); |
216 EXPECT_NE(nullptr, search); | 210 EXPECT_NE(nullptr, search); |
217 EXPECT_TRUE(FPDFText_FindNext(search)); | 211 EXPECT_TRUE(FPDFText_FindNext(search)); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 // Retrieve a link with too small a buffer. Buffer will not be | 280 // Retrieve a link with too small a buffer. Buffer will not be |
287 // NUL-terminated, but must not be modified past indicated length, | 281 // NUL-terminated, but must not be modified past indicated length, |
288 // so pre-fill with a pattern to check write bounds. | 282 // so pre-fill with a pattern to check write bounds. |
289 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 283 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
290 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); | 284 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); |
291 EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); | 285 EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); |
292 EXPECT_EQ(0xbdbd, fixed_buffer[1]); | 286 EXPECT_EQ(0xbdbd, fixed_buffer[1]); |
293 | 287 |
294 // Check buffer that doesn't have space for a terminating NUL. | 288 // Check buffer that doesn't have space for a terminating NUL. |
295 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 289 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
296 EXPECT_EQ(sizeof(expected_url) - 1, FPDFLink_GetURL( | 290 EXPECT_EQ( |
297 pagelink, 0, fixed_buffer, sizeof(expected_url) - 1)); | 291 sizeof(expected_url) - 1, |
298 EXPECT_TRUE(check_unsigned_shorts( | 292 FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url) - 1)); |
299 expected_url, fixed_buffer, sizeof(expected_url) - 1)); | 293 EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, |
| 294 sizeof(expected_url) - 1)); |
300 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]); | 295 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url) - 1]); |
301 | 296 |
302 // Retreive link with exactly-sized buffer. | 297 // Retreive link with exactly-sized buffer. |
303 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 298 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
304 EXPECT_EQ(sizeof(expected_url), FPDFLink_GetURL( | 299 EXPECT_EQ(sizeof(expected_url), |
305 pagelink, 0, fixed_buffer, sizeof(expected_url))); | 300 FPDFLink_GetURL(pagelink, 0, fixed_buffer, sizeof(expected_url))); |
306 EXPECT_TRUE(check_unsigned_shorts( | 301 EXPECT_TRUE( |
307 expected_url, fixed_buffer, sizeof(expected_url))); | 302 check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); |
308 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); | 303 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); |
309 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); | 304 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); |
310 | 305 |
311 // Retreive link with ample-sized-buffer. | 306 // Retreive link with ample-sized-buffer. |
312 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 307 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
313 EXPECT_EQ(sizeof(expected_url), FPDFLink_GetURL( | 308 EXPECT_EQ(sizeof(expected_url), |
314 pagelink, 0, fixed_buffer, 128)); | 309 FPDFLink_GetURL(pagelink, 0, fixed_buffer, 128)); |
315 EXPECT_TRUE(check_unsigned_shorts( | 310 EXPECT_TRUE( |
316 expected_url, fixed_buffer, sizeof(expected_url))); | 311 check_unsigned_shorts(expected_url, fixed_buffer, sizeof(expected_url))); |
317 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); | 312 EXPECT_EQ(0u, fixed_buffer[sizeof(expected_url) - 1]); |
318 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); | 313 EXPECT_EQ(0xbdbd, fixed_buffer[sizeof(expected_url)]); |
319 | 314 |
320 // Each link rendered in a single rect in this test page. | 315 // Each link rendered in a single rect in this test page. |
321 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); | 316 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); |
322 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); | 317 EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); |
323 | 318 |
324 // Each link rendered in a single rect in this test page. | 319 // Each link rendered in a single rect in this test page. |
325 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); | 320 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); |
326 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); | 321 EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); |
(...skipping 29 matching lines...) Expand all Loading... |
356 FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); | 351 FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); |
357 EXPECT_EQ(-2.0, left); | 352 EXPECT_EQ(-2.0, left); |
358 EXPECT_EQ(-2.0, right); | 353 EXPECT_EQ(-2.0, right); |
359 EXPECT_EQ(-2.0, bottom); | 354 EXPECT_EQ(-2.0, bottom); |
360 EXPECT_EQ(-2.0, top); | 355 EXPECT_EQ(-2.0, top); |
361 | 356 |
362 FPDFLink_CloseWebLinks(pagelink); | 357 FPDFLink_CloseWebLinks(pagelink); |
363 FPDFText_ClosePage(textpage); | 358 FPDFText_ClosePage(textpage); |
364 UnloadPage(page); | 359 UnloadPage(page); |
365 } | 360 } |
OLD | NEW |