Implement PDF417HighLevelEncoderTest.EncodeHighLevel.
Add tests for some interesting cases to improve test coverage. Tidy up
existing PDF417HighLevelEncoderTests.
Change-Id: I1ad2014c1198ea0c40bfb43adbfa5ddaabd57cbf
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55752
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
index ad07f79..995d4d8 100644
--- a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
+++ b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
@@ -121,9 +121,8 @@
return {};
size_t b_value = b.value();
- if (b_value == 0) {
+ if (b_value == 0)
b_value = 1;
- }
if (b_value == 1 && encodingMode == EncodingMode::kText) {
EncodeBinary(byteArr, p, 1, EncodingMode::kText, &sb);
} else {
diff --git a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
index eb2d30f..32c3f2d 100644
--- a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
+++ b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
@@ -47,12 +47,13 @@
std::vector<uint8_t>* bytes,
size_t startpos);
- friend class PDF417HighLevelEncoderTest_EncodeNumeric_Test;
- friend class PDF417HighLevelEncoderTest_EncodeBinary_Test;
- friend class PDF417HighLevelEncoderTest_EncodeText_Test;
+ friend class PDF417HighLevelEncoderTest_ConsecutiveBinaryCount_Test;
friend class PDF417HighLevelEncoderTest_ConsecutiveDigitCount_Test;
friend class PDF417HighLevelEncoderTest_ConsecutiveTextCount_Test;
- friend class PDF417HighLevelEncoderTest_ConsecutiveBinaryCount_Test;
+ friend class PDF417HighLevelEncoderTest_EncodeBinary_Test;
+ friend class PDF417HighLevelEncoderTest_EncodeHighLevel_Test;
+ friend class PDF417HighLevelEncoderTest_EncodeNumeric_Test;
+ friend class PDF417HighLevelEncoderTest_EncodeText_Test;
};
#endif // FXBARCODE_PDF417_BC_PDF417HIGHLEVELENCODER_H_
diff --git a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
index b9bf819..4ca5c8b 100644
--- a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
+++ b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp
@@ -7,7 +7,45 @@
#include "testing/gtest/include/gtest/gtest.h"
TEST(PDF417HighLevelEncoderTest, EncodeHighLevel) {
- // TODO(tsepez): implement test cases.
+ static constexpr struct EncodeHighLevelCase {
+ const wchar_t* input;
+ const wchar_t* expected;
+ int expected_length;
+ } kEncodeHighLevelCases[] = {
+ // Empty string encodes as empty string.
+ {L"", L"", 0},
+
+ // Binary mode with digit.
+ {L"\x000b\x000b\x0030", L"\x0385\x000b\x000b\x0030", 4},
+
+ // Text mode.
+ {L"xxxxxxXx", L"\x0384\x0341\x02c9\x02c9\x02cd\x02c9", 6},
+
+ // Text mode with punctuation.
+ {L"xxxxxx!x", L"\x0384\x0341\x02c9\x02c9\x02cf\x0143", 6},
+
+ // Text mode with mixed submode.
+ {L"xxxxxx0x", L"\x0384\x0341\x02c9\x02c9\x02ce\x001b\x02cf", 7},
+
+ // Text mode with mixed submode, and space in alpha submode.
+ {L"xxxxxx0X ", L"\x0384\x0341\x02c9\x02c9\x02ce\x001c\x02cc", 7},
+
+ // Text mode to binary mode.
+ {L"xxxxxx\x0b", L"\x0384\x0341\x02c9\x02c9\x02cf\x0391\x0385\x000b", 8},
+
+ // 13 consecutive digits triggers numeric encoding.
+ {L"0000000000000", L"\x0386\x000f\x00d9\x017b\x000b\x0064", 6},
+ };
+
+ for (size_t i = 0; i < FX_ArraySize(kEncodeHighLevelCases); ++i) {
+ const EncodeHighLevelCase& testcase = kEncodeHighLevelCases[i];
+ WideStringView input(testcase.input);
+ WideString expected(testcase.expected, testcase.expected_length);
+ Optional<WideString> result =
+ CBC_PDF417HighLevelEncoder::EncodeHighLevel(input);
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(expected, result.value()) << " for case number " << i;
+ }
}
TEST(PDF417HighLevelEncoderTest, EncodeText) {
@@ -15,22 +53,26 @@
}
TEST(PDF417HighLevelEncoderTest, EncodeBinary) {
- struct EncodeBinaryCase {
+ static constexpr struct EncodeBinaryCase {
const char* input;
int offset;
int count;
CBC_PDF417HighLevelEncoder::EncodingMode startmode;
const wchar_t* expected;
int expected_length;
- } encode_binary_cases[] = {
+ } kEncodeBinaryCases[] = {
// Empty string encodes as empty string.
{"", 0, 0, CBC_PDF417HighLevelEncoder::EncodingMode::kText, L"", 0},
+ // Single digit encodes with a shift-to byte.
+ {"x", 0, 1, CBC_PDF417HighLevelEncoder::EncodingMode::kText,
+ L"\x0391\x0385x", 3},
+
// Fewer than 6 characters encodes as prefix without compaction.
{"xxxxx", 0, 5, CBC_PDF417HighLevelEncoder::EncodingMode::kText,
L"\x0385xxxxx", 6},
- // 6 charcters triggerst text encoding compaction.
+ // 6 charcters triggers text encoding compaction.
{"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::EncodingMode::kText,
L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
@@ -39,30 +81,31 @@
L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
};
- for (size_t i = 0; i < FX_ArraySize(encode_binary_cases); ++i) {
- EncodeBinaryCase* ptr = &encode_binary_cases[i];
+ for (size_t i = 0; i < FX_ArraySize(kEncodeBinaryCases); ++i) {
+ const EncodeBinaryCase& testcase = kEncodeBinaryCases[i];
std::vector<uint8_t> input_array;
- size_t input_length = strlen(ptr->input);
+ size_t input_length = strlen(testcase.input);
input_array.resize(input_length);
for (size_t j = 0; j < input_length; ++j) {
- input_array[j] = ptr->input[j];
+ input_array[j] = testcase.input[j];
}
- WideString expected(ptr->expected, ptr->expected_length);
+ WideString expected(testcase.expected, testcase.expected_length);
WideString result;
- CBC_PDF417HighLevelEncoder::EncodeBinary(
- input_array, ptr->offset, ptr->count, ptr->startmode, &result);
+ CBC_PDF417HighLevelEncoder::EncodeBinary(input_array, testcase.offset,
+ testcase.count, testcase.startmode,
+ &result);
EXPECT_EQ(expected, result) << " for case number " << i;
}
}
TEST(PDF417HighLevelEncoderTest, EncodeNumeric) {
- struct EncodeNumericCase {
+ static constexpr struct EncodeNumericCase {
const wchar_t* input;
int offset;
int count;
const wchar_t* expected;
int expected_length;
- } encode_numeric_cases[] = {
+ } kEncodeNumericCases[] = {
// Empty string encodes as empty string.
{L"", 0, 0, L"", 0},
@@ -105,24 +148,24 @@
18},
};
- for (size_t i = 0; i < FX_ArraySize(encode_numeric_cases); ++i) {
- EncodeNumericCase* ptr = &encode_numeric_cases[i];
- WideString input(ptr->input);
- WideString expected(ptr->expected, ptr->expected_length);
+ for (size_t i = 0; i < FX_ArraySize(kEncodeNumericCases); ++i) {
+ const EncodeNumericCase& testcase = kEncodeNumericCases[i];
+ WideString input(testcase.input);
+ WideString expected(testcase.expected, testcase.expected_length);
WideString result;
- CBC_PDF417HighLevelEncoder::EncodeNumeric(input, ptr->offset, ptr->count,
- &result);
+ CBC_PDF417HighLevelEncoder::EncodeNumeric(input, testcase.offset,
+ testcase.count, &result);
EXPECT_EQ(expected, result) << " for case number " << i;
}
}
TEST(PDF417HighLevelEncoderTest, ConsecutiveDigitCount) {
- struct ConsecutiveDigitCase {
+ static constexpr struct ConsecutiveDigitCase {
const wchar_t* input;
int offset;
int expected_count;
- } consecutive_digit_cases[] = {
- // Empty string contains 0 consecuitve digits.
+ } kConsecutiveDigitCases[] = {
+ // Empty string contains 0 consecutive digits.
{L"", 0, 0},
// Single non-digit character contains 0 consecutive digits.
@@ -150,22 +193,23 @@
{L"123FOO45678", 6, 5},
};
- for (size_t i = 0; i < FX_ArraySize(consecutive_digit_cases); ++i) {
- ConsecutiveDigitCase* ptr = &consecutive_digit_cases[i];
- WideString input(ptr->input);
+ for (size_t i = 0; i < FX_ArraySize(kConsecutiveDigitCases); ++i) {
+ const ConsecutiveDigitCase& testcase = kConsecutiveDigitCases[i];
+ WideString input(testcase.input);
int actual_count =
- CBC_PDF417HighLevelEncoder::DetermineConsecutiveDigitCount(input,
- ptr->offset);
- EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i;
+ CBC_PDF417HighLevelEncoder::DetermineConsecutiveDigitCount(
+ input, testcase.offset);
+ EXPECT_EQ(testcase.expected_count, actual_count)
+ << " for case number " << i;
}
}
TEST(PDF417HighLevelEncoderTest, ConsecutiveTextCount) {
- struct ConsecutiveTextCase {
+ static constexpr struct ConsecutiveTextCase {
const wchar_t* input;
int offset;
int expected_count;
- } consecutive_text_cases[] = {
+ } kConsecutiveTextCases[] = {
// Empty string contains 0 consecutive text characters.
{L"", 0, 0},
@@ -209,13 +253,14 @@
{L"XXX121XXX12345678901234", 0, 9},
};
- for (size_t i = 0; i < FX_ArraySize(consecutive_text_cases); ++i) {
- ConsecutiveTextCase* ptr = &consecutive_text_cases[i];
- WideString input(ptr->input);
+ for (size_t i = 0; i < FX_ArraySize(kConsecutiveTextCases); ++i) {
+ const ConsecutiveTextCase& testcase = kConsecutiveTextCases[i];
+ WideString input(testcase.input);
int actual_count =
- CBC_PDF417HighLevelEncoder::DetermineConsecutiveTextCount(input,
- ptr->offset);
- EXPECT_EQ(ptr->expected_count, actual_count) << " for case number " << i;
+ CBC_PDF417HighLevelEncoder::DetermineConsecutiveTextCount(
+ input, testcase.offset);
+ EXPECT_EQ(testcase.expected_count, actual_count)
+ << " for case number " << i;
}
}