You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
416 lines
20 KiB
416 lines
20 KiB
/* |
|
* Copyright 2025 gitlost |
|
* Copyright 2025 Axel Waggershauser |
|
*/ |
|
// SPDX-License-Identifier: Apache-2.0 |
|
|
|
#include "GTIN.h" |
|
#include "Version.h" |
|
#include "ZXAlgorithms.h" |
|
#include "ZXingCpp.h" |
|
|
|
#ifdef ZXING_READERS |
|
#include "ReadBarcode.h" |
|
#endif |
|
#include "CreateBarcode.h" |
|
|
|
#include "gtest/gtest.h" |
|
|
|
#include <iomanip> |
|
|
|
using namespace ZXing; |
|
using namespace testing; |
|
using enum BarcodeFormat; |
|
|
|
static void check(int line, std::string_view input, CreatorOptions cOpts, std::string_view symbologyIdentifier, std::string_view text, |
|
std::string_view bytes, bool hasECI, std::string_view textECI, std::string_view bytesECI, std::string_view HRI, |
|
std::string_view contentType, std::string_view position = {}, std::string_view ecLevel = {}, |
|
std::string_view version = {}, bool fromBytes = false) |
|
{ |
|
if (!(cOpts.format() & AllCreatable)) |
|
return; |
|
|
|
auto bc = fromBytes ? CreateBarcodeFromBytes(input, cOpts) : CreateBarcodeFromText(input, cOpts); |
|
|
|
EXPECT_TRUE(bc.isValid()) << "line:" << line; |
|
if (!bc.isValid()) |
|
return; |
|
EXPECT_EQ(bc.symbologyIdentifier(), symbologyIdentifier) << "line:" << line; |
|
EXPECT_EQ(ToString(bc.contentType()), contentType) << "line:" << line; |
|
EXPECT_EQ(bc.text(TextMode::HRI), HRI) << "line:" << line; |
|
EXPECT_EQ(bc.text(TextMode::Plain), text) << "line:" << line; |
|
EXPECT_EQ(ToHex(bc.bytes()), bytes) << "line:" << line; |
|
EXPECT_EQ(bc.hasECI(), hasECI) << "line:" << line; |
|
EXPECT_EQ(bc.text(TextMode::ECI), textECI) << "line:" << line; |
|
EXPECT_EQ(ToHex(bc.bytesECI()), bytesECI) << "line:" << line; |
|
// if (!position.empty()) |
|
// EXPECT_EQ(ToString(bc.position()), position) << "line:" << line; |
|
// EXPECT_EQ(bc.ecLevel(), ecLevel) << "line:" << line; |
|
// EXPECT_EQ(bc.version(), version) << "line:" << line; |
|
|
|
#ifdef ZXING_READERS |
|
if (!(cOpts.format() & AllReadable)) |
|
return; |
|
|
|
auto br = ReadBarcode(bc.symbol(), ReaderOptions().formats(bc.format()).isPure(true).eanAddOnSymbol(EanAddOnSymbol::Read)); |
|
|
|
EXPECT_EQ(bc.isValid(), br.isValid()) << "line:" << line; |
|
EXPECT_EQ(bc.format(), br.format()) << "line:" << line; |
|
EXPECT_EQ(bc.symbologyIdentifier(), br.symbologyIdentifier()) << "line:" << line; |
|
EXPECT_EQ(bc.text(TextMode::Plain), br.text(TextMode::Plain)) << "line:" << line; |
|
EXPECT_EQ(ToHex(bc.bytes()), ToHex(br.bytes())) << "line:" << line; |
|
EXPECT_EQ(bc.hasECI(), br.hasECI()) << "line:" << line; |
|
EXPECT_EQ(bc.text(TextMode::ECI), br.text(TextMode::ECI)) << "line:" << line; |
|
EXPECT_EQ(ToHex(bc.bytesECI()), ToHex(br.bytesECI())) << "line:" << line; |
|
EXPECT_EQ(bc.text(TextMode::HRI), br.text(TextMode::HRI)) << "line:" << line; |
|
EXPECT_EQ(ToString(bc.contentType()), ToString(br.contentType())) << "line:" << line; |
|
// EXPECT_EQ(ToString(bc.position()), ToString(br.position())) << "line:" << line; |
|
// EXPECT_EQ(bc.ecLevel(), br.ecLevel()) << "line:" << line; |
|
// EXPECT_EQ(bc.version(), br.version()) << "line:" << line; |
|
|
|
EXPECT_EQ(bc.orientation(), br.orientation()) << "line:" << line; |
|
EXPECT_EQ(bc.isMirrored(), br.isMirrored()) << "line:" << line; |
|
EXPECT_EQ(bc.isInverted(), br.isInverted()) << "line:" << line; |
|
EXPECT_EQ(bc.readerInit(), br.readerInit()) << "line:" << line; |
|
#endif // ZXING_READERS |
|
} |
|
|
|
TEST(CreateBarcodeTest, ZintASCII) |
|
{ |
|
check(__LINE__, "1234", Aztec, "]z0", "1234", "31 32 33 34", false, "]z3\\0000261234", "5D 7A 30 31 32 33 34", |
|
"1234", "Text", "0x0 15x0 15x15 0x15", "58%", "1" /*version*/); |
|
|
|
check(__LINE__, "A12B", Codabar, "]F0", "A12B", "41 31 32 42", false, "]F0\\000026A12B", "5D 46 30 41 31 32 42", |
|
"A12B", "Text", "0x0 40x0 40x49 0x49"); |
|
|
|
// check(__LINE__, "1234", CodablockF, "]O4", "1234", "31 32 33 34", false, "]O4\\0000261234", |
|
// "5D 4F 34 31 32 33 34", "1234", "Text", "0x0 100x0 100x21 0x21"); |
|
|
|
check(__LINE__, "1234", Code128, "]C0", "1234", "31 32 33 34", false, "]C0\\0000261234", "5D 43 30 31 32 33 34", |
|
"1234", "Text", "0x0 56x0 56x49 0x49"); |
|
|
|
// check(__LINE__, "1234", Code16K, "]K0", "1234", "31 32 33 34", false, "]K0\\0000261234", |
|
// "5D 4B 30 31 32 33 34", "1234", "Text", "0x0 69x0 69x23 0x23"); |
|
|
|
// Plain (non-extended) Code 39 |
|
check(__LINE__, "1234", Code39, "]A0", "1234", "31 32 33 34", false, "]A0\\0000261234", "5D 41 30 31 32 33 34", |
|
"1234", "Text", "0x0 76x0 76x49 0x49"); |
|
|
|
// Extended Code 39 with DEL |
|
// HRI not escaped as content type considered "Text" (DEL not recognized) |
|
// check(__LINE__, "12\17734", Code39, "]A4", "12\17734", "31 32 7F 33 34", false, "]A4\\00002612\17734", |
|
// "5D 41 34 31 32 7F 33 34", "12\17734", "Text", "0x0 102x0 102x49 0x49"); |
|
|
|
// Extended Code 39 with SOH & DEL |
|
// HRI escaped as content type considered "Binary" (SOH) |
|
// check(__LINE__, "12\001\17734", Code39, "]A4", "12\001\17734", "31 32 01 7F 33 34", false, |
|
// "]A4\\00002612\001\17734", "5D 41 34 31 32 01 7F 33 34", "12<SOH><DEL>34", "Binary", "0x0 128x0 128x49 0x49"); |
|
|
|
// Extended Code 39 with NUL |
|
// HRI escaped as content type considered "Binary" (NUL) |
|
// check(__LINE__, std::string("12\00034", 5), Code39, "]A4", std::string("12\00034", 5), "31 32 00 33 34", false, |
|
// std::string("]A4\\00002612\00034", 15), "5D 41 34 31 32 00 33 34", "12<NUL>34", "Binary", "0x0 102x0 102x49 0x49"); |
|
|
|
check(__LINE__, "1234", Code93, "]G0", "1234", "31 32 33 34", false, "]G0\\0000261234", "5D 47 30 31 32 33 34", |
|
"1234", "Text", "0x0 72x0 72x39 0x39"); // Check digits removed |
|
|
|
check(__LINE__, "1234", DataBarOmni, "]e0", "0100000000012348", "30 31 30 30 30 30 30 30 30 30 30 31 32 33 34 38", |
|
false, "]e0\\0000260100000000012348", "5D 65 30 30 31 30 30 30 30 30 30 30 30 30 31 32 33 34 38", "(01)00000000012348", |
|
"GS1", "1x0 96x0 96x32 1x32"); |
|
|
|
check(__LINE__, "1234", DataBarStk, "]e0", "0100000000012348", |
|
"30 31 30 30 30 30 30 30 30 30 30 31 32 33 34 38", false, "]e0\\0000260100000000012348", |
|
"5D 65 30 30 31 30 30 30 30 30 30 30 30 30 31 32 33 34 38", "(01)00000000012348", "GS1", "1x0 50x0 50x68 1x68"); |
|
|
|
check(__LINE__, "(01)12345678901231(20)12(90)123(91)1234", DataBarExp, "]e0", |
|
"0112345678901231201290123\x1D" |
|
"911234", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32 39 30 31 32 33 1D 39 31 31 32 33 34", false, |
|
"]e0\\0000260112345678901231201290123\x1D" |
|
"911234", |
|
"5D 65 30 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32 39 30 31 32 33 1D 39 31 31 32 33 34", |
|
"(01)12345678901231(20)12(90)123(91)1234", "GS1", "2x0 246x0 246x33 2x33"); |
|
|
|
check(__LINE__, "(01)12345678901231(20)12(90)123(91)1234", DataBarExpStk, "]e0", |
|
"0112345678901231201290123\x1D" |
|
"911234", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32 39 30 31 32 33 1D 39 31 31 32 33 34", false, |
|
"]e0\\0000260112345678901231201290123\x1D" |
|
"911234", |
|
"5D 65 30 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32 39 30 31 32 33 1D 39 31 31 32 33 34", |
|
"(01)12345678901231(20)12(90)123(91)1234", "GS1", "0x0 102x0 102x108 0x108"); |
|
|
|
// Note not marked as GS1, and hence HRI AI not parenthesized TODO: check |
|
check(__LINE__, "1234", DataBarLtd, "]e0", "0100000000012348", |
|
"30 31 30 30 30 30 30 30 30 30 30 31 32 33 34 38", false, "]e0\\0000260100000000012348", |
|
"5D 65 30 30 31 30 30 30 30 30 30 30 30 30 31 32 33 34 38", "(01)00000000012348", "GS1", "1x0 73x0 73x9 1x9"); |
|
|
|
check(__LINE__, "1234", DataMatrix, "]d1", "1234", "31 32 33 34", false, "]d4\\0000261234", "5D 64 31 31 32 33 34", |
|
"1234", "Text", "0x0 9x0 9x9 0x9", "" /*ecLevel*/, "1" /*version*/); |
|
|
|
// check(__LINE__, "1234", DotCode, "]J0", "1234", "31 32 33 34", false, "]J3\\0000261234", |
|
// "5D 4A 33 31 32 33 34", "1234", "Text", "1x1 25x1 25x19 1x19", "" /*ecLevel*/, "" /*version*/, 3 /*dataMask*/); |
|
|
|
// DX number only |
|
check(__LINE__, "77-2", DXFilmEdge, "]XF", "77-2", "37 37 2D 32", false, "]XF\\00002677-2", "5D 58 46 37 37 2D 32", "77-2", |
|
"Text", "0x0 22x0 22x5 0x5"); |
|
|
|
// DX number + frame number |
|
check(__LINE__, "77-2/62A", DXFilmEdge, "]XF", "77-2/62A", "37 37 2D 32 2F 36 32 41", false, "]XF\\00002677-2/62A", |
|
"5D 58 46 37 37 2D 32 2F 36 32 41", "77-2/62A", "Text", "0x0 30x0 30x5 0x5"); |
|
|
|
check(__LINE__, "123456", EAN8, "]E4", "01234565", "30 31 32 33 34 35 36 35", false, "]E4\\00002601234565", |
|
"5D 45 34 30 31 32 33 34 35 36 35", "01234565", "Text", "0x0 66x0 66x59 0x59"); |
|
|
|
check(__LINE__, "1234567890128", EAN13, "]E0", "1234567890128", "31 32 33 34 35 36 37 38 39 30 31 32 38", false, |
|
"]E0\\0000261234567890128", "5D 45 30 31 32 33 34 35 36 37 38 39 30 31 32 38", "1234567890128", "Text", |
|
"0x0 94x0 94x73 0x73"); |
|
|
|
// check(__LINE__, "1234", HanXin, "]h0", "1234", "31 32 33 34", false, "]h1\\0000261234", |
|
// "5D 68 31 31 32 33 34", "1234", "Text", "0x0 22x0 22x22 0x22", "L4", "1" /*version*/); |
|
|
|
check(__LINE__, "1234", ITF, "]I0", "1234", "31 32 33 34", false, "]I0\\0000261234", "5D 49 30 31 32 33 34", "1234", |
|
"Text", "0x0 44x0 44x49 0x49"); |
|
|
|
check(__LINE__, "1234", MaxiCode, "]U0", "1234", "31 32 33 34", false, "]U2\\0000261234", "5D 55 30 31 32 33 34", |
|
"1234", "Text", "0x0 148x0 148x132 0x132", "4" /*ecLevel*/); |
|
|
|
// check(__LINE__, "1234", MicroPDF417, "]L2", "1234", "31 32 33 34", false, "]L1\\0000261234", |
|
// "5D 4C 32 31 32 33 34", "1234", "Text", "0x0 37x0 37x21 0x21", "64%" /*ecLevel*/); |
|
|
|
check(__LINE__, "1234", MicroQRCode, "]Q1", "1234", "31 32 33 34", false, "]Q2\\0000261234", "5D 51 31 31 32 33 34", |
|
"1234", "Text", "0x0 10x0 10x10 0x10", "L", "1" /*version*/); |
|
|
|
check(__LINE__, "1234", PDF417, "]L2", "1234", "31 32 33 34", false, "]L1\\0000261234", "5D 4C 32 31 32 33 34", |
|
"1234", "Text", "0x0 102x0 102x17 0x17", "66%" /*ecLevel*/); |
|
|
|
check(__LINE__, "1234", QRCode, "]Q1", "1234", "31 32 33 34", false, "]Q2\\0000261234", "5D 51 31 31 32 33 34", |
|
"1234", "Text", "0x0 20x0 20x20 0x20", "H", "1" /*version*/); |
|
|
|
check(__LINE__, "1234", RMQRCode, "]Q1", "1234", "31 32 33 34", false, "]Q2\\0000261234", "5D 51 31 31 32 33 34", |
|
"1234", "Text", "0x0 26x0 26x10 0x10", "H", "11" /*version*/); |
|
|
|
check(__LINE__, "1234", UPCA, "]E0", "0000000012348", "30 30 30 30 30 30 30 30 31 32 33 34 38", false, |
|
"]E0\\0000260000000012348", "5D 45 30 30 30 30 30 30 30 30 30 31 32 33 34 38", "0000000012348", "Text", "0x0 94x0 94x73 0x73"); |
|
|
|
check(__LINE__, "1234", UPCE, "]E0", "0000120000034", "30 30 30 30 31 32 30 30 30 30 30 33 34", false, "]E0\\0000260000120000034", |
|
"5D 45 30 30 30 30 30 31 32 30 30 30 30 30 33 34", "0000120000034", "Text", "0x0 50x0 50x73 0x73"); |
|
} |
|
|
|
|
|
TEST(CreateBarcodeTest, EANUPCAddOn) |
|
{ |
|
check(__LINE__, "1234567890128+12345", EAN13, "]E3", "123456789012812345", "31 32 33 34 35 36 37 38 39 30 31 32 38 31 32 33 34 35", false, |
|
"]E3\\000026123456789012812345", "5D 45 33 31 32 33 34 35 36 37 38 39 30 31 32 38 31 32 33 34 35", "123456789012812345", "Text"); |
|
|
|
check(__LINE__, "000000012348+12345", UPCA, "]E3", "000000001234812345", "30 30 30 30 30 30 30 30 31 32 33 34 38 31 32 33 34 35", false, |
|
"]E3\\000026000000001234812345", "5D 45 33 30 30 30 30 30 30 30 30 31 32 33 34 38 31 32 33 34 35", "000000001234812345", "Text"); |
|
|
|
check(__LINE__, "1234+12345", UPCE, "]E3", "000012000003412345", "30 30 30 30 31 32 30 30 30 30 30 33 34 31 32 33 34 35", false, |
|
"]E3\\000026000012000003412345", "5D 45 33 30 30 30 30 31 32 30 30 30 30 30 33 34 31 32 33 34 35", "000012000003412345", "Text"); |
|
} |
|
|
|
TEST(CreateBarcodeTest, ZintISO8859_1) |
|
{ |
|
// Control chars (SOH & DEL) |
|
check(__LINE__, "12\001\17734", Code128, "]C0", "12\001\17734", "31 32 01 7F 33 34", false, |
|
"]C0\\00002612\001\17734", "5D 43 30 31 32 01 7F 33 34", "12<SOH><DEL>34", "Binary"); |
|
|
|
// NUL |
|
check(__LINE__, std::string("12\00034", 5), Code128, "]C0", std::string("12\00034", 5), "31 32 00 33 34", false, |
|
std::string("]C0\\00002612\00034", 15), "5D 43 30 31 32 00 33 34", "12<NUL>34", "Binary"); |
|
|
|
// Latin-1 (Extended ASCII) |
|
check(__LINE__, "12é34", Code128, "]C0", "12é34", "31 32 E9 33 34", false, "]C0\\00002612é34", |
|
"5D 43 30 31 32 E9 33 34", "12é34", "Text"); |
|
|
|
// Control char & Latin-1 |
|
check(__LINE__, "\007Ç", Code128, "]C0", "\007Ç", "07 C7", false, "]C0\\000026\007Ç", "5D 43 30 07 C7", "<BEL>Ç", |
|
"Binary"); |
|
|
|
// No ECI |
|
check(__LINE__, "1234é", Aztec, "]z0", "1234é", "31 32 33 34 E9", false, "]z3\\0000261234é", |
|
"5D 7A 30 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "35%" /*ecLevel*/, "1" /*version*/); |
|
|
|
// With ECI |
|
check(__LINE__, "1234é", {Aztec, "eci=ISO8859_1"}, "]z0", "1234é", "31 32 33 34 E9", true, "]z3\\0000261234é", |
|
"5D 7A 33 5C 30 30 30 30 30 33 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "17%", "1"); |
|
|
|
// No ECI |
|
check(__LINE__, "1234é", DataMatrix, "]d1", "1234é", "31 32 33 34 E9", false, "]d4\\0000261234é", |
|
"5D 64 31 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "" /*ecLevel*/, "2" /*version*/); |
|
|
|
// With ECI |
|
check(__LINE__, "1234é", {DataMatrix, "eci=3"}, "]d1", "1234é", "31 32 33 34 E9", true, |
|
"]d4\\0000261234é", "5D 64 34 5C 30 30 30 30 30 33 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "" /*ecLevel*/, "3"); |
|
|
|
// No ECI |
|
check(__LINE__, "1234é", MaxiCode, "]U0", "1234é", "31 32 33 34 E9", false, "]U2\\0000261234é", |
|
"5D 55 30 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "4" /*ecLevel*/); |
|
|
|
// With ECI |
|
check(__LINE__, "1234é", {MaxiCode, "eci=ISO8859_1"}, "]U0", "1234é", "31 32 33 34 E9", true, |
|
"]U2\\0000261234é", "5D 55 32 5C 30 30 30 30 30 33 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "4" /*ecLevel*/); |
|
|
|
// No ECI |
|
check(__LINE__, "1234é", PDF417, "]L2", "1234é", "31 32 33 34 E9", false, "]L1\\0000261234é", |
|
"5D 4C 32 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "57%"); |
|
|
|
// With ECI |
|
check(__LINE__, "1234é", {PDF417, "eci=ISO8859_1"}, "]L2", "1234é", "31 32 33 34 E9", true, "]L1\\0000261234é", |
|
"5D 4C 31 5C 30 30 30 30 30 33 31 32 33 34 E9", "1234é", "Text", "" /*position*/, "50%"); |
|
|
|
// No ECI |
|
check(__LINE__, "1234é", QRCode, "]Q1", "1234é", "31 32 33 34 E9", false, "]Q2\\0000261234é", |
|
"5D 51 31 31 32 33 34 E9", "1234é", "Text", "0x0 20x0 20x20 0x20", "H", "1"); |
|
|
|
// With ECI |
|
check(__LINE__, "1234é", {QRCode, "eci=ISO8859_1"}, "]Q1", "1234é", "31 32 33 34 E9", true, "]Q2\\0000261234é", |
|
"5D 51 32 5C 30 30 30 30 30 33 31 32 33 34 E9", "1234é", "Text", "0x0 20x0 20x20 0x20", "H", "1"); |
|
|
|
// No ECI |
|
check(__LINE__, "1234é", RMQRCode, "]Q1", "1234é", "31 32 33 34 E9", false, "]Q2\\0000261234é", |
|
"5D 51 31 31 32 33 34 E9", "1234é", "Text", "0x0 26x0 26x10 0x10", "H", "11"); |
|
|
|
// With ECI |
|
check(__LINE__, "1234é", {RMQRCode, "eci=ISO8859_1"}, "]Q1", "1234é", "31 32 33 34 E9", true, |
|
"]Q2\\0000261234é", "5D 51 32 5C 30 30 30 30 30 33 31 32 33 34 E9", "1234é", "Text", "0x0 26x0 26x10 0x10", "M", "11"); |
|
} |
|
|
|
TEST(CreateBarcodeTest, ZintGS1) |
|
{ |
|
check(__LINE__, "(01)12345678901231(20)12", {Aztec, "GS1"}, "]z1", "01123456789012312012", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", false, "]z4\\00002601123456789012312012", |
|
"5D 7A 31 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", "(01)12345678901231(20)12", "GS1", |
|
"0x0 19x0 19x19 0x19", "50%", "2" /*version*/); |
|
|
|
check(__LINE__, "(01)12345678901231(20)12", {Code128, "GS1"}, "]C1", "01123456789012312012", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", false, "]C1\\00002601123456789012312012", |
|
"5D 43 31 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", "(01)12345678901231(20)12", "GS1", |
|
"0x0 155x0 155x63 0x63"); |
|
|
|
// check( |
|
// __LINE__, |
|
// "(01)04912345123459[15]970331[30]128[10]ABC123", {Code16K, "GS1"}, |
|
// "]K1", |
|
// "01049123451234591597033130128\x1D" |
|
// "10ABC123", |
|
// "30 31 30 34 39 31 32 33 34 35 31 32 33 34 35 39 31 35 39 37 30 33 33 31 33 30 31 32 38 1D 31 30 41 42 43 31 32 33", false, |
|
// "]K1\\00002601049123451234591597033130128\x1D" |
|
// "10ABC123", |
|
// "5D 4B 31 30 31 30 34 39 31 32 33 34 35 31 32 33 34 35 39 31 35 39 37 30 33 33 31 33 30 31 32 38 1D 31 30 41 42 43 " |
|
// "31 32 33", |
|
// "(01)04912345123459(15)970331(30)128(10)ABC123", "GS1", "0x0 69x0 69x67 0x67"); |
|
|
|
check(__LINE__, "(01)12345678901231(20)12", {DataMatrix, "GS1"}, "]d2", "01123456789012312012", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", false, "]d5\\00002601123456789012312012", |
|
"5D 64 32 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", "(01)12345678901231(20)12", "GS1", |
|
"0x0 15x0 15x15 0x15", "" /*ecLevel*/, "4" /*version*/); |
|
|
|
// check(__LINE__, "(01)00012345678905(17)201231(10)ABC123456", {DotCode, "GS1"}, "]J1", |
|
// "01000123456789051720123110ABC123456", |
|
// "30 31 30 30 30 31 32 33 34 35 36 37 38 39 30 35 31 37 32 30 31 32 33 31 31 30 41 42 43 31 32 33 34 35 36", false, |
|
// "]J4\\00002601000123456789051720123110ABC123456", |
|
// "5D 4A 31 30 31 30 30 30 31 32 33 34 35 36 37 38 39 30 35 31 37 32 30 31 32 33 31 31 30 41 42 43 31 32 33 34 35 36", |
|
// "(01)00012345678905(17)201231(10)ABC123456", "GS1", "1x1 57x1 57x39 1x39", "" /*ecLevel*/, "" /*version*/, 1 /*dataMask*/); |
|
|
|
check(__LINE__, "(01)12345678901231(20)12", {QRCode, "GS1"}, "]Q3", "01123456789012312012", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", false, "]Q4\\00002601123456789012312012", |
|
"5D 51 33 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", "(01)12345678901231(20)12", "GS1", |
|
"0x0 20x0 20x20 0x20", "Q", "1"); |
|
|
|
check(__LINE__, "(01)12345678901231(20)12", {RMQRCode, "GS1"}, "]Q3", "01123456789012312012", |
|
"30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", false, "]Q4\\00002601123456789012312012", |
|
"5D 51 33 30 31 31 32 33 34 35 36 37 38 39 30 31 32 33 31 32 30 31 32", "(01)12345678901231(20)12", "GS1", |
|
"0x0 26x0 26x12 0x12", "M", "17"); |
|
} |
|
|
|
TEST(CreateBarcodeTest, ZintBinary) |
|
{ |
|
check(__LINE__, std::string("\x00\x80", 2), Code128, "]C0", std::string("\0\xC2\x80", 3), |
|
"00 80", false, std::string("]C0\\000026\0\xC2\x80", 13), |
|
"5D 43 30 00 80", "<NUL><U+80>", "Binary", |
|
"0x0 67x0 67x49 0x49" /*position*/, "" /*ecLevel*/, "" /*version*/, true /*fromBytes*/); |
|
|
|
check(__LINE__, std::string("\x00\x80", 2), Aztec, "]z0", std::string("\0\xC2\x80", 3), |
|
"00 80", true, std::string("]z3\\000899\0\xC2\x80", 13), |
|
"5D 7A 33 5C 30 30 30 38 39 39 00 80", "<NUL><U+80>", "Binary", |
|
"0x0 15x0 15x15 0x15" /*position*/, "23%" /*ecLevel*/, "1" /*version*/, true /*fromBytes*/); |
|
} |
|
|
|
TEST(CreateBarcodeTest, CreatorOptions) |
|
{ |
|
Barcode bc; |
|
#if ZXING_ENABLE_PDF417 |
|
bc = CreateBarcodeFromText("12345", {PDF417}); |
|
EXPECT_EQ(bc.symbol().height(), 18); |
|
|
|
bc = CreateBarcodeFromText("12345", {PDF417, "rows=3"}); |
|
EXPECT_EQ(bc.symbol().height(), 9); |
|
|
|
bc = CreateBarcodeFromText("12345", {PDF417, "columns=1"}); |
|
EXPECT_EQ(bc.symbol().height(), 36); |
|
#endif // ZXING_ENABLE_PDF417 |
|
|
|
#if ZXING_ENABLE_1D |
|
bc = CreateBarcodeFromText("(21)123456789", {DataBarExpStk, "columns=1"}); |
|
EXPECT_GT(bc.symbol().height(), bc.symbol().width()); |
|
#endif // ZXING_ENABLE_1D |
|
|
|
#if ZXING_ENABLE_DATAMATRIX |
|
bc = CreateBarcodeFromText("12345", {DataMatrix, "readerInit"}); |
|
EXPECT_TRUE(bc.readerInit()); |
|
|
|
bc = CreateBarcodeFromText("12345abcdefghijklmnopqr", {DataMatrix, "forceSquare"}); |
|
EXPECT_EQ(bc.symbol().height(), bc.symbol().width()); |
|
#if defined(ZXING_READERS) |
|
bc = CreateBarcodeFromText("12345", {DataMatrix}); |
|
bc = ReadBarcode(bc.symbol(), ReaderOptions().formats(DataMatrix).isPure(true).binarizer(Binarizer::BoolCast)); |
|
EXPECT_EQ(bc.extra("UEC"), "1.0"); |
|
#endif |
|
#endif // ZXING_ENABLE_DATAMATRIX |
|
|
|
#if defined(ZXING_READERS) && ZXING_ENABLE_AZTEC |
|
bc = CreateBarcodeFromText("12345", {Aztec}); |
|
bc = ReadBarcode(bc.symbol(), ReaderOptions().formats(Aztec).isPure(true).binarizer(Binarizer::BoolCast)); |
|
EXPECT_EQ(bc.extra("UEC"), "1.0"); |
|
#endif |
|
|
|
#if ZXING_ENABLE_QRCODE |
|
bc = CreateBarcodeFromText("12345", {QRCode, "version=5"}); |
|
EXPECT_EQ(bc.symbol().height(), 37); |
|
#endif // ZXING_ENABLE_QRCODE |
|
|
|
#if defined(ZXING_READERS) && ZXING_ENABLE_QRCODE |
|
bc = CreateBarcodeFromText("12345", {QRCode, "dataMask=0"}); |
|
bc = ReadBarcode(bc.symbol(), ReaderOptions().isPure(true).binarizer(Binarizer::BoolCast)); |
|
EXPECT_EQ(bc.extra("dataMask"), "0"); |
|
EXPECT_EQ(bc.extra("UEC"), "1.0"); |
|
#endif // ZXING_READERS |
|
} |
|
|
|
#if defined(ZXING_READERS) && ZXING_ENABLE_1D |
|
TEST(CreateBarcodeTest, RandomDataBar) |
|
{ |
|
auto randomTest = [](BarcodeFormat format) { |
|
auto read_opts = ReaderOptions().formats(format).isPure(true).binarizer(Binarizer::BoolCast); |
|
|
|
int n = 1000; |
|
int nErrors = 0; |
|
for (int i = 0; i < n; i += 1) { |
|
auto input = ToString(rand(), 13); |
|
input = "(01)" + input + GTIN::ComputeCheckDigit(input); |
|
auto bc = CreateBarcodeFromText(input, format); |
|
auto br = ReadBarcode(bc.symbol(), read_opts); |
|
|
|
nErrors += !br.isValid() || bc.text(TextMode::HRI) != input; |
|
} |
|
EXPECT_EQ(nErrors, 0) << std::fixed << std::setw(4) << std::setprecision(2) << "(Error rate of " << ToString(format) << " is " |
|
<< nErrors * 100 / (double)n << "%)"; |
|
}; |
|
|
|
randomTest(DataBar); |
|
randomTest(DataBarLtd); |
|
randomTest(DataBarExp); |
|
} |
|
#endif // ZXING_READERS
|
|
|