// Copyright 2017 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/oned/BC_OnedCodaBarWriter.h"

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

namespace {

// 3 wide and 4 narrow modules per delimiter. One space between them.
constexpr int kModulesForDelimiters = (3 * 2 + 4) * 2 + 1;

// 2 wide and 5 narrow modules per number, '_' or '$'. 1 space between chars.
constexpr int kModulesPerNumber = 2 * 2 + 5 + 1;

// 3 wide and 4 narrow modules per number, '_' or '$'. 1 space between chars.
constexpr int kModulesPerPunctuation = 3 * 2 + 4 + 1;

TEST(OnedCodaBarWriterTest, Encode) {
  CBC_OnedCodaBarWriter writer;
  int32_t width;
  int32_t height;

  uint8_t* encoded = writer.Encode("", BCFORMAT_CODABAR, width, height);
  EXPECT_EQ(1, height);
  EXPECT_EQ(kModulesForDelimiters, width);
  const char* expected =
      "# ##  #  # "  // A Start
      "#  #  # ##";  // B End
  for (size_t i = 0; i < strlen(expected); i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);

  encoded = writer.Encode("123", BCFORMAT_CODABAR, width, height);
  EXPECT_EQ(1, height);
  EXPECT_EQ(kModulesForDelimiters + 3 * kModulesPerNumber, width);
  expected =
      "# ##  #  # "  // A Start
      "# # ##  # "   // 1
      "# #  # ## "   // 2
      "##  # # # "   // 3
      "#  #  # ##";  // B End
  for (size_t i = 0; i < strlen(expected); i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);

  encoded = writer.Encode("-$./:+", BCFORMAT_CODABAR, width, height);
  EXPECT_EQ(1, height);
  EXPECT_EQ(kModulesForDelimiters + 2 * kModulesPerNumber +
                4 * kModulesPerPunctuation,
            width);
  expected =
      "# ##  #  # "  // A Start
      "# #  ## # "   // -
      "# ##  # # "   // $
      "## ## ## # "  // .
      "## ## # ## "  // /
      "## # ## ## "  // :
      "# ## ## ## "  // +
      "#  #  # ##";  // B End
  for (size_t i = 0; i < strlen(expected); i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);

  encoded = writer.Encode("456.987987987/001", BCFORMAT_CODABAR, width, height);
  EXPECT_EQ(1, height);
  EXPECT_EQ(kModulesForDelimiters + 15 * kModulesPerNumber +
                2 * kModulesPerPunctuation,
            width);
  expected =
      "# ##  #  # "  // A Start
      "# ## #  # "   // 4
      "## # #  # "   // 5
      "#  # # ## "   // 6
      "## ## ## # "  // .
      "## #  # # "   // 9
      "#  ## # # "   // 8
      "#  # ## # "   // 7
      "## #  # # "   // 9
      "#  ## # # "   // 8
      "#  # ## # "   // 7
      "## #  # # "   // 9
      "#  ## # # "   // 8
      "#  # ## # "   // 7
      "## ## # ## "  // /
      "# # #  ## "   // 0
      "# # #  ## "   // 0
      "# # ##  # "   // 1
      "#  #  # ##";  // B End
  for (size_t i = 0; i < strlen(expected); i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);
}

TEST(OnedCodaBarWriterTest, SetDelimiters) {
  CBC_OnedCodaBarWriter writer;
  int32_t width;
  int32_t height;

  EXPECT_TRUE(writer.SetStartChar('A'));
  EXPECT_TRUE(writer.SetStartChar('B'));
  EXPECT_TRUE(writer.SetStartChar('C'));
  EXPECT_TRUE(writer.SetStartChar('D'));
  EXPECT_TRUE(writer.SetStartChar('E'));
  EXPECT_TRUE(writer.SetStartChar('N'));
  EXPECT_TRUE(writer.SetStartChar('T'));
  EXPECT_TRUE(writer.SetStartChar('*'));
  EXPECT_FALSE(writer.SetStartChar('V'));
  EXPECT_FALSE(writer.SetStartChar('0'));
  EXPECT_FALSE(writer.SetStartChar('\0'));
  EXPECT_FALSE(writer.SetStartChar('@'));

  EXPECT_TRUE(writer.SetEndChar('A'));
  EXPECT_TRUE(writer.SetEndChar('B'));
  EXPECT_TRUE(writer.SetEndChar('C'));
  EXPECT_TRUE(writer.SetEndChar('D'));
  EXPECT_TRUE(writer.SetEndChar('E'));
  EXPECT_TRUE(writer.SetEndChar('N'));
  EXPECT_TRUE(writer.SetEndChar('T'));
  EXPECT_TRUE(writer.SetEndChar('*'));
  EXPECT_FALSE(writer.SetEndChar('V'));
  EXPECT_FALSE(writer.SetEndChar('0'));
  EXPECT_FALSE(writer.SetEndChar('\0'));
  EXPECT_FALSE(writer.SetEndChar('@'));

  writer.SetStartChar('N');
  writer.SetEndChar('*');

  uint8_t* encoded = writer.Encode("987", BCFORMAT_CODABAR, width, height);
  EXPECT_EQ(1, height);
  EXPECT_EQ(kModulesForDelimiters + 3 * kModulesPerNumber, width);
  const char* expected =
      "#  #  # ## "  // N (same as B) Start
      "## #  # # "   // 9
      "#  ## # # "   // 8
      "#  # ## # "   // 7
      "# #  #  ##";  // * (same as C) End
  for (size_t i = 0; i < strlen(expected); i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);
}

}  // namespace
