46TEST(ParserDecodeTest, ValidateDecoderPipeline) {
49 auto decoders = pdfium::MakeRetain<CPDF_Array>();
50 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
54 auto decoders = pdfium::MakeRetain<CPDF_Array>();
55 decoders->AppendNew<CPDF_Name>(
"FlateEncode");
56 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
60 auto decoders = pdfium::MakeRetain<CPDF_Array>();
61 decoders->AppendNew<CPDF_Name>(
"FooBar");
62 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
66 auto decoders = pdfium::MakeRetain<CPDF_Array>();
67 decoders->AppendNew<CPDF_Name>(
"AHx");
68 decoders->AppendNew<CPDF_Name>(
"LZWDecode");
69 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
73 auto decoders = pdfium::MakeRetain<CPDF_Array>();
74 decoders->AppendNew<CPDF_Name>(
"ASCII85Decode");
75 decoders->AppendNew<CPDF_Name>(
"ASCII85Decode");
76 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
80 auto decoders = pdfium::MakeRetain<CPDF_Array>();
81 decoders->AppendNew<CPDF_Name>(
"ASCII85Decode");
82 decoders->AppendNew<CPDF_Name>(
"A85");
83 decoders->AppendNew<CPDF_Name>(
"RunLengthDecode");
84 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
85 decoders->AppendNew<CPDF_Name>(
"RL");
86 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
90 auto decoders = pdfium::MakeRetain<CPDF_Array>();
91 decoders->AppendNew<CPDF_Name>(
"RunLengthDecode");
92 decoders->AppendNew<CPDF_Name>(
"ASCII85Decode");
93 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
94 decoders->AppendNew<CPDF_Name>(
"LZW");
95 decoders->AppendNew<CPDF_Name>(
"DCTDecode");
96 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
100 auto decoders = pdfium::MakeRetain<CPDF_Array>();
101 decoders->AppendNew<CPDF_String>(
"FlateEncode");
102 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
106 auto decoders = pdfium::MakeRetain<CPDF_Array>();
107 decoders->AppendNew<CPDF_Name>(
"DCTDecode");
108 decoders->AppendNew<CPDF_Name>(
"CCITTFaxDecode");
109 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
113 auto decoders = pdfium::MakeRetain<CPDF_Array>();
114 decoders->AppendNew<CPDF_Name>(
"DCTDecode");
115 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
116 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
120 auto decoders = pdfium::MakeRetain<CPDF_Array>();
121 decoders->AppendNew<CPDF_String>(
"AHx");
122 decoders->AppendNew<CPDF_Name>(
"LZWDecode");
123 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
127 auto decoders = pdfium::MakeRetain<CPDF_Array>();
128 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
129 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
130 decoders->AppendNew<CPDF_Name>(
"DCTDecode");
131 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
132 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
133 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
137 auto decoders = pdfium::MakeRetain<CPDF_Array>();
138 decoders->AppendNew<CPDF_Name>(
"ASCII85Decode");
139 decoders->AppendNew<CPDF_Name>(
"A85");
140 decoders->AppendNew<CPDF_Name>(
"RunLengthDecode");
141 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
142 decoders->AppendNew<CPDF_String>(
"RL");
143 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
151 auto decoder =
pdfium::MakeRetain<CPDF_Name>(
nullptr,
"FlateDecode");
152 uint32_t decoder_number =
156 decoders->AppendNew<CPDF_Reference>(&objects_holder, decoder_number);
157 decoders->AppendNew<CPDF_Name>(
"LZW");
158 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
164 auto decoder =
pdfium::MakeRetain<CPDF_Name>(
nullptr,
"LZW");
165 uint32_t decoder_number =
169 decoders->AppendNew<CPDF_Name>(
"RunLengthDecode");
170 decoders->AppendNew<CPDF_Name>(
"ASCII85Decode");
171 decoders->AppendNew<CPDF_Name>(
"FlateDecode");
172 decoders->AppendNew<CPDF_Reference>(&objects_holder, decoder_number);
173 decoders->AppendNew<CPDF_Name>(
"DCTDecode");
174 EXPECT_TRUE(ValidateDecoderPipeline(decoders.Get()));
179 auto decoder =
pdfium::MakeRetain<CPDF_String>(
nullptr,
"FlateDecode");
180 uint32_t decoder_number =
184 decoders->AppendNew<CPDF_Reference>(&objects_holder, decoder_number);
185 decoders->AppendNew<CPDF_Name>(
"LZW");
186 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
191 auto decoder =
pdfium::MakeRetain<CPDF_Name>(
nullptr,
"DCTDecode");
192 uint32_t decoder_number =
196 decoders->AppendNew<CPDF_Reference>(&objects_holder, decoder_number);
197 decoders->AppendNew<CPDF_Name>(
"LZW");
198 EXPECT_FALSE(ValidateDecoderPipeline(decoders.Get()));
203TEST(ParserDecodeTest, GetDecoderArray) {
206 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
207 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
208 ASSERT_TRUE(decoder_array.has_value());
209 EXPECT_TRUE(decoder_array.value().empty());
213 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
214 dict->SetNewFor<CPDF_String>(
"Filter",
"RL");
215 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
216 EXPECT_FALSE(decoder_array.has_value());
220 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
221 dict->SetNewFor<CPDF_Name>(
"Filter",
"RL");
222 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
223 ASSERT_TRUE(decoder_array.has_value());
224 ASSERT_EQ(1u, decoder_array.value().size());
225 EXPECT_EQ(
"RL", decoder_array.value()[0].first);
229 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
230 dict->SetNewFor<CPDF_Array>(
"Filter");
231 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
232 ASSERT_TRUE(decoder_array.has_value());
233 EXPECT_TRUE(decoder_array.value().empty());
237 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
238 auto filter_array = dict->SetNewFor<CPDF_Array>(
"Filter");
239 filter_array->AppendNew<CPDF_Name>(
"FooBar");
240 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
241 ASSERT_TRUE(decoder_array.has_value());
242 ASSERT_EQ(1u, decoder_array.value().size());
243 EXPECT_EQ(
"FooBar", decoder_array.value()[0].first);
247 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
248 auto filter_array = dict->SetNewFor<CPDF_Array>(
"Filter");
249 filter_array->AppendNew<CPDF_Name>(
"AHx");
250 filter_array->AppendNew<CPDF_Name>(
"LZWDecode");
251 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
252 ASSERT_TRUE(decoder_array.has_value());
253 ASSERT_EQ(2u, decoder_array.value().size());
254 EXPECT_EQ(
"AHx", decoder_array.value()[0].first);
255 EXPECT_EQ(
"LZWDecode", decoder_array.value()[1].first);
259 auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
260 auto invalid_filter_array = dict->SetNewFor<CPDF_Array>(
"Filter");
261 invalid_filter_array->AppendNew<CPDF_Name>(
"DCTDecode");
262 invalid_filter_array->AppendNew<CPDF_Name>(
"CCITTFaxDecode");
263 std::optional<DecoderArray> decoder_array = GetDecoderArray(dict);
264 EXPECT_FALSE(decoder_array.has_value());
327 EXPECT_EQ(L"", PDF_DecodeText(ToSpan(
"")));
330 EXPECT_EQ(L"the quick\tfox", PDF_DecodeText(ToSpan(
"the quick\tfox")));
333 EXPECT_EQ(L"\x0330\x0331",
334 PDF_DecodeText(ToSpan(
"\xEF\xBB\xBF\xCC\xB0\xCC\xB1")));
337 EXPECT_EQ(L"\x0330\x0331",
338 PDF_DecodeText(ToSpan(
"\xFE\xFF\x03\x30\x03\x31")));
342 L"\x7F51\x9875\x0020\x56FE\x7247\x0020"
343 L"\x8D44\x8BAF\x66F4\x591A\x0020\x00BB",
345 ToSpan(
"\xFE\xFF\x7F\x51\x98\x75\x00\x20\x56\xFE\x72\x47\x00"
346 "\x20\x8D\x44\x8B\xAF\x66\xF4\x59\x1A\x00\x20\x00\xBB")));
349 EXPECT_EQ(L"🎨", PDF_DecodeText(ToSpan(
"\xEF\xBB\xBF\xF0\x9F\x8E\xA8")));
352 EXPECT_EQ(L"🎨", PDF_DecodeText(ToSpan(
"\xFE\xFF\xD8\x3C\xDF\xA8")));