blob: d28f9502d743bcd9980869eb80316580bf7ca110 [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 <qtest.h>
#include <QTransform>
#include <QPainterPath>
class tst_QTransform : public QObject
{
Q_OBJECT
public:
tst_QTransform();
virtual ~tst_QTransform();
public slots:
void init();
void cleanup();
private slots:
void construct();
void translate_data();
void translate();
void scale_data();
void scale();
void shear_data();
void shear();
void rotate_data();
void rotate();
void rotateXYZ_data();
void rotateXYZ();
void operatorAssign_data();
void operatorAssign();
void operatorEqual_data();
void operatorEqual();
void operatorNotEqual_data();
void operatorNotEqual();
void operatorMultiply_data();
void operatorMultiply();
void operatorPlusEqualScalar_data();
void operatorPlusEqualScalar();
void operatorMinusEqualScalar_data();
void operatorMinusEqualScalar();
void operatorMultiplyEqual_data();
void operatorMultiplyEqual();
void operatorMultiplyEqualScalar_data();
void operatorMultiplyEqualScalar();
void operatorDivideEqualScalar_data();
void operatorDivideEqualScalar();
void mapQPoint_data();
void mapQPoint();
void mapQPointF_data();
void mapQPointF();
void mapRect_data();
void mapRect();
void mapRectF_data();
void mapRectF();
void mapQPolygon_data();
void mapQPolygon();
void mapQPolygonF_data();
void mapQPolygonF();
void mapQRegion_data();
void mapQRegion();
void mapToPolygon_data();
void mapToPolygon();
void mapQPainterPath_data();
void mapQPainterPath();
void isIdentity_data();
void isIdentity();
void isAffine_data();
void isAffine();
void isInvertible_data();
void isInvertible();
void isRotating_data();
void isRotating();
void isScaling_data();
void isScaling();
void isTranslating_data();
void isTranslating();
void type_data();
void type();
void determinant_data();
void determinant();
void adjoint_data();
void adjoint();
void transposed_data();
void transposed();
void inverted_data();
void inverted();
private:
QMap<const char *, QTransform> generateTransforms() const;
};
tst_QTransform::tst_QTransform()
{
}
tst_QTransform::~tst_QTransform()
{
}
void tst_QTransform::init()
{
}
void tst_QTransform::cleanup()
{
}
QMap<const char *, QTransform> tst_QTransform::generateTransforms() const
{
QMap<const char *, QTransform> x;
x["0: identity"] = QTransform();
x["1: translate"] = QTransform().translate(10, 10);
x["2: translate"] = QTransform().translate(-10, -10);
x["3: rotate45"] = QTransform().rotate(45);
x["4: rotate90"] = QTransform().rotate(90);
x["5: rotate180"] = QTransform().rotate(180);
x["6: shear2,2"] = QTransform().shear(2, 2);
x["7: shear-2,-2"] = QTransform().shear(-2, -2);
x["8: scaleUp2,2"] = QTransform().scale(2, 2);
x["9: scaleUp2,3"] = QTransform().scale(2, 3);
x["10: scaleDown0.5,0.5"] = QTransform().scale(0.5, 0.5);
x["11: scaleDown0.5,0.25"] = QTransform().scale(0.5, 0.25);
x["12: rotateX"] = QTransform().rotate(45, Qt::XAxis);
x["13: rotateY"] = QTransform().rotate(45, Qt::YAxis);
x["14: rotateXY"] = QTransform().rotate(45, Qt::XAxis).rotate(45, Qt::YAxis);
x["15: rotateYZ"] = QTransform().rotate(45, Qt::YAxis).rotate(45, Qt::ZAxis);
x["16: full"] = QTransform().translate(10, 10).rotate(45).shear(2, 2).scale(2, 2).rotate(45, Qt::YAxis).rotate(45, Qt::XAxis).rotate(45, Qt::ZAxis);
return x;
}
void tst_QTransform::construct()
{
QBENCHMARK {
QTransform x;
}
}
#define SINGLE_DATA_IMPLEMENTATION(func) \
void tst_QTransform::func##_data() \
{ \
QTest::addColumn<QTransform>("transform"); \
QMap<const char *, QTransform> x = generateTransforms(); \
for (auto it = x.begin(), end = x.end(); it != end; ++it) { \
QTest::newRow(it.key()) << it.value(); \
} \
}
#define DOUBLE_DATA_IMPLEMENTATION(func) \
void tst_QTransform::func##_data() \
{ \
QTest::addColumn<QTransform>("x1"); \
QTest::addColumn<QTransform>("x2"); \
QMap<const char *, QTransform> x = generateTransforms(); \
for (auto it = x.cbegin(), end = x.cend(); it != end; ++it) { \
const char *key1 = it.key(); \
QTransform x1 = it.value(); \
for (auto it2 = x.cbegin(), end = x.cend(); it2 != end; ++it2) { \
QTest::newRow(QString("%1 + %2").arg(key1).arg(it2.key()).toLatin1().constData()) \
<< x1 << it2.value(); \
} \
} \
}
SINGLE_DATA_IMPLEMENTATION(translate)
void tst_QTransform::translate()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.translate(10, 10);
}
}
SINGLE_DATA_IMPLEMENTATION(scale)
void tst_QTransform::scale()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.scale(2, 2);
}
}
SINGLE_DATA_IMPLEMENTATION(shear)
void tst_QTransform::shear()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.shear(2, 2);
}
}
SINGLE_DATA_IMPLEMENTATION(rotate)
void tst_QTransform::rotate()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.rotate(45);
}
}
SINGLE_DATA_IMPLEMENTATION(rotateXYZ)
void tst_QTransform::rotateXYZ()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.rotate(45, Qt::XAxis);
x.rotate(45, Qt::YAxis);
x.rotate(45, Qt::ZAxis);
}
}
DOUBLE_DATA_IMPLEMENTATION(operatorAssign)
void tst_QTransform::operatorAssign()
{
QFETCH(QTransform, x1);
QFETCH(QTransform, x2);
QTransform x = x1;
QBENCHMARK {
x = x2;
}
}
DOUBLE_DATA_IMPLEMENTATION(operatorEqual)
void tst_QTransform::operatorEqual()
{
QFETCH(QTransform, x1);
QFETCH(QTransform, x2);
QTransform x = x1;
QBENCHMARK {
x == x2;
}
}
DOUBLE_DATA_IMPLEMENTATION(operatorNotEqual)
void tst_QTransform::operatorNotEqual()
{
QFETCH(QTransform, x1);
QFETCH(QTransform, x2);
QTransform x = x1;
QBENCHMARK {
x != x2;
}
}
DOUBLE_DATA_IMPLEMENTATION(operatorMultiply)
void tst_QTransform::operatorMultiply()
{
QFETCH(QTransform, x1);
QFETCH(QTransform, x2);
QTransform x = x1;
QBENCHMARK {
x * x2;
}
}
SINGLE_DATA_IMPLEMENTATION(operatorPlusEqualScalar)
void tst_QTransform::operatorPlusEqualScalar()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x += 3.14;
}
}
SINGLE_DATA_IMPLEMENTATION(operatorMinusEqualScalar)
void tst_QTransform::operatorMinusEqualScalar()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x -= 3.14;
}
}
DOUBLE_DATA_IMPLEMENTATION(operatorMultiplyEqual)
void tst_QTransform::operatorMultiplyEqual()
{
QFETCH(QTransform, x1);
QFETCH(QTransform, x2);
QTransform x = x1;
QBENCHMARK {
x *= x2;
}
}
SINGLE_DATA_IMPLEMENTATION(operatorMultiplyEqualScalar)
void tst_QTransform::operatorMultiplyEqualScalar()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x * 3;
}
}
SINGLE_DATA_IMPLEMENTATION(operatorDivideEqualScalar)
void tst_QTransform::operatorDivideEqualScalar()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x /= 3;
}
}
SINGLE_DATA_IMPLEMENTATION(mapQPoint)
void tst_QTransform::mapQPoint()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.map(QPoint(3, 3));
}
}
SINGLE_DATA_IMPLEMENTATION(mapQPointF)
void tst_QTransform::mapQPointF()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.map(QPointF(3, 3));
}
}
SINGLE_DATA_IMPLEMENTATION(mapRect)
void tst_QTransform::mapRect()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.mapRect(QRect(0, 0, 100, 100));
}
}
SINGLE_DATA_IMPLEMENTATION(mapRectF)
void tst_QTransform::mapRectF()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.mapRect(QRectF(0, 0, 100, 100));
}
}
SINGLE_DATA_IMPLEMENTATION(mapQPolygon)
void tst_QTransform::mapQPolygon()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QPolygon poly = QPolygon(QRect(0, 0, 100, 100));
QBENCHMARK {
x.map(poly);
}
}
SINGLE_DATA_IMPLEMENTATION(mapQPolygonF)
void tst_QTransform::mapQPolygonF()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QPolygonF poly = QPolygonF(QRectF(0, 0, 100, 100));
QBENCHMARK {
x.map(poly);
}
}
SINGLE_DATA_IMPLEMENTATION(mapQRegion)
void tst_QTransform::mapQRegion()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QRegion region;
for (int i = 0; i < 10; ++i)
region += QRect(i * 10, i * 10, 100, 100);
QBENCHMARK {
x.map(region);
}
}
SINGLE_DATA_IMPLEMENTATION(mapToPolygon)
void tst_QTransform::mapToPolygon()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QBENCHMARK {
x.mapToPolygon(QRect(0, 0, 100, 100));
}
}
SINGLE_DATA_IMPLEMENTATION(mapQPainterPath)
void tst_QTransform::mapQPainterPath()
{
QFETCH(QTransform, transform);
QTransform x = transform;
QPainterPath path;
for (int i = 0; i < 10; ++i)
path.addEllipse(i * 10, i * 10, 100, 100);
QBENCHMARK {
x.map(path);
}
}
SINGLE_DATA_IMPLEMENTATION(isIdentity)
void tst_QTransform::isIdentity()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.isIdentity();
}
}
SINGLE_DATA_IMPLEMENTATION(isAffine)
void tst_QTransform::isAffine()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.isAffine();
}
}
SINGLE_DATA_IMPLEMENTATION(isInvertible)
void tst_QTransform::isInvertible()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.isInvertible();
}
}
SINGLE_DATA_IMPLEMENTATION(isRotating)
void tst_QTransform::isRotating()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.isRotating();
}
}
SINGLE_DATA_IMPLEMENTATION(isScaling)
void tst_QTransform::isScaling()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.isScaling();
}
}
SINGLE_DATA_IMPLEMENTATION(isTranslating)
void tst_QTransform::isTranslating()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.isTranslating();
}
}
SINGLE_DATA_IMPLEMENTATION(type)
void tst_QTransform::type()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.type();
}
}
SINGLE_DATA_IMPLEMENTATION(determinant)
void tst_QTransform::determinant()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.determinant();
}
}
SINGLE_DATA_IMPLEMENTATION(adjoint)
void tst_QTransform::adjoint()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.adjoint();
}
}
SINGLE_DATA_IMPLEMENTATION(transposed)
void tst_QTransform::transposed()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.transposed();
}
}
SINGLE_DATA_IMPLEMENTATION(inverted)
void tst_QTransform::inverted()
{
QFETCH(QTransform, transform);
QBENCHMARK {
transform.inverted();
}
}
QTEST_MAIN(tst_QTransform)
#include "tst_qtransform.moc"