/****************************************************************************
**
** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt3D module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

// TODO Remove in Qt6
#include <QtCore/qcompilerdetection.h>
QT_WARNING_DISABLE_DEPRECATED

#include <QtTest/QTest>
#include <Qt3DRender/qtextureimagedata.h>
#include <Qt3DRender/private/qtexture_p.h>

class tst_DdsTextures : public QObject
{
    Q_OBJECT

private slots:
    void ddsImageData();
};

void tst_DdsTextures::ddsImageData()
{
    const struct TextureInfo {
        const char *source;
        int width;
        int height;
        int depth;
        int faces;
        int mipmapLevels;
        QOpenGLTexture::TextureFormat format;
    } textures[] = {
        { "data/16x16x1-1-lumi-nomips.dds",     16, 16, 1, 1, 1, QOpenGLTexture::R8_UNorm },
        { "data/16x16x1-1-lumi.dds",            16, 16, 1, 1, 5, QOpenGLTexture::R8_UNorm },
        { "data/16x16x1-1-rgb-nomips.dds",      16, 16, 1, 1, 1, QOpenGLTexture::RGBA8_UNorm },
        { "data/16x16x1-1-rgb.dds",             16, 16, 1, 1, 5, QOpenGLTexture::RGBA8_UNorm },
        { "data/16x16x1-1-bc1-nomips.dds",      16, 16, 1, 1, 1, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-1-bc1.dds",             16, 16, 1, 1, 5, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-1-bc3-nomips.dds",      16, 16, 1, 1, 1, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-1-bc3.dds",             16, 16, 1, 1, 5, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-1-bc1-nomips-dx10.dds", 16, 16, 1, 1, 1, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-1-bc1-dx10.dds",        16, 16, 1, 1, 5, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-1-bc3-nomips-dx10.dds", 16, 16, 1, 1, 1, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-1-bc3-dx10.dds",        16, 16, 1, 1, 5, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-6-lumi-nomips.dds",     16, 16, 1, 6, 1, QOpenGLTexture::R8_UNorm },
        { "data/16x16x1-6-lumi.dds",            16, 16, 1, 6, 5, QOpenGLTexture::R8_UNorm },
        { "data/16x16x1-6-rgb-nomips.dds",      16, 16, 1, 6, 1, QOpenGLTexture::RGBA8_UNorm },
        { "data/16x16x1-6-rgb.dds",             16, 16, 1, 6, 5, QOpenGLTexture::RGBA8_UNorm },
        { "data/16x16x1-6-bc1-nomips.dds",      16, 16, 1, 6, 1, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-6-bc1.dds",             16, 16, 1, 6, 5, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-6-bc3-nomips.dds",      16, 16, 1, 6, 1, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-6-bc3.dds",             16, 16, 1, 6, 5, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-6-bc1-nomips-dx10.dds", 16, 16, 1, 6, 1, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-6-bc1-dx10.dds",        16, 16, 1, 6, 5, QOpenGLTexture::RGBA_DXT1 },
        { "data/16x16x1-6-bc3-nomips-dx10.dds", 16, 16, 1, 6, 1, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16x1-6-bc3-dx10.dds",        16, 16, 1, 6, 5, QOpenGLTexture::RGBA_DXT5 },
        { "data/16x16-etc1.pkm",                16, 16, 1, 1, 1, QOpenGLTexture::RGB8_ETC1 },
        { "data/16x16-etc2.pkm",                16, 16, 1, 1, 1, QOpenGLTexture::RGB8_ETC2 },
    };

    for (unsigned i = 0; i < sizeof(textures)/sizeof(*textures); i++) {
        const TextureInfo *texture = &textures[i];

        Qt3DRender::QTextureImageDataPtr data = Qt3DRender::TextureLoadingHelper::loadTextureData(QUrl::fromLocalFile(QFINDTESTDATA(texture->source)), true, false);

        QVERIFY(data);
        QCOMPARE(data->width(), texture->width);
        QCOMPARE(data->height(), texture->height);
        QCOMPARE(data->faces(), texture->faces);
        QCOMPARE(data->mipLevels(), texture->mipmapLevels);
        QCOMPARE(data->format(), texture->format);
    }
}

QTEST_APPLESS_MAIN(tst_DdsTextures)

#include "tst_ddstextures.moc"
