From 8fa17eb15940d4731215c594a7bce65d54d80699 2015-03-13 13:46:56 From: Friedemann Kleint Date: 2015-03-13 13:46:56 Subject: [PATCH] QXYSeries::insert(): Handle out-of-range indexes gracefully. Prepend when index < 0, append when index >= size and clamp values of signal QXYSeries::pointAdded() to [0, size]. Change-Id: Ib22449d2f14274c8b13b36dc78362caf030da339 Task-number: QTRD-3488 Reviewed-by: Miikka Heikkinen --- diff --git a/src/charts/xychart/qxyseries.cpp b/src/charts/xychart/qxyseries.cpp index d99dca3..20ff127 100644 --- a/src/charts/xychart/qxyseries.cpp +++ b/src/charts/xychart/qxyseries.cpp @@ -541,6 +541,7 @@ void QXYSeries::insert(int index, const QPointF &point) { Q_D(QXYSeries); if (isValidValue(point)) { + index = qMax(0, qMin(index, d->m_points.size())); d->m_points.insert(index, point); emit pointAdded(index); } diff --git a/tests/auto/qlineseries/tst_qlineseries.cpp b/tests/auto/qlineseries/tst_qlineseries.cpp index b4a557b..622e940 100644 --- a/tests/auto/qlineseries/tst_qlineseries.cpp +++ b/tests/auto/qlineseries/tst_qlineseries.cpp @@ -37,6 +37,7 @@ private slots: void pressedSignal(); void releasedSignal(); void doubleClickedSignal(); + void insert(); protected: void pointsVisible_data(); }; @@ -165,6 +166,28 @@ void tst_QLineSeries::releasedSignal() QCOMPARE(qRound(signalPoint.y()), qRound(linePoint.y())); } +void tst_QLineSeries::insert() +{ + QLineSeries lineSeries; + QSignalSpy insertSpy(&lineSeries, &QXYSeries::pointAdded); + lineSeries.insert(0, QPoint(3, 3)); + QCOMPARE(insertSpy.count(), 1); + QVariantList arguments = insertSpy.takeFirst(); + QCOMPARE(arguments.first().toInt(), 0); + lineSeries.insert(0, QPoint(1, 1)); + arguments = insertSpy.takeFirst(); + QCOMPARE(arguments.first().toInt(), 0); + lineSeries.insert(1, QPoint(2, 2)); + arguments = insertSpy.takeFirst(); + QCOMPARE(arguments.first().toInt(), 1); + lineSeries.insert(42, QPoint(0, 0)); + arguments = insertSpy.takeFirst(); + QCOMPARE(arguments.first().toInt(), 3); + lineSeries.insert(-42, QPoint(0, 0)); + arguments = insertSpy.takeFirst(); + QCOMPARE(arguments.first().toInt(), 0); +} + void tst_QLineSeries::doubleClickedSignal() { SKIP_IF_CANNOT_TEST_MOUSE_EVENTS();