// 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_OnedEAN8Writer.h"

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

namespace {

TEST(OnedEAN8WriterTest, Encode) {
  CBC_OnedEAN8Writer writer;
  writer.InitEANWriter();
  int32_t width;
  uint8_t* encoded;
  const char* expected;

  // EAN-8 barcodes encode 8-digit numbers into 67 modules in a unidimensional
  // disposition.
  encoded = writer.Encode("", BC_TYPE::kEAN8, width);
  EXPECT_FALSE(encoded);
  FX_Free(encoded);

  encoded = writer.Encode("123", BC_TYPE::kEAN8, width);
  EXPECT_FALSE(encoded);
  FX_Free(encoded);

  encoded = writer.Encode("1234567", BC_TYPE::kEAN8, width);
  EXPECT_FALSE(encoded);
  FX_Free(encoded);

  encoded = writer.Encode("123456789", BC_TYPE::kEAN8, width);
  EXPECT_FALSE(encoded);
  FX_Free(encoded);

  encoded = writer.Encode("12345670", BC_TYPE::kEAN8, width);
  EXPECT_TRUE(encoded);
  EXPECT_EQ(67, width);

  expected =
      "# #"      // Start
      "  ##  #"  // 1 L
      "  #  ##"  // 2 L
      " #### #"  // 3 L
      " #   ##"  // 4 L
      " # # "    // Middle
      "#  ### "  // 5 R
      "# #    "  // 6 R
      "#   #  "  // 7 R
      "###  # "  // 0 R
      "# #";     // End
  for (int i = 0; i < 67; i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);

  encoded = writer.Encode("99441104", BC_TYPE::kEAN8, width);
  EXPECT_TRUE(encoded);
  EXPECT_EQ(67, width);

  expected =
      "# #"      // Start
      "   # ##"  // 9 L
      "   # ##"  // 9 L
      " #   ##"  // 4 L
      " #   ##"  // 4 L
      " # # "    // Middle
      "##  ## "  // 1 R
      "##  ## "  // 1 R
      "###  # "  // 0 R
      "# ###  "  // 4 R
      "# #";     // End
  for (int i = 0; i < 67; i++) {
    EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
  }
  FX_Free(encoded);
}

TEST(OnedEAN8WriterTest, Checksum) {
  CBC_OnedEAN8Writer writer;
  writer.InitEANWriter();
  EXPECT_EQ(0, writer.CalcChecksum(""));
  EXPECT_EQ(6, writer.CalcChecksum("123"));
  EXPECT_EQ(0, writer.CalcChecksum("1234567"));
  EXPECT_EQ(4, writer.CalcChecksum("9944110"));
}

}  // namespace
