File: codectest.cpp

package info (click to toggle)
kf6-kcodecs 6.13.0-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 23,784 kB
  • sloc: cpp: 8,843; sh: 14; makefile: 5
file content (111 lines) | stat: -rw-r--r-- 3,666 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
    SPDX-FileCopyrightText: 2010 Thomas McGuire <mcguire@kde.org>

    SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "codectest.h"

#include <QTest>

#include <QDir>

#include "../src/kcodecs.h"

using namespace KCodecs;

QTEST_MAIN(CodecTest)

enum Mode {
    Decode,
    Encode,
};
Q_DECLARE_METATYPE(Mode)

void CodecTest::testCodecs_data()
{
    QTest::addColumn<QByteArray>("input");
    QTest::addColumn<QByteArray>("expResult");
    QTest::addColumn<QByteArray>("codecName");
    QTest::addColumn<QString>("tag");
    QTest::addColumn<Mode>("mode");

    QString dataDir = QFINDTESTDATA("data/binary_data");
    QVERIFY(!dataDir.isEmpty());
    dataDir.chop(QByteArrayView("binary_data").size());
    QDir codecBaseDir(dataDir);
    const QStringList lst = codecBaseDir.entryList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
    for (const QString &dir : lst) {
        if (dir.toLower().startsWith(QLatin1String("codec_"))) {
            const QString codecName = dir.right(dir.size() - 6);
            QDir codecDir(codecBaseDir.path() + QLatin1String("/") + dir);
            const QStringList lst2 = codecDir.entryList(QStringList(), QDir::Files, QDir::NoSort);
            for (const QString &file : lst2) {
                if (file.toLower().endsWith(QLatin1String(".expected"))) {
                    const QString dataFileNameBase = file.left(file.size() - 9);
                    QFile dataFile(codecDir.path() + QLatin1Char('/') + dataFileNameBase);
                    QFile expectedFile(codecDir.path() + QLatin1Char('/') + file);
                    QVERIFY(dataFile.open(QIODevice::ReadOnly));
                    QVERIFY(expectedFile.open(QIODevice::ReadOnly));

                    Mode mode = Decode;
                    if (file.contains(QLatin1String("-decode"))) {
                        mode = Decode;
                    } else if (file.contains(QLatin1String("-encode"))) {
                        mode = Encode;
                    }

                    const QByteArray data = dataFile.readAll();
                    const QByteArray expected = expectedFile.readAll();

                    const QString tag = codecName + QLatin1Char('/') + dataFileNameBase;
                    QTest::newRow(tag.toLatin1().constData()) << data << expected << codecName.toLatin1() << tag << mode;

                    dataFile.close();
                    expectedFile.close();
                }
            }
        }
    }
}

void CodecTest::testCodecs()
{
    QFETCH(QByteArray, input);
    QFETCH(QByteArray, expResult);
    QFETCH(QByteArray, codecName);
    QFETCH(QString, tag);
    QFETCH(Mode, mode);

    Codec *codec = Codec::codecForName(codecName);
    QVERIFY(codec);

    QStringList blacklistedTags;
    if (blacklistedTags.contains(tag)) {
        QEXPECT_FAIL(tag.toLatin1().constData(), "Codec broken", Continue);
    }

    QByteArray result;
    if (mode == Decode) {
        result = codec->decode(input, Codec::NewlineLF);
    } else {
        result = codec->encode(input, Codec::NewlineLF);
    }

    // More usable version of QCOMPARE(result, expResult), in case the difference is at the end...
    if (result != expResult) {
        const QList<QByteArray> lines = result.split('\n');
        const QList<QByteArray> expLines = expResult.split('\n');
        if (lines.count() == expLines.count()) {
            QCOMPARE(result.split('\n'), expResult.split('\n'));
        }
    }
    QCOMPARE(result, expResult);
}

void CodecTest::testInvalidCodec()
{
    Codec *codec = Codec::codecForName("thiscodectotallydoesntexist");
    QCOMPARE(codec, nullptr);
}

#include "moc_codectest.cpp"