blob: 52be69b2e25bb98ff37d30a22f2699b43d5c1fe8 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite 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$
**
****************************************************************************/
#include <QtTest/QtTest>
#include <QtCore/QVariant>
#include <QtCore/QDateTime>
#include <QtCore/QMetaType>
#include <qt_windows.h>
QT_BEGIN_NAMESPACE
// Conversion functions from statically linked library (axtypes.h)
bool QVariantToVARIANT_container(const QVariant &var, VARIANT &arg,
const QByteArray &typeName = QByteArray(),
bool out = false);
QVariant VARIANTToQVariant_container(const VARIANT &arg, const QByteArray &typeName,
uint type = 0);
QT_END_NAMESPACE
class tst_Conversion : public QObject
{
Q_OBJECT
private slots:
void conversion_data();
void conversion();
};
enum Mode {
ByValue,
ByReference, // Allocate new value
OutParameter // Pre-allocated out-parameter by reference (test works only for types < qint64)
};
Q_DECLARE_METATYPE(Mode)
void tst_Conversion::conversion_data()
{
QTest::addColumn<QVariant>("value");
QTest::addColumn<uint>("expectedType");
QTest::addColumn<QByteArray>("typeName");
QTest::addColumn<Mode>("mode");
QVariant qvar;
QByteArray typeName;
qvar = QVariant('a');
typeName = QByteArrayLiteral("char");
QTest::newRow("char")
<< qvar << uint(VT_I1) << typeName << ByValue;
QTest::newRow("char-ref")
<< qvar << uint(VT_I1 | VT_BYREF) << typeName << ByReference;
QTest::newRow("char-out")
<< qvar << uint(VT_I1 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(uchar(197));
typeName = QByteArrayLiteral("uchar");
QTest::newRow("uchar")
<< qvar << uint(VT_UI1) << typeName << ByValue;
QTest::newRow("uchar-ref")
<< qvar << uint(VT_UI1 | VT_BYREF) << typeName << ByReference;
QTest::newRow("uchar-out")
<< qvar << uint(VT_UI1 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(ushort(42));
typeName = QByteArrayLiteral("ushort");
QTest::newRow("ushort")
<< qvar << uint(VT_UI2) << typeName << ByValue;
QTest::newRow("ushort-ref")
<< qvar << uint(VT_UI2 | VT_BYREF) << typeName << ByReference;
QTest::newRow("ushort-out")
<< qvar << uint(VT_UI2 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(short(42));
typeName = QByteArrayLiteral("short");
QTest::newRow("short")
<< qvar << uint(VT_I2) << typeName << ByValue;
QTest::newRow("short-ref")
<< qvar << uint(VT_I2 | VT_BYREF) << typeName << ByReference;
QTest::newRow("short-out")
<< qvar << uint(VT_I2 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(42);
typeName.clear();
QTest::newRow("int")
<< qvar << uint(VT_I4) << typeName << ByValue;
QTest::newRow("int-ref")
<< qvar << uint(VT_I4 | VT_BYREF) << typeName << ByReference;
QTest::newRow("int-out")
<< qvar << uint(VT_I4 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(42u);
typeName.clear();
QTest::newRow("uint")
<< qvar << uint(VT_UI4) << typeName << ByValue;
QTest::newRow("uint-ref")
<< qvar << uint(VT_UI4 | VT_BYREF) << typeName << ByReference;
QTest::newRow("uint-out")
<< qvar << uint(VT_UI4 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(qint64(42));
typeName.clear();
QTest::newRow("int64")
<< qvar << uint(VT_I8) << typeName << ByValue;
QTest::newRow("int64-ref")
<< qvar << uint(VT_I8 | VT_BYREF) << typeName << ByReference;
QTest::newRow("int64-out")
<< qvar << uint(VT_I8 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(quint64(42u));
typeName.clear();
QTest::newRow("uint64")
<< qvar << uint(VT_UI8) << typeName << ByValue;
QTest::newRow("uint64-ref")
<< qvar << uint(VT_UI8 | VT_BYREF) << typeName << ByReference;
QTest::newRow("uint64-out")
<< qvar << uint(VT_UI8 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(3.141f);
typeName = QByteArrayLiteral("float");
QTest::newRow("float")
<< qvar << uint(VT_R4) << typeName << ByValue;
QTest::newRow("float-ref")
<< qvar << uint(VT_R4 | VT_BYREF) << typeName << ByReference;
QTest::newRow("float-out")
<< qvar << uint(VT_R4 | VT_BYREF) << typeName << OutParameter;
qvar = QVariant(3.141);
typeName.clear();
QTest::newRow("double")
<< qvar << uint(VT_R8) << typeName << ByValue;
QTest::newRow("double-ref")
<< qvar << uint(VT_R8 | VT_BYREF) << typeName << ByReference;
QTest::newRow("double-out")
<< qvar << uint(VT_R8 | VT_BYREF) << typeName << OutParameter;
qvar = QDateTime(QDate(1968, 3, 9), QTime(10, 0));
typeName.clear();
QTest::newRow("datetime")
<< qvar << uint(VT_DATE) << typeName << ByValue;
QTest::newRow("datetime-ref")
<< qvar << uint(VT_DATE | VT_BYREF) << typeName << ByReference;
QTest::newRow("datetime-out")
<< qvar << uint(VT_DATE | VT_BYREF) << typeName << OutParameter;
}
void tst_Conversion::conversion()
{
QFETCH(QVariant, value);
QFETCH(uint, expectedType);
QFETCH(QByteArray, typeName);
QFETCH(Mode, mode);
VARIANT variant;
VariantInit(&variant);
if (mode == OutParameter) {
variant.vt = expectedType | VT_BYREF;
variant.pullVal = new ULONGLONG(0);
}
QVERIFY(QVariantToVARIANT_container(value, variant, typeName, mode != ByValue));
QCOMPARE(uint(variant.vt), expectedType);
const QVariant converted = VARIANTToQVariant_container(variant, QByteArray());
QCOMPARE(converted, value);
if (mode == OutParameter)
delete variant.pullVal;
}
QTEST_MAIN(tst_Conversion)
#include "tst_conversion.moc"