/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc ** All rights reserved. ** For any questions to Digia, please use contact form at http://qt.digia.com ** ** This file is part of the Qt Enterprise Charts Add-on. ** ** $QT_BEGIN_LICENSE$ ** Licensees holding valid Qt Enterprise licenses may use this file in ** accordance with the Qt Enterprise License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. ** ** If you have questions regarding the use of this file, please use ** contact form at http://qt.digia.com ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "tst_qxyseries.h" Q_DECLARE_METATYPE(QList) void tst_QXYSeries::initTestCase() { } void tst_QXYSeries::cleanupTestCase() { QTest::qWait(1); // Allow final deleteLaters to run } void tst_QXYSeries::init() { m_view = new QChartView(newQChartOrQPolarChart()); m_chart = m_view->chart(); } void tst_QXYSeries::cleanup() { delete m_view; m_view = 0; m_chart = 0; m_series = 0; } void tst_QXYSeries::seriesName() { QSignalSpy nameSpy(m_series, SIGNAL(nameChanged())); QCOMPARE(m_series->name(), QString()); m_series->setName("seriesname"); QCOMPARE(m_series->name(), QString("seriesname")); TRY_COMPARE(nameSpy.count(), 1); } void tst_QXYSeries::seriesVisible() { QSignalSpy visibleSpy(m_series, SIGNAL(visibleChanged())); QCOMPARE(m_series->isVisible(), true); m_series->setVisible(false); QCOMPARE(m_series->isVisible(), false); m_series->setVisible(true); TRY_COMPARE(visibleSpy.count(), 2); } void tst_QXYSeries::seriesOpacity() { QSignalSpy opacitySpy(m_series, SIGNAL(opacityChanged())); QCOMPARE(m_series->opacity(), 1.0); m_series->setOpacity(0.5); QCOMPARE(m_series->opacity(), 0.5); QCOMPARE(opacitySpy.count(), 1); m_series->setOpacity(0.0); QCOMPARE(m_series->opacity(), 0.0); QCOMPARE(opacitySpy.count(), 2); m_series->setOpacity(1.0); QCOMPARE(m_series->opacity(), 1.0); QCOMPARE(opacitySpy.count(), 3); } void tst_QXYSeries::pointLabelsFormat() { QSignalSpy labelsFormatSpy(m_series, SIGNAL(pointLabelsFormatChanged(QString))); QCOMPARE(m_series->pointLabelsFormat(), QLatin1String("@xPoint, @yPoint")); QString format("@yPoint"); m_series->setPointLabelsFormat(format); TRY_COMPARE(labelsFormatSpy.count(), 1); QList arguments = labelsFormatSpy.takeFirst(); QVERIFY(arguments.at(0).toString() == format); m_series->setPointLabelsFormat(QString()); TRY_COMPARE(labelsFormatSpy.count(), 1); arguments = labelsFormatSpy.takeFirst(); QVERIFY(arguments.at(0).toString() == QString()); } void tst_QXYSeries::pointLabelsVisible() { QSignalSpy labelsVisibleSpy(m_series, SIGNAL(pointLabelsVisibilityChanged(bool))); QCOMPARE(m_series->pointLabelsVisible(), false); m_series->setPointLabelsVisible(); QCOMPARE(m_series->pointLabelsVisible(), true); TRY_COMPARE(labelsVisibleSpy.count(), 1); QList arguments = labelsVisibleSpy.takeFirst(); QVERIFY(arguments.at(0).toBool() == true); m_series->setPointLabelsVisible(false); QCOMPARE(m_series->pointLabelsVisible(), false); TRY_COMPARE(labelsVisibleSpy.count(), 1); arguments = labelsVisibleSpy.takeFirst(); QVERIFY(arguments.at(0).toBool() == false); } void tst_QXYSeries::pointLabelsFont() { QFont defaultFont(m_series->pointLabelsFont()); QSignalSpy labelsFontSpy(m_series, SIGNAL(pointLabelsFontChanged(QFont))); QFont font("Times", 10); m_series->setPointLabelsFont(font); TRY_COMPARE(labelsFontSpy.count(), 1); QList arguments = labelsFontSpy.takeFirst(); QVERIFY(arguments.at(0).value() == font); m_series->setPointLabelsFont(defaultFont); TRY_COMPARE(labelsFontSpy.count(), 1); arguments = labelsFontSpy.takeFirst(); QVERIFY(arguments.at(0).value() == defaultFont); } void tst_QXYSeries::pointLabelsColor() { QColor defaultColor(QPen().color()); QSignalSpy labelsColorSpy(m_series, SIGNAL(pointLabelsColorChanged(QColor))); QCOMPARE(m_series->pointLabelsColor(), defaultColor); QColor color(Qt::blue); m_series->setPointLabelsColor(color); TRY_COMPARE(labelsColorSpy.count(), 1); QList arguments = labelsColorSpy.takeFirst(); QVERIFY(arguments.at(0).value() == color); m_series->setPointLabelsColor(defaultColor); TRY_COMPARE(labelsColorSpy.count(), 1); arguments = labelsColorSpy.takeFirst(); QVERIFY(arguments.at(0).value() == defaultColor); } void tst_QXYSeries::append_data() { QTest::addColumn< QList >("points"); QTest::addColumn< QList >("otherPoints"); QTest::newRow("0,0 1,1 2,2 3,3") << (QList() << QPointF(0,0) << QPointF(1,1) << QPointF(2,2) << QPointF(3,3)) << (QList() << QPointF(4,4) << QPointF(5,5) << QPointF(6,6) << QPointF(7,7)); QTest::newRow("0,0 -1,-1 -2,-2 -3,-3") << (QList() << QPointF(0,0) << QPointF(-1,-1) << QPointF(-2,-2) << QPointF(-3,-3)) << (QList() << QPointF(-4,-4) << QPointF(-5,-5) << QPointF(-6,-6) << QPointF(-7,-7)); } void tst_QXYSeries::append_raw_data() { append_data(); } void tst_QXYSeries::append_raw() { QFETCH(QList, points); QFETCH(QList, otherPoints); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); QSignalSpy addedSpy(m_series, SIGNAL(pointAdded(int))); m_series->append(points); TRY_COMPARE(spy0.count(), 0); TRY_COMPARE(addedSpy.count(), points.count()); QCOMPARE(m_series->points(), points); // Process events between appends foreach (const QPointF &point, otherPoints) { m_series->append(point); QApplication::processEvents(); } } void tst_QXYSeries::chart_append_data() { append_data(); } void tst_QXYSeries::chart_append() { append_raw(); m_chart->addSeries(m_series); m_view->show(); QTest::qWaitForWindowShown(m_view); } void tst_QXYSeries::append_chart_data() { append_data(); } void tst_QXYSeries::append_chart() { m_view->show(); m_chart->addSeries(m_series); QTest::qWaitForWindowShown(m_view); append_raw(); } void tst_QXYSeries::append_chart_animation_data() { append_data(); } void tst_QXYSeries::append_chart_animation() { m_chart->setAnimationOptions(QChart::AllAnimations); append_chart(); } void tst_QXYSeries::count_data() { QTest::addColumn("count"); QTest::newRow("0") << 0; QTest::newRow("5") << 5; QTest::newRow("10") << 5; } void tst_QXYSeries::count_raw_data() { count_data(); } void tst_QXYSeries::count_raw() { QFETCH(int, count); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); for(int i=0 ; i< count; ++i) m_series->append(i,i); TRY_COMPARE(spy0.count(), 0); QCOMPARE(m_series->count(), count); } void tst_QXYSeries::remove_raw_data() { append_data(); } void tst_QXYSeries::remove_raw() { QFETCH(QList, points); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); m_series->append(points); TRY_COMPARE(spy0.count(), 0); QCOMPARE(m_series->points(), points); foreach (const QPointF& point,points) m_series->remove(point); QCOMPARE(m_series->points().count(), 0); TRY_COMPARE(spy0.count(), 0); m_series->append(points); QCOMPARE(m_series->points(), points); //reverse order for(int i = points.count()-1 ; i>=0; i--){ m_series->remove(points[i]); } QCOMPARE(m_series->points().count(), 0); QApplication::processEvents(); // Process events between removes m_series->append(points); QCOMPARE(m_series->points(), points); foreach (const QPointF &point, points) { m_series->remove(point); QApplication::processEvents(); } // Actual meaningful delay between removes, but still shorter than animation duration // (simulate e.g. spamming a hypothetical "remove last point"-button) QList bunchOfPoints; for (int i = 0; i < 10; i++) bunchOfPoints.append(QPointF(i, (qreal) rand() / (qreal) RAND_MAX)); m_series->replace(bunchOfPoints); QCOMPARE(m_series->points(), bunchOfPoints); QTest::qWait(1500); // Wait for append animations to be over for (int i = bunchOfPoints.count() - 1; i >= 0; i--) { m_series->remove(bunchOfPoints.at(i)); QTest::qWait(50); } QCOMPARE(m_series->points().count(), 0); // Removal using index for (int i = 0; i < 10; i++) bunchOfPoints.append(QPointF(i, (qreal) rand() / (qreal) RAND_MAX)); m_series->replace(bunchOfPoints); m_series->remove(5); m_series->remove(0); QCOMPARE(m_series->points().count(), (bunchOfPoints.count() - 2)); for (int i = bunchOfPoints.count() - 3; i >= 0; i--) { m_series->remove(i); QCOMPARE(m_series->points().count(), i); } QCOMPARE(m_series->points().count(), 0); } void tst_QXYSeries::remove_chart_data() { append_data(); } void tst_QXYSeries::remove_chart() { m_view->show(); m_chart->addSeries(m_series); QTest::qWaitForWindowShown(m_view); remove_raw(); } void tst_QXYSeries::remove_chart_animation_data() { append_data(); } void tst_QXYSeries::remove_chart_animation() { m_chart->setAnimationOptions(QChart::AllAnimations); remove_chart(); } void tst_QXYSeries::clear_raw_data() { append_data(); } void tst_QXYSeries::clear_raw() { QFETCH(QList, points); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); m_series->append(points); TRY_COMPARE(spy0.count(), 0); QCOMPARE(m_series->points(), points); m_series->clear(); TRY_COMPARE(spy0.count(), 0); QCOMPARE(m_series->points().count(), 0); QApplication::processEvents(); } void tst_QXYSeries::clear_chart_data() { append_data(); } void tst_QXYSeries::clear_chart() { m_view->show(); m_chart->addSeries(m_series); QTest::qWaitForWindowShown(m_view); clear_raw(); } void tst_QXYSeries::clear_chart_animation_data() { append_data(); } void tst_QXYSeries::clear_chart_animation() { m_chart->setAnimationOptions(QChart::AllAnimations); clear_chart(); } void tst_QXYSeries::replace_raw_data() { append_data(); } void tst_QXYSeries::replace_raw() { QFETCH(QList, points); QFETCH(QList, otherPoints); QSignalSpy pointReplacedSpy(m_series, SIGNAL(pointReplaced(int))); QSignalSpy pointsReplacedSpy(m_series, SIGNAL(pointsReplaced())); m_series->append(points); TRY_COMPARE(pointReplacedSpy.count(), 0); TRY_COMPARE(pointsReplacedSpy.count(), 0); QCOMPARE(m_series->points(), points); foreach (const QPointF& point, points) m_series->replace(point.x(),point.y(),point.x(),0); TRY_COMPARE(pointReplacedSpy.count(), points.count()); TRY_COMPARE(pointsReplacedSpy.count(), 0); // Replace a point that does not exist m_series->replace(-123, 999, 0, 0); TRY_COMPARE(pointReplacedSpy.count(), points.count()); TRY_COMPARE(pointsReplacedSpy.count(), 0); QList newPoints = m_series->points(); QCOMPARE(newPoints.count(), points.count()); for(int i =0 ; i allPoints; for (int i = 0; i < 10; i++) allPoints.append(QPointF(i, (qreal) rand() / (qreal) RAND_MAX)); m_series->replace(allPoints); TRY_COMPARE(pointReplacedSpy.count(), points.count()); TRY_COMPARE(pointsReplacedSpy.count(), 1); m_series->replace(points); QApplication::processEvents(); // Process events between replaces for (int i = 0; i < points.count(); ++i) { m_series->replace(points.at(i), otherPoints.at(i)); QApplication::processEvents(); } newPoints = m_series->points(); QCOMPARE(newPoints.count(), points.count()); for (int i = 0; i < points.count(); ++i) { QCOMPARE(otherPoints.at(i).x(), newPoints.at(i).x()); QCOMPARE(otherPoints.at(i).y(), newPoints.at(i).y()); } // Append followed by a replace shouldn't crash m_series->clear(); m_series->append(QPointF(22,22)); m_series->append(QPointF(23,23)); QApplication::processEvents(); m_series->replace(QPointF(23,23), otherPoints.at(1)); QCOMPARE(m_series->points().at(1).x(), otherPoints.at(1).x()); QCOMPARE(m_series->points().at(1).y(), otherPoints.at(1).y()); // Replace using index m_series->append(otherPoints); m_series->replace(0, QPointF(333, 333)); m_series->replace(3, 444, 444); m_series->replace(m_series->count() - 1, QPointF(555, 555)); QCOMPARE(m_series->points().at(0), QPointF(333, 333)); QCOMPARE(m_series->points().at(3), QPointF(444, 444)); QCOMPARE(m_series->points().at(m_series->count() - 1), QPointF(555, 555)); } void tst_QXYSeries::replace_chart_data() { append_data(); } void tst_QXYSeries::replace_chart() { m_view->show(); m_chart->addSeries(m_series); QTest::qWaitForWindowShown(m_view); replace_raw(); } void tst_QXYSeries::replace_chart_animation_data() { append_data(); } void tst_QXYSeries::replace_chart_animation() { m_chart->setAnimationOptions(QChart::AllAnimations); replace_chart(); } void tst_QXYSeries::insert_data() { append_data(); } void tst_QXYSeries::insert() { QFETCH(QList, points); m_series->append(points); QSignalSpy addedSpy(m_series, SIGNAL(pointAdded(int))); m_series->insert(0, QPointF(5, 5)); TRY_COMPARE(addedSpy.count(), 1); QCOMPARE(m_series->points().count(), points.count() + 1); m_series->insert(m_series->count(), QPointF(6, 6)); TRY_COMPARE(addedSpy.count(), 2); QCOMPARE(m_series->points().count(), points.count() + 2); } void tst_QXYSeries::oper_data() { append_data(); } void tst_QXYSeries::oper() { QFETCH(QList, points); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); foreach (const QPointF& point,points) { *m_series<points(), points); TRY_COMPARE(spy0.count(), 0); } void tst_QXYSeries::pen_data() { QTest::addColumn("pen"); QTest::newRow("null") << QPen(); QTest::newRow("blue") << QPen(Qt::blue); QTest::newRow("black") << QPen(Qt::black); QTest::newRow("red") << QPen(Qt::red); } void tst_QXYSeries::pen() { QFETCH(QPen, pen); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); m_series->setPen(pen); TRY_COMPARE(spy0.count(), 0); QCOMPARE(m_series->pen(), pen); m_chart->addSeries(m_series); if (pen != QPen()) QCOMPARE(m_series->pen(), pen); m_chart->setTheme(QChart::ChartThemeDark); // setting a theme will overwrite all customizations if (pen != QPen()) QVERIFY(m_series->pen() != pen); } void tst_QXYSeries::pointsVisible_data() { QTest::addColumn("pointsVisible"); QTest::newRow("true") << true; QTest::newRow("false") << false; } void tst_QXYSeries::pointsVisible_raw_data() { pointsVisible_data(); } void tst_QXYSeries::pointsVisible_raw() { QFETCH(bool, pointsVisible); QSignalSpy spy0(m_series, SIGNAL(clicked(QPointF))); m_series->setPointsVisible(pointsVisible); TRY_COMPARE(spy0.count(), 0); QCOMPARE(m_series->pointsVisible(), pointsVisible); } void tst_QXYSeries::changedSignals() { QSignalSpy visibleSpy(m_series, SIGNAL(visibleChanged())); QSignalSpy nameSpy(m_series, SIGNAL(nameChanged())); QSignalSpy colorSpy(m_series, SIGNAL(colorChanged(QColor))); // Visibility m_series->setVisible(false); m_series->setVisible(false); TRY_COMPARE(visibleSpy.count(), 1); m_series->setVisible(true); TRY_COMPARE(visibleSpy.count(), 2); // Color m_series->setColor(QColor("aliceblue")); TRY_COMPARE(colorSpy.count(), 1); // Pen and Brush QPen p = m_series->pen(); p.setColor("aquamarine"); m_series->setPen(p); QBrush b = m_series->brush(); b.setColor("beige"); m_series->setBrush(b); TRY_COMPARE(colorSpy.count(), 2); // Verify all the signals again, to make sure no extra signals were emitted TRY_COMPARE(visibleSpy.count(), 2); TRY_COMPARE(nameSpy.count(), 0); TRY_COMPARE(colorSpy.count(), 2); }