1 // Copyright 2017 The PDFium Authors
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
20 class BarcodeTest : public testing::Test {
21 public:
SetUp()22 void SetUp() override {
23 BC_Library_Init();
24
25 auto device = std::make_unique<CFX_DefaultRenderDevice>();
26 auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
27 if (bitmap->Create(640, 480, FXDIB_Format::kBgrx)) {
28 bitmap_ = bitmap;
29 }
30 ASSERT_TRUE(bitmap_);
31 ASSERT_TRUE(device->Attach(bitmap_));
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() { return barcode_->RenderDevice(device_.get(), matrix_); }
51
BitmapChecksum()52 std::string BitmapChecksum() {
53 return GenerateMD5Base16(bitmap_->GetBuffer());
54 }
55
56 // Manually insert calls to this as needed for debugging.
SaveBitmap(const std::string & filename)57 void SaveBitmap(const std::string& filename) {
58 BitmapSaver::WriteBitmapToPng(bitmap_.Get(), filename);
59 }
60
61 protected:
62 CFX_Matrix matrix_;
63 std::unique_ptr<CFX_Barcode> barcode_;
64 std::unique_ptr<CFX_RenderDevice> device_;
65 RetainPtr<CFX_DIBitmap> bitmap_;
66 };
67
68 // https://crbug.com/pdfium/738
69 #if defined(PDF_USE_SKIA)
70 #define MAYBE_Code39 DISABLED_Code39
71 #else
72 #define MAYBE_Code39 Code39
73 #endif
TEST_F(BarcodeTest,MAYBE_Code39)74 TEST_F(BarcodeTest, MAYBE_Code39) {
75 Create(BC_TYPE::kCode39);
76 EXPECT_TRUE(barcode()->Encode(L"CLAMS"));
77 RenderDevice();
78 EXPECT_EQ("cd4cd3f36da38ff58d9f621827018903", BitmapChecksum());
79 }
80
81 // https://crbug.com/pdfium/738
82 #if defined(PDF_USE_SKIA)
83 #define MAYBE_CodaBar DISABLED_CodaBar
84 #else
85 #define MAYBE_CodaBar CodaBar
86 #endif
TEST_F(BarcodeTest,MAYBE_CodaBar)87 TEST_F(BarcodeTest, MAYBE_CodaBar) {
88 Create(BC_TYPE::kCodabar);
89 EXPECT_TRUE(barcode()->Encode(L"$123-456"));
90 RenderDevice();
91 EXPECT_EQ("5fad4fc19f099001a0fe83c89430c977", BitmapChecksum());
92 }
93
TEST_F(BarcodeTest,CodaBarLetters)94 TEST_F(BarcodeTest, CodaBarLetters) {
95 Create(BC_TYPE::kCodabar);
96 EXPECT_FALSE(barcode()->Encode(L"clams"));
97 }
98
99 // https://crbug.com/pdfium/738
100 #if defined(PDF_USE_SKIA)
101 #define MAYBE_Code128 DISABLED_Code128
102 #else
103 #define MAYBE_Code128 Code128
104 #endif
TEST_F(BarcodeTest,MAYBE_Code128)105 TEST_F(BarcodeTest, MAYBE_Code128) {
106 Create(BC_TYPE::kCode128);
107 EXPECT_TRUE(barcode()->Encode(L"Clams"));
108 RenderDevice();
109 EXPECT_EQ("6351f0f6e997050e4658bbb4777aef74", BitmapChecksum());
110 }
111
112 // https://crbug.com/pdfium/738
113 #if defined(PDF_USE_SKIA)
114 #define MAYBE_Code128B DISABLED_Code128B
115 #else
116 #define MAYBE_Code128B Code128B
117 #endif
TEST_F(BarcodeTest,MAYBE_Code128B)118 TEST_F(BarcodeTest, MAYBE_Code128B) {
119 Create(BC_TYPE::kCode128B);
120 EXPECT_TRUE(barcode()->Encode(L"Clams"));
121 RenderDevice();
122 EXPECT_EQ("6351f0f6e997050e4658bbb4777aef74", BitmapChecksum());
123 }
124
125 // https://crbug.com/pdfium/738
126 #if defined(PDF_USE_SKIA)
127 #define MAYBE_Code128C DISABLED_Code128C
128 #else
129 #define MAYBE_Code128C Code128C
130 #endif
TEST_F(BarcodeTest,MAYBE_Code128C)131 TEST_F(BarcodeTest, MAYBE_Code128C) {
132 Create(BC_TYPE::kCode128C);
133 EXPECT_TRUE(barcode()->Encode(L"123456"));
134 RenderDevice();
135 EXPECT_EQ("fba730a807ba6363f9bd2bc7f8c56d1f", BitmapChecksum());
136 }
137
138 // https://crbug.com/pdfium/738
139 #if defined(PDF_USE_SKIA)
140 #define MAYBE_Code128CLetters DISABLED_Code128CLetters
141 #else
142 #define MAYBE_Code128CLetters Code128CLetters
143 #endif
TEST_F(BarcodeTest,MAYBE_Code128CLetters)144 TEST_F(BarcodeTest, MAYBE_Code128CLetters) {
145 Create(BC_TYPE::kCode128C);
146 EXPECT_TRUE(barcode()->Encode(L"clams"));
147 RenderDevice();
148 EXPECT_EQ("6284ec8503d5a948c9518108da33cdd3", BitmapChecksum());
149 }
150
151 // https://crbug.com/pdfium/738
152 #if defined(PDF_USE_SKIA)
153 #define MAYBE_Ean8 DISABLED_Ean8
154 #else
155 #define MAYBE_Ean8 Ean8
156 #endif
TEST_F(BarcodeTest,MAYBE_Ean8)157 TEST_F(BarcodeTest, MAYBE_Ean8) {
158 Create(BC_TYPE::kEAN8);
159 EXPECT_TRUE(barcode()->Encode(L"123456"));
160 RenderDevice();
161 EXPECT_EQ("aff88491ac46ca6217d780d185300cde", BitmapChecksum());
162 }
163
TEST_F(BarcodeTest,Ean8Letters)164 TEST_F(BarcodeTest, Ean8Letters) {
165 Create(BC_TYPE::kEAN8);
166 EXPECT_FALSE(barcode()->Encode(L"clams"));
167 }
168
169 // https://crbug.com/pdfium/738
170 #if defined(PDF_USE_SKIA)
171 #define MAYBE_UPCA DISABLED_UPCA
172 #else
173 #define MAYBE_UPCA UPCA
174 #endif
TEST_F(BarcodeTest,MAYBE_UPCA)175 TEST_F(BarcodeTest, MAYBE_UPCA) {
176 Create(BC_TYPE::kUPCA);
177 EXPECT_TRUE(barcode()->Encode(L"123456"));
178 RenderDevice();
179 EXPECT_EQ("fe26a5714cff7ffe3f9b02183efc435b", BitmapChecksum());
180 }
181
TEST_F(BarcodeTest,UPCALetters)182 TEST_F(BarcodeTest, UPCALetters) {
183 Create(BC_TYPE::kUPCA);
184 EXPECT_FALSE(barcode()->Encode(L"clams"));
185 }
186
187 // https://crbug.com/pdfium/738
188 #if defined(PDF_USE_SKIA)
189 #define MAYBE_Ean13 DISABLED_Ean13
190 #else
191 #define MAYBE_Ean13 Ean13
192 #endif
TEST_F(BarcodeTest,MAYBE_Ean13)193 TEST_F(BarcodeTest, MAYBE_Ean13) {
194 Create(BC_TYPE::kEAN13);
195 EXPECT_TRUE(barcode()->Encode(L"123456"));
196 RenderDevice();
197 EXPECT_EQ("72d2190b98d635c32834bf67552e561e", BitmapChecksum());
198 }
199
TEST_F(BarcodeTest,Ean13Letters)200 TEST_F(BarcodeTest, Ean13Letters) {
201 Create(BC_TYPE::kEAN13);
202 EXPECT_FALSE(barcode()->Encode(L"clams"));
203 }
204
205 // https://crbug.com/pdfium/738
206 #if defined(PDF_USE_SKIA)
207 #define MAYBE_Pdf417 DISABLED_Pdf417
208 #else
209 #define MAYBE_Pdf417 Pdf417
210 #endif
TEST_F(BarcodeTest,MAYBE_Pdf417)211 TEST_F(BarcodeTest, MAYBE_Pdf417) {
212 Create(BC_TYPE::kPDF417);
213 EXPECT_TRUE(barcode()->Encode(L"clams"));
214 RenderDevice();
215 EXPECT_EQ("191e35d11613901b7d5d51033689aa89", BitmapChecksum());
216 }
217
218 // https://crbug.com/pdfium/738
219 #if defined(PDF_USE_SKIA)
220 #define MAYBE_DataMatrix DISABLED_DataMatrix
221 #else
222 #define MAYBE_DataMatrix DataMatrix
223 #endif
TEST_F(BarcodeTest,MAYBE_DataMatrix)224 TEST_F(BarcodeTest, MAYBE_DataMatrix) {
225 Create(BC_TYPE::kDataMatrix);
226 EXPECT_TRUE(barcode()->Encode(L"clams"));
227 RenderDevice();
228 EXPECT_EQ("5e5cd9a680b86fcd4ffd53ed36e3c980", BitmapChecksum());
229 }
230
231 // https://crbug.com/pdfium/738
232 #if defined(PDF_USE_SKIA)
233 #define MAYBE_QrCode DISABLED_QrCode
234 #else
235 #define MAYBE_QrCode QrCode
236 #endif
TEST_F(BarcodeTest,MAYBE_QrCode)237 TEST_F(BarcodeTest, MAYBE_QrCode) {
238 Create(BC_TYPE::kQRCode);
239 EXPECT_TRUE(barcode()->Encode(L"clams"));
240 RenderDevice();
241 EXPECT_EQ("4751c6e0f67749fabe24f787128decee", BitmapChecksum());
242 }
243