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

#include "fxbarcode/oned/BC_OnedCode39Writer.h"

#include <string.h>

#include "core/fxcrt/fx_memory.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

// 3 wide and 6 narrow modules per char. 1 space between chars.
constexpr int MODULES_PER_CHAR = 3 * 3 + 6 + 1;

// '*' is added as the first and last char.
const int DELIMITER_CHARS = 2;

// Last char may serve as checksum.
const int CHECKSUM_CHARS = 1;

TEST(OnedCode39WriterTest, SetWideNarrowRatio) {
  // Code 39 barcodes encode strings of any size into modules in a
  // unidimensional disposition.
  // Each module is either: a narrow bar, a narrow space, a wide
  // bar, or a wide space. Accepted wide-to-narrow ratios are between 2 and 3.
  // This writer in particular only takes integer ratios, so it's either 2 or 3.
  CBC_OnedCode39Writer writer;
  EXPECT_FALSE(writer.SetWideNarrowRatio(0));
  EXPECT_FALSE(writer.SetWideNarrowRatio(1));
  EXPECT_TRUE(writer.SetWideNarrowRatio(2));
  EXPECT_TRUE(writer.SetWideNarrowRatio(3));
  EXPECT_FALSE(writer.SetWideNarrowRatio(4));
  EXPECT_FALSE(writer.SetWideNarrowRatio(100));

  writer.SetWideNarrowRatio(3);

  int32_t width;
  uint8_t* encoded;
  const char* expected;

  encoded = writer.Encode("PDFIUM", width);
  expected =
      "#   # ### ### # "  // * Start
      "# ### ### #   # "  // P
      "# # ###   # ### "  // D
      "# ### ###   # # "  // F
      "# ### #   ### # "  // I
      "###   # # # ### "  // U
      "### ### # #   # "  // M
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);

  writer.SetWideNarrowRatio(2);

  encoded = writer.Encode("PDFIUM", width);
  expected =
      "#  # ## ## # "  // * Start
      "# ## ## #  # "  // P
      "# # ##  # ## "  // D
      "# ## ##  # # "  // F
      "# ## #  ## # "  // I
      "##  # # # ## "  // U
      "## ## # #  # "  // M
      "#  # ## ## #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);
}

TEST(OnedCode39WriterTest, Encode) {
  CBC_OnedCode39Writer writer;
  int32_t width;
  uint8_t* encoded;
  const char* expected;

  encoded = writer.Encode("", width);
  EXPECT_EQ((0 + DELIMITER_CHARS) * MODULES_PER_CHAR - 1, width);
  expected =
      "#   # ### ### # "  // * Start
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);

  encoded = writer.Encode("123", width);
  EXPECT_EQ((3 + DELIMITER_CHARS) * MODULES_PER_CHAR - 1, width);
  expected =
      "#   # ### ### # "  // * Start
      "### #   # # ### "  // 1
      "# ###   # # ### "  // 2
      "### ###   # # # "  // 3
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);

  encoded = writer.Encode("PDFIUM", width);
  EXPECT_EQ((6 + DELIMITER_CHARS) * MODULES_PER_CHAR - 1, width);
  expected =
      "#   # ### ### # "  // * Start
      "# ### ### #   # "  // P
      "# # ###   # ### "  // D
      "# ### ###   # # "  // F
      "# ### #   ### # "  // I
      "###   # # # ### "  // U
      "### ### # #   # "  // M
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);

  encoded = writer.Encode("A -$%./+Z", width);
  EXPECT_EQ((9 + DELIMITER_CHARS) * MODULES_PER_CHAR - 1, width);
  expected =
      "#   # ### ### # "  // * Start
      "### # #   # ### "  // A
      "#   ### # ### # "  // Space
      "#   # # ### ### "  // -
      "#   #   #   # # "  // $
      "# #   #   #   # "  // %
      "###   # # ### # "  // .
      "#   #   # #   # "  // /
      "#   # #   #   # "  // +
      "#   ### ### # # "  // Z
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);
}

TEST(OnedCode39WriterTest, Checksum) {
  CBC_OnedCode39Writer writer;
  int32_t width;
  uint8_t* encoded;
  const char* expected;

  writer.SetCalcChecksum(true);

  encoded = writer.Encode("123", width);
  EXPECT_EQ((3 + CHECKSUM_CHARS + DELIMITER_CHARS) * MODULES_PER_CHAR - 1,
            width);
  expected =
      "#   # ### ### # "  // * Start
      "### #   # # ### "  // 1 (1)
      "# ###   # # ### "  // 2 (2)
      "### ###   # # # "  // 3 (3)
      "# ###   ### # # "  // 6 (6 = (1 + 2 + 3) % 43)
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);

  encoded = writer.Encode("PDFIUM", width);
  EXPECT_EQ((6 + CHECKSUM_CHARS + DELIMITER_CHARS) * MODULES_PER_CHAR - 1,
            width);
  expected =
      "#   # ### ### # "  // * Start
      "# ### ### #   # "  // P (25)
      "# # ###   # ### "  // D (13)
      "# ### ###   # # "  // F (15)
      "# ### #   ### # "  // I (18)
      "###   # # # ### "  // U (30)
      "### ### # #   # "  // M (22)
      "###   # # ### # "  // . (37 = (25 + 13 + 15 + 18 + 30 + 22) % 43)
      "#   # ### ### #";  // * End
  for (size_t i = 0; i < strlen(expected); i++)
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  FX_Free(encoded);
}

}  // namespace
