1 // Copyright 2017 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "fxbarcode/cfx_barcode.h"
6 
7 #include <memory>
8 #include <string>
9 #include <utility>
10 
11 #include "core/fxcrt/fx_coordinates.h"
12 #include "core/fxcrt/fx_string.h"
13 #include "core/fxge/cfx_defaultrenderdevice.h"
14 #include "core/fxge/cfx_renderdevice.h"
15 #include "core/fxge/dib/cfx_dibitmap.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "testing/utils/bitmap_saver.h"
18 #include "testing/utils/hash.h"
19 #include "third_party/base/ptr_util.h"
20 
21 class BarcodeTest : public testing::Test {
22  public:
SetUp()23   void SetUp() override {
24     BC_Library_Init();
25 
26     auto device = pdfium::MakeUnique<CFX_DefaultRenderDevice>();
27     auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
28     if (bitmap->Create(640, 480, FXDIB_Rgb32))
29       bitmap_ = bitmap;
30     ASSERT_TRUE(bitmap_);
31     ASSERT_TRUE(device->Attach(bitmap_, false, nullptr, false));
32     device_ = std::move(device);
33   }
34 
TearDown()35   void TearDown() override {
36     bitmap_.Reset();
37     device_.reset();
38     barcode_.reset();
39     BC_Library_Destroy();
40   }
41 
barcode() const42   CFX_Barcode* barcode() const { return barcode_.get(); }
43 
Create(BC_TYPE type)44   void Create(BC_TYPE type) {
45     barcode_ = CFX_Barcode::Create(type);
46     barcode_->SetHeight(298);
47     barcode_->SetWidth(418);
48   }
49 
RenderDevice()50   bool RenderDevice() {
51     return barcode_->RenderDevice(device_.get(), &matrix_);
52   }
53 
BitmapChecksum()54   std::string BitmapChecksum() {
55     return GenerateMD5Base16(bitmap_->GetBuffer(),
56                              bitmap_->GetPitch() * bitmap_->GetHeight());
57   }
58 
59   // Manually insert calls to this as needed for debugging.
SaveBitmap(const std::string & filename)60   void SaveBitmap(const std::string& filename) {
61     BitmapSaver::WriteBitmapToPng(bitmap_.Get(), filename);
62   }
63 
64  protected:
65   CFX_Matrix matrix_;
66   std::unique_ptr<CFX_Barcode> barcode_;
67   std::unique_ptr<CFX_RenderDevice> device_;
68   RetainPtr<CFX_DIBitmap> bitmap_;
69 };
70 
71 // https://crbug.com/pdfium/738
72 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
73 #define MAYBE_Code39 DISABLED_Code39
74 #else
75 #define MAYBE_Code39 Code39
76 #endif
TEST_F(BarcodeTest,MAYBE_Code39)77 TEST_F(BarcodeTest, MAYBE_Code39) {
78   Create(BC_CODE39);
79   EXPECT_TRUE(barcode()->Encode(L"CLAMS"));
80   RenderDevice();
81   EXPECT_EQ("cd4cd3f36da38ff58d9f621827018903", BitmapChecksum());
82 }
83 
84 // https://crbug.com/pdfium/738
85 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
86 #define MAYBE_CodaBar DISABLED_CodaBar
87 #else
88 #define MAYBE_CodaBar CodaBar
89 #endif
TEST_F(BarcodeTest,MAYBE_CodaBar)90 TEST_F(BarcodeTest, MAYBE_CodaBar) {
91   Create(BC_CODABAR);
92   EXPECT_TRUE(barcode()->Encode(L"$123-456"));
93   RenderDevice();
94   EXPECT_EQ("5fad4fc19f099001a0fe83c89430c977", BitmapChecksum());
95 }
96 
TEST_F(BarcodeTest,DISABLED_CodaBarLetters)97 TEST_F(BarcodeTest, DISABLED_CodaBarLetters) {
98   Create(BC_CODABAR);
99   EXPECT_FALSE(barcode()->Encode(L"clams"));
100 }
101 
102 // https://crbug.com/pdfium/738
103 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
104 #define MAYBE_Code128 DISABLED_Code128
105 #else
106 #define MAYBE_Code128 Code128
107 #endif
TEST_F(BarcodeTest,MAYBE_Code128)108 TEST_F(BarcodeTest, MAYBE_Code128) {
109   Create(BC_CODE128);
110   EXPECT_TRUE(barcode()->Encode(L"Clams"));
111   RenderDevice();
112   EXPECT_EQ("6351f0f6e997050e4658bbb4777aef74", BitmapChecksum());
113 }
114 
115 // https://crbug.com/pdfium/738
116 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
117 #define MAYBE_Code128B DISABLED_Code128B
118 #else
119 #define MAYBE_Code128B Code128B
120 #endif
TEST_F(BarcodeTest,MAYBE_Code128B)121 TEST_F(BarcodeTest, MAYBE_Code128B) {
122   Create(BC_CODE128_B);
123   EXPECT_TRUE(barcode()->Encode(L"Clams"));
124   RenderDevice();
125   EXPECT_EQ("6351f0f6e997050e4658bbb4777aef74", BitmapChecksum());
126 }
127 
128 // https://crbug.com/pdfium/738
129 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
130 #define MAYBE_Code128C DISABLED_Code128C
131 #else
132 #define MAYBE_Code128C Code128C
133 #endif
TEST_F(BarcodeTest,MAYBE_Code128C)134 TEST_F(BarcodeTest, MAYBE_Code128C) {
135   Create(BC_CODE128_C);
136   EXPECT_TRUE(barcode()->Encode(L"123456"));
137   RenderDevice();
138   EXPECT_EQ("fba730a807ba6363f9bd2bc7f8c56d1f", BitmapChecksum());
139 }
140 
TEST_F(BarcodeTest,DISABLED_Code128CLetters)141 TEST_F(BarcodeTest, DISABLED_Code128CLetters) {
142   Create(BC_CODE128_C);
143   EXPECT_FALSE(barcode()->Encode(L"clams"));
144 }
145 
146 // https://crbug.com/pdfium/738
147 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
148 #define MAYBE_Ean8 DISABLED_Ean8
149 #else
150 #define MAYBE_Ean8 Ean8
151 #endif
TEST_F(BarcodeTest,MAYBE_Ean8)152 TEST_F(BarcodeTest, MAYBE_Ean8) {
153   Create(BC_EAN8);
154   EXPECT_TRUE(barcode()->Encode(L"123456"));
155   RenderDevice();
156   EXPECT_EQ("aff88491ac46ca6217d780d185300cde", BitmapChecksum());
157 }
158 
TEST_F(BarcodeTest,DISABLED_Ean8Letters)159 TEST_F(BarcodeTest, DISABLED_Ean8Letters) {
160   Create(BC_EAN8);
161   EXPECT_FALSE(barcode()->Encode(L"clams"));
162 }
163 
164 // https://crbug.com/pdfium/738
165 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
166 #define MAYBE_UPCA DISABLED_UPCA
167 #else
168 #define MAYBE_UPCA UPCA
169 #endif
TEST_F(BarcodeTest,MAYBE_UPCA)170 TEST_F(BarcodeTest, MAYBE_UPCA) {
171   Create(BC_UPCA);
172   EXPECT_TRUE(barcode()->Encode(L"123456"));
173   RenderDevice();
174   EXPECT_EQ("fe26a5714cff7ffe3f9b02183efc435b", BitmapChecksum());
175 }
176 
TEST_F(BarcodeTest,DISABLED_UPCALetters)177 TEST_F(BarcodeTest, DISABLED_UPCALetters) {
178   Create(BC_UPCA);
179   EXPECT_FALSE(barcode()->Encode(L"clams"));
180 }
181 
182 // https://crbug.com/pdfium/738
183 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
184 #define MAYBE_Ean13 DISABLED_Ean13
185 #else
186 #define MAYBE_Ean13 Ean13
187 #endif
TEST_F(BarcodeTest,MAYBE_Ean13)188 TEST_F(BarcodeTest, MAYBE_Ean13) {
189   Create(BC_EAN13);
190   EXPECT_TRUE(barcode()->Encode(L"123456"));
191   RenderDevice();
192   EXPECT_EQ("72d2190b98d635c32834bf67552e561e", BitmapChecksum());
193 }
194 
TEST_F(BarcodeTest,DISABLED_Ean13Letters)195 TEST_F(BarcodeTest, DISABLED_Ean13Letters) {
196   Create(BC_EAN13);
197   EXPECT_FALSE(barcode()->Encode(L"clams"));
198 }
199 
200 // https://crbug.com/pdfium/738
201 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
202 #define MAYBE_Pdf417 DISABLED_Pdf417
203 #else
204 #define MAYBE_Pdf417 Pdf417
205 #endif
TEST_F(BarcodeTest,MAYBE_Pdf417)206 TEST_F(BarcodeTest, MAYBE_Pdf417) {
207   Create(BC_PDF417);
208   EXPECT_TRUE(barcode()->Encode(L"clams"));
209   RenderDevice();
210   EXPECT_EQ("191e35d11613901b7d5d51033689aa89", BitmapChecksum());
211 }
212 
213 // https://crbug.com/pdfium/738
214 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
215 #define MAYBE_DataMatrix DISABLED_DataMatrix
216 #else
217 #define MAYBE_DataMatrix DataMatrix
218 #endif
TEST_F(BarcodeTest,MAYBE_DataMatrix)219 TEST_F(BarcodeTest, MAYBE_DataMatrix) {
220   Create(BC_DATAMATRIX);
221   EXPECT_TRUE(barcode()->Encode(L"clams"));
222   RenderDevice();
223   EXPECT_EQ("5e5cd9a680b86fcd4ffd53ed36e3c980", BitmapChecksum());
224 }
225 
226 // https://crbug.com/pdfium/738
227 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
228 #define MAYBE_QrCode DISABLED_QrCode
229 #else
230 #define MAYBE_QrCode QrCode
231 #endif
TEST_F(BarcodeTest,MAYBE_QrCode)232 TEST_F(BarcodeTest, MAYBE_QrCode) {
233   Create(BC_QR_CODE);
234   EXPECT_TRUE(barcode()->Encode(L"clams"));
235   RenderDevice();
236   EXPECT_EQ("4751c6e0f67749fabe24f787128decee", BitmapChecksum());
237 }
238