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/oned/BC_OnedCodaBarWriter.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7 
8 namespace {
9 
10 // 3 wide and 4 narrow modules per delimiter. One space between them.
11 const int kModulesForDelimiters = (3 * 2 + 4 * 1) * 2 + 1;
12 
13 // 2 wide and 5 narrow modules per number, '_' or '$'. 1 space between chars.
14 const int kModulesPerNumber = 2 * 2 + 5 * 1 + 1;
15 
16 // 3 wide and 4 narrow modules per number, '_' or '$'. 1 space between chars.
17 const int kModulesPerPunctuation = 3 * 2 + 4 * 1 + 1;
18 
TEST(OnedCodaBarWriterTest,Encode)19 TEST(OnedCodaBarWriterTest, Encode) {
20   CBC_OnedCodaBarWriter writer;
21   int32_t width;
22   int32_t height;
23 
24   uint8_t* encoded = writer.Encode("", BCFORMAT_CODABAR, width, height);
25   EXPECT_EQ(1, height);
26   EXPECT_EQ(kModulesForDelimiters, width);
27   const char* expected =
28       "# ##  #  # "  // A Start
29       "#  #  # ##";  // B End
30   for (size_t i = 0; i < strlen(expected); i++) {
31     EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
32   }
33   FX_Free(encoded);
34 
35   encoded = writer.Encode("123", BCFORMAT_CODABAR, width, height);
36   EXPECT_EQ(1, height);
37   EXPECT_EQ(kModulesForDelimiters + 3 * kModulesPerNumber, width);
38   expected =
39       "# ##  #  # "  // A Start
40       "# # ##  # "   // 1
41       "# #  # ## "   // 2
42       "##  # # # "   // 3
43       "#  #  # ##";  // B End
44   for (size_t i = 0; i < strlen(expected); i++) {
45     EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
46   }
47   FX_Free(encoded);
48 
49   encoded = writer.Encode("-$./:+", BCFORMAT_CODABAR, width, height);
50   EXPECT_EQ(1, height);
51   EXPECT_EQ(kModulesForDelimiters + 2 * kModulesPerNumber +
52                 4 * kModulesPerPunctuation,
53             width);
54   expected =
55       "# ##  #  # "  // A Start
56       "# #  ## # "   // -
57       "# ##  # # "   // $
58       "## ## ## # "  // .
59       "## ## # ## "  // /
60       "## # ## ## "  // :
61       "# ## ## ## "  // +
62       "#  #  # ##";  // B End
63   for (size_t i = 0; i < strlen(expected); i++) {
64     EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
65   }
66   FX_Free(encoded);
67 
68   encoded = writer.Encode("456.987987987/001", BCFORMAT_CODABAR, width, height);
69   EXPECT_EQ(1, height);
70   EXPECT_EQ(kModulesForDelimiters + 15 * kModulesPerNumber +
71                 2 * kModulesPerPunctuation,
72             width);
73   expected =
74       "# ##  #  # "  // A Start
75       "# ## #  # "   // 4
76       "## # #  # "   // 5
77       "#  # # ## "   // 6
78       "## ## ## # "  // .
79       "## #  # # "   // 9
80       "#  ## # # "   // 8
81       "#  # ## # "   // 7
82       "## #  # # "   // 9
83       "#  ## # # "   // 8
84       "#  # ## # "   // 7
85       "## #  # # "   // 9
86       "#  ## # # "   // 8
87       "#  # ## # "   // 7
88       "## ## # ## "  // /
89       "# # #  ## "   // 0
90       "# # #  ## "   // 0
91       "# # ##  # "   // 1
92       "#  #  # ##";  // B End
93   for (size_t i = 0; i < strlen(expected); i++) {
94     EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
95   }
96   FX_Free(encoded);
97 }
98 
TEST(OnedCodaBarWriterTest,SetDelimiters)99 TEST(OnedCodaBarWriterTest, SetDelimiters) {
100   CBC_OnedCodaBarWriter writer;
101   int32_t width;
102   int32_t height;
103 
104   EXPECT_TRUE(writer.SetStartChar('A'));
105   EXPECT_TRUE(writer.SetStartChar('B'));
106   EXPECT_TRUE(writer.SetStartChar('C'));
107   EXPECT_TRUE(writer.SetStartChar('D'));
108   EXPECT_TRUE(writer.SetStartChar('E'));
109   EXPECT_TRUE(writer.SetStartChar('N'));
110   EXPECT_TRUE(writer.SetStartChar('T'));
111   EXPECT_TRUE(writer.SetStartChar('*'));
112   EXPECT_FALSE(writer.SetStartChar('V'));
113   EXPECT_FALSE(writer.SetStartChar('0'));
114   EXPECT_FALSE(writer.SetStartChar('\0'));
115   EXPECT_FALSE(writer.SetStartChar('@'));
116 
117   EXPECT_TRUE(writer.SetEndChar('A'));
118   EXPECT_TRUE(writer.SetEndChar('B'));
119   EXPECT_TRUE(writer.SetEndChar('C'));
120   EXPECT_TRUE(writer.SetEndChar('D'));
121   EXPECT_TRUE(writer.SetEndChar('E'));
122   EXPECT_TRUE(writer.SetEndChar('N'));
123   EXPECT_TRUE(writer.SetEndChar('T'));
124   EXPECT_TRUE(writer.SetEndChar('*'));
125   EXPECT_FALSE(writer.SetEndChar('V'));
126   EXPECT_FALSE(writer.SetEndChar('0'));
127   EXPECT_FALSE(writer.SetEndChar('\0'));
128   EXPECT_FALSE(writer.SetEndChar('@'));
129 
130   writer.SetStartChar('N');
131   writer.SetEndChar('*');
132 
133   uint8_t* encoded = writer.Encode("987", BCFORMAT_CODABAR, width, height);
134   EXPECT_EQ(1, height);
135   EXPECT_EQ(kModulesForDelimiters + 3 * kModulesPerNumber, width);
136   const char* expected =
137       "#  #  # ## "  // N (same as B) Start
138       "## #  # # "   // 9
139       "#  ## # # "   // 8
140       "#  # ## # "   // 7
141       "# #  #  ##";  // * (same as C) End
142   for (size_t i = 0; i < strlen(expected); i++) {
143     EXPECT_EQ(expected[i] != ' ', !!encoded[i]) << i;
144   }
145   FX_Free(encoded);
146 }
147 
148 }  // namespace
149