| // Copyright 2018 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/datamatrix/BC_DataMatrixWriter.h" |
| |
| #include <vector> |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/base/stl_util.h" |
| |
| class CBC_DataMatrixWriterTest : public testing::Test { |
| public: |
| CBC_DataMatrixWriterTest() = default; |
| ~CBC_DataMatrixWriterTest() override = default; |
| |
| // testing::Test: |
| void SetUp() override { BC_Library_Init(); } |
| void TearDown() override { BC_Library_Destroy(); } |
| }; |
| |
| TEST_F(CBC_DataMatrixWriterTest, Encode) { |
| CBC_DataMatrixWriter writer; |
| int32_t width = -1; |
| int32_t height = -1; |
| |
| { |
| static constexpr int kExpectedDimension = 10; |
| // clang-format off |
| static constexpr uint8_t kExpectedData[] = { |
| 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, |
| 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, |
| 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, |
| 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, |
| 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, |
| 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, |
| 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, |
| 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, |
| 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 |
| }; |
| // clang-format on |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(L"", &width, &height); |
| ASSERT_EQ(pdfium::size(kExpectedData), data.size()); |
| ASSERT_EQ(kExpectedDimension, width); |
| ASSERT_EQ(kExpectedDimension, height); |
| for (size_t i = 0; i < pdfium::size(kExpectedData); ++i) |
| EXPECT_EQ(kExpectedData[i], data[i]) << i; |
| } |
| { |
| static constexpr int kExpectedDimension = 14; |
| // clang-format off |
| static constexpr uint8_t kExpectedData[] = { |
| 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, |
| 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, |
| 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, |
| 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, |
| 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, |
| 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, |
| 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, |
| 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, |
| 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, |
| 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, |
| 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, |
| 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, |
| 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 |
| }; |
| // clang-format on |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(L"helloworld", &width, &height); |
| ASSERT_EQ(pdfium::size(kExpectedData), data.size()); |
| ASSERT_EQ(kExpectedDimension, width); |
| ASSERT_EQ(kExpectedDimension, height); |
| for (size_t i = 0; i < pdfium::size(kExpectedData); ++i) |
| EXPECT_EQ(kExpectedData[i], data[i]) << i; |
| } |
| { |
| static constexpr int kExpectedDimension = 10; |
| // clang-format off |
| static constexpr uint8_t kExpectedData[] = { |
| 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, |
| 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, |
| 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, |
| 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, |
| 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, |
| 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, |
| 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, |
| 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, |
| 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 |
| }; |
| // clang-format on |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(L"12345", &width, &height); |
| ASSERT_EQ(pdfium::size(kExpectedData), data.size()); |
| ASSERT_EQ(kExpectedDimension, width); |
| ASSERT_EQ(kExpectedDimension, height); |
| for (size_t i = 0; i < pdfium::size(kExpectedData); ++i) |
| EXPECT_EQ(kExpectedData[i], data[i]) << i; |
| } |
| { |
| static constexpr int kExpectedDimension = 18; |
| // clang-format off |
| static constexpr uint8_t kExpectedData[] = { |
| 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, |
| 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, |
| 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, |
| 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, |
| 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, |
| 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, |
| 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, |
| 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, |
| 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, |
| 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, |
| 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, |
| 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, |
| 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, |
| 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, |
| 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, |
| 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, |
| 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 |
| }; |
| // clang-format on |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(L"abcdefghijklmnopqrst", &width, &height); |
| ASSERT_EQ(pdfium::size(kExpectedData), data.size()); |
| ASSERT_EQ(kExpectedDimension, width); |
| ASSERT_EQ(kExpectedDimension, height); |
| for (size_t i = 0; i < pdfium::size(kExpectedData); ++i) |
| EXPECT_EQ(kExpectedData[i], data[i]) << i; |
| } |
| { |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(L"hello world", &width, &height); |
| ASSERT_TRUE(data.empty()); |
| } |
| } |
| |
| TEST_F(CBC_DataMatrixWriterTest, EncodeLimitAlphaNumeric) { |
| CBC_DataMatrixWriter writer; |
| int32_t width = -1; |
| int32_t height = -1; |
| |
| static constexpr int kMaxInputLength = 2335; // Per spec. |
| WideString input; |
| for (size_t i = 0; i < kMaxInputLength; ++i) |
| input.InsertAtBack(L'a'); |
| |
| { |
| static constexpr int kExpectedDimension = 144; |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(input.c_str(), &width, &height); |
| EXPECT_EQ(20736u, data.size()); |
| EXPECT_EQ(kExpectedDimension, width); |
| EXPECT_EQ(kExpectedDimension, height); |
| } |
| |
| // Go over the limit. |
| input.InsertAtBack(L'a'); |
| { |
| width = -1; |
| height = -1; |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(input.c_str(), &width, &height); |
| EXPECT_EQ(0u, data.size()); |
| EXPECT_EQ(-1, width); |
| EXPECT_EQ(-1, height); |
| } |
| } |
| |
| TEST_F(CBC_DataMatrixWriterTest, EncodeLimitNumbers) { |
| CBC_DataMatrixWriter writer; |
| int32_t width = -1; |
| int32_t height = -1; |
| |
| static constexpr int kMaxInputLength = 3116; // Per spec. |
| WideString input; |
| for (size_t i = 0; i < kMaxInputLength; ++i) |
| input.InsertAtBack(L'1'); |
| |
| { |
| static constexpr int kExpectedDimension = 144; |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(input.c_str(), &width, &height); |
| EXPECT_EQ(20736u, data.size()); |
| EXPECT_EQ(kExpectedDimension, width); |
| EXPECT_EQ(kExpectedDimension, height); |
| } |
| |
| // Go over the limit. |
| input.InsertAtBack(L'1'); |
| { |
| width = -1; |
| height = -1; |
| std::vector<uint8_t, FxAllocAllocator<uint8_t>> data = |
| writer.Encode(input.c_str(), &width, &height); |
| EXPECT_EQ(0u, data.size()); |
| EXPECT_EQ(-1, width); |
| EXPECT_EQ(-1, height); |
| } |
| } |