Add unit tests for GetDecoderArray().
Change-Id: I074446acc6d825362888188c85da7d223e1c5183
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/67732
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp b/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp
index 895a964..91cb4f4 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp
@@ -5,6 +5,7 @@
#include "core/fpdfapi/parser/fpdf_parser_decode.h"
#include "core/fpdfapi/parser/cpdf_array.h"
+#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/cpdf_string.h"
#include "core/fxcrt/fx_memory_wrappers.h"
@@ -112,6 +113,72 @@
}
}
+// TODO(thestig): Test decoder params.
+TEST(fpdf_parser_decode, GetDecoderArray) {
+ {
+ // No filter returns pdfium::nullopt.
+ // TODO(thestig): Should return empty DecoderArray instead.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ EXPECT_FALSE(decoder_array.has_value());
+ }
+ {
+ // Wrong filter type.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ dict->SetNewFor<CPDF_String>("Filter", "RL", false);
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ EXPECT_FALSE(decoder_array.has_value());
+ }
+ {
+ // Filter name.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ dict->SetNewFor<CPDF_Name>("Filter", "RL");
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ ASSERT_TRUE(decoder_array.has_value());
+ ASSERT_EQ(1u, decoder_array.value().size());
+ EXPECT_EQ("RL", decoder_array.value()[0].first);
+ }
+ {
+ // Empty filter array.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ dict->SetNewFor<CPDF_Array>("Filter");
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ ASSERT_TRUE(decoder_array.has_value());
+ EXPECT_TRUE(decoder_array.value().empty());
+ }
+ {
+ // Valid 1 element filter array.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ auto* filter_array = dict->SetNewFor<CPDF_Array>("Filter");
+ filter_array->AddNew<CPDF_Name>("FooBar");
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ ASSERT_TRUE(decoder_array.has_value());
+ ASSERT_EQ(1u, decoder_array.value().size());
+ EXPECT_EQ("FooBar", decoder_array.value()[0].first);
+ }
+ {
+ // Valid 2 element filter array.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ auto* filter_array = dict->SetNewFor<CPDF_Array>("Filter");
+ filter_array->AddNew<CPDF_Name>("AHx");
+ filter_array->AddNew<CPDF_Name>("LZWDecode");
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ ASSERT_TRUE(decoder_array.has_value());
+ ASSERT_EQ(2u, decoder_array.value().size());
+ EXPECT_EQ("AHx", decoder_array.value()[0].first);
+ EXPECT_EQ("LZWDecode", decoder_array.value()[1].first);
+ }
+ {
+ // Invalid 2 element filter array.
+ auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
+ auto* invalid_filter_array = dict->SetNewFor<CPDF_Array>("Filter");
+ invalid_filter_array->AddNew<CPDF_Name>("DCTDecode");
+ invalid_filter_array->AddNew<CPDF_Name>("CCITTFaxDecode");
+ Optional<DecoderArray> decoder_array = GetDecoderArray(dict.Get());
+ EXPECT_FALSE(decoder_array.has_value());
+ }
+}
+
TEST(fpdf_parser_decode, A85Decode) {
const pdfium::DecodeTestData kTestData[] = {
// Empty src string.