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

Side by Side Diff: core/fpdfdoc/doc_basic_unittest.cpp

Issue 2187073005: Splitting fpdfdoc/doc_* part II. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@fpdf_doc_III
Patch Set: Rebase to master Created 4 years, 4 months 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/fpdfdoc/doc_basic.cpp ('k') | core/fpdfdoc/doc_ocg.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <memory>
6 #include <vector>
7
8 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
9 #include "core/fpdfapi/fpdf_parser/include/cpdf_name.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
11 #include "core/fpdfdoc/include/cpdf_filespec.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "testing/test_support.h"
14
15 namespace {
16
17 using ScopedObj = std::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>>;
18 using ScopedDict =
19 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>>;
20 }
21
22 TEST(doc_basic_filespec, EncodeDecodeFileName) {
23 std::vector<pdfium::NullTermWstrFuncTestData> test_data = {
24 // Empty src string.
25 {L"", L""},
26 // only file name.
27 {L"test.pdf", L"test.pdf"},
28 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
29 // With drive identifier.
30 {L"r:\\pdfdocs\\spec.pdf", L"/r/pdfdocs/spec.pdf"},
31 // Relative path.
32 {L"My Document\\test.pdf", L"My Document/test.pdf"},
33 // Absolute path without drive identifier.
34 {L"\\pdfdocs\\spec.pdf", L"//pdfdocs/spec.pdf"},
35 // Absolute path with double backslashes.
36 {L"\\\\pdfdocs\\spec.pdf", L"/pdfdocs/spec.pdf"},
37 // Network resource name. It is not supported yet.
38 // {L"pclib/eng:\\pdfdocs\\spec.pdf", L"/pclib/eng/pdfdocs/spec.pdf"},
39 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
40 // Absolute path with colon separator.
41 {L"Mac HD:PDFDocs:spec.pdf", L"/Mac HD/PDFDocs/spec.pdf"},
42 // Relative path with colon separator.
43 {L"PDFDocs:spec.pdf", L"PDFDocs/spec.pdf"},
44 #else
45 // Relative path.
46 {L"./docs/test.pdf", L"./docs/test.pdf"},
47 // Relative path with parent dir.
48 {L"../test_docs/test.pdf", L"../test_docs/test.pdf"},
49 // Absolute path.
50 {L"/usr/local/home/test.pdf", L"/usr/local/home/test.pdf"},
51 #endif
52 };
53 for (const auto& data : test_data) {
54 CFX_WideString encoded_str = CPDF_FileSpec::EncodeFileName(data.input);
55 EXPECT_TRUE(encoded_str == data.expected);
56 // DecodeFileName is the reverse procedure of EncodeFileName.
57 CFX_WideString decoded_str = CPDF_FileSpec::DecodeFileName(data.expected);
58 EXPECT_TRUE(decoded_str == data.input);
59 }
60 }
61
62 TEST(doc_basic_filespec, GetFileName) {
63 {
64 // String object.
65 pdfium::NullTermWstrFuncTestData test_data = {
66 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
67 L"/C/docs/test.pdf",
68 L"C:\\docs\\test.pdf"
69 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
70 L"/Mac HD/docs/test.pdf",
71 L"Mac HD:docs:test.pdf"
72 #else
73 L"/docs/test.pdf",
74 L"/docs/test.pdf"
75 #endif
76 };
77 ScopedObj str_obj(new CPDF_String(test_data.input));
78 CPDF_FileSpec file_spec(str_obj.get());
79 CFX_WideString file_name;
80 EXPECT_TRUE(file_spec.GetFileName(&file_name));
81 EXPECT_TRUE(file_name == test_data.expected);
82 }
83 {
84 // Dictionary object.
85 pdfium::NullTermWstrFuncTestData test_data[5] = {
86 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
87 {L"/C/docs/test.pdf", L"C:\\docs\\test.pdf"},
88 {L"/D/docs/test.pdf", L"D:\\docs\\test.pdf"},
89 {L"/E/docs/test.pdf", L"E:\\docs\\test.pdf"},
90 {L"/F/docs/test.pdf", L"F:\\docs\\test.pdf"},
91 {L"/G/docs/test.pdf", L"G:\\docs\\test.pdf"},
92 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
93 {L"/Mac HD/docs1/test.pdf", L"Mac HD:docs1:test.pdf"},
94 {L"/Mac HD/docs2/test.pdf", L"Mac HD:docs2:test.pdf"},
95 {L"/Mac HD/docs3/test.pdf", L"Mac HD:docs3:test.pdf"},
96 {L"/Mac HD/docs4/test.pdf", L"Mac HD:docs4:test.pdf"},
97 {L"/Mac HD/docs5/test.pdf", L"Mac HD:docs5:test.pdf"},
98 #else
99 {L"/docs/a/test.pdf", L"/docs/a/test.pdf"},
100 {L"/docs/b/test.pdf", L"/docs/b/test.pdf"},
101 {L"/docs/c/test.pdf", L"/docs/c/test.pdf"},
102 {L"/docs/d/test.pdf", L"/docs/d/test.pdf"},
103 {L"/docs/e/test.pdf", L"/docs/e/test.pdf"},
104 #endif
105 };
106 // Keyword fields in reverse order of precedence to retrieve the file name.
107 const char* const keywords[5] = {"Unix", "Mac", "DOS", "F", "UF"};
108 ScopedDict dict_obj(new CPDF_Dictionary);
109 CPDF_FileSpec file_spec(dict_obj.get());
110 CFX_WideString file_name;
111 for (int i = 0; i < 5; ++i) {
112 dict_obj->SetAt(keywords[i], new CPDF_String(test_data[i].input));
113 EXPECT_TRUE(file_spec.GetFileName(&file_name));
114 EXPECT_TRUE(file_name == test_data[i].expected);
115 }
116
117 // With all the former fields and 'FS' field suggests 'URL' type.
118 dict_obj->SetAtString("FS", "URL");
119 EXPECT_TRUE(file_spec.GetFileName(&file_name));
120 // Url string is not decoded.
121 EXPECT_TRUE(file_name == test_data[4].input);
122 }
123 {
124 // Invalid object.
125 ScopedObj name_obj(new CPDF_Name("test.pdf"));
126 CPDF_FileSpec file_spec(name_obj.get());
127 CFX_WideString file_name;
128 EXPECT_FALSE(file_spec.GetFileName(&file_name));
129 }
130 }
131
132 TEST(doc_basic_filespec, SetFileName) {
133 pdfium::NullTermWstrFuncTestData test_data = {
134 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
135 L"C:\\docs\\test.pdf",
136 L"/C/docs/test.pdf"
137 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
138 L"Mac HD:docs:test.pdf",
139 L"/Mac HD/docs/test.pdf"
140 #else
141 L"/docs/test.pdf",
142 L"/docs/test.pdf"
143 #endif
144 };
145 // String object.
146 ScopedObj str_obj(new CPDF_String(L"babababa"));
147 CPDF_FileSpec file_spec1(str_obj.get());
148 file_spec1.SetFileName(test_data.input);
149 // Check internal object value.
150 CFX_ByteString str = CFX_ByteString::FromUnicode(test_data.expected);
151 EXPECT_TRUE(str == str_obj->GetString());
152 // Check we can get the file name back.
153 CFX_WideString file_name;
154 EXPECT_TRUE(file_spec1.GetFileName(&file_name));
155 EXPECT_TRUE(file_name == test_data.input);
156
157 // Dictionary object.
158 ScopedDict dict_obj(new CPDF_Dictionary);
159 CPDF_FileSpec file_spec2(dict_obj.get());
160 file_spec2.SetFileName(test_data.input);
161 // Check internal object value.
162 file_name = dict_obj->GetUnicodeTextBy("F");
163 EXPECT_TRUE(file_name == test_data.expected);
164 file_name = dict_obj->GetUnicodeTextBy("UF");
165 EXPECT_TRUE(file_name == test_data.expected);
166 // Check we can get the file name back.
167 EXPECT_TRUE(file_spec2.GetFileName(&file_name));
168 EXPECT_TRUE(file_name == test_data.input);
169 }
OLDNEW
« no previous file with comments | « core/fpdfdoc/doc_basic.cpp ('k') | core/fpdfdoc/doc_ocg.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698