File indexing completed on 2024-05-05 04:00:57

0001 /*
0002     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: MIT
0005 */
0006 
0007 #include "../src/lib/bitvector_p.h"
0008 #include "../src/lib/code128barcode_p.h"
0009 
0010 #include <prison.h>
0011 
0012 #include <QObject>
0013 #include <QTest>
0014 
0015 Q_DECLARE_METATYPE(Prison::BitVector)
0016 
0017 using namespace Prison;
0018 
0019 class Code128BarcodeTest : public QObject
0020 {
0021     Q_OBJECT
0022 private Q_SLOTS:
0023     void testEncode_data()
0024     {
0025         QTest::addColumn<QByteArray>("input");
0026         QTest::addColumn<BitVector>("output");
0027 
0028         BitVector v;
0029         QTest::newRow("empty") << QByteArray() << v;
0030         v.appendMSB(1680, 11);
0031         v.appendMSB(1554, 11);
0032         v.appendMSB(1062, 11);
0033         v.appendMSB(1424, 11);
0034         v.appendMSB(1220, 11);
0035         v.appendMSB(6379, 13);
0036         QTest::newRow("all lower") << QByteArray("kde") << v;
0037         v.clear();
0038         v.appendMSB(1680, 11);
0039         v.appendMSB(1422, 11);
0040         v.appendMSB(1416, 11);
0041         v.appendMSB(1128, 11);
0042         v.appendMSB(1764, 11);
0043         v.appendMSB(6379, 13);
0044         QTest::newRow("all uppper") << QByteArray("KDE") << v;
0045 
0046         v.clear();
0047         v.appendMSB(1680, 11);
0048         v.appendMSB(1614, 11);
0049         v.appendMSB(1764, 11);
0050         v.appendMSB(6379, 13);
0051         QTest::newRow("1 digit") << QByteArray("4") << v;
0052         v.clear();
0053         v.appendMSB(1692, 11);
0054         v.appendMSB(1464, 11);
0055         v.appendMSB(1134, 11);
0056         v.appendMSB(6379, 13);
0057         QTest::newRow("2 digits") << QByteArray("42") << v;
0058         v.clear();
0059         v.appendMSB(1680, 11);
0060         v.appendMSB(1614, 11);
0061         v.appendMSB(1650, 11);
0062         v.appendMSB(1650, 11);
0063         v.appendMSB(1124, 11);
0064         v.appendMSB(6379, 13);
0065         QTest::newRow("3 digits") << QByteArray("422") << v;
0066         v.clear();
0067         v.appendMSB(1692, 11);
0068         v.appendMSB(1464, 11);
0069         v.appendMSB(1902, 11);
0070         v.appendMSB(1782, 11);
0071         v.appendMSB(6379, 13);
0072         QTest::newRow("4 digits") << QByteArray("4223") << v;
0073 
0074         v.clear();
0075         v.appendMSB(1680, 11);
0076         v.appendMSB(1814, 11);
0077         v.appendMSB(1260, 11);
0078         v.appendMSB(1260, 11);
0079         v.appendMSB(1896, 11);
0080         v.appendMSB(1814, 11);
0081         v.appendMSB(6379, 13);
0082         QTest::newRow("mixed") << QByteArray("X00Y") << v;
0083 
0084         v.clear();
0085         v.appendMSB(1668, 11);
0086         v.appendMSB(1292, 11);
0087         v.appendMSB(1292, 11);
0088         v.appendMSB(6379, 13);
0089         QTest::newRow("null") << QByteArray("\0", 1) << v;
0090         v.clear();
0091         v.appendMSB(1668, 11);
0092         v.appendMSB(1422, 11);
0093         v.appendMSB(1416, 11);
0094         v.appendMSB(1128, 11);
0095         v.appendMSB(1292, 11);
0096         v.appendMSB(1412, 11);
0097         v.appendMSB(6379, 13);
0098         QTest::newRow("Code A only") << QByteArray("KDE\0", 4) << v;
0099 
0100         v.clear();
0101         v.appendMSB(1668, 11);
0102         v.appendMSB(1292, 11);
0103         v.appendMSB(1518, 11);
0104         v.appendMSB(1554, 11);
0105         v.appendMSB(1062, 11);
0106         v.appendMSB(1424, 11);
0107         v.appendMSB(1616, 11);
0108         v.appendMSB(6379, 13);
0109         QTest::newRow("Start A -> Latch B") << QByteArray("\0kde", 4) << v;
0110         v.clear();
0111         v.appendMSB(1680, 11);
0112         v.appendMSB(1554, 11);
0113         v.appendMSB(1062, 11);
0114         v.appendMSB(1886, 11);
0115         v.appendMSB(1292, 11);
0116         v.appendMSB(1292, 11);
0117         v.appendMSB(1602, 11);
0118         v.appendMSB(6379, 13);
0119         QTest::newRow("Start B -> Latch A") << QByteArray("kd\0\0", 4) << v;
0120 
0121         v.clear();
0122         v.appendMSB(1668, 11);
0123         v.appendMSB(1292, 11);
0124         v.appendMSB(1954, 11);
0125         v.appendMSB(1118, 11);
0126         v.appendMSB(1590, 11);
0127         v.appendMSB(1292, 11);
0128         v.appendMSB(1328, 11);
0129         v.appendMSB(6379, 13);
0130         QTest::newRow("Start A -> Shift B") << QByteArray("\0~@\0", 4) << v;
0131         v.clear();
0132         v.appendMSB(1680, 11);
0133         v.appendMSB(1974, 11);
0134         v.appendMSB(1954, 11);
0135         v.appendMSB(1292, 11);
0136         v.appendMSB(1310, 11);
0137         v.appendMSB(1844, 11);
0138         v.appendMSB(6379, 13);
0139         QTest::newRow("Start B -> Shift A") << QByteArray("{\0}", 3) << v;
0140 
0141         v.clear();
0142         v.appendMSB(1692, 11);
0143         v.appendMSB(1436, 11);
0144         v.appendMSB(1112, 11);
0145         v.appendMSB(1518, 11);
0146         v.appendMSB(1304, 11);
0147         v.appendMSB(1112, 11);
0148         v.appendMSB(1158, 11);
0149         v.appendMSB(6379, 13);
0150         QTest::newRow("Start C -> Latch B") << QByteArray("1234AB") << v;
0151         v.clear();
0152         v.appendMSB(1680, 11);
0153         v.appendMSB(1304, 11);
0154         v.appendMSB(1112, 11);
0155         v.appendMSB(1502, 11);
0156         v.appendMSB(1436, 11);
0157         v.appendMSB(1112, 11);
0158         v.appendMSB(1966, 11);
0159         v.appendMSB(6379, 13);
0160         QTest::newRow("Start B -> Latch C") << QByteArray("AB1234") << v;
0161     }
0162 
0163     void testEncode()
0164     {
0165         QFETCH(QByteArray, input);
0166         QFETCH(BitVector, output);
0167 
0168         Code128Barcode code;
0169         const auto v = code.encode(input);
0170         if (v != output) {
0171             qDebug() << "Actual  :" << v;
0172             qDebug() << "Expected:" << output;
0173         }
0174         QCOMPARE(v, output);
0175     }
0176 
0177     void testDimension()
0178     {
0179         auto barcode = Prison::Barcode::create(Prison::Code128);
0180         QVERIFY(barcode);
0181         QCOMPARE(barcode->format(), Prison::Code128);
0182         QCOMPARE(barcode->dimensions(), Prison::Barcode::OneDimension);
0183     }
0184 
0185     void testSize()
0186     {
0187         auto barcode = Prison::Barcode::create(Prison::Code128);
0188         QVERIFY(barcode);
0189         QCOMPARE(barcode->format(), Prison::Code128);
0190         barcode->setData(QStringLiteral("UNIT TEST"));
0191         QCOMPARE(barcode->minimumSize(), QSize(154, 1));
0192         QCOMPARE(barcode->preferredSize(1), QSize(308, 50));
0193         QCOMPARE(barcode->preferredSize(2), QSize(154, 50));
0194         QCOMPARE(barcode->toImage(barcode->preferredSize(1)).size(), QSize(308, 50));
0195         QCOMPARE(barcode->toImage({1, 1}).isNull(), true);
0196     }
0197 
0198     void testRender_data()
0199     {
0200         QTest::addColumn<QByteArray>("input");
0201         QTest::addColumn<QString>("refName");
0202 
0203         QTest::newRow("text") << QByteArray("KF5::Prison") << "code128-text.png";
0204         QTest::newRow("binary") << QByteArray("KDE\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9kde", 16) << "code128-binary.png";
0205     }
0206 
0207     void testRender()
0208     {
0209         QFETCH(QByteArray, input);
0210         QFETCH(QString, refName);
0211 
0212         {
0213             auto code = Prison::Barcode::create(Prison::Code128);
0214             QVERIFY(code);
0215             code->setData(QString::fromLatin1(input.constData(), input.size()));
0216             const auto img = code->toImage(code->minimumSize());
0217             img.save(refName);
0218 
0219             QImage ref(QStringLiteral(":/code128/") + refName);
0220             ref = ref.convertToFormat(img.format());
0221             QCOMPARE(img, ref);
0222         }
0223 
0224         {
0225             auto code = Prison::Barcode::create(Prison::Code128);
0226             QVERIFY(code);
0227             code->setData(QString::fromLatin1(input.constData(), input.size()));
0228             const auto img = code->toImage(code->minimumSize());
0229             img.save(refName);
0230 
0231             QImage ref(QStringLiteral(":/code128/") + refName);
0232             ref = ref.convertToFormat(img.format());
0233             QCOMPARE(img, ref);
0234         }
0235     }
0236 };
0237 
0238 QTEST_APPLESS_MAIN(Code128BarcodeTest)
0239 
0240 #include "code128barcodetest.moc"