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 "core/fxcrt/include/fx_basic.h" | 5 #include "core/fxcrt/include/fx_basic.h" |
6 #include "public/fpdf_text.h" | 6 #include "public/fpdf_text.h" |
7 #include "public/fpdfview.h" | 7 #include "public/fpdfview.h" |
8 #include "testing/embedder_test.h" | 8 #include "testing/embedder_test.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "testing/test_support.h" | 10 #include "testing/test_support.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 return true; | 25 return true; |
26 } | 26 } |
27 | 27 |
28 } // namespace | 28 } // namespace |
29 | 29 |
30 class FPDFTextEmbeddertest : public EmbedderTest {}; | 30 class FPDFTextEmbeddertest : public EmbedderTest {}; |
31 | 31 |
32 TEST_F(FPDFTextEmbeddertest, Text) { | 32 TEST_F(FPDFTextEmbeddertest, Text) { |
33 EXPECT_TRUE(OpenDocument("hello_world.pdf")); | 33 EXPECT_TRUE(OpenDocument("hello_world.pdf")); |
34 FPDF_PAGE page = LoadPage(0); | 34 FPDF_PAGE page = LoadPage(0); |
35 EXPECT_NE(nullptr, page); | 35 EXPECT_TRUE(page); |
36 | 36 |
37 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 37 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
38 EXPECT_NE(nullptr, textpage); | 38 EXPECT_TRUE(textpage); |
39 | 39 |
40 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; | 40 static const char expected[] = "Hello, world!\r\nGoodbye, world!"; |
41 unsigned short fixed_buffer[128]; | 41 unsigned short fixed_buffer[128]; |
42 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); | 42 memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); |
43 | 43 |
44 // Check includes the terminating NUL that is provided. | 44 // Check includes the terminating NUL that is provided. |
45 int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); | 45 int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); |
46 ASSERT_GE(num_chars, 0); | 46 ASSERT_GE(num_chars, 0); |
47 EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars)); | 47 EXPECT_EQ(sizeof(expected), static_cast<size_t>(num_chars)); |
48 EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); | 48 EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 EXPECT_EQ(0u, fixed_buffer[9]); | 134 EXPECT_EQ(0u, fixed_buffer[9]); |
135 EXPECT_EQ(0xbdbd, fixed_buffer[10]); | 135 EXPECT_EQ(0xbdbd, fixed_buffer[10]); |
136 | 136 |
137 FPDFText_ClosePage(textpage); | 137 FPDFText_ClosePage(textpage); |
138 UnloadPage(page); | 138 UnloadPage(page); |
139 } | 139 } |
140 | 140 |
141 TEST_F(FPDFTextEmbeddertest, TextSearch) { | 141 TEST_F(FPDFTextEmbeddertest, TextSearch) { |
142 EXPECT_TRUE(OpenDocument("hello_world.pdf")); | 142 EXPECT_TRUE(OpenDocument("hello_world.pdf")); |
143 FPDF_PAGE page = LoadPage(0); | 143 FPDF_PAGE page = LoadPage(0); |
144 EXPECT_NE(nullptr, page); | 144 EXPECT_TRUE(page); |
145 | 145 |
146 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 146 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
147 EXPECT_NE(nullptr, textpage); | 147 EXPECT_TRUE(textpage); |
148 | 148 |
149 std::unique_ptr<unsigned short, pdfium::FreeDeleter> nope = | 149 std::unique_ptr<unsigned short, pdfium::FreeDeleter> nope = |
150 GetFPDFWideString(L"nope"); | 150 GetFPDFWideString(L"nope"); |
151 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world = | 151 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world = |
152 GetFPDFWideString(L"world"); | 152 GetFPDFWideString(L"world"); |
153 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_caps = | 153 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_caps = |
154 GetFPDFWideString(L"WORLD"); | 154 GetFPDFWideString(L"WORLD"); |
155 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_substr = | 155 std::unique_ptr<unsigned short, pdfium::FreeDeleter> world_substr = |
156 GetFPDFWideString(L"orld"); | 156 GetFPDFWideString(L"orld"); |
157 | 157 |
158 // No occurences of "nope" in test page. | 158 // No occurences of "nope" in test page. |
159 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); | 159 FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); |
160 EXPECT_NE(nullptr, search); | 160 EXPECT_TRUE(search); |
161 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 161 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
162 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 162 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
163 | 163 |
164 // Advancing finds nothing. | 164 // Advancing finds nothing. |
165 EXPECT_FALSE(FPDFText_FindNext(search)); | 165 EXPECT_FALSE(FPDFText_FindNext(search)); |
166 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 166 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
167 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 167 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
168 | 168 |
169 // Retreating finds nothing. | 169 // Retreating finds nothing. |
170 EXPECT_FALSE(FPDFText_FindPrev(search)); | 170 EXPECT_FALSE(FPDFText_FindPrev(search)); |
171 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 171 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
172 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 172 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
173 FPDFText_FindClose(search); | 173 FPDFText_FindClose(search); |
174 | 174 |
175 // Two occurences of "world" in test page. | 175 // Two occurences of "world" in test page. |
176 search = FPDFText_FindStart(textpage, world.get(), 0, 2); | 176 search = FPDFText_FindStart(textpage, world.get(), 0, 2); |
177 EXPECT_NE(nullptr, search); | 177 EXPECT_TRUE(search); |
178 | 178 |
179 // Remains not found until advanced. | 179 // Remains not found until advanced. |
180 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 180 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
181 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 181 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
182 | 182 |
183 // First occurence of "world" in this test page. | 183 // First occurence of "world" in this test page. |
184 EXPECT_TRUE(FPDFText_FindNext(search)); | 184 EXPECT_TRUE(FPDFText_FindNext(search)); |
185 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 185 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
186 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 186 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
187 | 187 |
(...skipping 14 matching lines...) Expand all Loading... |
202 | 202 |
203 // Found position unchanged when fails to retreat. | 203 // Found position unchanged when fails to retreat. |
204 EXPECT_FALSE(FPDFText_FindPrev(search)); | 204 EXPECT_FALSE(FPDFText_FindPrev(search)); |
205 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 205 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
206 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 206 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
207 FPDFText_FindClose(search); | 207 FPDFText_FindClose(search); |
208 | 208 |
209 // Exact search unaffected by case sensitiity and whole word flags. | 209 // Exact search unaffected by case sensitiity and whole word flags. |
210 search = FPDFText_FindStart(textpage, world.get(), | 210 search = FPDFText_FindStart(textpage, world.get(), |
211 FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); | 211 FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); |
212 EXPECT_NE(nullptr, search); | 212 EXPECT_TRUE(search); |
213 EXPECT_TRUE(FPDFText_FindNext(search)); | 213 EXPECT_TRUE(FPDFText_FindNext(search)); |
214 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 214 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
215 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 215 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
216 FPDFText_FindClose(search); | 216 FPDFText_FindClose(search); |
217 | 217 |
218 // Default is case-insensitive, so matching agaist caps works. | 218 // Default is case-insensitive, so matching agaist caps works. |
219 search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); | 219 search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); |
220 EXPECT_NE(nullptr, search); | 220 EXPECT_TRUE(search); |
221 EXPECT_TRUE(FPDFText_FindNext(search)); | 221 EXPECT_TRUE(FPDFText_FindNext(search)); |
222 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); | 222 EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); |
223 EXPECT_EQ(5, FPDFText_GetSchCount(search)); | 223 EXPECT_EQ(5, FPDFText_GetSchCount(search)); |
224 FPDFText_FindClose(search); | 224 FPDFText_FindClose(search); |
225 | 225 |
226 // But can be made case sensitive, in which case this fails. | 226 // But can be made case sensitive, in which case this fails. |
227 search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); | 227 search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); |
228 EXPECT_FALSE(FPDFText_FindNext(search)); | 228 EXPECT_FALSE(FPDFText_FindNext(search)); |
229 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); | 229 EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); |
230 EXPECT_EQ(0, FPDFText_GetSchCount(search)); | 230 EXPECT_EQ(0, FPDFText_GetSchCount(search)); |
(...skipping 14 matching lines...) Expand all Loading... |
245 FPDFText_FindClose(search); | 245 FPDFText_FindClose(search); |
246 | 246 |
247 FPDFText_ClosePage(textpage); | 247 FPDFText_ClosePage(textpage); |
248 UnloadPage(page); | 248 UnloadPage(page); |
249 } | 249 } |
250 | 250 |
251 // Test that the page has characters despite a bad stream length. | 251 // Test that the page has characters despite a bad stream length. |
252 TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { | 252 TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { |
253 EXPECT_TRUE(OpenDocument("bug_57.pdf")); | 253 EXPECT_TRUE(OpenDocument("bug_57.pdf")); |
254 FPDF_PAGE page = LoadPage(0); | 254 FPDF_PAGE page = LoadPage(0); |
255 EXPECT_NE(nullptr, page); | 255 EXPECT_TRUE(page); |
256 | 256 |
257 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 257 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
258 EXPECT_NE(nullptr, textpage); | 258 EXPECT_TRUE(textpage); |
259 EXPECT_EQ(13, FPDFText_CountChars(textpage)); | 259 EXPECT_EQ(13, FPDFText_CountChars(textpage)); |
260 | 260 |
261 FPDFText_ClosePage(textpage); | 261 FPDFText_ClosePage(textpage); |
262 UnloadPage(page); | 262 UnloadPage(page); |
263 } | 263 } |
264 | 264 |
265 TEST_F(FPDFTextEmbeddertest, WebLinks) { | 265 TEST_F(FPDFTextEmbeddertest, WebLinks) { |
266 EXPECT_TRUE(OpenDocument("weblinks.pdf")); | 266 EXPECT_TRUE(OpenDocument("weblinks.pdf")); |
267 FPDF_PAGE page = LoadPage(0); | 267 FPDF_PAGE page = LoadPage(0); |
268 EXPECT_NE(nullptr, page); | 268 EXPECT_TRUE(page); |
269 | 269 |
270 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 270 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
271 EXPECT_NE(nullptr, textpage); | 271 EXPECT_TRUE(textpage); |
272 | 272 |
273 FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); | 273 FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); |
274 EXPECT_NE(nullptr, pagelink); | 274 EXPECT_TRUE(pagelink); |
275 | 275 |
276 // Page contains two HTTP-style URLs. | 276 // Page contains two HTTP-style URLs. |
277 EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); | 277 EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); |
278 | 278 |
279 // Only a terminating NUL required for bogus links. | 279 // Only a terminating NUL required for bogus links. |
280 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); | 280 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); |
281 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); | 281 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); |
282 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); | 282 EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); |
283 | 283 |
284 // Query the number of characters required for each link (incl NUL). | 284 // Query the number of characters required for each link (incl NUL). |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 EXPECT_EQ(-2.0, top); | 364 EXPECT_EQ(-2.0, top); |
365 | 365 |
366 FPDFLink_CloseWebLinks(pagelink); | 366 FPDFLink_CloseWebLinks(pagelink); |
367 FPDFText_ClosePage(textpage); | 367 FPDFText_ClosePage(textpage); |
368 UnloadPage(page); | 368 UnloadPage(page); |
369 } | 369 } |
370 | 370 |
371 TEST_F(FPDFTextEmbeddertest, GetFontSize) { | 371 TEST_F(FPDFTextEmbeddertest, GetFontSize) { |
372 EXPECT_TRUE(OpenDocument("hello_world.pdf")); | 372 EXPECT_TRUE(OpenDocument("hello_world.pdf")); |
373 FPDF_PAGE page = LoadPage(0); | 373 FPDF_PAGE page = LoadPage(0); |
374 EXPECT_NE(nullptr, page); | 374 EXPECT_TRUE(page); |
375 | 375 |
376 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); | 376 FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); |
377 EXPECT_NE(nullptr, textpage); | 377 EXPECT_TRUE(textpage); |
378 | 378 |
379 const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, | 379 const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, |
380 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, | 380 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, |
381 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; | 381 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; |
382 | 382 |
383 int count = FPDFText_CountChars(textpage); | 383 int count = FPDFText_CountChars(textpage); |
384 ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), static_cast<size_t>(count)); | 384 ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), static_cast<size_t>(count)); |
385 for (int i = 0; i < count; ++i) | 385 for (int i = 0; i < count; ++i) |
386 EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; | 386 EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; |
387 | 387 |
388 FPDFText_ClosePage(textpage); | 388 FPDFText_ClosePage(textpage); |
389 UnloadPage(page); | 389 UnloadPage(page); |
390 } | 390 } |
OLD | NEW |