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;
   }
 }