File indexing completed on 2024-05-19 05:57:13

0001 /*
0002  *  SPDX-FileCopyrightText: 2019 Jonah BrĂ¼chert <jbb@kaidan.im
0003  *  SPDX-FileCopyrightText: 2020 Nicolas Fella <nicolas.fella@gmx.de>
0004  *
0005  *  SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #include <QImage>
0009 #include <QtTest/QTest>
0010 
0011 #include "Qrca.h"
0012 #include "QrCodeContent.h"
0013 
0014 constexpr auto VCARD =
0015     "BEGIN:VCARD\n"
0016     "VERSION:3.0\n"
0017     "NAME:Alice\n"
0018     "TEL;TYPE=CELL:+12 3456 789\n"
0019     "UID:H3ll0-W0RLD-1M-A-VC4RD\n"
0020     "END:VCARD";
0021 
0022 class QrcaTest : public QObject
0023 {
0024     Q_OBJECT
0025 
0026 private slots:
0027     void isUrl()
0028     {
0029         auto type = QrCodeContent(QStringLiteral("https://kde.org"), Prison::Format::QRCode).contentType();
0030         QCOMPARE(type, QrCodeContent::Url);
0031     }
0032 
0033     void isVCard()
0034     {
0035         auto type = QrCodeContent(QString::fromUtf8(VCARD), Prison::Format::QRCode).contentType();
0036         QCOMPARE(type, QrCodeContent::VCard);
0037     }
0038 
0039     void isOtpToken()
0040     {
0041         auto type = QrCodeContent(QStringLiteral("otpauth://totp/ACME%20Co:john.doe@email.com?"
0042                                                  "secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&"
0043                                                  "issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30"),
0044                                   Prison::Format::QRCode)
0045                         .contentType();
0046         QCOMPARE(type, QrCodeContent::OtpToken);
0047     }
0048 
0049     void isText()
0050     {
0051         auto type = QrCodeContent(QStringLiteral("Hello World"), Prison::Format::QRCode).contentType();
0052         QCOMPARE(type, QrCodeContent::Text);
0053     }
0054 
0055     void isBinary()
0056     {
0057         auto type = QrCodeContent(QByteArray("hello\0world"), Prison::Format::QRCode).contentType();
0058         QCOMPARE(type, QrCodeContent::Binary);
0059     }
0060 
0061     void VCardName()
0062     {
0063         QCOMPARE(Qrca::getVCardName(VCARD), "Alice");
0064     }
0065 
0066     void isHealthCertificate()
0067     {
0068         const auto euDgc = QLatin1String(R"(HC1:6BF+70790T9WJWG.FKY*4GO0.O1CV2 O5 N2FBBRW1*70HS8WY04AC*WIFN0AHCD8KD97TK0F90KECTHGWJC0FDC:5AIA%G7X+AQB9746HS80:54IBQF60R6$A80X6S1BTYACG6M+9XG8KIAWNA91AY%67092L4WJCT3EHS8XJC$+DXJCCWENF6OF63W5NW6WF6%JC QE/IAYJC5LEW34U3ET7DXC9 QE-ED8%E.JCBECB1A-:8$96646AL60A60S6Q$D.UDRYA 96NF6L/5QW6307KQEPD09WEQDD+Q6TW6FA7C466KCN9E%961A6DL6FA7D46JPCT3E5JDLA7$Q6E464W5TG6..DX%DZJC6/DTZ9 QE5$CB$DA/D JC1/D3Z8WED1ECW.CCWE.Y92OAGY8MY9L+9MPCG/D5 C5IA5N9$PC5$CUZCY$5Y$527B+A4KZNQG5TKOWWD9FL%I8U$F7O2IBM85CWOC%LEZU4R/BXHDAHN 11$CA5MRI:AONFN7091K9FKIGIY%VWSSSU9%01FO2*FTPQ3C3F)");
0069         auto content = QrCodeContent(euDgc, Prison::Format::QRCode);
0070         QCOMPARE(content.contentType(), QrCodeContent::HealthCertificate);
0071         QCOMPARE(content.isPlainText(), true);
0072 
0073         const auto shc = QLatin1String(R"(shc:/56762909524320603460292437404460312229595326546034602925407728043360287028647167452228092861333145643765314159064022030645045908564355034142454136403706366541713724123638030437562204673740753232392543344332605736010645293153127074242839503869221276673066722326704208032257377630206204102243765868534325585800216728380758570810550562275738232930525766717231740711763612092161592153096328534441634054402943377667210963225304674530596075435638397044612142673774753658337371663741436303047729543963706374067674286421560312673434200333100044570935560632522561743609646455716545030067553205697165595467357259336905215258206553666267536405106110603868756743057374741132623962713132720925323961730873375536454524772309323860117657535973252254070723767559237108283634222457303834393764345021623421595704723907262507213576410771210010632152352426620444450711320937297037117562253509316127771010655641352255685220340306590611732431312500307552044223360477273575682173757329713550044454620375617727270874593576214004383056067405655645662776650638245361115644032910572312043253045263230756306409056010606604063725200845063604227244710632217410642253265635203704100010712124656463756722433434763371605524627435432728726805737158093905762509643823077770552176327727417269601100663232587754412727745655673026606824396103085737106558690435623939775344733266266450413133106160594564000674010021253230285571090670620460223463600968251127726720426268065873047275673154755422592169443774532859213023545832044424075364665766295969731262342066753077580339055069605474)");
0074         content = QrCodeContent(shc, Prison::Format::QRCode);
0075         QCOMPARE(content.contentType(), QrCodeContent::HealthCertificate);
0076         QCOMPARE(content.isPlainText(), true);
0077     }
0078 
0079     void isTransportTicket()
0080     {
0081         const auto uic9183 = QByteArray::fromHex("2355543031303038303030303032302C02141AE7BBA505A4B31E0D0868FD709CE2A03BC71B62021469DCD3887C0357879A93FA86B3A4AAFBB2A1AA1F0000000030333734789C7D91BF4EC25014C691415D5C7C82262E50A99E7BFA9F0D6C2B0D14931608C84088686C4034A592E893B0B938CACAA283495FC041371FC673E58F98183BDC7EF73BBFFBDDD3D37AA764172C6000AA0C6080691B56B322E9A9B587E980080C99CA0CB06CCBE6A06B01029061329415EE142BE428CC0485685F715AD6A9DA5A0FC2450E1AF3B781AA6A6AE4A36F39D8ACD6CBDE5FB406F28AA638A605C0FB65AC7A1D5D750737D17938228BBA218A84CC458184B21426090D252631332086DB4082D731A0234C25A59693D960481B8D67395177D8BFB88DE28CD70D87D9FDA330BEA39AFE4FCD580B41C6FB68B885BC50F34F5C31708F8BA257132B9E98714A878EE33959A2A855542F93C76496BC44824FE241E827D3B37E47EAE40F08D0788BFCABF0FB66EA1B99A9F3692B34138D8F9E6A74B38C3FE772A3387916FCBDDFC1FC50A3CE2767CC7F4A3A4DCBFB24DE7A9B8C73EDD446AEFDBA18FDD3F6E7E6CE647CBF1BD2E66341F488E82D89E98AF802EAA2924B");
0082         auto content = QrCodeContent(uic9183, Prison::Format::QRCode);
0083         QCOMPARE(content.contentType(), QrCodeContent::TransportTicket);
0084         QCOMPARE(content.isPlainText(), false);
0085 
0086         content = QrCodeContent(QStringLiteral("M1DESMARAIS/LUC       EABC123 YULFRAAC 0834 326J001A0025 100"), Prison::Format::PDF417);
0087         QCOMPARE(content.contentType(), QrCodeContent::TransportTicket);
0088         QCOMPARE(content.isPlainText(), true);
0089     }
0090 
0091     void isGlobalTradeItemNumber()
0092     {
0093         auto content = QrCodeContent(QStringLiteral("9783827316608"), Prison::Format::EAN13);
0094         QCOMPARE(content.contentType(), QrCodeContent::ISBN);
0095         content = QrCodeContent(QStringLiteral("4337256114837"), Prison::Format::EAN13);
0096         QCOMPARE(content.contentType(), QrCodeContent::EAN);
0097         content = QrCodeContent(QStringLiteral("4388844146860"), Prison::Format::EAN13);
0098         QCOMPARE(content.contentType(), QrCodeContent::EAN);
0099     }
0100 
0101     void isWifiSetting()
0102     {
0103         auto content = QrCodeContent(QStringLiteral("WIFI:T:WPA;S:mynetwork;P:mypass;;"), Prison::Format::QRCode);
0104         QCOMPARE(content.contentType(), QrCodeContent::WifiSetting);
0105     }
0106 };
0107 
0108 QTEST_GUILESS_MAIN(QrcaTest)
0109 
0110 #include "qrcatest.moc"