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
112
113
/* ============================================================
 *
 * This file is a part of digiKam project
 * https://www.digikam.org
 *
 * Date        : 28/08/2021
 * Description : an unit-test to detect image quality level
 *
 * SPDX-FileCopyrightText: 2021-2025 by Gilles Caulier <caulier dot gilles at gmail dot com>
 * SPDX-FileCopyrightText: 2021-2022 by Phuoc Khanh Le <phuockhanhnk94 at gmail dot com>
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 *
 * ============================================================ */

#pragma once

// Qt includes

#include <QObject>
#include <QDir>
#include <QMultiMap>
#include <QString>

// Local includes

#include "imgqsorttest_shared.h"
#include "digikam_globals.h"
#include "digikam_debug.h"
#include "imagequalitycontainer.h"
#include "exiftoolparser.h"
#include "dpluginloader.h"
#include "dtestdatadir.h"

// Shared class for utest

using namespace Digikam;

using PairImageQuality = QPair<QString, int>;
using DataTestCases    = QMultiMap<QString, PairImageQuality>;

class ImgQSortTest : public QObject
{
    Q_OBJECT

public:

    explicit ImgQSortTest(QObject* const parent = nullptr)
        : QObject(parent)
    {
    }

protected:

    QDir imageDir() const
    {
        QDir dir = DTestDataDir::TestData(QString::fromUtf8("core/tests/imgqsort")).root();
        qCDebug(DIGIKAM_TESTS_LOG) << "Test Data Dir:" << dir;

        return dir;
    }

    template <typename Function, typename Parameter>
    QHash<QString, bool> testParseTestImages(const QString& testcase_name, Function ParseTestFunc, Parameter parameter)
    {
        QStringList imageNames;

        QList<PairImageQuality> dataTest = getDataTestCases().values(testcase_name);

        for (const auto& image_refQuality : std::as_const(dataTest))
        {
            imageNames << image_refQuality.first;
        }

        QFileInfoList list                    = imageDir().entryInfoList(imageNames, QDir::Files, QDir::Name);
        QHash<QString, int> results_detection = ParseTestFunc(parameter, list);
        QHash<QString, bool> results_test;

        for (const auto& image_refQuality : std::as_const(dataTest))
        {
            results_test.insert(image_refQuality.first, results_detection.value(image_refQuality.first) == image_refQuality.second);
        }

        return results_test;
    }

    DataTestCases getDataTestCases() const<--- Function 'getDataTestCases()' should return member 'm_dataTestCases' by const reference.
    {
        return m_dataTestCases;
    }

protected Q_SLOTS:

    void initTestCase()
    {
        QDir dir(qApp->applicationDirPath());
        qputenv("DK_PLUGIN_PATH", dir.canonicalPath().toUtf8());
        DPluginLoader::instance()->init();

        QScopedPointer<ExifToolParser> const parser(new ExifToolParser(nullptr));
        m_hasExifTool = parser->exifToolAvailable();
    }

    void cleanupTestCase()
    {
        DPluginLoader::instance()->cleanUp();
    }

protected:

    DataTestCases m_dataTestCases;
    bool          m_hasExifTool     = false;
};