##// END OF EJS Templates
Fix default axis for DeclarativeChart...
Fix default axis for DeclarativeChart The range for the axis needs to be set if no axis has been defined for Chart. Change-Id: I036fd1264b53b150bc9aaf1c1571f4d1dbefbc81 Task-number: QTRD-3482 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>

File last commit:

r2776:bc1f6aa59d42
r2789:bcb78508ec67
Show More
tst_qhorizontalstackedbarseries.cpp
1019 lines | 39.7 KiB | text/x-c | CppLexer
/ tests / auto / qhorizontalstackedbarseries / tst_qhorizontalstackedbarseries.cpp
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd
** All rights reserved.
** For any questions to The Qt Company, please use contact form at http://qt.io
**
** This file is part of the Qt Charts module.
**
** Licensees holding valid commercial license for Qt may use this file in
** accordance with the Qt License Agreement provided with the Software
** or, alternatively, in accordance with the terms contained in a written
** agreement between you and The Qt Company.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.io
**
****************************************************************************/
#include <QtTest/QtTest>
#include <QtCharts/QHorizontalStackedBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QChartView>
#include <QtCharts/QChart>
#include "tst_definitions.h"
QT_CHARTS_USE_NAMESPACE
Q_DECLARE_METATYPE(QBarSet*)
Q_DECLARE_METATYPE(QAbstractBarSeries::LabelsPosition)
class tst_QHorizontalStackedBarSeries : public QObject
{
Q_OBJECT
public slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
private slots:
void qhorizontalstackedbarseries_data();
void qhorizontalstackedbarseries();
void type_data();
void type();
void setLabelsFormat();
void setLabelsPosition();
void mouseclicked_data();
void mouseclicked();
void mousehovered_data();
void mousehovered();
void mousePressed();
void mouseReleased();
void mouseDoubleClicked();
private:
QHorizontalStackedBarSeries* m_barseries;
};
void tst_QHorizontalStackedBarSeries::initTestCase()
{
qRegisterMetaType<QBarSet*>("QBarSet*");
qRegisterMetaType<QAbstractBarSeries::LabelsPosition>("QAbstractBarSeries::LabelsPosition");
}
void tst_QHorizontalStackedBarSeries::cleanupTestCase()
{
QTest::qWait(1); // Allow final deleteLaters to run
}
void tst_QHorizontalStackedBarSeries::init()
{
m_barseries = new QHorizontalStackedBarSeries();
}
void tst_QHorizontalStackedBarSeries::cleanup()
{
delete m_barseries;
m_barseries = 0;
}
void tst_QHorizontalStackedBarSeries::qhorizontalstackedbarseries_data()
{
}
void tst_QHorizontalStackedBarSeries::qhorizontalstackedbarseries()
{
QHorizontalStackedBarSeries *barseries = new QHorizontalStackedBarSeries();
QVERIFY(barseries != 0);
delete barseries;
}
void tst_QHorizontalStackedBarSeries::type_data()
{
}
void tst_QHorizontalStackedBarSeries::type()
{
QVERIFY(m_barseries->type() == QAbstractSeries::SeriesTypeHorizontalStackedBar);
}
void tst_QHorizontalStackedBarSeries::setLabelsFormat()
{
QSignalSpy labelsFormatSpy(m_barseries, SIGNAL(labelsFormatChanged(QString)));
QCOMPARE(m_barseries->labelsFormat(), QString());
QString format("(@value)");
m_barseries->setLabelsFormat(format);
TRY_COMPARE(labelsFormatSpy.count(), 1);
QList<QVariant> arguments = labelsFormatSpy.takeFirst();
QVERIFY(arguments.at(0).toString() == format);
QCOMPARE(m_barseries->labelsFormat(), format);
m_barseries->setLabelsFormat(QString());
TRY_COMPARE(labelsFormatSpy.count(), 1);
arguments = labelsFormatSpy.takeFirst();
QVERIFY(arguments.at(0).toString() == QString());
QCOMPARE(m_barseries->labelsFormat(), QString());
}
void tst_QHorizontalStackedBarSeries::setLabelsPosition()
{
QSignalSpy labelsPositionSpy(m_barseries,
SIGNAL(labelsPositionChanged(QAbstractBarSeries::LabelsPosition)));
QCOMPARE(m_barseries->labelsPosition(), QHorizontalStackedBarSeries::LabelsCenter);
m_barseries->setLabelsPosition(QHorizontalStackedBarSeries::LabelsInsideEnd);
TRY_COMPARE(labelsPositionSpy.count(), 1);
QList<QVariant> arguments = labelsPositionSpy.takeFirst();
QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
== QHorizontalStackedBarSeries::LabelsInsideEnd);
QCOMPARE(m_barseries->labelsPosition(), QHorizontalStackedBarSeries::LabelsInsideEnd);
m_barseries->setLabelsPosition(QHorizontalStackedBarSeries::LabelsInsideBase);
TRY_COMPARE(labelsPositionSpy.count(), 1);
arguments = labelsPositionSpy.takeFirst();
QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
== QHorizontalStackedBarSeries::LabelsInsideBase);
QCOMPARE(m_barseries->labelsPosition(), QHorizontalStackedBarSeries::LabelsInsideBase);
m_barseries->setLabelsPosition(QHorizontalStackedBarSeries::LabelsOutsideEnd);
TRY_COMPARE(labelsPositionSpy.count(), 1);
arguments = labelsPositionSpy.takeFirst();
QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
== QHorizontalStackedBarSeries::LabelsOutsideEnd);
QCOMPARE(m_barseries->labelsPosition(), QHorizontalStackedBarSeries::LabelsOutsideEnd);
m_barseries->setLabelsPosition(QHorizontalStackedBarSeries::LabelsCenter);
TRY_COMPARE(labelsPositionSpy.count(), 1);
arguments = labelsPositionSpy.takeFirst();
QVERIFY(arguments.at(0).value<QAbstractBarSeries::LabelsPosition>()
== QHorizontalStackedBarSeries::LabelsCenter);
QCOMPARE(m_barseries->labelsPosition(), QHorizontalStackedBarSeries::LabelsCenter);
}
void tst_QHorizontalStackedBarSeries::mouseclicked_data()
{
}
void tst_QHorizontalStackedBarSeries::mouseclicked()
{
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
QHorizontalStackedBarSeries* series = new QHorizontalStackedBarSeries();
QBarSet* set1 = new QBarSet(QString("set 1"));
*set1 << 10 << 10 << 10;
series->append(set1);
QBarSet* set2 = new QBarSet(QString("set 2"));
*set2 << 10 << 10 << 10;
series->append(set2);
QList<QBarSet*> barSets = series->barSets();
QSignalSpy seriesSpy(series,SIGNAL(clicked(int,QBarSet*)));
QChartView view(new QChart());
view.resize(400,300);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
// Calculate expected layout for bars
QRectF plotArea = view.chart()->plotArea();
qreal width = plotArea.width();
qreal height = plotArea.height();
qreal rangeY = 3; // 3 values per set
qreal rangeX = 20; // From 0 to 20 because bars are stacked (this should be height of highest stack)
qreal scaleY = (height / rangeY);
qreal scaleX = (width / rangeX);
qreal setCount = series->count();
qreal domainMinY = -0.5; // These come from internal domain used by barseries.
qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
QVector<QRectF> layout;
// 3 = count of values in set
// Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
for (int i = 0; i < 3; i++) {
qreal xMax = -scaleX * domainMinX + plotArea.left();
qreal xMin = -scaleX * domainMinX + plotArea.left();
for (int set = 0; set < setCount; set++) {
qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
qreal rectWidth = barSets.at(set)->at(i) * scaleX;
if (rectWidth > 0) {
QRectF rect(xMax, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMax += rectWidth;
} else {
QRectF rect(xMin, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMin += rectWidth;
}
}
}
//====================================================================================
// barset 1, bar 0
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
//====================================================================================
// barset 1, bar 1
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 1);
//====================================================================================
// barset 1, bar 2
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 2);
//====================================================================================
// barset 2, bar 0
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
//====================================================================================
// barset 2, bar 1
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 1);
//====================================================================================
// barset 2, bar 2
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 2);
}
void tst_QHorizontalStackedBarSeries::mousehovered_data()
{
}
void tst_QHorizontalStackedBarSeries::mousehovered()
{
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
QHorizontalStackedBarSeries* series = new QHorizontalStackedBarSeries();
QBarSet* set1 = new QBarSet(QString("set 1"));
*set1 << 10 << 10 << 10;
series->append(set1);
QBarSet* set2 = new QBarSet(QString("set 2"));
*set2 << 10 << 10 << 10;
series->append(set2);
QList<QBarSet*> barSets = series->barSets();
QSignalSpy seriesIndexSpy(series, SIGNAL(hovered(bool, int, QBarSet*)));
QSignalSpy setIndexSpy1(set1, SIGNAL(hovered(bool, int)));
QSignalSpy setIndexSpy2(set2, SIGNAL(hovered(bool, int)));
QChartView view(new QChart());
view.resize(400,300);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
//this is hack since view does not get events otherwise
view.setMouseTracking(true);
// Calculate expected layout for bars
QRectF plotArea = view.chart()->plotArea();
qreal width = plotArea.width();
qreal height = plotArea.height();
qreal rangeY = 3; // 3 values per set
qreal rangeX = 20; // From 0 to 20 because bars are stacked (this should be height of highest stack)
qreal scaleY = (height / rangeY);
qreal scaleX = (width / rangeX);
qreal setCount = series->count();
qreal domainMinY = -0.5; // These come from internal domain used by barseries.
qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
QVector<QRectF> layout;
// 3 = count of values in set
// Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
for (int i = 0; i < 3; i++) {
qreal xMax = -scaleX * domainMinX + plotArea.left();
qreal xMin = -scaleX * domainMinX + plotArea.left();
for (int set = 0; set < setCount; set++) {
qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
qreal rectWidth = barSets.at(set)->at(i) * scaleX;
if (rectWidth > 0) {
QRectF rect(xMax, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMax += rectWidth;
} else {
QRectF rect(xMin, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMin += rectWidth;
}
}
}
//=======================================================================
// move mouse to left border
QTest::mouseMove(view.viewport(), QPoint(0, layout.at(4).center().y()));
QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
TRY_COMPARE(seriesIndexSpy.count(), 0);
//=======================================================================
// move mouse on top of set1
QTest::mouseMove(view.viewport(), layout.at(4).center().toPoint());
TRY_COMPARE(seriesIndexSpy.count(), 1);
TRY_COMPARE(setIndexSpy1.count(), 1);
TRY_COMPARE(setIndexSpy2.count(), 0);
QList<QVariant> seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
QList<QVariant> setIndexSpyArg = setIndexSpy1.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == true);
//=======================================================================
// move mouse from top of set1 to top of set2
QTest::mouseMove(view.viewport(), layout.at(5).center().toPoint());
TRY_COMPARE(seriesIndexSpy.count(), 2);
TRY_COMPARE(setIndexSpy1.count(), 1);
TRY_COMPARE(setIndexSpy2.count(), 1);
// should leave set1
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
setIndexSpyArg = setIndexSpy1.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == false);
// should enter set2
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
setIndexSpyArg = setIndexSpy2.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == true);
//=======================================================================
// move mouse from top of set2 to background
QTest::mouseMove(view.viewport(), QPoint(layout.at(5).center().y(), 0));
TRY_COMPARE(seriesIndexSpy.count(), 1);
TRY_COMPARE(setIndexSpy1.count(), 0);
TRY_COMPARE(setIndexSpy2.count(), 1);
// should leave set2
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
setIndexSpyArg = setIndexSpy2.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == false);
//=======================================================================
// move mouse on top of set1, bar0 to check the index (hover into set1)
QTest::mouseMove(view.viewport(), layout.at(0).center().toPoint());
TRY_COMPARE(seriesIndexSpy.count(), 1);
TRY_COMPARE(setIndexSpy1.count(), 1);
TRY_COMPARE(setIndexSpy2.count(), 0);
//should enter set1, bar0
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
setIndexSpyArg = setIndexSpy1.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == true);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
//=======================================================================
// move mouse on top of set2, bar0 to check the index (hover out set1,
// hover in set2)
QTest::mouseMove(view.viewport(), layout.at(1).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 10000);
TRY_COMPARE(seriesIndexSpy.count(), 2);
TRY_COMPARE(setIndexSpy1.count(), 1);
TRY_COMPARE(setIndexSpy2.count(), 1);
//should leave set1, bar0
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
setIndexSpyArg = setIndexSpy1.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == false);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
//should enter set2, bar0
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
setIndexSpyArg = setIndexSpy2.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == true);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
//=======================================================================
// move mouse on top of set1, bar1 to check the index (hover out set2,
// hover in set1)
QTest::mouseMove(view.viewport(), layout.at(2).center().toPoint());
TRY_COMPARE(seriesIndexSpy.count(), 2);
TRY_COMPARE(setIndexSpy1.count(), 1);
TRY_COMPARE(setIndexSpy2.count(), 1);
//should leave set2, bar0
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 0);
setIndexSpyArg = setIndexSpy2.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == false);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 0);
//should enter set1, bar1
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
setIndexSpyArg = setIndexSpy1.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == true);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
//=======================================================================
// move mouse between set1 and set2 (hover out set1)
QTest::mouseMove(view.viewport(), QPoint(layout.at(3).left(),
(layout.at(3).top() + layout.at(4).bottom()) / 2));
TRY_COMPARE(seriesIndexSpy.count(), 1);
TRY_COMPARE(setIndexSpy1.count(), 1);
TRY_COMPARE(setIndexSpy2.count(), 0);
//should leave set1, bar1
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set1);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
setIndexSpyArg = setIndexSpy1.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == false);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
//=======================================================================
// move mouse on top of set2, bar1 to check the index (hover in set2)
QTest::mouseMove(view.viewport(), layout.at(3).center().toPoint());
TRY_COMPARE(seriesIndexSpy.count(), 1);
TRY_COMPARE(setIndexSpy1.count(), 0);
TRY_COMPARE(setIndexSpy2.count(), 1);
//should enter set2, bar1
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == true);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
setIndexSpyArg = setIndexSpy2.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == true);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
//=======================================================================
// move mouse between set1 and set2 (hover out set2)
QTest::mouseMove(view.viewport(), QPoint(layout.at(3).left(),
(layout.at(3).top() + layout.at(4).bottom()) / 2));
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
TRY_COMPARE(seriesIndexSpy.count(), 1);
TRY_COMPARE(setIndexSpy1.count(), 0);
TRY_COMPARE(setIndexSpy2.count(), 1);
//should leave set1, bar1
seriesIndexSpyArg = seriesIndexSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesIndexSpyArg.at(2)), set2);
QVERIFY(seriesIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(seriesIndexSpyArg.at(0).toBool() == false);
QVERIFY(seriesIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(seriesIndexSpyArg.at(1).toInt() == 1);
setIndexSpyArg = setIndexSpy2.takeFirst();
QVERIFY(setIndexSpyArg.at(0).type() == QVariant::Bool);
QVERIFY(setIndexSpyArg.at(0).toBool() == false);
QVERIFY(setIndexSpyArg.at(1).type() == QVariant::Int);
QVERIFY(setIndexSpyArg.at(1).toInt() == 1);
}
void tst_QHorizontalStackedBarSeries::mousePressed()
{
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
QHorizontalStackedBarSeries* series = new QHorizontalStackedBarSeries();
QBarSet* set1 = new QBarSet(QString("set 1"));
*set1 << 10 << 10 << 10;
series->append(set1);
QBarSet* set2 = new QBarSet(QString("set 2"));
*set2 << 10 << 10 << 10;
series->append(set2);
QList<QBarSet*> barSets = series->barSets();
QSignalSpy seriesSpy(series,SIGNAL(pressed(int,QBarSet*)));
QSignalSpy setSpy1(set1, SIGNAL(pressed(int)));
QSignalSpy setSpy2(set2, SIGNAL(pressed(int)));
QChartView view(new QChart());
view.resize(400,300);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
// Calculate expected layout for bars
QRectF plotArea = view.chart()->plotArea();
qreal width = plotArea.width();
qreal height = plotArea.height();
qreal rangeY = 3; // 3 values per set
qreal rangeX = 20; // From 0 to 20 because bars are stacked (this should be height of highest stack)
qreal scaleY = (height / rangeY);
qreal scaleX = (width / rangeX);
qreal setCount = series->count();
qreal domainMinY = -0.5; // These come from internal domain used by barseries.
qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
QVector<QRectF> layout;
// 3 = count of values in set
// Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
for (int i = 0; i < 3; i++) {
qreal xMax = -scaleX * domainMinX + plotArea.left();
qreal xMin = -scaleX * domainMinX + plotArea.left();
for (int set = 0; set < setCount; set++) {
qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
qreal rectWidth = barSets.at(set)->at(i) * scaleX;
if (rectWidth > 0) {
QRectF rect(xMax, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMax += rectWidth;
} else {
QRectF rect(xMin, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMin += rectWidth;
}
}
}
//====================================================================================
// barset 1, bar 0
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
QList<QVariant> setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 0);
//====================================================================================
// barset 1, bar 1
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 1);
setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 1);
//====================================================================================
// barset 1, bar 2
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 2);
setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 2);
//====================================================================================
// barset 2, bar 0
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 0);
QCOMPARE(setSpy2.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
setSpyArg = setSpy2.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 0);
//====================================================================================
// barset 2, bar 1
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 0);
QCOMPARE(setSpy2.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 1);
setSpyArg = setSpy2.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 1);
//====================================================================================
// barset 2, bar 2
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 0);
QCOMPARE(setSpy2.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 2);
setSpyArg = setSpy2.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 2);
}
void tst_QHorizontalStackedBarSeries::mouseReleased()
{
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
QHorizontalStackedBarSeries* series = new QHorizontalStackedBarSeries();
QBarSet* set1 = new QBarSet(QString("set 1"));
*set1 << 10 << 10 << 10;
series->append(set1);
QBarSet* set2 = new QBarSet(QString("set 2"));
*set2 << 10 << 10 << 10;
series->append(set2);
QList<QBarSet*> barSets = series->barSets();
QSignalSpy seriesSpy(series,SIGNAL(released(int,QBarSet*)));
QSignalSpy setSpy1(set1, SIGNAL(released(int)));
QSignalSpy setSpy2(set2, SIGNAL(released(int)));
QChartView view(new QChart());
view.resize(400,300);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
// Calculate expected layout for bars
QRectF plotArea = view.chart()->plotArea();
qreal width = plotArea.width();
qreal height = plotArea.height();
qreal rangeY = 3; // 3 values per set
qreal rangeX = 20; // From 0 to 20 because bars are stacked (this should be height of highest stack)
qreal scaleY = (height / rangeY);
qreal scaleX = (width / rangeX);
qreal setCount = series->count();
qreal domainMinY = -0.5; // These come from internal domain used by barseries.
qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
QVector<QRectF> layout;
// 3 = count of values in set
// Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
for (int i = 0; i < 3; i++) {
qreal xMax = -scaleX * domainMinX + plotArea.left();
qreal xMin = -scaleX * domainMinX + plotArea.left();
for (int set = 0; set < setCount; set++) {
qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
qreal rectWidth = barSets.at(set)->at(i) * scaleX;
if (rectWidth > 0) {
QRectF rect(xMax, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMax += rectWidth;
} else {
QRectF rect(xMin, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMin += rectWidth;
}
}
}
//====================================================================================
// barset 1, bar 0
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
QList<QVariant> setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 0);
//====================================================================================
// barset 1, bar 1
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(2).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 1);
setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 1);
//====================================================================================
// barset 1, bar 2
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(4).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 2);
setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 2);
//====================================================================================
// barset 2, bar 0
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(1).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 0);
QCOMPARE(setSpy2.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
setSpyArg = setSpy2.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 0);
//====================================================================================
// barset 2, bar 1
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(3).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 0);
QCOMPARE(setSpy2.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 1);
setSpyArg = setSpy2.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 1);
//====================================================================================
// barset 2, bar 2
QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, layout.at(5).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 0);
QCOMPARE(setSpy2.count(), 1);
seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set2);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 2);
setSpyArg = setSpy2.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 2);
}
void tst_QHorizontalStackedBarSeries::mouseDoubleClicked()
{
SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();
QHorizontalStackedBarSeries* series = new QHorizontalStackedBarSeries();
QBarSet* set1 = new QBarSet(QString("set 1"));
*set1 << 10 << 10 << 10;
series->append(set1);
QBarSet* set2 = new QBarSet(QString("set 2"));
*set2 << 10 << 10 << 10;
series->append(set2);
QList<QBarSet*> barSets = series->barSets();
QSignalSpy seriesSpy(series,SIGNAL(doubleClicked(int,QBarSet*)));
QSignalSpy setSpy1(set1, SIGNAL(doubleClicked(int)));
QSignalSpy setSpy2(set2, SIGNAL(doubleClicked(int)));
QChartView view(new QChart());
view.resize(400,300);
view.chart()->addSeries(series);
view.show();
QTest::qWaitForWindowShown(&view);
// Calculate expected layout for bars
QRectF plotArea = view.chart()->plotArea();
qreal width = plotArea.width();
qreal height = plotArea.height();
qreal rangeY = 3; // 3 values per set
qreal rangeX = 20; // From 0 to 20 because bars are stacked (this should be height of highest stack)
qreal scaleY = (height / rangeY);
qreal scaleX = (width / rangeX);
qreal setCount = series->count();
qreal domainMinY = -0.5; // These come from internal domain used by barseries.
qreal domainMinX = 0; // No access to domain from outside, so use hard coded values.
qreal rectHeight = scaleY * series->barWidth(); // On horizontal chart barWidth of the barseries means height of the rect.
QVector<QRectF> layout;
// 3 = count of values in set
// Note that rects in this vector will be interleaved (set1 bar0, set2 bar0, set1 bar1, set2 bar1, etc.)
for (int i = 0; i < 3; i++) {
qreal xMax = -scaleX * domainMinX + plotArea.left();
qreal xMin = -scaleX * domainMinX + plotArea.left();
for (int set = 0; set < setCount; set++) {
qreal yPos = (domainMinY +0.5 -i) * scaleY + plotArea.bottom() - rectHeight/2;
qreal rectWidth = barSets.at(set)->at(i) * scaleX;
if (rectWidth > 0) {
QRectF rect(xMax, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMax += rectWidth;
} else {
QRectF rect(xMin, yPos - rectHeight, rectWidth, rectHeight);
layout.append(rect);
xMin += rectWidth;
}
}
}
// barset 1, bar 0
QTest::mouseDClick(view.viewport(), Qt::LeftButton, 0, layout.at(0).center().toPoint());
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
QCOMPARE(seriesSpy.count(), 1);
QCOMPARE(setSpy1.count(), 1);
QCOMPARE(setSpy2.count(), 0);
QList<QVariant> seriesSpyArg = seriesSpy.takeFirst();
QCOMPARE(qvariant_cast<QBarSet*>(seriesSpyArg.at(1)), set1);
QVERIFY(seriesSpyArg.at(0).type() == QVariant::Int);
QVERIFY(seriesSpyArg.at(0).toInt() == 0);
QList<QVariant> setSpyArg = setSpy1.takeFirst();
QVERIFY(setSpyArg.at(0).type() == QVariant::Int);
QVERIFY(setSpyArg.at(0).toInt() == 0);
}
QTEST_MAIN(tst_QHorizontalStackedBarSeries)
#include "tst_qhorizontalstackedbarseries.moc"