// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"

#include <vector>

#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/base/stl_util.h"

TEST(PDF417HighLevelEncoderTest, EncodeHighLevel) {
  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 < pdfium::size(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) {
  // TODO(tsepez): implement test cases.
}

TEST(PDF417HighLevelEncoderTest, EncodeBinary) {
  static constexpr struct EncodeBinaryCase {
    const char* input;
    int offset;
    int count;
    CBC_PDF417HighLevelEncoder::EncodingMode startmode;
    const wchar_t* expected;
    int expected_length;
  } 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 triggers text encoding compaction.
      {"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::EncodingMode::kText,
       L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},

      // Same result if initially in numeric compaction mode.
      {"xxxxxx", 0, 6, CBC_PDF417HighLevelEncoder::EncodingMode::kNumeric,
       L"\u039c\u00c9\u031f\u012a\u00d2\u02d0", 6},
  };

  for (size_t i = 0; i < pdfium::size(kEncodeBinaryCases); ++i) {
    const EncodeBinaryCase& testcase = kEncodeBinaryCases[i];
    std::vector<uint8_t> input_array;
    size_t input_length = strlen(testcase.input);
    input_array.resize(input_length);
    for (size_t j = 0; j < input_length; ++j) {
      input_array[j] = testcase.input[j];
    }
    WideString expected(testcase.expected, testcase.expected_length);
    WideString result;
    CBC_PDF417HighLevelEncoder::EncodeBinary(input_array, testcase.offset,
                                             testcase.count, testcase.startmode,
                                             &result);
    EXPECT_EQ(expected, result) << " for case number " << i;
  }
}

TEST(PDF417HighLevelEncoderTest, EncodeNumeric) {
  static constexpr struct EncodeNumericCase {
    const wchar_t* input;
    int offset;
    int count;
    const wchar_t* expected;
    int expected_length;
  } kEncodeNumericCases[] = {
      // Empty string encodes as empty string.
      {L"", 0, 0, L"", 0},

      // Single 0 should encode as 10 base-900 == a.
      {L"0", 0, 1, L"\x000a", 1},

      // 800 should encode as 1800 base-900 == 2,0.
      {L"800", 0, 3, L"\x0002\x0000", 2},

      // Test longer strings and sub-strings.
      {L"123456", 0, 6, L"\x0001\x015c\x0100", 3},
      {L"123456", 0, 5, L"\x007c\x02e9", 2},
      {L"123456", 1, 5, L"\x0089\x009c", 2},
      {L"123456", 2, 2, L"\x0086", 1},

      // Up to 44 characters encodes as 15 base-900 words.
      {L"00000000000000000000000000000000000000000000", 0, 44,
       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
       L"\x0090\x020b\x019b\x0064",
       15},

      // 45 characters should encode as same 15 words followed by one additional
      // word.
      {L"000000000000000000000000000000000000000000000", 0, 45,
       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
       L"\x0090\x020b\x019b\x0064\x000a",
       16},

      // 44 characters followed by 800 should encode as 15 words followed by
      // 1800 base-900 == 2,0.
      {L"00000000000000000000000000000000000000000000800", 0, 47,
       L"\x01b5\x006f\x02cc\x0084\x01bc\x0076\x00b3\x005c\x01f0\x034f\x01e6"
       L"\x0090\x020b\x019b\x0064\x0002\x0000",
       17},

      // Even longer input.
      {L"10000000000000000000000000000000000000000000000000", 0, 50,
       L"\x01e0\x02f0\x036d\x02ad\x029c\x01ea\x0011\x000b\x02d6\x023c\x0108"
       L"\x02bb\x0023\x02d2\x00c8\x0001\x00d3\x0064",
       18},
  };

  for (size_t i = 0; i < pdfium::size(kEncodeNumericCases); ++i) {
    const EncodeNumericCase& testcase = kEncodeNumericCases[i];
    WideString input(testcase.input);
    WideString expected(testcase.expected, testcase.expected_length);
    WideString result;
    CBC_PDF417HighLevelEncoder::EncodeNumeric(input, testcase.offset,
                                              testcase.count, &result);
    EXPECT_EQ(expected, result) << " for case number " << i;
  }
}

TEST(PDF417HighLevelEncoderTest, ConsecutiveDigitCount) {
  static constexpr struct ConsecutiveDigitCase {
    const wchar_t* input;
    int offset;
    int expected_count;
  } kConsecutiveDigitCases[] = {
      // Empty string contains 0 consecutive digits.
      {L"", 0, 0},

      // Single non-digit character contains 0 consecutive digits.
      {L"X", 0, 0},

      // Leading non-digit followed by digits contains 0 consecutive.
      {L"X123", 0, 0},

      // Single digit contains 1 consecutive digit.
      {L"1", 0, 1},

      // Single digit followe by non-digit contains 1 consecutive digit.
      {L"1Z", 0, 1},

      // Test longer strings.
      {L"123FOO45678", 0, 3},

      // Test subtring starting in digits field.
      {L"123FOO45678", 3, 0},

      // Test subtring starting in non-digits field.
      {L"123FOO45678", 3, 0},

      // Test substring starting in digits field following non-digit field.
      {L"123FOO45678", 6, 5},
  };

  for (size_t i = 0; i < pdfium::size(kConsecutiveDigitCases); ++i) {
    const ConsecutiveDigitCase& testcase = kConsecutiveDigitCases[i];
    WideString input(testcase.input);
    int actual_count =
        CBC_PDF417HighLevelEncoder::DetermineConsecutiveDigitCount(
            input, testcase.offset);
    EXPECT_EQ(testcase.expected_count, actual_count)
        << " for case number " << i;
  }
}

TEST(PDF417HighLevelEncoderTest, ConsecutiveTextCount) {
  static constexpr struct ConsecutiveTextCase {
    const wchar_t* input;
    int offset;
    int expected_count;
  } kConsecutiveTextCases[] = {
      // Empty string contains 0 consecutive text characters.
      {L"", 0, 0},

      // Single text character is 1 consecutive text characters.
      {L"X", 0, 1},

      // Trailing numbers count as text characters.
      {L"X123", 0, 4},

      // Leading numbers count as text characters.
      {L"123X", 0, 4},

      // Embedded lo-value binary characters terminate text runs.
      {L"ABC\x0001XXXX", 0, 3},

      // Embedded hi-value binary characters terminate text runs.
      {L"ABC\x0100XXXX", 0, 3},

      // Text run still found after indexing past lo-value character.
      {L"ABC\x0001XXXX", 4, 4},

      // Text run still found after indexing past hi-value character.
      {L"ABC\x0100XXXX", 4, 4},

      // Leading hi-value character results in 0 consecutive characters.
      {L"\x0100XXX", 0, 0},

      // Up to 12 numbers count as text.
      {L"123456789012", 0, 12},

      // 13 or more numbers are compresssed using numeric compression, not text.
      {L"1234567890123", 0, 0},

      // Leading Text character doesn't affect the 12 character case.
      {L"X123456789012", 0, 13},

      // Leading Text character doesn't affect the 13 character case.
      {L"X1234567890123", 0, 1},

      // Jumping between numbers and letters works properly.
      {L"XXX121XXX12345678901234", 0, 9},
  };

  for (size_t i = 0; i < pdfium::size(kConsecutiveTextCases); ++i) {
    const ConsecutiveTextCase& testcase = kConsecutiveTextCases[i];
    WideString input(testcase.input);
    int actual_count =
        CBC_PDF417HighLevelEncoder::DetermineConsecutiveTextCount(
            input, testcase.offset);
    EXPECT_EQ(testcase.expected_count, actual_count)
        << " for case number " << i;
  }
}

TEST(PDF417HighLevelEncoderTest, ConsecutiveBinaryCount) {
  // TODO(tsepez): implement test cases.
}
