|  | // 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_OnedCode39Writer.h" | 
|  |  | 
|  | #include <cstring> | 
|  |  | 
|  | #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; | 
|  | int32_t height; | 
|  | uint8_t* encoded; | 
|  | const char* expected; | 
|  |  | 
|  | encoded = writer.Encode("PDFIUM", BCFORMAT_CODE_39, width, height); | 
|  | 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", BCFORMAT_CODE_39, width, height); | 
|  | 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; | 
|  | int32_t height; | 
|  | uint8_t* encoded; | 
|  | const char* expected; | 
|  |  | 
|  | encoded = writer.Encode("", BCFORMAT_CODE_39, width, height); | 
|  | EXPECT_EQ(1, height); | 
|  | 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", BCFORMAT_CODE_39, width, height); | 
|  | EXPECT_EQ(1, height); | 
|  | 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", BCFORMAT_CODE_39, width, height); | 
|  | EXPECT_EQ(1, height); | 
|  | 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", BCFORMAT_CODE_39, width, height); | 
|  | EXPECT_EQ(1, height); | 
|  | 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; | 
|  | int32_t height; | 
|  | uint8_t* encoded; | 
|  | const char* expected; | 
|  |  | 
|  | writer.SetCalcChecksum(true); | 
|  |  | 
|  | encoded = writer.Encode("123", BCFORMAT_CODE_39, width, height); | 
|  | EXPECT_EQ(1, height); | 
|  | 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", BCFORMAT_CODE_39, width, height); | 
|  | EXPECT_EQ(1, height); | 
|  | 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 |